jxl_extras.cmake (6631B)
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 # Object library for those parts of extras that do not depend on jxl internals 9 # or jpegli. We will create two versions of these object files, one with and one 10 # without external codec support compiled in. 11 list(APPEND JPEGXL_EXTRAS_CORE_SOURCES 12 "${JPEGXL_INTERNAL_EXTRAS_SOURCES}" 13 "${JPEGXL_INTERNAL_CODEC_APNG_SOURCES}" 14 "${JPEGXL_INTERNAL_CODEC_EXR_SOURCES}" 15 "${JPEGXL_INTERNAL_CODEC_JPG_SOURCES}" 16 "${JPEGXL_INTERNAL_CODEC_JXL_SOURCES}" 17 "${JPEGXL_INTERNAL_CODEC_PGX_SOURCES}" 18 "${JPEGXL_INTERNAL_CODEC_PNM_SOURCES}" 19 "${JPEGXL_INTERNAL_CODEC_NPY_SOURCES}" 20 extras/dec/gif.cc 21 extras/dec/gif.h 22 ) 23 foreach(LIB jxl_extras_core-obj jxl_extras_core_nocodec-obj) 24 add_library("${LIB}" OBJECT "${JPEGXL_EXTRAS_CORE_SOURCES}") 25 list(APPEND JXL_EXTRAS_OBJECT_LIBRARIES "${LIB}") 26 endforeach() 27 list(APPEND JXL_EXTRAS_OBJECTS $<TARGET_OBJECTS:jxl_extras_core-obj>) 28 29 # Object library for those parts of extras that depend on jxl internals. 30 add_library(jxl_extras_internal-obj OBJECT 31 "${JPEGXL_INTERNAL_EXTRAS_FOR_TOOLS_SOURCES}" 32 ) 33 list(APPEND JXL_EXTRAS_OBJECT_LIBRARIES jxl_extras_internal-obj) 34 list(APPEND JXL_EXTRAS_OBJECTS $<TARGET_OBJECTS:jxl_extras_internal-obj>) 35 36 set(JXL_EXTRAS_CODEC_INTERNAL_LIBRARIES) 37 38 find_package(GIF 5.1) 39 if(GIF_FOUND) 40 target_include_directories(jxl_extras_core-obj PRIVATE "${GIF_INCLUDE_DIRS}") 41 target_compile_definitions(jxl_extras_core-obj PRIVATE -DJPEGXL_ENABLE_GIF=1) 42 list(APPEND JXL_EXTRAS_CODEC_INTERNAL_LIBRARIES ${GIF_LIBRARIES}) 43 if(JPEGXL_DEP_LICENSE_DIR) 44 configure_file("${JPEGXL_DEP_LICENSE_DIR}/libgif-dev/copyright" 45 ${PROJECT_BINARY_DIR}/LICENSE.libgif COPYONLY) 46 endif() # JPEGXL_DEP_LICENSE_DIR 47 endif() 48 49 find_package(JPEG) 50 if(JPEG_FOUND) 51 target_include_directories(jxl_extras_core-obj PRIVATE "${JPEG_INCLUDE_DIRS}") 52 target_compile_definitions(jxl_extras_core-obj PRIVATE -DJPEGXL_ENABLE_JPEG=1) 53 list(APPEND JXL_EXTRAS_CODEC_INTERNAL_LIBRARIES ${JPEG_LIBRARIES}) 54 if(JPEGXL_DEP_LICENSE_DIR) 55 configure_file("${JPEGXL_DEP_LICENSE_DIR}/libjpeg-dev/copyright" 56 ${PROJECT_BINARY_DIR}/LICENSE.libjpeg COPYONLY) 57 endif() # JPEGXL_DEP_LICENSE_DIR 58 endif() 59 60 if (JPEGXL_ENABLE_SJPEG) 61 target_compile_definitions(jxl_extras_core-obj PRIVATE 62 -DJPEGXL_ENABLE_SJPEG=1) 63 target_include_directories(jxl_extras_core-obj PRIVATE 64 ../third_party/sjpeg/src) 65 list(APPEND JXL_EXTRAS_CODEC_INTERNAL_LIBRARIES sjpeg) 66 endif() 67 68 if(JPEGXL_ENABLE_JPEGLI) 69 add_library(jxl_extras_jpegli-obj OBJECT 70 "${JPEGXL_INTERNAL_CODEC_JPEGLI_SOURCES}" 71 ) 72 target_include_directories(jxl_extras_jpegli-obj PRIVATE 73 "${CMAKE_CURRENT_BINARY_DIR}/include/jpegli" 74 ) 75 list(APPEND JXL_EXTRAS_OBJECT_LIBRARIES jxl_extras_jpegli-obj) 76 list(APPEND JXL_EXTRAS_OBJECTS $<TARGET_OBJECTS:jxl_extras_jpegli-obj>) 77 endif() 78 79 if(NOT JPEGXL_BUNDLE_LIBPNG) 80 find_package(PNG) 81 endif() 82 if(PNG_FOUND) 83 target_include_directories(jxl_extras_core-obj PRIVATE "${PNG_INCLUDE_DIRS}") 84 target_compile_definitions(jxl_extras_core-obj PRIVATE -DJPEGXL_ENABLE_APNG=1) 85 list(APPEND JXL_EXTRAS_CODEC_INTERNAL_LIBRARIES ${PNG_LIBRARIES}) 86 configure_file(extras/LICENSE.apngdis 87 ${PROJECT_BINARY_DIR}/LICENSE.apngdis COPYONLY) 88 endif() 89 90 if (JPEGXL_ENABLE_OPENEXR) 91 pkg_check_modules(OpenEXR IMPORTED_TARGET OpenEXR) 92 if (OpenEXR_FOUND) 93 target_include_directories(jxl_extras_core-obj PRIVATE 94 "${OpenEXR_INCLUDE_DIRS}" 95 ) 96 target_compile_definitions(jxl_extras_core-obj PRIVATE -DJPEGXL_ENABLE_EXR=1) 97 list(APPEND JXL_EXTRAS_CODEC_INTERNAL_LIBRARIES PkgConfig::OpenEXR) 98 if(JPEGXL_DEP_LICENSE_DIR) 99 configure_file("${JPEGXL_DEP_LICENSE_DIR}/libopenexr-dev/copyright" 100 ${PROJECT_BINARY_DIR}/LICENSE.libopenexr COPYONLY) 101 endif() # JPEGXL_DEP_LICENSE_DIR 102 # OpenEXR generates exceptions, so we need exception support to catch them. 103 # Actually those flags counteract the ones set in JPEGXL_INTERNAL_FLAGS. 104 if (NOT WIN32) 105 set_source_files_properties( 106 extras/dec/exr.cc extras/enc/exr.cc PROPERTIES COMPILE_FLAGS -fexceptions) 107 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") 108 set_source_files_properties( 109 extras/dec/exr.cc extras/enc/exr.cc PROPERTIES COMPILE_FLAGS 110 -fcxx-exceptions) 111 endif() 112 endif() 113 endif() # OpenEXR_FOUND 114 endif() # JPEGXL_ENABLE_OPENEXR 115 116 # Common settings for the object libraries. 117 foreach(LIB ${JXL_EXTRAS_OBJECT_LIBRARIES}) 118 target_compile_options("${LIB}" PRIVATE "${JPEGXL_INTERNAL_FLAGS}") 119 target_compile_definitions("${LIB}" PRIVATE -DJXL_EXPORT=) 120 set_property(TARGET "${LIB}" PROPERTY POSITION_INDEPENDENT_CODE ON) 121 target_include_directories("${LIB}" PRIVATE 122 ${PROJECT_SOURCE_DIR} 123 ${CMAKE_CURRENT_SOURCE_DIR}/include 124 ${CMAKE_CURRENT_BINARY_DIR}/include 125 ${JXL_HWY_INCLUDE_DIRS} 126 ) 127 endforeach() 128 129 # Define an extras library that does not have the image codecs, only the core 130 # extras code. This is needed for some of the fuzzers. 131 add_library(jxl_extras_nocodec-internal STATIC EXCLUDE_FROM_ALL 132 $<TARGET_OBJECTS:jxl_extras_core_nocodec-obj> 133 $<TARGET_OBJECTS:jxl_extras_internal-obj> 134 ) 135 target_link_libraries(jxl_extras_nocodec-internal PRIVATE jxl_threads) 136 target_link_libraries(jxl_extras_nocodec-internal PUBLIC jxl-internal) 137 138 # We only define a static library jxl_extras since it uses internal parts of 139 # jxl library which are not accessible from outside the library in the 140 # shared library case. 141 add_library(jxl_extras-internal STATIC EXCLUDE_FROM_ALL ${JXL_EXTRAS_OBJECTS}) 142 target_link_libraries(jxl_extras-internal PRIVATE 143 ${JXL_EXTRAS_CODEC_INTERNAL_LIBRARIES} 144 jxl_threads 145 ) 146 target_link_libraries(jxl_extras-internal PUBLIC jxl-internal) 147 if(JPEGXL_ENABLE_JPEGLI) 148 target_compile_definitions(jxl_extras-internal PUBLIC -DJPEGXL_ENABLE_JPEGLI=1) 149 target_link_libraries(jxl_extras-internal PRIVATE jpegli-static) 150 endif() 151 152 ### Library that does not depend on internal parts of jxl library. 153 ### Used by cjxl and djxl binaries. 154 add_library(jxl_extras_codec 155 $<TARGET_OBJECTS:jxl_extras_core-obj> 156 ) 157 target_link_libraries(jxl_extras_codec PRIVATE 158 ${JXL_EXTRAS_CODEC_INTERNAL_LIBRARIES} 159 ) 160 target_link_libraries(jxl_extras_codec PUBLIC jxl) 161 set_target_properties(jxl_extras_codec PROPERTIES 162 VERSION ${JPEGXL_LIBRARY_VERSION} 163 SOVERSION ${JPEGXL_LIBRARY_SOVERSION} 164 ) 165 install(TARGETS jxl_extras_codec 166 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 167 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 168 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 169 )