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")