diff --git a/.github/actions/setup-libraries/action.yml b/.github/actions/setup-libraries/action.yml index 97ce80f..3da28f1 100644 --- a/.github/actions/setup-libraries/action.yml +++ b/.github/actions/setup-libraries/action.yml @@ -8,7 +8,7 @@ runs: using: "composite" steps: - name: Install dependencies - run: sudo apt install gperf gettext autopoint + run: sudo apt install gperf gettext autopoint nasm shell: bash - name: Running autogen.sh in unibreak diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dfac933..7930b2d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Download artifact - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v8 with: path: artifacts diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 9daff7b..be3b5e2 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: submodules: true @@ -45,7 +45,7 @@ jobs: working-directory: build run: cmake --build . - - uses: actions/upload-artifact@v5 + - uses: actions/upload-artifact@v7 with: name: build-${{ matrix.ANDROID_ABI }} path: | diff --git a/.gitmodules b/.gitmodules index a72eba9..07c1626 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,6 @@ [submodule "src/unibreak"] path = src/unibreak url = https://github.com/adah1972/libunibreak.git - branch = libunibreak_6_1 [submodule "src/harfbuzz"] path = src/harfbuzz url = https://github.com/harfbuzz/harfbuzz.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 86d0563..c32d758 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,16 +11,6 @@ set(EXTERNAL_PROJECT_CMAKE_ARGS include(${CMAKE_TOOLCHAIN_FILE}) -# fribidi and unibreak can't match ANDROID_HOST_TAG!!! -if(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux) - set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64-linux") -elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) - set(ANDROID_HOST_TAG darwin-x86_64) - set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64-darwin") -elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) - set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64-windows") -endif() - # # Set some convenience variables. # @@ -42,23 +32,33 @@ set(PLATFORM_COMPILE_ENV_CMDS OBJDUMP=${CMAKE_OBJDUMP} RANLIB=${CMAKE_RANLIB} STRIP=${CMAKE_STRIP} - PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/lib/pkgconfig) + PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/lib/pkgconfig + PKG_CONFIG_LIBDIR=) set(PLATFORM_COMPILE_ENV_FLAGS - "CFLAGS=${CMAKE_C_FLAGS} -fPIC --target=${CMAKE_C_COMPILER_TARGET}" - "CXXFLAGS=${CMAKE_CXX_FLAGS} -fPIC --target=${CMAKE_CXX_COMPILER_TARGET}" + "CFLAGS=${CMAKE_C_FLAGS} --target=${CMAKE_C_COMPILER_TARGET}" + "CXXFLAGS=${CMAKE_CXX_FLAGS} --target=${CMAKE_CXX_COMPILER_TARGET}" "LDFLAGS=${CMAKE_SHARED_LINKER_FLAGS} --target=${CMAKE_C_COMPILER_TARGET}" - "ASFLAGS= -fPIC" - "YASMFLAGS= -fPIC" ) set(PLATFORM_CONFIGURE_ENV ${PLATFORM_COMPILE_ENV_CMDS} ${PLATFORM_COMPILE_ENV_FLAGS}) +# From https://developer.android.com/ndk/guides/other_build_systems#autoconf +if(CMAKE_ANDROID_ARCH STREQUAL "arm") + set(HOST_TRIPLET "armv7a-linux-androideabi") +elseif(CMAKE_ANDROID_ARCH STREQUAL "arm64") + set(HOST_TRIPLET "aarch64-linux-android") +elseif(CMAKE_ANDROID_ARCH STREQUAL "x86") + set(HOST_TRIPLET "i686-linux-android") +elseif(CMAKE_ANDROID_ARCH STREQUAL "x86_64") + set(HOST_TRIPLET "x86_64-linux-android") +else() + message(FATAL_ERROR "Unsupported CMAKE_ANDROID_ARCH: ${CMAKE_ANDROID_ARCH}") +endif() + set(PLATFORM_BUILD_AND_HOST - "--build=${CMAKE_HOST_SYSTEM_PROCESSOR}" - "--host=${CMAKE_C_COMPILER_TARGET}" - "--target=${CMAKE_C_COMPILER_TARGET}" + "--host=${HOST_TRIPLET}" ) # @@ -83,6 +83,7 @@ if(EXISTS ${PROJECT_SOURCE_DIR}/cmake/files/meson-cross-android.in) unset(MESON_SYSTEM_CPU_FAMILY) endif() +include(cmake/zlib.cmake) include(cmake/unibreak.cmake) include(cmake/fribidi.cmake) include(cmake/freetype.cmake) diff --git a/README.md b/README.md index 5d6a301..ee93b52 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,13 @@ Build libass for Android. ## library version -* [unibreak](https://github.com/adah1972/libunibreak) [v6.1](https://github.com/adah1972/libunibreak/releases/tag/libunibreak_6_1) -* [harfbuzz](https://github.com/harfbuzz/harfbuzz) [v11.3.3](https://github.com/harfbuzz/harfbuzz/releases/tag/11.2.1) +* [unibreak](https://github.com/adah1972/libunibreak) [v7.0](https://github.com/adah1972/libunibreak/releases/tag/libunibreak_7_0) +* [harfbuzz](https://github.com/harfbuzz/harfbuzz) [v14.4.0](https://github.com/harfbuzz/harfbuzz/releases/tag/14.4.0) * [fribidi](https://github.com/fribidi/fribidi) [v1.0.16](https://github.com/fribidi/fribidi/releases/tag/v1.0.16) -* [freetype](https://gitlab.freedesktop.org/freetype/freetype) [v2.13.3](https://gitlab.freedesktop.org/freetype/freetype/-/tags/VER-2-13-3) -* [expat](https://github.com/libexpat/libexpat) [2.7.1](https://github.com/libexpat/libexpat/releases/tag/R_2_7_1) -* [fontconfig](https://gitlab.freedesktop.org/fontconfig/fontconfig) [master with daa175d2](https://gitlab.freedesktop.org/fontconfig/fontconfig/-/commit/daa175d234b8a362eedd4c18c33537cc2d19cd98) -* [ass](https://github.com/libass/libass) [v0.17.4](https://github.com/libass/libass/releases/tag/0.17.4) +* [freetype](https://gitlab.freedesktop.org/freetype/freetype) [v2.14.3](https://gitlab.freedesktop.org/freetype/freetype/-/tags/VER-2-14-3) +* [expat](https://github.com/libexpat/libexpat) [2.8.4](https://github.com/libexpat/libexpat/releases/tag/R_2_8_4) +* [fontconfig](https://gitlab.freedesktop.org/fontconfig/fontconfig) [v2.18.3](https://gitlab.freedesktop.org/fontconfig/fontconfig/-/tags/2.18.3) +* [ass](https://github.com/libass/libass) [v0.17.5](https://github.com/libass/libass/releases/tag/0.17.5) ## how to use @@ -24,11 +24,11 @@ Build libass for Android. ### autogen ``` -cd ./src/unibreak && ./autogen.sh -cd ./src/fribidi && ./autogen.sh -cd ./src/fontconfig && ./autogen.sh -cd ./src/expat/expat && ./buildconf.sh -cd ./src/ass && ./autogen.sh +cd ./src/unibreak && NOCONFIGURE=1 ./autogen.sh && cd - +cd ./src/fribidi && NOCONFIGURE=1 ./autogen.sh && cd - +cd ./src/fontconfig && NOCONFIGURE=1 ./autogen.sh && cd - +cd ./src/expat/expat && ./buildconf.sh && cd - +cd ./src/ass && ./autogen.sh && cd - ``` ### add ass cmake to CMakeList.txt diff --git a/cmake/ass.cmake b/cmake/ass.cmake index 0bcc4a6..644eb94 100644 --- a/cmake/ass.cmake +++ b/cmake/ass.cmake @@ -1,4 +1,12 @@ cmake_minimum_required(VERSION 3.10) + +if(NOT CMAKE_ANDROID_ARCH STREQUAL "arm") + set(ASS_ASM_ARG "--enable-asm") +else() + # libass doesn't support arm 32 bits asm. + set(ASS_ASM_ARG "--disable-asm") +endif() + ExternalProject_Add(ep_ass DEPENDS ep_fontconfig ep_harfbuzz ep_freetype ep_fribidi ep_unibreak SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} @@ -11,8 +19,10 @@ ExternalProject_Add(ep_ass --prefix= --enable-static --disable-shared + --with-pic --enable-fontconfig --enable-libunibreak + ${ASS_ASM_ARG} --srcdir=/ BUILD_COMMAND make INSTALL_COMMAND make install diff --git a/cmake/expat.cmake b/cmake/expat.cmake index 1a34d3e..34ad635 100644 --- a/cmake/expat.cmake +++ b/cmake/expat.cmake @@ -9,6 +9,7 @@ ExternalProject_Add(ep_expat --prefix= --enable-static --disable-shared + --with-pic --without-tests --without-docbook BUILD_COMMAND make diff --git a/cmake/fontconfig.cmake b/cmake/fontconfig.cmake index 3ce50ec..28f47e1 100644 --- a/cmake/fontconfig.cmake +++ b/cmake/fontconfig.cmake @@ -5,10 +5,18 @@ ExternalProject_Add(ep_fontconfig INSTALL_DIR ${CMAKE_BINARY_DIR} CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ${PLATFORM_CONFIGURE_ENV} + # m4/va_copy.m4 AC_RUN_IFELSE has no cross-compiling fallback. + # Due to that, the check fails with: + # checking for va_copy() function... configure: error: in `PATH/libass-cmake/build/ep_fontconfig-prefix/src/ep_fontconfig-build': + # configure: error: cannot run test program while cross compiling + # To avoid this failure, set its cache variable to skip the runtime check. + # The NDK toolchain always provides C99 va_copy(). + ac_cv_va_copy=C99 //configure ${PLATFORM_BUILD_AND_HOST} --prefix= --enable-static --disable-shared + --with-pic BUILD_COMMAND make INSTALL_COMMAND make install ) \ No newline at end of file diff --git a/cmake/fribidi.cmake b/cmake/fribidi.cmake index 9b075ff..ba4d1cf 100644 --- a/cmake/fribidi.cmake +++ b/cmake/fribidi.cmake @@ -9,8 +9,7 @@ ExternalProject_Add(ep_fribidi --prefix= --enable-static --disable-shared - --disable-docs - --disable-option-checking + --with-pic BUILD_COMMAND make INSTALL_COMMAND make install ) diff --git a/cmake/unibreak.cmake b/cmake/unibreak.cmake index 3922a67..a351a0b 100644 --- a/cmake/unibreak.cmake +++ b/cmake/unibreak.cmake @@ -9,6 +9,7 @@ ExternalProject_Add(ep_unibreak --prefix= --enable-static --disable-shared + --with-pic BUILD_COMMAND make INSTALL_COMMAND make install ) diff --git a/cmake/zlib.cmake b/cmake/zlib.cmake new file mode 100644 index 0000000..be3411c --- /dev/null +++ b/cmake/zlib.cmake @@ -0,0 +1,23 @@ +# The Android NDK toolchain ships its own zlib in the sysroot, +# but it does not provide a zlib.pc. +# Since freetype's generated freetype2.pc declares `Requires.private: +# zlib`, pkg-config needs a zlib.pc to resolve that dependency. +set(NDK_ZLIB_HEADER "${CMAKE_SYSROOT}/usr/include/zlib.h") +set(NDK_ZLIB_VERSION "1.0.0") +if(EXISTS ${NDK_ZLIB_HEADER}) + file(STRINGS ${NDK_ZLIB_HEADER} NDK_ZLIB_VERSION_LINE REGEX "#define ZLIB_VERSION ") + string(REGEX REPLACE ".*#define ZLIB_VERSION \"([^\"]+)\".*" "\\1" NDK_ZLIB_VERSION "${NDK_ZLIB_VERSION_LINE}") +endif() + +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib/pkgconfig) +file(WRITE ${CMAKE_BINARY_DIR}/lib/pkgconfig/zlib.pc +"Name: zlib +Description: zlib compression library (provided by the Android NDK toolchain) +Version: ${NDK_ZLIB_VERSION} +Libs: -lz +Cflags: +") + +unset(NDK_ZLIB_HEADER) +unset(NDK_ZLIB_VERSION) +unset(NDK_ZLIB_VERSION_LINE) diff --git a/src/ass b/src/ass index bbb3c7f..4a05d81 160000 --- a/src/ass +++ b/src/ass @@ -1 +1 @@ -Subproject commit bbb3c7f1570a4a021e52683f3fbdf74fe492ae84 +Subproject commit 4a05d8127f525943ebf45fdc6497c9e665947f0d diff --git a/src/expat b/src/expat index f9a3eeb..12cf0b1 160000 --- a/src/expat +++ b/src/expat @@ -1 +1 @@ -Subproject commit f9a3eeb3e09fbea04b1c451ffc422ab2f1e45744 +Subproject commit 12cf0b1f25f026a022fe728ad8f7e3d017285b80 diff --git a/src/fontconfig b/src/fontconfig index daa175d..0f23672 160000 --- a/src/fontconfig +++ b/src/fontconfig @@ -1 +1 @@ -Subproject commit daa175d234b8a362eedd4c18c33537cc2d19cd98 +Subproject commit 0f236723a3c26bd9745e32ba2b3ee21e5f809295 diff --git a/src/freetype b/src/freetype index 42608f7..0a0221a 160000 --- a/src/freetype +++ b/src/freetype @@ -1 +1 @@ -Subproject commit 42608f77f20749dd6ddc9e0536788eaad70ea4b5 +Subproject commit 0a0221a1347e2f1e07c395263540026e9a0aa7c7 diff --git a/src/harfbuzz b/src/harfbuzz index c3fcbff..36cb489 160000 --- a/src/harfbuzz +++ b/src/harfbuzz @@ -1 +1 @@ -Subproject commit c3fcbffa651cea70400552f2a8bd695ad11023c1 +Subproject commit 36cb489cb02ce4b92099669ba9f9bea348eff93f diff --git a/src/unibreak b/src/unibreak index 304585d..3ce4bfa 160000 --- a/src/unibreak +++ b/src/unibreak @@ -1 +1 @@ -Subproject commit 304585d8e2d63187507368d612c3d5fff1486368 +Subproject commit 3ce4bfa3129ff3738046a44a6db533d2ce25af2b