From e1ef308c50110639d5fff4877c9ff817e6d03482 Mon Sep 17 00:00:00 2001 From: Go Kudo Date: Mon, 3 Nov 2025 07:59:23 +0900 Subject: [PATCH] build(CMake): Improve jpegli support for iOS/Android/Emscripten --- AUTHORS | 1 + CMakeLists.txt | 21 +++++++++++++++++ lib/jpegli.cmake | 50 ++++++++++++++++++++++++----------------- lib/jpegli/jpeg.list.62 | 4 ++++ lib/jpegli/jpeg.list.8 | 2 ++ 5 files changed, 58 insertions(+), 20 deletions(-) create mode 100644 lib/jpegli/jpeg.list.62 create mode 100644 lib/jpegli/jpeg.list.8 diff --git a/AUTHORS b/AUTHORS index 8bcb2d694c2..7b325bacd98 100644 --- a/AUTHORS +++ b/AUTHORS @@ -65,6 +65,7 @@ Galaxy4594 <164440799+Galaxy4594@users.noreply.github.com> Gerhard Huber gi-man Gilles Devillers (GilDev) +Go Kudo Heiko Becker Ivan Kokorev Ivan Siutsou (Melirius) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb981694983..1672e519080 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -123,6 +123,17 @@ else() message(STATUS "libjpeg-turbo submodule is absent; not enabling jpegli") endif() +set(JPEGXL_PLATFORM_IOS OFF) +if(APPLE) + if(DEFINED IOS AND IOS) + set(JPEGXL_PLATFORM_IOS ON) + elseif(CMAKE_SYSTEM_NAME MATCHES "iOS|tvOS|watchOS") + set(JPEGXL_PLATFORM_IOS ON) + elseif(DEFINED CMAKE_OSX_SYSROOT AND CMAKE_OSX_SYSROOT MATCHES "(iphone|appletv|watch).*os") + set(JPEGXL_PLATFORM_IOS ON) + endif() +endif() + include(TestBigEndian) test_big_endian(ARCH_IS_BIG_ENDIAN) if(ARCH_IS_BIG_ENDIAN) @@ -152,6 +163,16 @@ set(JPEGXL_ENABLE_JPEGLI ${ENABLE_JPEGLI_DEFAULT} CACHE BOOL "Build jpegli library.") set(JPEGXL_ENABLE_JPEGLI_LIBJPEG true CACHE BOOL "Build libjpeg.so shared library based on jpegli.") +set(_jpegli_libjpeg_only_obj_default OFF) +if(EMSCRIPTEN OR JPEGXL_PLATFORM_IOS) + set(_jpegli_libjpeg_only_obj_default ON) +endif() +if(NOT DEFINED JPEGXL_ENABLE_JPEGLI_LIBJPEG_ONLY_OBJ) + set(JPEGXL_ENABLE_JPEGLI_LIBJPEG_ONLY_OBJ ${_jpegli_libjpeg_only_obj_default}) +endif() +set(JPEGXL_ENABLE_JPEGLI_LIBJPEG_ONLY_OBJ "${JPEGXL_ENABLE_JPEGLI_LIBJPEG_ONLY_OBJ}" CACHE BOOL + "Build libjpeg compatible library based on jpegli, but only as an object." FORCE) +unset(_jpegli_libjpeg_only_obj_default) set(JPEGXL_INSTALL_JPEGLI_LIBJPEG false CACHE BOOL "Install jpegli version of libjpeg.so system-wide.") set(JPEGLI_LIBJPEG_LIBRARY_VERSION "62.3.0" CACHE STRING diff --git a/lib/jpegli.cmake b/lib/jpegli.cmake index 9c90ec5f3e1..1bc61e09758 100644 --- a/lib/jpegli.cmake +++ b/lib/jpegli.cmake @@ -30,20 +30,19 @@ configure_file( configure_file( ../third_party/libjpeg-turbo/jmorecfg.h include/jpegli/jmorecfg.h COPYONLY) -add_library(jpegli-static STATIC EXCLUDE_FROM_ALL "${JPEGXL_INTERNAL_JPEGLI_SOURCES}") -target_compile_options(jpegli-static PRIVATE "${JPEGXL_INTERNAL_FLAGS}") -target_compile_options(jpegli-static PUBLIC ${JPEGXL_COVERAGE_FLAGS}) -set_property(TARGET jpegli-static PROPERTY POSITION_INDEPENDENT_CODE ON) -target_include_directories(jpegli-static PRIVATE - "$" - "$" - "$" - "${JXL_HWY_INCLUDE_DIRS}" -) -target_include_directories(jpegli-static PUBLIC - "$" -) -target_link_libraries(jpegli-static PUBLIC ${JPEGLI_INTERNAL_LIBS}) +add_library(jpegli-static-obj OBJECT "${JPEGXL_INTERNAL_JPEGLI_SOURCES}") +set_property(TARGET jpegli-static-obj PROPERTY POSITION_INDEPENDENT_CODE ON) +target_compile_options(jpegli-static-obj PRIVATE "${JPEGXL_INTERNAL_FLAGS}") +target_compile_options(jpegli-static-obj PUBLIC ${JPEGXL_COVERAGE_FLAGS}) +target_include_directories(jpegli-static-obj + PRIVATE "$" "${JXL_HWY_INCLUDE_DIRS}" + PUBLIC + "$" + "$") +target_link_libraries(jpegli-static-obj PUBLIC ${JPEGLI_INTERNAL_LIBS}) + +add_library(jpegli-static STATIC EXCLUDE_FROM_ALL $) +target_link_libraries(jpegli-static PUBLIC jpegli-static-obj) # # Tests for jpegli-static @@ -107,13 +106,14 @@ endif() # Build libjpeg.so that links to libjpeg-static # -if (JPEGXL_ENABLE_JPEGLI_LIBJPEG AND NOT APPLE AND NOT WIN32 AND NOT EMSCRIPTEN) +if (JPEGXL_ENABLE_JPEGLI_LIBJPEG AND NOT WIN32) add_library(jpegli-libjpeg-obj OBJECT "${JPEGXL_INTERNAL_JPEGLI_WRAPPER_SOURCES}") target_compile_options(jpegli-libjpeg-obj PRIVATE ${JPEGXL_INTERNAL_FLAGS}) target_compile_options(jpegli-libjpeg-obj PUBLIC ${JPEGXL_COVERAGE_FLAGS}) set_property(TARGET jpegli-libjpeg-obj PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(jpegli-libjpeg-obj PRIVATE "$" + "$" "$" ) target_compile_definitions(jpegli-libjpeg-obj PUBLIC @@ -121,6 +121,7 @@ target_compile_definitions(jpegli-libjpeg-obj PUBLIC ) set(JPEGLI_LIBJPEG_INTERNAL_OBJECTS $) +if(NOT JPEGXL_ENABLE_JPEGLI_LIBJPEG_ONLY_OBJ) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/jpegli) add_library(jpeg SHARED ${JPEGLI_LIBJPEG_INTERNAL_OBJECTS}) target_link_libraries(jpeg PUBLIC ${JPEGXL_COVERAGE_FLAGS}) @@ -131,12 +132,19 @@ set_target_properties(jpeg PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/jpegli" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/jpegli") -# Add a jpeg.version file as a version script to tag symbols with the +# Add a jpeg.version or jpeg.list file as a version script to tag symbols with the # appropriate version number. -set_target_properties(jpeg PROPERTIES - LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.version.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}) -set_property(TARGET jpeg APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.version.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}") +if (LINUX) + set_target_properties(jpeg PROPERTIES + LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.version.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}) + set_property(TARGET jpeg APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.version.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}") +elseif(APPLE) + set_target_properties(jpeg PROPERTIES + LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.list.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}) + set_property(TARGET jpeg APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.list.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}") +endif() if (JPEGXL_INSTALL_JPEGLI_LIBJPEG) install(TARGETS jpeg @@ -155,4 +163,6 @@ if(LINKER_SUPPORT_EXCLUDE_LIBS) set_property(TARGET jpeg APPEND_STRING PROPERTY LINK_FLAGS " ${LINKER_EXCLUDE_LIBS_FLAG}") endif() + +endif() endif() diff --git a/lib/jpegli/jpeg.list.62 b/lib/jpegli/jpeg.list.62 new file mode 100644 index 00000000000..773976f77dd --- /dev/null +++ b/lib/jpegli/jpeg.list.62 @@ -0,0 +1,4 @@ +_jpeg* +_tj* +_jpeg_mem_src* +_jpeg_mem_dest* diff --git a/lib/jpegli/jpeg.list.8 b/lib/jpegli/jpeg.list.8 new file mode 100644 index 00000000000..4ddc63d8c43 --- /dev/null +++ b/lib/jpegli/jpeg.list.8 @@ -0,0 +1,2 @@ +_jpeg* +_tj*