Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 70 additions & 4 deletions .github/workflows/release-libpdfium.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ on:
default: false

permissions:
contents: read
contents: write

jobs:
source-tests:
Expand Down Expand Up @@ -57,15 +57,27 @@ jobs:
fail-fast: false
matrix:
include:
# Linux & Wasm
- { target: linux-x64, runner: ubuntu-24.04 }
- { target: linux-arm64, runner: ubuntu-24.04 }
- { target: linuxmusl-x64, runner: ubuntu-24.04 }
- { target: linuxmusl-arm64, runner: ubuntu-24.04 }
- { target: wasm32, runner: ubuntu-24.04 }
# Darwin (macOS)
- { target: darwin-arm64, runner: macos-15 }
- { target: darwin-x64, runner: macos-15 }
# Windows
- { target: win32-x64, runner: windows-2022 }
- { target: win32-arm64, runner: windows-2022 }
# Android
- { target: arm64-v8a, runner: ubuntu-24.04 }
- { target: armeabi-v7a, runner: ubuntu-24.04 }
- { target: x86, runner: ubuntu-24.04 }
- { target: x86_64, runner: ubuntu-24.04 }
# iOS
- { target: ios-arm64, runner: macos-15 }
- { target: ios-simulator-arm64, runner: macos-15 }
- { target: ios-simulator-x64, runner: macos-15 }
env:
DEPOT_TOOLS_WIN_TOOLCHAIN: 0
EMSDK_VERSION: 3.1.72
Expand Down Expand Up @@ -132,7 +144,7 @@ jobs:
- name: Select Xcode
if: runner.os == 'macOS'
shell: bash
run: sudo xcode-select -s "/Applications/Xcode_26.0.app"
run: sudo xcode-select -s "/Applications/Xcode_16.1.app"
- name: Install Windows deps
if: runner.os == 'Windows'
shell: pwsh
Expand Down Expand Up @@ -161,18 +173,72 @@ jobs:
name: libembedpdf-pdf-runtime-${{ matrix.target }}
path: out/embedpdf-runtime-artifacts/*.tar.gz

ios-universal:
name: Build ios-arm64_x86_64-simulator
needs: build
runs-on: macos-15
steps:
- uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref_name }}
- uses: actions/download-artifact@v6
with:
name: libembedpdf-pdf-runtime-ios-simulator-arm64
path: artifacts/ios-simulator-arm64
- uses: actions/download-artifact@v6
with:
name: libembedpdf-pdf-runtime-ios-simulator-x64
path: artifacts/ios-simulator-x64
- name: Combine iOS simulator libraries
shell: bash
run: |
mkdir -p out/ios-universal/lib

# Unpack
mkdir -p staging/arm64 staging/x64
tar -xzf artifacts/ios-simulator-arm64/*.tar.gz -C staging/arm64
tar -xzf artifacts/ios-simulator-x64/*.tar.gz -C staging/x64

# Combine with lipo
lipo -create staging/arm64/lib/libpdfium.a staging/x64/lib/libpdfium.a -output out/ios-universal/lib/libpdfium.a

# Copy headers and other files from one of them
mkdir -p out/ios-universal/include out/ios-universal/LICENSES
cp -R staging/arm64/include/. out/ios-universal/include/
cp -R staging/arm64/LICENSES/. out/ios-universal/LICENSES/
cp staging/arm64/args.gn out/ios-universal/args.gn

# Write metadata
cat > out/ios-universal/BUILD-METADATA.json <<EOF
{
"name": "embedpdf-pdf-runtime",
"target": "ios-arm64_x86_64-simulator",
"sha": "$(git rev-parse HEAD)",
"createdAt": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
}
EOF

# Package
mkdir -p out/embedpdf-runtime-artifacts
short_sha=$(git rev-parse --short HEAD)
tar -czf "out/embedpdf-runtime-artifacts/libembedpdf-pdf-runtime-ios-arm64_x86_64-simulator-$short_sha.tar.gz" -C out/ios-universal .
- uses: actions/upload-artifact@v6
with:
name: libembedpdf-pdf-runtime-ios-arm64_x86_64-simulator
path: out/embedpdf-runtime-artifacts/*.tar.gz

release:
name: Publish release
runs-on: ubuntu-24.04
needs: build
needs: [build, ios-universal]
if: github.event_name == 'workflow_dispatch' && inputs.release == true
permissions:
contents: write
steps:
- uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref_name }}
- uses: actions/download-artifact@v7
- uses: actions/download-artifact@v6
with:
path: artifacts
- name: Flatten artifacts
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -70,4 +70,5 @@
*.vcxproj
*.xcodeproj
*~
.idea

5 changes: 3 additions & 2 deletions build_overrides/build.gni
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,9 @@ if (use_system_xcode == "") {
[ target_os ],
"value")
use_system_xcode = _result == 0
}
if (target_os == "ios") {
} else if (target_os == "ios") {
use_system_xcode = true
} else {
use_system_xcode = true
}
}
35 changes: 35 additions & 0 deletions patches/embedpdf-runtime/android/build.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
diff --git a/config/BUILDCONFIG.gn b/config/BUILDCONFIG.gn
index b5dca4a..279e0ab 100644
--- a/config/BUILDCONFIG.gn
+++ b/config/BUILDCONFIG.gn
@@ -241,7 +241,7 @@ _default_toolchain = ""

if (target_os == "android") {
# Targeting android on Mac is best-effort and not guaranteed to work.
- assert(host_os == "linux", "Android builds are only supported on Linux.")
+ assert(host_os == "linux" || host_os == "mac", "Android builds are only supported on Linux or Mac.")
_default_toolchain = "//build/toolchain/android:android_clang_$target_cpu"
} else if (target_os == "chromeos" || target_os == "linux") {
# See comments in build/toolchain/cros/BUILD.gn about board compiles.
diff --git a/config/android/config.gni b/config/android/config.gni
index cc12ce7..392e125 100644
--- a/config/android/config.gni
+++ b/config/android/config.gni
@@ -69,7 +69,7 @@ if (is_android) {

# The default to use for android:minSdkVersion for targets that do
# not explicitly set it.
- default_min_sdk_version = 29
+ default_min_sdk_version = 21
if (is_cronet_build) {
# Cronet's min sdk version support policy is different from the rest of
# Chromium; Cronet explicitly supports older devices.
@@ -131,7 +131,7 @@ if (is_android) {
}

# Our build system no longer supports legacy multidex.
- min_supported_sdk_version = 23
+ min_supported_sdk_version = 21

# ASAN requires O MR1.
# https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid/01f8df1ac1a447a8475cdfcb03e8b13140042dbd#running-with-wrapsh-recommended
17 changes: 17 additions & 0 deletions patches/embedpdf-runtime/ios/libjpeg_turbo.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
diff --git a/BUILD.gn b/BUILD.gn
index 7e5ca70..3708d7a 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -11,9 +11,9 @@ if (current_cpu == "arm" || current_cpu == "arm64") {
import("//build/config/arm.gni")
}

-assert(
- use_blink,
- "This is not used if blink is not enabled, don't drag it in unintentionally")
+# assert(
+# use_blink,
+# "This is not used if blink is not enabled, don't drag it in unintentionally")

source_set("libjpeg_headers") {
sources = [
17 changes: 14 additions & 3 deletions patches/embedpdf-runtime/shared-library.patch
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
diff --git a/BUILD.gn b/BUILD.gn
index 62210c2f6..053fbff6d 100644
index fbdb13a4e..3b450b979 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -228,7 +228,7 @@ group("pdfium_public_headers") {
@@ -225,10 +225,18 @@ group("pdfium_public_headers") {
]
}

Expand All @@ -11,7 +11,18 @@ index 62210c2f6..053fbff6d 100644
output_name = "pdfium"
libs = []
configs += [ ":pdfium_strict_config" ]
@@ -263,6 +263,9 @@ component("pdfium") {
+ if (is_android) {
+ _configs = filter_exclude(configs, [
+ "//build/config/android:hide_all_but_jni_onload",
+ "//build/config/android:hide_all_but_jni",
+ ])
+ configs = []
+ configs = _configs
+ }
public_configs = [ ":pdfium_public_config" ]

deps = [
@@ -263,6 +269,9 @@ component("pdfium") {
"gdi32.lib",
"user32.lib",
]
Expand Down
7 changes: 7 additions & 0 deletions scripts/embedpdf-runtime/apply-patches.sh
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,13 @@ case "$TARGET" in
linux-*)
apply_patch_file "$SOURCE_DIR" "$PATCH_DIR/shared-library.patch"
;;
android-* | arm64-v8a | armeabi-v7a | x86 | x86_64)
apply_patch_file "$SOURCE_DIR" "$PATCH_DIR/shared-library.patch"
apply_patch_file "$SOURCE_DIR/build" "$PATCH_DIR/android/build.patch"
;;
ios-*)
apply_patch_file "$SOURCE_DIR/third_party/libjpeg_turbo" "$PATCH_DIR/ios/libjpeg_turbo.patch"
;;
*)
echo "unknown target: $TARGET" >&2
exit 1
Expand Down
60 changes: 54 additions & 6 deletions scripts/embedpdf-runtime/build-target.sh
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,44 @@ case "$TARGET" in
GN_TARGET_CPU="arm64"
PDF_IS_COMPLETE_LIB=false
;;
android-arm64 | arm64-v8a)
GN_TARGET_OS="android"
GN_TARGET_CPU="arm64"
PDF_IS_COMPLETE_LIB=false
;;
android-arm | armeabi-v7a)
GN_TARGET_OS="android"
GN_TARGET_CPU="arm"
PDF_IS_COMPLETE_LIB=false
;;
android-x64 | x86_64)
GN_TARGET_OS="android"
GN_TARGET_CPU="x64"
PDF_IS_COMPLETE_LIB=false
;;
android-x86 | x86)
GN_TARGET_OS="android"
GN_TARGET_CPU="x86"
PDF_IS_COMPLETE_LIB=false
;;
ios-arm64)
GN_TARGET_OS="ios"
GN_TARGET_CPU="arm64"
PDF_IS_COMPLETE_LIB=true
EXTRA_ARGS=$'\nios_enable_code_signing=false\ntarget_environment="device"'
;;
ios-simulator-arm64)
GN_TARGET_OS="ios"
GN_TARGET_CPU="arm64"
PDF_IS_COMPLETE_LIB=true
EXTRA_ARGS=$'\nios_enable_code_signing=false\nuse_ios_simulator=true\ntarget_environment="simulator"'
;;
ios-simulator-x64)
GN_TARGET_OS="ios"
GN_TARGET_CPU="x64"
PDF_IS_COMPLETE_LIB=true
EXTRA_ARGS=$'\nios_enable_code_signing=false\nuse_ios_simulator=true\ntarget_environment="simulator"'
;;
*)
echo "unknown target: $TARGET" >&2
exit 1
Expand All @@ -68,12 +106,22 @@ PDF_RUNTIME_TARGET_OS_LIST="${PDF_RUNTIME_TARGET_OS_LIST:-$GN_TARGET_OS}" \

"$SOURCE_DIR/scripts/embedpdf-runtime/apply-patches.sh" "$TARGET"

if [[ "$TARGET" == linux-* ]]; then
(
cd "$SOURCE_DIR"
build/install-build-deps.sh --no-prompt
build/linux/sysroot_scripts/install-sysroot.py "--arch=$GN_TARGET_CPU"
)
if [[ "$(uname)" == "Linux" ]]; then
if [[ "$TARGET" == linux-* || "$TARGET" == android-* || "$TARGET" == arm64-v8a || "$TARGET" == armeabi-v7a || "$TARGET" == x86 || "$TARGET" == x86_64 ]]; then
(
cd "$SOURCE_DIR"
if [[ "$TARGET" == android-* || "$TARGET" == arm64-v8a || "$TARGET" == armeabi-v7a || "$TARGET" == x86 || "$TARGET" == x86_64 ]]; then
# For android, we might need --android but it's often slow and interactive.
# Most runners have what's needed. Let's try without --android first but keep the base linux deps.
build/install-build-deps.sh --no-prompt --no-arm --no-chromeos-fonts
else
build/install-build-deps.sh --no-prompt
fi
if [[ "$GN_TARGET_OS" == "linux" ]]; then
build/linux/sysroot_scripts/install-sysroot.py "--arch=$GN_TARGET_CPU"
fi
)
fi
fi

OUT="$SOURCE_DIR/out/embedpdf-runtime/$TARGET"
Expand Down
61 changes: 61 additions & 0 deletions scripts/embedpdf-runtime/package-ios-simulator-universal.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
set -euo pipefail

SOURCE_DIR="${PDF_RUNTIME_SOURCE_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
ARTIFACT_DIR="${PDF_RUNTIME_ARTIFACT_DIR:-$SOURCE_DIR/out/embedpdf-runtime-artifacts}"

# This script combines ios-simulator-arm64 and ios-simulator-x64 into a single
# universal library and packages it. It expects that both targets have already
# been built and packaged with package-target.sh.

STAGING="$SOURCE_DIR/out/embedpdf-runtime-staging/ios-simulator-universal"
mkdir -p "$STAGING"

# Find the latest artifacts for both targets
ARM64_ARTIFACT=$(ls -t "$ARTIFACT_DIR"/libembedpdf-pdf-runtime-ios-simulator-arm64-*.tar.gz 2>/dev/null | head -n 1 || true)
X64_ARTIFACT=$(ls -t "$ARTIFACT_DIR"/libembedpdf-pdf-runtime-ios-simulator-x64-*.tar.gz 2>/dev/null | head -n 1 || true)

if [[ -z "$ARM64_ARTIFACT" || -z "$X64_ARTIFACT" ]]; then
echo "Error: Missing required artifacts for ios-simulator-arm64 and/or ios-simulator-x64" >&2
exit 1
fi

echo "Combining artifacts:"
echo " $ARM64_ARTIFACT"
echo " $X64_ARTIFACT"

TMP_ARM64="$STAGING/arm64"
TMP_X64="$STAGING/x64"
mkdir -p "$TMP_ARM64" "$TMP_X64"

tar -xzf "$ARM64_ARTIFACT" -C "$TMP_ARM64"
tar -xzf "$X64_ARTIFACT" -C "$TMP_X64"

# Combine with lipo
mkdir -p "$STAGING/lib"
lipo -create "$TMP_ARM64/lib/libpdfium.a" "$TMP_X64/lib/libpdfium.a" -output "$STAGING/lib/libpdfium.a"

# Copy headers and other metadata from arm64 (they should be identical)
cp -R "$TMP_ARM64/include" "$STAGING/include"
cp "$TMP_ARM64/args.gn" "$STAGING/args.gn"
if [[ -d "$TMP_ARM64/LICENSES" ]]; then
cp -R "$TMP_ARM64/LICENSES" "$STAGING/LICENSES"
fi

# Write metadata
cat > "$STAGING/BUILD-METADATA.json" <<EOF
{
"name": "embedpdf-pdf-runtime",
"target": "ios-arm64_x86_64-simulator",
"sha": "$(git -C "$SOURCE_DIR" rev-parse HEAD)",
"createdAt": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
}
EOF

# Package
SHORT_SHA=$(git -C "$SOURCE_DIR" rev-parse --short HEAD)
OUT_FILE="$ARTIFACT_DIR/libembedpdf-pdf-runtime-ios-arm64_x86_64-simulator-$SHORT_SHA.tar.gz"
mkdir -p "$(dirname "$OUT_FILE")"
tar -czf "$OUT_FILE" -C "$STAGING" .

echo "Created universal artifact: $OUT_FILE"
4 changes: 2 additions & 2 deletions scripts/embedpdf-runtime/package-target.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ case "$TARGET" in
LIB_SOURCE="$OUT/libpdfium.dylib"
LIB_DEST="$STAGING/lib/libpdfium.dylib"
;;
linux-*)
linux-*|android-*|arm64-v8a|armeabi-v7a|x86_64|x86)
LIB_SOURCE="$OUT/libpdfium.so"
LIB_DEST="$STAGING/lib/libpdfium.so"
;;
linuxmusl-*|wasm32)
ios-*|linuxmusl-*|wasm32)
LIB_SOURCE="$OUT/obj/libpdfium.a"
LIB_DEST="$STAGING/lib/libpdfium.a"
;;
Expand Down
2 changes: 2 additions & 0 deletions scripts/embedpdf-runtime/sync-deps.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ solutions = [
"managed": False,
"custom_vars": {
"checkout_configuration": "small",
$( [[ "$TARGET_OS_LIST" == *"android"* ]] && echo '"checkout_android": True,' )
$( [[ "$TARGET_OS_LIST" == *"ios"* ]] && echo '"checkout_ios": True,' )
},
},
]
Expand Down
Loading