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