jpegli.cmake (5919B)
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 set(JPEGLI_INTERNAL_LIBS 9 hwy 10 Threads::Threads 11 ${ATOMICS_LIBRARIES} 12 ) 13 14 # JPEGLIB setup 15 set(BITS_IN_JSAMPLE 8) 16 set(MEM_SRCDST_SUPPORTED 1) 17 18 if(JPEGLI_LIBJPEG_LIBRARY_SOVERSION STREQUAL "62") 19 set(JPEG_LIB_VERSION 62) 20 elseif(JPEGLI_LIBJPEG_LIBRARY_SOVERSION STREQUAL "7") 21 set(JPEG_LIB_VERSION 70) 22 elseif(JPEGLI_LIBJPEG_LIBRARY_SOVERSION STREQUAL "8") 23 set(JPEG_LIB_VERSION 80) 24 endif() 25 26 configure_file( 27 ../third_party/libjpeg-turbo/jconfig.h.in include/jpegli/jconfig.h) 28 configure_file( 29 ../third_party/libjpeg-turbo/jpeglib.h include/jpegli/jpeglib.h COPYONLY) 30 configure_file( 31 ../third_party/libjpeg-turbo/jmorecfg.h include/jpegli/jmorecfg.h COPYONLY) 32 33 add_library(jpegli-static STATIC EXCLUDE_FROM_ALL "${JPEGXL_INTERNAL_JPEGLI_SOURCES}") 34 target_compile_options(jpegli-static PRIVATE "${JPEGXL_INTERNAL_FLAGS}") 35 target_compile_options(jpegli-static PUBLIC ${JPEGXL_COVERAGE_FLAGS}) 36 set_property(TARGET jpegli-static PROPERTY POSITION_INDEPENDENT_CODE ON) 37 target_include_directories(jpegli-static PRIVATE 38 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>" 39 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>" 40 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>" 41 "${JXL_HWY_INCLUDE_DIRS}" 42 ) 43 target_include_directories(jpegli-static PUBLIC 44 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/jpegli>" 45 ) 46 target_link_libraries(jpegli-static PUBLIC ${JPEGLI_INTERNAL_LIBS}) 47 48 # 49 # Tests for jpegli-static 50 # 51 52 find_package(JPEG) 53 if(JPEG_FOUND AND BUILD_TESTING) 54 # TODO(eustas): merge into jxl_tests.cmake? 55 56 add_library(jpegli_libjpeg_util-obj OBJECT 57 ${JPEGXL_INTERNAL_JPEGLI_LIBJPEG_HELPER_FILES} 58 ) 59 target_include_directories(jpegli_libjpeg_util-obj PRIVATE 60 "${PROJECT_SOURCE_DIR}" 61 "${JPEG_INCLUDE_DIRS}" 62 ) 63 target_compile_options(jpegli_libjpeg_util-obj PRIVATE 64 "${JPEGXL_INTERNAL_FLAGS}" "${JPEGXL_COVERAGE_FLAGS}") 65 66 # Individual test binaries: 67 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tests) 68 foreach (TESTFILE IN LISTS JPEGXL_INTERNAL_JPEGLI_TESTS) 69 # The TESTNAME is the name without the extension or directory. 70 get_filename_component(TESTNAME ${TESTFILE} NAME_WE) 71 add_executable(${TESTNAME} ${TESTFILE} 72 $<TARGET_OBJECTS:jpegli_libjpeg_util-obj> 73 ${JPEGXL_INTERNAL_JPEGLI_TESTLIB_FILES} 74 ) 75 target_compile_options(${TESTNAME} PRIVATE 76 ${JPEGXL_INTERNAL_FLAGS} 77 # Add coverage flags to the test binary so code in the private headers of 78 # the library is also instrumented when running tests that execute it. 79 ${JPEGXL_COVERAGE_FLAGS} 80 ) 81 target_compile_definitions(${TESTNAME} PRIVATE 82 -DTEST_DATA_PATH="${JPEGXL_TEST_DATA_PATH}") 83 target_include_directories(${TESTNAME} PRIVATE 84 "${PROJECT_SOURCE_DIR}" 85 "${CMAKE_CURRENT_SOURCE_DIR}/include" 86 "${CMAKE_CURRENT_BINARY_DIR}/include" 87 ) 88 target_link_libraries(${TESTNAME} 89 hwy 90 jpegli-static 91 GTest::GTest 92 GTest::Main 93 ${JPEG_LIBRARIES} 94 ) 95 set_target_properties(${TESTNAME} PROPERTIES LINK_FLAGS "${JPEGXL_COVERAGE_LINK_FLAGS}") 96 # Output test targets in the test directory. 97 set_target_properties(${TESTNAME} PROPERTIES PREFIX "tests/") 98 if (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 99 set_target_properties(${TESTNAME} PROPERTIES COMPILE_FLAGS "-Wno-error") 100 endif () 101 # 240 seconds because some build types (e.g. coverage) can be quite slow. 102 gtest_discover_tests(${TESTNAME} DISCOVERY_TIMEOUT 240) 103 endforeach () 104 endif() 105 106 # 107 # Build libjpeg.so that links to libjpeg-static 108 # 109 110 if (JPEGXL_ENABLE_JPEGLI_LIBJPEG AND NOT APPLE AND NOT WIN32 AND NOT EMSCRIPTEN) 111 add_library(jpegli-libjpeg-obj OBJECT "${JPEGXL_INTERNAL_JPEGLI_WRAPPER_SOURCES}") 112 target_compile_options(jpegli-libjpeg-obj PRIVATE ${JPEGXL_INTERNAL_FLAGS}) 113 target_compile_options(jpegli-libjpeg-obj PUBLIC ${JPEGXL_COVERAGE_FLAGS}) 114 set_property(TARGET jpegli-libjpeg-obj PROPERTY POSITION_INDEPENDENT_CODE ON) 115 target_include_directories(jpegli-libjpeg-obj PRIVATE 116 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>" 117 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/jpegli>" 118 ) 119 target_compile_definitions(jpegli-libjpeg-obj PUBLIC 120 ${JPEGLI_LIBJPEG_OBJ_COMPILE_DEFINITIONS} 121 ) 122 set(JPEGLI_LIBJPEG_INTERNAL_OBJECTS $<TARGET_OBJECTS:jpegli-libjpeg-obj>) 123 124 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/jpegli) 125 add_library(jpeg SHARED ${JPEGLI_LIBJPEG_INTERNAL_OBJECTS}) 126 target_link_libraries(jpeg PUBLIC ${JPEGXL_COVERAGE_FLAGS}) 127 target_link_libraries(jpeg PRIVATE jpegli-static) 128 set_target_properties(jpeg PROPERTIES 129 VERSION ${JPEGLI_LIBJPEG_LIBRARY_VERSION} 130 SOVERSION ${JPEGLI_LIBJPEG_LIBRARY_SOVERSION} 131 LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/jpegli" 132 RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/jpegli") 133 134 # Add a jpeg.version file as a version script to tag symbols with the 135 # appropriate version number. 136 set_target_properties(jpeg PROPERTIES 137 LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.version.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}) 138 set_property(TARGET jpeg APPEND_STRING PROPERTY 139 LINK_FLAGS " -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.version.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}") 140 141 if (JPEGXL_INSTALL_JPEGLI_LIBJPEG) 142 install(TARGETS jpeg 143 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 144 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 145 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) 146 install( 147 DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include/jpegli/" 148 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") 149 endif() 150 151 # This hides the default visibility symbols from static libraries bundled into 152 # the shared library. In particular this prevents exposing symbols from hwy 153 # in the shared library. 154 if(LINKER_SUPPORT_EXCLUDE_LIBS) 155 set_property(TARGET jpeg APPEND_STRING PROPERTY 156 LINK_FLAGS " ${LINKER_EXCLUDE_LIBS_FLAG}") 157 endif() 158 endif()