jpegli.cmake (5929B)
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 gmock 92 GTest::GTest 93 GTest::Main 94 ${JPEG_LIBRARIES} 95 ) 96 set_target_properties(${TESTNAME} PROPERTIES LINK_FLAGS "${JPEGXL_COVERAGE_LINK_FLAGS}") 97 # Output test targets in the test directory. 98 set_target_properties(${TESTNAME} PROPERTIES PREFIX "tests/") 99 if (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 100 set_target_properties(${TESTNAME} PROPERTIES COMPILE_FLAGS "-Wno-error") 101 endif () 102 # 240 seconds because some build types (e.g. coverage) can be quite slow. 103 gtest_discover_tests(${TESTNAME} DISCOVERY_TIMEOUT 240) 104 endforeach () 105 endif() 106 107 # 108 # Build libjpeg.so that links to libjpeg-static 109 # 110 111 if (JPEGXL_ENABLE_JPEGLI_LIBJPEG AND NOT APPLE AND NOT WIN32 AND NOT EMSCRIPTEN) 112 add_library(jpegli-libjpeg-obj OBJECT "${JPEGXL_INTERNAL_JPEGLI_WRAPPER_SOURCES}") 113 target_compile_options(jpegli-libjpeg-obj PRIVATE ${JPEGXL_INTERNAL_FLAGS}) 114 target_compile_options(jpegli-libjpeg-obj PUBLIC ${JPEGXL_COVERAGE_FLAGS}) 115 set_property(TARGET jpegli-libjpeg-obj PROPERTY POSITION_INDEPENDENT_CODE ON) 116 target_include_directories(jpegli-libjpeg-obj PRIVATE 117 "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>" 118 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/jpegli>" 119 ) 120 target_compile_definitions(jpegli-libjpeg-obj PUBLIC 121 ${JPEGLI_LIBJPEG_OBJ_COMPILE_DEFINITIONS} 122 ) 123 set(JPEGLI_LIBJPEG_INTERNAL_OBJECTS $<TARGET_OBJECTS:jpegli-libjpeg-obj>) 124 125 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/jpegli) 126 add_library(jpeg SHARED ${JPEGLI_LIBJPEG_INTERNAL_OBJECTS}) 127 target_link_libraries(jpeg PUBLIC ${JPEGXL_COVERAGE_FLAGS}) 128 target_link_libraries(jpeg PRIVATE jpegli-static) 129 set_target_properties(jpeg PROPERTIES 130 VERSION ${JPEGLI_LIBJPEG_LIBRARY_VERSION} 131 SOVERSION ${JPEGLI_LIBJPEG_LIBRARY_SOVERSION} 132 LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/jpegli" 133 RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/jpegli") 134 135 # Add a jpeg.version file as a version script to tag symbols with the 136 # appropriate version number. 137 set_target_properties(jpeg PROPERTIES 138 LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.version.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}) 139 set_property(TARGET jpeg APPEND_STRING PROPERTY 140 LINK_FLAGS " -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/jpegli/jpeg.version.${JPEGLI_LIBJPEG_LIBRARY_SOVERSION}") 141 142 if (JPEGXL_INSTALL_JPEGLI_LIBJPEG) 143 install(TARGETS jpeg 144 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 145 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 146 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) 147 install( 148 DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include/jpegli/" 149 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") 150 endif() 151 152 # This hides the default visibility symbols from static libraries bundled into 153 # the shared library. In particular this prevents exposing symbols from hwy 154 # in the shared library. 155 if(LINKER_SUPPORT_EXCLUDE_LIBS) 156 set_property(TARGET jpeg APPEND_STRING PROPERTY 157 LINK_FLAGS " ${LINKER_EXCLUDE_LIBS_FLAG}") 158 endif() 159 endif()