tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

jxl.cmake (10233B)


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