libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

jxl.cmake (10147B)


      1 # Copyright (c) the JPEG XL Project Authors. All rights reserved.
      2 #
      3 # Use of this source code is governed by a BSD-style
      4 # license that can be found in the LICENSE file.
      5 
      6 include(jxl_lists.cmake)
      7 
      8 if (JPEGXL_ENABLE_TOOLS OR JPEGXL_ENABLE_DEVTOOLS OR JPEGXL_ENABLE_BOXES)
      9 list(APPEND JPEGXL_INTERNAL_DEC_SOURCES ${JPEGXL_INTERNAL_DEC_BOX_SOURCES})
     10 endif()
     11 
     12 if (JPEGXL_ENABLE_TRANSCODE_JPEG OR JPEGXL_ENABLE_TOOLS OR JPEGXL_ENABLE_DEVTOOLS)
     13 list(APPEND JPEGXL_INTERNAL_DEC_SOURCES ${JPEGXL_INTERNAL_DEC_JPEG_SOURCES})
     14 endif()
     15 
     16 set_source_files_properties(jxl/enc_fast_lossless.cc PROPERTIES COMPILE_FLAGS -O3)
     17 
     18 set(JPEGXL_DEC_INTERNAL_LIBS
     19   hwy
     20   Threads::Threads
     21   ${ATOMICS_LIBRARIES}
     22 )
     23 
     24 if (JPEGXL_ENABLE_TRANSCODE_JPEG OR JPEGXL_ENABLE_BOXES)
     25 list(APPEND JPEGXL_DEC_INTERNAL_LIBS brotlidec brotlicommon)
     26 endif()
     27 
     28 set(JPEGXL_INTERNAL_LIBS
     29   ${JPEGXL_DEC_INTERNAL_LIBS}
     30   brotlienc
     31 )
     32 
     33 if (JPEGXL_ENABLE_TRANSCODE_JPEG)
     34   list(APPEND JPEGXL_INTERNAL_FLAGS -DJPEGXL_ENABLE_TRANSCODE_JPEG=1)
     35 else()
     36   list(APPEND JPEGXL_INTERNAL_FLAGS -DJPEGXL_ENABLE_TRANSCODE_JPEG=0)
     37 endif ()
     38 
     39 if (JPEGXL_ENABLE_BOXES)
     40   list(APPEND JPEGXL_INTERNAL_FLAGS -DJPEGXL_ENABLE_BOXES=1)
     41 else()
     42   list(APPEND JPEGXL_INTERNAL_FLAGS -DJPEGXL_ENABLE_BOXES=0)
     43 endif ()
     44 
     45 set(OBJ_COMPILE_DEFINITIONS
     46   # Used to determine if we are building the library when defined or just
     47   # including the library when not defined. This is public so libjxl shared
     48   # library gets this define too.
     49   JXL_INTERNAL_LIBRARY_BUILD
     50 )
     51 
     52 # Generate version.h
     53 configure_file("jxl/version.h.in" "include/jxl/version.h")
     54 
     55 list(APPEND JPEGXL_INTERNAL_PUBLIC_HEADERS
     56   ${CMAKE_CURRENT_BINARY_DIR}/include/jxl/version.h)
     57 
     58 # Headers for exporting/importing public headers
     59 include(GenerateExportHeader)
     60 
     61 # CMake does not allow generate_export_header for INTERFACE library, so we
     62 # add this stub library just for file generation.
     63 add_library(jxl_export OBJECT ${JPEGXL_INTERNAL_PUBLIC_HEADERS} nothing.cc)
     64 set_target_properties(jxl_export PROPERTIES
     65   CXX_VISIBILITY_PRESET hidden
     66   VISIBILITY_INLINES_HIDDEN 1
     67   DEFINE_SYMBOL JXL_INTERNAL_LIBRARY_BUILD
     68   LINKER_LANGUAGE CXX
     69 )
     70 generate_export_header(jxl_export
     71   BASE_NAME JXL
     72   EXPORT_FILE_NAME include/jxl/jxl_export.h)
     73 # Place all public headers in a single directory.
     74 foreach(path ${JPEGXL_INTERNAL_PUBLIC_HEADERS})
     75   configure_file(
     76     ${path}
     77     ${path}
     78     COPYONLY
     79   )
     80 endforeach()
     81 
     82 add_library(jxl_base INTERFACE)
     83 target_include_directories(jxl_base SYSTEM INTERFACE
     84   "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>"
     85 )
     86 target_include_directories(jxl_base INTERFACE
     87   ${PROJECT_SOURCE_DIR}
     88   ${JXL_HWY_INCLUDE_DIRS}
     89 )
     90 
     91 # On android, link with log to use android-related log functions.
     92 if(CMAKE_SYSTEM_NAME STREQUAL "Android")
     93   find_library(log-lib log)
     94   if(log-lib)
     95     target_link_libraries(jxl_base INTERFACE ${log-lib})
     96     target_compile_definitions(jxl_base INTERFACE USE_ANDROID_LOGGER)
     97   endif()
     98 endif()
     99 
    100 add_dependencies(jxl_base jxl_export)
    101 
    102 # Decoder-only object library
    103 add_library(jxl_dec-obj OBJECT ${JPEGXL_INTERNAL_DEC_SOURCES})
    104 target_compile_options(jxl_dec-obj PRIVATE ${JPEGXL_INTERNAL_FLAGS})
    105 target_compile_options(jxl_dec-obj PUBLIC ${JPEGXL_COVERAGE_FLAGS})
    106 set_property(TARGET jxl_dec-obj PROPERTY POSITION_INDEPENDENT_CODE ON)
    107 target_include_directories(jxl_dec-obj PUBLIC
    108   "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>"
    109   "${JXL_HWY_INCLUDE_DIRS}"
    110   "$<BUILD_INTERFACE:$<TARGET_PROPERTY:brotlicommon,INTERFACE_INCLUDE_DIRECTORIES>>"
    111 )
    112 target_compile_definitions(jxl_dec-obj PUBLIC
    113   ${OBJ_COMPILE_DEFINITIONS}
    114 )
    115 target_link_libraries(jxl_dec-obj PUBLIC jxl_base)
    116 
    117 # Object library. This is used to hold the set of objects and properties.
    118 add_library(jxl_enc-obj OBJECT ${JPEGXL_INTERNAL_ENC_SOURCES})
    119 target_compile_options(jxl_enc-obj PRIVATE ${JPEGXL_INTERNAL_FLAGS})
    120 target_compile_options(jxl_enc-obj PUBLIC ${JPEGXL_COVERAGE_FLAGS})
    121 set_property(TARGET jxl_enc-obj PROPERTY POSITION_INDEPENDENT_CODE ON)
    122 target_include_directories(jxl_enc-obj PUBLIC
    123   ${PROJECT_SOURCE_DIR}
    124   ${JXL_HWY_INCLUDE_DIRS}
    125   $<TARGET_PROPERTY:brotlicommon,INTERFACE_INCLUDE_DIRECTORIES>
    126 )
    127 target_compile_definitions(jxl_enc-obj PUBLIC
    128   ${OBJ_COMPILE_DEFINITIONS}
    129 )
    130 target_link_libraries(jxl_enc-obj PUBLIC jxl_base)
    131 
    132 set_target_properties(jxl_dec-obj PROPERTIES
    133   CXX_VISIBILITY_PRESET hidden
    134   VISIBILITY_INLINES_HIDDEN 1
    135   DEFINE_SYMBOL JXL_INTERNAL_LIBRARY_BUILD
    136 )
    137 
    138 set_target_properties(jxl_enc-obj PROPERTIES
    139   CXX_VISIBILITY_PRESET hidden
    140   VISIBILITY_INLINES_HIDDEN 1
    141   DEFINE_SYMBOL JXL_INTERNAL_LIBRARY_BUILD
    142 )
    143 
    144 # Private static library. This exposes all the internal functions and is used
    145 # for tests.
    146 add_library(jxl_dec-internal STATIC
    147   $<TARGET_OBJECTS:jxl_dec-obj>
    148   ${JXL_CMS_OBJECTS}
    149 )
    150 target_link_libraries(jxl_dec-internal PUBLIC
    151   ${JPEGXL_COVERAGE_FLAGS}
    152   ${JPEGXL_DEC_INTERNAL_LIBS}
    153   jxl_base
    154 )
    155 
    156 # The list of objects in the static and shared libraries.
    157 set(JPEGXL_INTERNAL_OBJECTS
    158   $<TARGET_OBJECTS:jxl_enc-obj>
    159   $<TARGET_OBJECTS:jxl_dec-obj>
    160 )
    161 
    162 # Private static library. This exposes all the internal functions and is used
    163 # for tests.
    164 # TODO(lode): once the source files are correctly split so that it is possible
    165 # to do, remove $<TARGET_OBJECTS:jxl_dec-obj> here and depend on jxl_dec-internal
    166 add_library(jxl-internal STATIC
    167   ${JPEGXL_INTERNAL_OBJECTS}
    168 )
    169 target_link_libraries(jxl-internal PUBLIC
    170   ${JPEGXL_COVERAGE_FLAGS}
    171   ${JPEGXL_INTERNAL_LIBS}
    172   jxl_cms
    173   jxl_base
    174 )
    175 target_include_directories(jxl-internal PUBLIC
    176   "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>")
    177 
    178 target_compile_definitions(jxl-internal INTERFACE -DJXL_STATIC_DEFINE)
    179 target_compile_definitions(jxl_dec-internal INTERFACE -DJXL_STATIC_DEFINE)
    180 target_compile_definitions(jxl-internal INTERFACE -DJXL_STATIC_DEFINE)
    181 target_compile_definitions(jxl_dec-internal INTERFACE -DJXL_STATIC_DEFINE)
    182 
    183 # TODO(deymo): Move TCMalloc linkage to the tools/ directory since the library
    184 # shouldn't do any allocs anyway.
    185 if(JPEGXL_ENABLE_TCMALLOC)
    186   pkg_check_modules(TCMallocMinimal REQUIRED IMPORTED_TARGET
    187       libtcmalloc_minimal)
    188   # tcmalloc 2.8 has concurrency issues that makes it sometimes return nullptr
    189   # for large allocs. See https://github.com/gperftools/gperftools/issues/1204
    190   # for details.
    191   if(TCMallocMinimal_VERSION VERSION_EQUAL 2.8)
    192     message(FATAL_ERROR
    193         "tcmalloc version 2.8 has a concurrency bug. You have installed "
    194         "version ${TCMallocMinimal_VERSION}, please either downgrade tcmalloc "
    195         "to version 2.7, upgrade to 2.8.1 or newer or pass "
    196         "-DJPEGXL_ENABLE_TCMALLOC=OFF to jpeg-xl cmake line. See the following "
    197         "bug for details:\n"
    198         "   https://github.com/gperftools/gperftools/issues/1204\n")
    199   endif()
    200   target_link_libraries(jxl-internal PUBLIC PkgConfig::TCMallocMinimal)
    201 endif()  # JPEGXL_ENABLE_TCMALLOC
    202 
    203 # Public library.
    204 add_library(jxl ${JPEGXL_INTERNAL_OBJECTS})
    205 strip_internal(JPEGXL_INTERNAL_SHARED_LIBS JPEGXL_INTERNAL_LIBS)
    206 target_link_libraries(jxl PUBLIC ${JPEGXL_COVERAGE_FLAGS} jxl_base)
    207 target_link_libraries(jxl PUBLIC jxl_cms)
    208 target_link_libraries(jxl PRIVATE ${JPEGXL_INTERNAL_SHARED_LIBS})
    209 set_target_properties(jxl PROPERTIES
    210   VERSION ${JPEGXL_LIBRARY_VERSION}
    211   SOVERSION ${JPEGXL_LIBRARY_SOVERSION})
    212 
    213 # Public decoder library.
    214 add_library(jxl_dec $<TARGET_OBJECTS:jxl_dec-obj>)
    215 strip_internal(JPEGXL_DEC_INTERNAL_SHARED_LIBS JPEGXL_DEC_INTERNAL_LIBS)
    216 target_link_libraries(jxl_dec PUBLIC ${JPEGXL_COVERAGE_FLAGS} jxl_base)
    217 target_link_libraries(jxl_dec PRIVATE ${JPEGXL_DEC_INTERNAL_SHARED_LIBS})
    218 set_target_properties(jxl_dec PROPERTIES
    219   VERSION ${JPEGXL_LIBRARY_VERSION}
    220   SOVERSION ${JPEGXL_LIBRARY_SOVERSION})
    221 
    222 # Check whether the linker support excluding libs
    223 set(LINKER_EXCLUDE_LIBS_FLAG "-Wl,--exclude-libs=ALL")
    224 include(CheckCSourceCompiles)
    225 list(APPEND CMAKE_EXE_LINKER_FLAGS ${LINKER_EXCLUDE_LIBS_FLAG})
    226 check_c_source_compiles("int main(){return 0;}" LINKER_SUPPORT_EXCLUDE_LIBS)
    227 list(REMOVE_ITEM CMAKE_EXE_LINKER_FLAGS ${LINKER_EXCLUDE_LIBS_FLAG})
    228 
    229 if(NOT BUILD_SHARED_LIBS)
    230   target_compile_definitions(jxl PUBLIC -DJXL_STATIC_DEFINE)
    231   target_compile_definitions(jxl_dec PUBLIC -DJXL_STATIC_DEFINE)
    232 endif()
    233 
    234 # Add a jxl.version file as a version script to tag symbols with the
    235 # appropriate version number. This script is also used to limit what's exposed
    236 # in the shared library from the static dependencies bundled here.
    237 foreach(target IN ITEMS jxl jxl_dec)
    238   set_target_properties(${target} PROPERTIES
    239       LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/jxl/jxl.version)
    240   if(APPLE)
    241   set_property(TARGET ${target} APPEND_STRING PROPERTY
    242       LINK_FLAGS "-Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/jxl/jxl_osx.syms")
    243   elseif(WIN32)
    244     # Nothing needed here, we use __declspec(dllexport) (jxl_export.h)
    245   else()
    246   set_property(TARGET ${target} APPEND_STRING PROPERTY
    247       LINK_FLAGS " -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/jxl/jxl.version")
    248   endif()  # APPLE
    249   # This hides the default visibility symbols from static libraries bundled into
    250   # the shared library. In particular this prevents exposing symbols from hwy
    251   # and skcms in the shared library.
    252   if(LINKER_SUPPORT_EXCLUDE_LIBS)
    253     set_property(TARGET ${target} APPEND_STRING PROPERTY
    254         LINK_FLAGS " ${LINKER_EXCLUDE_LIBS_FLAG}")
    255   endif()
    256 endforeach()
    257 
    258 # Only install libjxl public library. The libjxl_dec is not installed since it
    259 # contains symbols also in libjxl which would conflict if programs try to use
    260 # both.
    261 install(TARGETS jxl
    262   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    263   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    264   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
    265 
    266 # Add a pkg-config file for libjxl.
    267 set(JPEGXL_LIBRARY_REQUIRES
    268     "libhwy libbrotlienc libbrotlidec libjxl_cms")
    269 
    270 if (BUILD_SHARED_LIBS)
    271   set(JPEGXL_REQUIRES_TYPE "Requires.private")
    272   set(JPEGXL_PRIVATE_LIBS "-lm ${PKGCONFIG_CXX_LIB}")
    273 else()
    274   set(JPEGXL_REQUIRES_TYPE "Requires")
    275   set(JPEGXL_PUBLIC_LIBS "-lm ${PKGCONFIG_CXX_LIB}")
    276 endif()
    277 
    278 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/jxl/libjxl.pc.in"
    279                "libjxl.pc" @ONLY)
    280 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libjxl.pc"
    281   DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")