1 # Copyright (c) the JPEG XL Project Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style
4 # license that can be found in the LICENSE file.
6 include(jxl_lists.cmake)
8 set(JPEGLI_INTERNAL_LIBS
15 set(BITS_IN_JSAMPLE 8)
16 set(MEM_SRCDST_SUPPORTED 1)
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)
27 ../third_party/libjpeg-turbo/jconfig.h.in include/jpegli/jconfig.h)
29 ../third_party/libjpeg-turbo/jpeglib.h include/jpegli/jpeglib.h COPYONLY)
31 ../third_party/libjpeg-turbo/jmorecfg.h include/jpegli/jmorecfg.h COPYONLY)
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}"
43 target_include_directories(jpegli-static PUBLIC
44 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/jpegli>"
46 target_link_libraries(jpegli-static PUBLIC ${JPEGLI_INTERNAL_LIBS})
49 # Tests for jpegli-static
53 if(JPEG_FOUND AND BUILD_TESTING)
54 # TODO(eustas): merge into jxl_tests.cmake?
56 add_library(jpegli_libjpeg_util-obj OBJECT
57 ${JPEGXL_INTERNAL_JPEGLI_LIBJPEG_HELPER_FILES}
59 target_include_directories(jpegli_libjpeg_util-obj PRIVATE
60 "${PROJECT_SOURCE_DIR}"
61 "${JPEG_INCLUDE_DIRS}"
63 target_compile_options(jpegli_libjpeg_util-obj PRIVATE
64 "${JPEGXL_INTERNAL_FLAGS}" "${JPEGXL_COVERAGE_FLAGS}")
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}
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}
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"
88 target_link_libraries(${TESTNAME}
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")
102 # 240 seconds because some build types (e.g. coverage) can be quite slow.
103 gtest_discover_tests(${TESTNAME} DISCOVERY_TIMEOUT 240)
108 # Build libjpeg.so that links to libjpeg-static
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>"
120 target_compile_definitions(jpegli-libjpeg-obj PUBLIC
121 ${JPEGLI_LIBJPEG_OBJ_COMPILE_DEFINITIONS}
123 set(JPEGLI_LIBJPEG_INTERNAL_OBJECTS $<TARGET_OBJECTS:jpegli-libjpeg-obj>)
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")
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}")
142 if (JPEGXL_INSTALL_JPEGLI_LIBJPEG)
144 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
145 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
146 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
148 DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include/jpegli/"
149 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
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}")