diff options
Diffstat (limited to 'media/libjxl/src/tools/CMakeLists.txt')
-rw-r--r-- | media/libjxl/src/tools/CMakeLists.txt | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/media/libjxl/src/tools/CMakeLists.txt b/media/libjxl/src/tools/CMakeLists.txt new file mode 100644 index 0000000000..9ee2e53fcb --- /dev/null +++ b/media/libjxl/src/tools/CMakeLists.txt @@ -0,0 +1,483 @@ +# Copyright (c) the JPEG XL Project Authors. All rights reserved. +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# ICC detection library used by the comparison and viewer tools. +if(JPEGXL_ENABLE_VIEWERS) +if(WIN32) + find_package(Qt5 QUIET COMPONENTS Widgets) + if (NOT Qt5_FOUND) + message(WARNING "Qt5 was not found.") + else() + add_library(icc_detect STATIC EXCLUDE_FROM_ALL + icc_detect/icc_detect_win32.cc + icc_detect/icc_detect.h + ) + target_include_directories(icc_detect PRIVATE "${PROJECT_SOURCE_DIR}") + target_link_libraries(icc_detect PUBLIC Qt5::Widgets) + if(JPEGXL_DEP_LICENSE_DIR) + configure_file("${JPEGXL_DEP_LICENSE_DIR}/libqt5widgets5/copyright" + ${PROJECT_BINARY_DIR}/LICENSE.libqt5widgets5 COPYONLY) + endif() # JPEGXL_DEP_LICENSE_DIR + endif() +elseif(APPLE) + find_package(Qt5 QUIET COMPONENTS Widgets) + if (Qt5_FOUND) + add_library(icc_detect STATIC EXCLUDE_FROM_ALL + icc_detect/icc_detect_empty.cc + icc_detect/icc_detect.h + ) + target_include_directories(icc_detect PRIVATE "${PROJECT_SOURCE_DIR}") + target_link_libraries(icc_detect PUBLIC Qt5::Widgets) + else() + message(WARNING "APPLE: Qt5 was not found.") + endif() +else() + find_package(Qt5 QUIET COMPONENTS Widgets X11Extras) + find_package(ECM QUIET NO_MODULE) + if (NOT Qt5_FOUND OR NOT ECM_FOUND) + if (NOT Qt5_FOUND) + message(WARNING "Qt5 was not found.") + else() + message(WARNING "extra-cmake-modules were not found.") + endif() + else() + set(CMAKE_MODULE_PATH ${ECM_FIND_MODULE_DIR}) + find_package(XCB COMPONENTS XCB) + if (XCB_FOUND) + add_library(icc_detect STATIC EXCLUDE_FROM_ALL + icc_detect/icc_detect_x11.cc + icc_detect/icc_detect.h + ) + target_link_libraries(icc_detect PUBLIC jxl-static Qt5::Widgets Qt5::X11Extras XCB::XCB) + endif () + endif() +endif() +endif() # JPEGXL_ENABLE_VIEWERS + +# Tools are added conditionally below. +set(TOOL_BINARIES) + +add_library(jxl_tool STATIC EXCLUDE_FROM_ALL + cmdline.cc + codec_config.cc + tool_version.cc +) +target_compile_options(jxl_tool PUBLIC "${JPEGXL_INTERNAL_FLAGS}") +target_link_libraries(jxl_tool jxl-static) + +target_include_directories(jxl_tool + PUBLIC "${PROJECT_SOURCE_DIR}") + +# The JPEGXL_VERSION is set from the builders. +if(NOT DEFINED JPEGXL_VERSION OR JPEGXL_VERSION STREQUAL "") + find_package(Git QUIET) + execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-parse --short HEAD + OUTPUT_VARIABLE GIT_REV + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + ERROR_QUIET) + string(STRIP "${GIT_REV}" GIT_REV) + if(GIT_REV STREQUAL "") + set(JPEGXL_VERSION "(unknown)") + endif() +endif() + +if(NOT DEFINED JPEGXL_VERSION OR JPEGXL_VERSION STREQUAL "") + # We are building from a git environment and the user didn't set + # JPEGXL_VERSION. Make a target that computes the GIT_REV at build-time always + # but only updates the file if it changed. This allows rebuilds without + # modifying cmake files to update the JPEGXL_VERSION. + message(STATUS "Building with JPEGXL_VERSION=${GIT_REV} (auto-updated)") + add_custom_target( + tool_version_git + ${CMAKE_COMMAND} + -D JPEGXL_ROOT_DIR=${CMAKE_SOURCE_DIR} + -D DST=${CMAKE_CURRENT_BINARY_DIR}/tool_version_git.h + -P ${CMAKE_CURRENT_SOURCE_DIR}/git_version.cmake + BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/tool_version_git.h" + ) + add_dependencies(jxl_tool tool_version_git) + + set_source_files_properties(tool_version.cc PROPERTIES + COMPILE_DEFINITIONS JPEGXL_VERSION_FROM_GIT=1) + target_include_directories(jxl_tool PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") + # Note: Ninja looks for dependencies on the jxl_tool target before running + # the tool_version_git targets, so when updating the tool_version_git.h the + # jxl_tool target is not rebuilt. This forces to generate it at configure time + # if needed. + execute_process( + COMMAND ${CMAKE_COMMAND} + -D JPEGXL_ROOT_DIR=${CMAKE_SOURCE_DIR} + -D DST=${CMAKE_CURRENT_BINARY_DIR}/tool_version_git.h + -P ${CMAKE_CURRENT_SOURCE_DIR}/git_version.cmake) +else() + message(STATUS "Building with JPEGXL_VERSION=${JPEGXL_VERSION}") + set_source_files_properties(tool_version.cc PROPERTIES + COMPILE_DEFINITIONS JPEGXL_VERSION=\"${JPEGXL_VERSION}\") +endif() + +if(JPEGXL_ENABLE_TOOLS) + list(APPEND TOOL_BINARIES + cjxl + cjxl_ng + djxl + djxl_ng + cjpeg_hdr + jxlinfo + ) + + # Main compressor. + add_executable(cjxl + cjxl.cc + speed_stats.cc + cjxl_main.cc + ) + target_link_libraries(cjxl + box + jxl-static + jxl_extras-static + jxl_threads-static + ) + + + add_executable(cjxl_ng + cjxl_ng_main.cc + ) + target_link_libraries(cjxl_ng + jxl + jxl_extras_dec-static + jxl_threads + hwy + jxl_gflags + ) + target_include_directories(cjxl_ng PRIVATE "${PROJECT_SOURCE_DIR}") + if(JPEGXL_EMSCRIPTEN) + set_target_properties(cjxl_ng PROPERTIES LINK_FLAGS "-s USE_LIBPNG=1") + endif() + + add_executable(djxl_ng + djxl_ng_main.cc + ) + target_link_libraries(djxl_ng + jxl + jxl_gflags + ) + + add_executable(cjpeg_hdr + cjpeg_hdr.cc + ) + target_link_libraries(cjpeg_hdr + box + jxl-static + jxl_extras-static + jxl_threads-static + ) + + # Main decompressor. + add_library(djxltool STATIC + djxl.cc + speed_stats.cc + ) + target_link_libraries(djxltool + box + jxl-static + jxl_extras-static + jxl_threads-static + ) + + add_executable(djxl + djxl_main.cc + ) + target_link_libraries(djxl djxltool) + + add_executable(jxlinfo + jxlinfo.c + ) + target_link_libraries(jxlinfo jxl) + + if(NOT ${SANITIZER} STREQUAL "none") + # Linking a C test binary with the C++ JPEG XL implementation when using + # address sanitizer is not well supported by clang 9, so force using clang++ + # for linking this test if a sanitizer is used. + set_target_properties(jxlinfo PROPERTIES LINKER_LANGUAGE CXX) + endif() # SANITIZER != "none" + +endif() # JPEGXL_ENABLE_TOOLS + +# Other developer tools. +if(${JPEGXL_ENABLE_DEVTOOLS}) + list(APPEND TOOL_BINARIES + fuzzer_corpus + butteraugli_main + decode_and_encode + display_to_hlg + pq_to_hlg + render_hlg + tone_map + texture_to_cube + generate_lut_template + ssimulacra_main + xyb_range + jxl_from_tree + ) + + add_executable(fuzzer_corpus fuzzer_corpus.cc) + + add_executable(ssimulacra_main ssimulacra_main.cc ssimulacra.cc) + add_executable(butteraugli_main butteraugli_main.cc) + add_executable(decode_and_encode decode_and_encode.cc) + add_executable(display_to_hlg hdr/display_to_hlg.cc) + add_executable(pq_to_hlg hdr/pq_to_hlg.cc) + add_executable(render_hlg hdr/render_hlg.cc) + add_executable(tone_map hdr/tone_map.cc) + add_executable(texture_to_cube hdr/texture_to_cube.cc) + add_executable(generate_lut_template hdr/generate_lut_template.cc) + add_executable(xyb_range xyb_range.cc) + add_executable(jxl_from_tree jxl_from_tree.cc) +endif() # JPEGXL_ENABLE_DEVTOOLS + +# Benchmark tools. +if(${JPEGXL_ENABLE_BENCHMARK}) + list(APPEND TOOL_BINARIES + benchmark_xl + ) + + add_executable(benchmark_xl + benchmark/benchmark_xl.cc + benchmark/benchmark_args.cc + benchmark/benchmark_codec.cc + benchmark/benchmark_file_io.cc + benchmark/benchmark_stats.cc + benchmark/benchmark_utils.cc + benchmark/benchmark_utils.h + benchmark/benchmark_codec_custom.cc + benchmark/benchmark_codec_custom.h + benchmark/benchmark_codec_jxl.cc + benchmark/benchmark_codec_jxl.h + speed_stats.cc + speed_stats.h + ../third_party/dirent.cc + ) + target_link_libraries(benchmark_xl Threads::Threads) + if(MINGW) + # MINGW doesn't support glob.h. + target_compile_definitions(benchmark_xl PRIVATE "-DHAS_GLOB=0") + endif() # MINGW + + find_package(JPEG) + if(JPEG_FOUND) + target_sources(benchmark_xl PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/benchmark/benchmark_codec_jpeg.cc" + "${CMAKE_CURRENT_LIST_DIR}/benchmark/benchmark_codec_jpeg.h" + ) + endif () + + if(NOT JPEGXL_BUNDLE_LIBPNG) + find_package(PNG) + endif() + if(PNG_FOUND) + target_sources(benchmark_xl PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/benchmark/benchmark_codec_png.cc" + "${CMAKE_CURRENT_LIST_DIR}/benchmark/benchmark_codec_png.h" + ) + endif() + + find_package(PkgConfig) + pkg_check_modules(WebP IMPORTED_TARGET libwebp) + if(WebP_FOUND) + target_sources(benchmark_xl PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/benchmark/benchmark_codec_webp.cc" + "${CMAKE_CURRENT_LIST_DIR}/benchmark/benchmark_codec_webp.h" + ) + target_compile_definitions(benchmark_xl PRIVATE -DBENCHMARK_WEBP) + + # Use the static version of webp if available. + find_library(WebP_STATIC_LINK_LIBRARY NAMES libwebp.a + PATHS "${WebP_LIBDIR}") + if("${WebP_STATIC_LINK_LIBRARY}" STREQUAL "WebP_STATIC_LINK_LIBRARY-NOTFOUND") + message(WARNING "Using dynamic libwebp") + target_link_libraries(benchmark_xl PkgConfig::WebP) + else() + target_link_libraries(benchmark_xl "${WebP_STATIC_LINK_LIBRARY}") + target_include_directories(benchmark_xl + PRIVATE ${WebP_STATIC_INCLUDE_DIRS}) + target_compile_options(benchmark_xl PRIVATE ${WebP_STATIC_CFLAGS_OTHER}) + endif() + endif() + + pkg_check_modules(AVIF IMPORTED_TARGET libavif) + if(AVIF_FOUND) + target_sources(benchmark_xl PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/benchmark/benchmark_codec_avif.cc" + "${CMAKE_CURRENT_LIST_DIR}/benchmark/benchmark_codec_avif.h" + ) + target_compile_definitions(benchmark_xl PRIVATE -DBENCHMARK_AVIF) + target_link_libraries(benchmark_xl PkgConfig::AVIF) + endif() +endif() # JPEGXL_ENABLE_BENCHMARK + +# All tool binaries depend on "jxl" library and the tool helpers. +foreach(BINARY IN LISTS TOOL_BINARIES) + target_include_directories("${BINARY}" PRIVATE "${PROJECT_SOURCE_DIR}") + target_link_libraries("${BINARY}" box jxl-static jxl_extras-static jxl_threads-static jxl_tool) + if(JPEGXL_EMSCRIPTEN) + set_target_properties(${BINARY} PROPERTIES LINK_FLAGS "-s USE_LIBPNG=1") + endif() + +endforeach() +install(TARGETS ${TOOL_BINARIES} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") +message(STATUS "Building tools: ${TOOL_BINARIES}") + +set(FUZZER_BINARIES + color_encoding_fuzzer + decode_basic_info_fuzzer + djxl_fuzzer + icc_codec_fuzzer + fields_fuzzer + rans_fuzzer + set_from_bytes_fuzzer + transforms_fuzzer +) + +# Fuzzers. +foreach(FUZZER IN LISTS FUZZER_BINARIES) + if(${JPEGXL_ENABLE_FUZZERS}) + set(BINARY "${FUZZER}") + add_executable("${BINARY}" "${BINARY}.cc") + target_link_libraries("${BINARY}" ${JPEGXL_FUZZER_LINK_FLAGS}) + else() + # When not enabled we want a lightweight alternative for regular fuzzers + # that just run the target. + set(BINARY "${FUZZER}_runner") + add_executable("${BINARY}" EXCLUDE_FROM_ALL + "fuzzer_stub.cc" "${FUZZER}.cc") + endif() # JPEGXL_ENABLE_FUZZERS + target_include_directories("${BINARY}" PRIVATE "${CMAKE_SOURCE_DIR}") + if(${FUZZER} STREQUAL djxl_fuzzer) + target_link_libraries("${BINARY}" + jxl_dec-static + jxl_threads-static + ) + else() + target_link_libraries("${BINARY}" + jxl-static + jxl_extras-static + jxl_threads-static + jxl_tool + ) + endif() +endforeach() + +# EMSCRIPTEN doesn't support dynamic libraries so testing for linkage there +# doesn't make much sense. +if(BUILD_TESTING AND TARGET jxl AND NOT JPEGXL_EMSCRIPTEN) +# Library API test. This test is only to check that we can link against the +# shared library from C99 file and don't need to use internal symbols. +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tests) +add_executable(libjxl_test libjxl_test.c) +set_property(TARGET libjxl_test PROPERTY C_STANDARD 99) +if(NOT ${SANITIZER} STREQUAL "none") + # Linking a C test binary with the C++ JPEG XL implementation when using + # address sanitizer is not well supported by clang 9, so force using clang++ + # for linking this test if a sanitizer is used. + set_target_properties(libjxl_test PROPERTIES LINKER_LANGUAGE CXX) +endif() # SANITIZER != "none" +set_target_properties(libjxl_test PROPERTIES PREFIX "tests/") +target_link_libraries(libjxl_test jxl) +if (NOT MSVC) +target_compile_options(libjxl_test PRIVATE -Wall -Wextra -Werror) +if(NOT WIN32) + target_compile_options(libjxl_test PRIVATE -pedantic) +endif() # NOT WIN32 +endif() # NOT MSVC + +add_test(NAME LibraryCLinkageTest COMMAND libjxl_test) + +endif() # BUILD_TESTING AND TARGET jxl AND NOT JPEGXL_EMSCRIPTEN + +# Tools defined in subdirectories. +if(${JPEGXL_ENABLE_VIEWERS}) +add_subdirectory(viewer) +add_subdirectory(comparison_viewer) +add_subdirectory(flicker_test) +endif() + +add_subdirectory(box) +add_subdirectory(conformance) + + +if ("${JPEGXL_EMSCRIPTEN}") +# WASM API facade. +add_executable(jxl_emcc jxl_emcc.cc) +target_link_libraries(jxl_emcc jxl-static jxl_extras-static) +set_target_properties(jxl_emcc PROPERTIES LINK_FLAGS "\ + -O3\ + --closure 1 \ + -s ALLOW_MEMORY_GROWTH=1 \ + -s USE_LIBPNG=1 \ + -s DISABLE_EXCEPTION_CATCHING=1 \ + -s MODULARIZE=1 \ + -s FILESYSTEM=0 \ + -s EXPORT_NAME=\"JxlCodecModule\"\ + -s \"EXPORTED_FUNCTIONS=[\ + _jxlCompress,\ + _jxlDecompress,\ + _free,\ + _malloc\ + ]\"\ +") +endif () # JPEGXL_EMSCRIPTEN + +if(JPEGXL_ENABLE_JNI) +find_package(JNI QUIET) +find_package(Java QUIET) + +if ("${JNI_FOUND}" AND "${Java_FOUND}") + include(UseJava) + + # decoder_jni_onload.cc might be necessary for Android; not used yet. + add_library(jxl_jni SHARED jni/org/jpeg/jpegxl/wrapper/decoder_jni.cc) + target_include_directories(jxl_jni PRIVATE "${JNI_INCLUDE_DIRS}" "${PROJECT_SOURCE_DIR}") + target_link_libraries(jxl_jni PUBLIC jxl_dec-static jxl_threads-static) + if(NOT DEFINED JPEGXL_INSTALL_JNIDIR) + set(JPEGXL_INSTALL_JNIDIR ${CMAKE_INSTALL_LIBDIR}) + endif() + install(TARGETS jxl_jni DESTINATION ${JPEGXL_INSTALL_JNIDIR}) + + add_jar(jxl_jni_wrapper SOURCES + jni/org/jpeg/jpegxl/wrapper/Decoder.java + jni/org/jpeg/jpegxl/wrapper/DecoderJni.java + jni/org/jpeg/jpegxl/wrapper/ImageData.java + jni/org/jpeg/jpegxl/wrapper/PixelFormat.java + jni/org/jpeg/jpegxl/wrapper/Status.java + jni/org/jpeg/jpegxl/wrapper/StreamInfo.java + OUTPUT_NAME org.jpeg.jpegxl + ) + get_target_property(JXL_JNI_WRAPPER_JAR jxl_jni_wrapper JAR_FILE) + if(NOT DEFINED JPEGXL_INSTALL_JARDIR) + set(JPEGXL_INSTALL_JARDIR ${CMAKE_INSTALL_LIBDIR}) + endif() + install_jar(jxl_jni_wrapper DESTINATION ${JPEGXL_INSTALL_JARDIR}) + + add_jar(jxl_jni_wrapper_test + SOURCES jni/org/jpeg/jpegxl/wrapper/DecoderTest.java + INCLUDE_JARS jxl_jni_wrapper + ) + get_target_property(JXL_JNI_WRAPPER_TEST_JAR jxl_jni_wrapper_test JAR_FILE) + + if(NOT "${SANITIZER}" MATCHES ".san") + # NB: Vanilla OpenJDK 8 / 11 are known to work well (i.e. either + # "which java" or JAVA_HOME environment variable point to the path like + # "/usr/lib/jvm/java-xx-openjdk-yyy" on Debian Linux). + add_test( + NAME test_jxl_jni_wrapper + COMMAND ${Java_JAVA_EXECUTABLE} + -cp "${JXL_JNI_WRAPPER_JAR}:${JXL_JNI_WRAPPER_TEST_JAR}" + -Dorg.jpeg.jpegxl.wrapper.lib=$<TARGET_FILE:jxl_jni> + org.jpeg.jpegxl.wrapper.DecoderTest + ) + endif() # JPEGXL_ENABLE_FUZZERS +endif() # JNI_FOUND & Java_FOUND +endif() # JPEGXL_ENABLE_JNI |