summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt499
1 files changed, 245 insertions, 254 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8cd0880..d9a5215 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,41 +3,21 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
-# Ubuntu bionic ships with cmake 3.10.
-cmake_minimum_required(VERSION 3.10)
+# Ubuntu focal ships with cmake 3.16.
+cmake_minimum_required(VERSION 3.16...3.27)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
-# Honor VISIBILITY_INLINES_HIDDEN on all types of targets.
-if(POLICY CMP0063)
- cmake_policy(SET CMP0063 NEW)
-endif()
-# Pass CMAKE_EXE_LINKER_FLAGS to CC and CXX compilers when testing if they work.
-if(POLICY CMP0065)
- cmake_policy(SET CMP0065 NEW)
-endif()
-
-# Set PIE flags for POSITION_INDEPENDENT_CODE targets, added in 3.14.
-if(POLICY CMP0083)
- cmake_policy(SET CMP0083 NEW)
-endif()
-
project(LIBJXL LANGUAGES C CXX)
-include(CheckCXXSourceCompiles)
-check_cxx_source_compiles(
- "int main() {
- #if !defined(__EMSCRIPTEN__)
- static_assert(false, \"__EMSCRIPTEN__ is not defined\");
- #endif
- return 0;
- }"
- JPEGXL_EMSCRIPTEN
-)
+# TODO(sboukortt): remove once oss-fuzz passes -DBUILD_SHARED_LIBS=OFF
+if(JPEGXL_ENABLE_FUZZERS)
+ message(INFO "Fuzzer build detected, building static libs")
+ set(BUILD_SHARED_LIBS OFF)
+endif()
message(STATUS "CMAKE_SYSTEM_PROCESSOR is ${CMAKE_SYSTEM_PROCESSOR}")
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-fsanitize=fuzzer-no-link" CXX_FUZZERS_SUPPORTED)
-check_cxx_compiler_flag("-Xclang -mconstructor-aliases" CXX_CONSTRUCTOR_ALIASES_SUPPORTED)
check_cxx_compiler_flag("-fmacro-prefix-map=OLD=NEW" CXX_MACRO_PREFIX_MAP)
check_cxx_compiler_flag("-fno-rtti" CXX_NO_RTTI_SUPPORTED)
@@ -50,6 +30,19 @@ if(CHECK_PIE_SUPPORTED)
endif()
endif()
+if(PROVISION_DEPENDENCIES)
+ # Run script to provision dependencies.
+ find_program (BASH_PROGRAM bash)
+ if(BASH_PROGRAM)
+ execute_process(
+ COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/deps.sh
+ RESULT_VARIABLE PROVISION_DEPENDENCIES_RESULT)
+ endif()
+ if(NOT PROVISION_DEPENDENCIES_RESULT EQUAL "0")
+ message(FATAL_ERROR "${CMAKE_CURRENT_SOURCE_DIR}/deps.sh failed with ${PROVISION_DEPENDENCIES_RESULT}")
+ endif()
+endif()
+
### Project build options:
if(CXX_FUZZERS_SUPPORTED)
# Enabled by default except on arm64, Windows and Apple builds.
@@ -84,7 +77,7 @@ check_cxx_source_compiles(
set(WARNINGS_AS_ERRORS_DEFAULT false)
-if((SANITIZER STREQUAL "msan") OR JPEGXL_EMSCRIPTEN)
+if((SANITIZER STREQUAL "msan") OR EMSCRIPTEN)
set(BUNDLE_LIBPNG_DEFAULT YES)
else()
set(BUNDLE_LIBPNG_DEFAULT NO)
@@ -100,6 +93,16 @@ set(JPEGXL_ENABLE_DEVTOOLS false CACHE BOOL
"Build JPEGXL developer tools.")
set(JPEGXL_ENABLE_TOOLS true CACHE BOOL
"Build JPEGXL user tools: cjxl and djxl.")
+set(JPEGXL_ENABLE_JPEGLI true CACHE BOOL
+ "Build jpegli library.")
+set(JPEGXL_ENABLE_JPEGLI_LIBJPEG true CACHE BOOL
+ "Build libjpeg.so shared library based on jpegli.")
+set(JPEGXL_INSTALL_JPEGLI_LIBJPEG false CACHE BOOL
+ "Install jpegli version of libjpeg.so system-wide.")
+set(JPEGLI_LIBJPEG_LIBRARY_VERSION "62.3.0" CACHE STRING
+ "Library version of the libjpeg.so shared library that we build.")
+set(JPEGLI_LIBJPEG_LIBRARY_SOVERSION "62" CACHE STRING
+ "Library so-version of the libjpeg.so shared library that we build.")
set(JPEGXL_ENABLE_DOXYGEN true CACHE BOOL
"Generate C API documentation using Doxygen.")
set(JPEGXL_ENABLE_MANPAGES true CACHE BOOL
@@ -118,8 +121,6 @@ set(JPEGXL_ENABLE_OPENEXR true CACHE BOOL
"Build JPEGXL with support for OpenEXR if available.")
set(JPEGXL_ENABLE_SKCMS true CACHE BOOL
"Build with skcms instead of lcms2.")
-set(JPEGXL_BUNDLE_SKCMS true CACHE BOOL
- "When building with skcms, bundle it into libjxl.a.")
set(JPEGXL_ENABLE_VIEWERS false CACHE BOOL
"Build JPEGXL viewer tools for evaluation.")
set(JPEGXL_ENABLE_TCMALLOC ${ENABLE_TCMALLOC_DEFAULT} CACHE BOOL
@@ -128,23 +129,30 @@ set(JPEGXL_ENABLE_PLUGINS false CACHE BOOL
"Build third-party plugins to support JPEG XL in other applications.")
set(JPEGXL_ENABLE_COVERAGE false CACHE BOOL
"Enable code coverage tracking for libjxl. This also enables debug and disables optimizations.")
-set(JPEGXL_ENABLE_PROFILER false CACHE BOOL
- "Builds in support for profiling (printed by tools if extra flags given)")
set(JPEGXL_ENABLE_SIZELESS_VECTORS false CACHE BOOL
"Builds in support for SVE/RVV vectorization")
set(JPEGXL_ENABLE_TRANSCODE_JPEG true CACHE BOOL
"Builds in support for decoding transcoded JXL files back to JPEG,\
disabling it makes the decoder reject JXL_DEC_JPEG_RECONSTRUCTION events,\
(default enabled)")
-set(JPEGXL_STATIC false CACHE BOOL
- "Build tools as static binaries.")
+set(JPEGXL_ENABLE_BOXES true CACHE BOOL
+ "Builds in support for decoding boxes in JXL files,\
+ disabling it makes the decoder reject JXL_DEC_BOX events,\
+ (default enabled)")
set(JPEGXL_WARNINGS_AS_ERRORS ${WARNINGS_AS_ERRORS_DEFAULT} CACHE BOOL
"Treat warnings as errors during compilation.")
set(JPEGXL_DEP_LICENSE_DIR "" CACHE STRING
"Directory where to search for system dependencies \"copyright\" files.")
set(JPEGXL_FORCE_NEON false CACHE BOOL
"Set flags to enable NEON in arm if not enabled by your toolchain.")
-
+set(JPEGXL_TEST_TOOLS false CACHE BOOL
+ "Run scripts that test the encoding / decoding tools.")
+set(JPEGXL_ENABLE_AVX512 false CACHE BOOL
+ "Build with AVX512 support (faster on CPUs that support it, but larger binary size).")
+set(JPEGXL_ENABLE_AVX512_SPR false CACHE BOOL
+ "Build with AVX-512FP16 support (faster on CPUs that support it, but larger binary size).")
+set(JPEGXL_ENABLE_AVX512_ZEN4 false CACHE BOOL
+"Build with Zen4-optimized AVX512 support (faster on CPUs that support it, but larger binary size).")
# Force system dependencies.
set(JPEGXL_FORCE_SYSTEM_BROTLI false CACHE BOOL
@@ -162,40 +170,33 @@ if (NOT CMAKE_C_COMPILER_ID STREQUAL CMAKE_CXX_COMPILER_ID)
message(FATAL_ERROR "Different C/C++ compilers set: "
"${CMAKE_C_COMPILER_ID} vs ${CMAKE_CXX_COMPILER_ID}")
endif()
-if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- # Android NDK's toolchain.cmake fakes the clang version in
- # CMAKE_CXX_COMPILER_VERSION with an incorrect number, so ignore this.
- if (NOT CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION MATCHES "clang"
- AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5)
- message(FATAL_ERROR
- "Minimum Clang version required is Clang 5, please update.")
- endif()
-elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
- if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7)
- message(FATAL_ERROR
- "Minimum GCC version required is 7, please update.")
- endif()
-endif()
message(STATUS
"Compiled IDs C:${CMAKE_C_COMPILER_ID}, C++:${CMAKE_CXX_COMPILER_ID}")
+set(JXL_HWY_INCLUDE_DIRS "$<BUILD_INTERFACE:$<TARGET_PROPERTY:$<IF:$<TARGET_EXISTS:hwy::hwy>,hwy::hwy,hwy>,INTERFACE_INCLUDE_DIRECTORIES>>")
+# Always disable SSSE3 since it is rare to have SSSE3 but not SSE4
+set(HWY_DISABLED_TARGETS "HWY_SSSE3")
+if (NOT JPEGXL_ENABLE_AVX512)
+ message(STATUS "Disabled AVX512 (set JPEGXL_ENABLE_AVX512 to enable it)")
+ set(HWY_DISABLED_TARGETS "${HWY_DISABLED_TARGETS}|HWY_AVX3")
+ add_definitions(-DFJXL_ENABLE_AVX512=0)
+endif()
+if (NOT JPEGXL_ENABLE_AVX512_SPR)
+ message(STATUS "Disabled AVX512_SPR (set JPEGXL_ENABLE_AVX512_SPR to enable it)")
+ set(HWY_DISABLED_TARGETS "${HWY_DISABLED_TARGETS}|HWY_AVX3_SPR")
+endif()
+if (NOT JPEGXL_ENABLE_AVX512_ZEN4)
+ message(STATUS "Disabled AVX512_ZEN4 (set JPEGXL_ENABLE_AVX512_ZEN4 to enable it)")
+ set(HWY_DISABLED_TARGETS "${HWY_DISABLED_TARGETS}|HWY_AVX3_ZEN4")
+endif()
+
+
+
# CMAKE_EXPORT_COMPILE_COMMANDS is used to generate the compilation database
# used by clang-tidy.
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
-if(JPEGXL_STATIC)
- set(BUILD_SHARED_LIBS 0)
- # Clang developers say that in case to use "static" we have to build stdlib
- # ourselves; for real use case we don't care about stdlib, as it is "granted",
- # so just linking all other libraries is fine.
- if (NOT MSVC AND NOT APPLE)
- set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
- set(CMAKE_EXE_LINKER_FLAGS
- "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++")
- endif()
-endif() # JPEGXL_STATIC
-
# Threads
set(THREADS_PREFER_PTHREAD_FLAG YES)
find_package(Threads REQUIRED)
@@ -209,41 +210,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED YES)
# Atomics
find_package(Atomics REQUIRED)
-if(JPEGXL_STATIC)
- if (MINGW)
- # In MINGW libstdc++ uses pthreads directly. When building statically a
- # program (regardless of whether the source code uses pthread or not) the
- # toolchain will add stdc++ and pthread to the linking step but stdc++ will
- # be linked statically while pthread will be linked dynamically.
- # To avoid this and have pthread statically linked with need to pass it in
- # the command line with "-Wl,-Bstatic -lpthread -Wl,-Bdynamic" but the
- # linker will discard it if not used by anything else up to that point in
- # the linker command line. If the program or any dependency don't use
- # pthread directly -lpthread is discarded and libstdc++ (added by the
- # toolchain later) will then use the dynamic version. For this we also need
- # to pass -lstdc++ explicitly before -lpthread. For pure C programs -lstdc++
- # will be discarded anyway.
- # This adds these flags as dependencies for *all* targets. Adding this to
- # CMAKE_EXE_LINKER_FLAGS instead would cause them to be included before any
- # object files and therefore discarded. This should be set in the
- # INTERFACE_LINK_LIBRARIES of Threads::Threads but some third_part targets
- # don't depend on it.
- link_libraries(-Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic)
- elseif(CMAKE_USE_PTHREADS_INIT)
- # "whole-archive" is not supported on OSX.
- if (NOT APPLE)
- # Set pthreads as a whole-archive, otherwise weak symbols in the static
- # libraries will discard pthreads symbols leading to segmentation fault at
- # runtime.
- message(STATUS "Using -lpthread as --whole-archive")
- set_target_properties(Threads::Threads PROPERTIES
- INTERFACE_LINK_LIBRARIES
- "-Wl,--whole-archive;-lpthread;-Wl,--no-whole-archive")
- endif()
- endif()
-endif() # JPEGXL_STATIC
-
-if (JPEGXL_EMSCRIPTEN)
+if (EMSCRIPTEN)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
@@ -257,75 +224,78 @@ if (CXX_NO_RTTI_SUPPORTED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
endif()
-if (MSVC)
-# TODO(janwas): add flags
-else ()
+# Internal flags for coverage builds:
+set(JPEGXL_COVERAGE_FLAGS)
+set(JPEGXL_COVERAGE_LINK_FLAGS)
-# Global compiler flags for all targets here and in subdirectories.
-add_definitions(
- # Avoid changing the binary based on the current time and date.
- -D__DATE__="redacted"
- -D__TIMESTAMP__="redacted"
- -D__TIME__="redacted"
- # To avoid build error in tizen, add define for submodules
- -D__TIZEN__
-)
-
-# Avoid log spam from fopen etc.
-if(MSVC)
+if (MSVC)
+ # TODO(janwas): add flags
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
-endif()
-
-# TODO(eustas): JXL currently compiles, but does not pass tests...
-if (NOT JXL_HWY_DISABLED_TARGETS_FORCED AND NOT JPEGXL_ENABLE_SIZELESS_VECTORS)
- add_definitions(-DHWY_DISABLED_TARGETS=\(HWY_SVE|HWY_SVE2|HWY_SVE_256|HWY_SVE2_128|HWY_RVV\))
- message("Warning: HWY_SVE, HWY_SVE2, HWY_SVE_256, HWY_SVE2_128 and HWY_RVV CPU targets are disabled")
-endif()
-
-# In CMake before 3.12 it is problematic to pass repeated flags like -Xclang.
-# For this reason we place them in CMAKE_CXX_FLAGS instead.
-# See https://gitlab.kitware.com/cmake/cmake/issues/15826
+else ()
+ # Global compiler flags for all targets here and in subdirectories.
+ add_definitions(
+ # Avoid changing the binary based on the current time and date.
+ -D__DATE__="redacted"
+ -D__TIMESTAMP__="redacted"
+ -D__TIME__="redacted"
+ # To avoid build error in tizen, add define for submodules
+ -D__TIZEN__
+ )
-# Machine flags.
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funwind-tables")
-if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xclang -mrelax-all")
-endif()
-if (CXX_CONSTRUCTOR_ALIASES_SUPPORTED)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xclang -mconstructor-aliases")
-endif()
+ # TODO(eustas): JXL currently compiles, but does not pass tests...
+ if (NOT JXL_HWY_DISABLED_TARGETS_FORCED)
+ if (NOT JPEGXL_ENABLE_SIZELESS_VECTORS)
+ set(HWY_DISABLED_TARGETS "${HWY_DISABLED_TARGETS}|HWY_SVE|HWY_SVE2|HWY_SVE_256|HWY_SVE2_128|HWY_RVV")
+ endif()
+ add_definitions(-DHWY_DISABLED_TARGETS=\(${HWY_DISABLED_TARGETS}\))
+ endif()
-if(WIN32)
-# Not supported by clang-cl, but frame pointers are default on Windows
-else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
-endif()
+ # Machine flags.
+ add_compile_options(-funwind-tables)
+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ add_compile_options("SHELL:-Xclang -mrelax-all")
+ endif()
+ if (CXX_CONSTRUCTOR_ALIASES_SUPPORTED)
+ add_compile_options("SHELL:-Xclang -mconstructor-aliases")
+ endif()
-# CPU flags - remove once we have NEON dynamic dispatch
+ if(WIN32)
+ # Not supported by clang-cl, but frame pointers are default on Windows
+ else()
+ add_compile_options(-fno-omit-frame-pointer)
+ endif()
-# TODO(janwas): this also matches M1, but only ARMv7 is intended/needed.
-if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
-if(JPEGXL_FORCE_NEON)
-# GCC requires these flags, otherwise __ARM_NEON is undefined.
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
- -mfpu=neon-vfpv4 -mfloat-abi=hard")
-endif()
-endif()
+ # CPU flags - remove once we have NEON dynamic dispatch
-# Force build with optimizations in release mode.
-set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
+ # TODO(janwas): this also matches M1, but only ARMv7 is intended/needed.
+ if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
+ if(JPEGXL_FORCE_NEON)
+ # GCC requires these flags, otherwise __ARM_NEON is undefined.
+ add_compile_options(-mfpu=neon-vfpv4 -mfloat-abi=hard)
+ endif()
+ endif()
-add_compile_options(
- # Ignore this to allow redefining __DATE__ and others.
- -Wno-builtin-macro-redefined
+ add_compile_options(
+ # Ignore this to allow redefining __DATE__ and others.
+ -Wno-builtin-macro-redefined
- # Global warning settings.
- -Wall
-)
+ # Global warning settings.
+ -Wall
+ )
-if (JPEGXL_WARNINGS_AS_ERRORS)
-add_compile_options(-Werror)
-endif ()
+ if (JPEGXL_WARNINGS_AS_ERRORS)
+ add_compile_options(-Werror)
+ endif ()
+
+ if(JPEGXL_ENABLE_COVERAGE)
+ set(JPEGXL_COVERAGE_FLAGS
+ -g -O0 -fprofile-arcs -ftest-coverage
+ -DJXL_ENABLE_ASSERT=0 -DJXL_ENABLE_CHECK=0
+ )
+ set(JPEGXL_COVERAGE_LINK_FLAGS
+ --coverage
+ )
+ endif() # JPEGXL_ENABLE_COVERAGE
endif () # !MSVC
include(GNUInstallDirs)
@@ -350,125 +320,146 @@ endif()
add_subdirectory(lib)
if(BUILD_TESTING)
-# Script to run tests over the source code in bash.
-find_program (BASH_PROGRAM bash)
-if(BASH_PROGRAM)
- add_test(
- NAME bash_test
- COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/bash_test.sh)
-endif()
+ # Script to run tests over the source code in bash.
+ find_program (BASH_PROGRAM bash)
+ if(BASH_PROGRAM)
+ add_test(
+ NAME bash_test
+ COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/bash_test.sh)
+ endif()
endif() # BUILD_TESTING
# Documentation generated by Doxygen
if(JPEGXL_ENABLE_DOXYGEN)
-find_package(Doxygen)
-if(DOXYGEN_FOUND)
-set(DOXYGEN_GENERATE_HTML "YES")
-set(DOXYGEN_GENERATE_XML "YES")
-set(DOXYGEN_STRIP_FROM_PATH "${CMAKE_CURRENT_SOURCE_DIR}/lib/include")
-set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "README.md")
-if(JPEGXL_WARNINGS_AS_ERRORS)
-set(DOXYGEN_WARN_AS_ERROR "YES")
-endif()
-set(DOXYGEN_QUIET "YES")
-doxygen_add_docs(doc
- "${CMAKE_CURRENT_SOURCE_DIR}/lib/include"
- "${CMAKE_CURRENT_SOURCE_DIR}/doc/api.txt"
- WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
- COMMENT "Generating C API documentation")
-
-# Add sphinx doc build step for readthedocs.io (requires doxygen too).
-find_program(SPHINX_BUILD_PROGRAM sphinx-build)
-if(SPHINX_BUILD_PROGRAM)
- add_custom_command(
- OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/rtd/nonexistent"
- COMMENT "Generating readthedocs.io output on ${CMAKE_CURRENT_BINARY_DIR}/rtd"
- COMMAND ${SPHINX_BUILD_PROGRAM} -q -W -b html -j auto
- ${CMAKE_SOURCE_DIR}/doc/sphinx
- ${CMAKE_CURRENT_BINARY_DIR}/rtd
- DEPENDS doc
- )
- # This command runs the documentation generation every time since the output
- # target file doesn't exist.
- add_custom_target(rtd-html
- DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/rtd/nonexistent
- )
-else() # SPHINX_BUILD_PROGRAM\
- message(WARNING "sphinx-build not found, skipping rtd documentation")
-endif() # SPHINX_BUILD_PROGRAM
+ find_package(Doxygen)
+ if(DOXYGEN_FOUND)
+ set(DOXYGEN_GENERATE_HTML "YES")
+ set(DOXYGEN_GENERATE_XML "YES")
+ set(DOXYGEN_STRIP_FROM_PATH "${CMAKE_CURRENT_SOURCE_DIR}/lib/include")
+ if(JPEGXL_WARNINGS_AS_ERRORS)
+ set(DOXYGEN_WARN_AS_ERROR "YES")
+ endif()
+ set(DOXYGEN_QUIET "YES")
+ doxygen_add_docs(doc
+ "${CMAKE_CURRENT_SOURCE_DIR}/lib/include"
+ "${CMAKE_CURRENT_SOURCE_DIR}/doc/api.txt"
+ WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
+ COMMENT "Generating C API documentation")
+
+ # Add sphinx doc build step for readthedocs.io (requires doxygen too).
+ find_program(SPHINX_BUILD_PROGRAM sphinx-build)
+ if(SPHINX_BUILD_PROGRAM)
+ add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/rtd/nonexistent"
+ COMMENT "Generating readthedocs.io output on ${CMAKE_CURRENT_BINARY_DIR}/rtd"
+ COMMAND ${SPHINX_BUILD_PROGRAM} -q -W -b html -j auto
+ ${CMAKE_SOURCE_DIR}/doc/sphinx
+ ${CMAKE_CURRENT_BINARY_DIR}/rtd
+ DEPENDS doc
+ )
+ # This command runs the documentation generation every time since the output
+ # target file doesn't exist.
+ add_custom_target(rtd-html
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/rtd/nonexistent
+ )
+ else() # SPHINX_BUILD_PROGRAM\
+ message(WARNING "sphinx-build not found, skipping rtd documentation")
+ endif() # SPHINX_BUILD_PROGRAM
-else()
-# Create a "doc" target for compatibility since "doc" is not otherwise added to
-# the build when doxygen is not installed.
-add_custom_target(doc false
- COMMENT "Error: Can't generate doc since Doxygen not installed.")
-endif() # DOXYGEN_FOUND
+ else()
+ # Create a "doc" target for compatibility since "doc" is not otherwise added to
+ # the build when doxygen is not installed.
+ add_custom_target(doc false
+ COMMENT "Error: Can't generate doc since Doxygen not installed.")
+ endif() # DOXYGEN_FOUND
endif() # JPEGXL_ENABLE_DOXYGEN
if(JPEGXL_ENABLE_MANPAGES)
-find_program(ASCIIDOC a2x)
-if(ASCIIDOC)
-file(STRINGS "${ASCIIDOC}" ASCIIDOC_SHEBANG LIMIT_COUNT 1)
-if(ASCIIDOC_SHEBANG MATCHES "/sh|/bash")
- set(ASCIIDOC_PY_FOUND ON)
- # Run the program directly and set ASCIIDOC as empty.
- set(ASCIIDOC_PY "${ASCIIDOC}")
- set(ASCIIDOC "")
-elseif(ASCIIDOC_SHEBANG MATCHES "python2")
- find_package(Python2 COMPONENTS Interpreter)
- set(ASCIIDOC_PY_FOUND "${Python2_Interpreter_FOUND}")
- set(ASCIIDOC_PY Python2::Interpreter)
-elseif(ASCIIDOC_SHEBANG MATCHES "python3")
- find_package(Python3 COMPONENTS Interpreter)
- set(ASCIIDOC_PY_FOUND "${Python3_Interpreter_FOUND}")
- set(ASCIIDOC_PY Python3::Interpreter)
-else()
- find_package(Python COMPONENTS Interpreter QUIET)
- if(NOT Python_Interpreter_FOUND)
- find_program(ASCIIDOC_PY python)
- if(ASCIIDOC_PY)
+ find_program(ASCIIDOC a2x)
+ if(ASCIIDOC)
+ file(STRINGS "${ASCIIDOC}" ASCIIDOC_SHEBANG LIMIT_COUNT 1)
+ if(ASCIIDOC_SHEBANG MATCHES "/sh|/bash" OR MINGW)
set(ASCIIDOC_PY_FOUND ON)
+ # Run the program directly and set ASCIIDOC as empty.
+ set(ASCIIDOC_PY "${ASCIIDOC}")
+ set(ASCIIDOC "")
+ elseif(ASCIIDOC_SHEBANG MATCHES "python2")
+ find_package(Python2 COMPONENTS Interpreter)
+ set(ASCIIDOC_PY_FOUND "${Python2_Interpreter_FOUND}")
+ set(ASCIIDOC_PY Python2::Interpreter)
+ elseif(ASCIIDOC_SHEBANG MATCHES "python3")
+ find_package(Python3 COMPONENTS Interpreter)
+ set(ASCIIDOC_PY_FOUND "${Python3_Interpreter_FOUND}")
+ set(ASCIIDOC_PY Python3::Interpreter)
+ else()
+ find_package(Python COMPONENTS Interpreter QUIET)
+ if(NOT Python_Interpreter_FOUND)
+ find_program(ASCIIDOC_PY python)
+ if(ASCIIDOC_PY)
+ set(ASCIIDOC_PY_FOUND ON)
+ endif()
+ else()
+ set(ASCIIDOC_PY_FOUND "${Python_Interpreter_FOUND}")
+ set(ASCIIDOC_PY Python::Interpreter)
+ endif()
endif()
- else()
- set(ASCIIDOC_PY_FOUND "${Python_Interpreter_FOUND}")
- set(ASCIIDOC_PY Python::Interpreter)
- endif()
-endif()
-if (ASCIIDOC_PY_FOUND)
- set(MANPAGE_FILES "")
- set(MANPAGES "")
- foreach(PAGE IN ITEMS cjxl djxl)
- # Invoking the Python interpreter ourselves instead of running the a2x binary
- # directly is necessary on MSYS2, otherwise it is run through cmd.exe which
- # does not recognize it.
- add_custom_command(
- OUTPUT "${PAGE}.1"
- COMMAND "${ASCIIDOC_PY}"
- ARGS ${ASCIIDOC}
- --format manpage --destination-dir="${CMAKE_CURRENT_BINARY_DIR}"
- "${CMAKE_CURRENT_SOURCE_DIR}/doc/man/${PAGE}.txt"
- MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/doc/man/${PAGE}.txt")
- list(APPEND MANPAGE_FILES "${CMAKE_CURRENT_BINARY_DIR}/${PAGE}.1")
- list(APPEND MANPAGES "${PAGE}.1")
- endforeach()
- add_custom_target(manpages ALL DEPENDS ${MANPAGES})
- install(FILES ${MANPAGE_FILES} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
-endif() # ASCIIDOC_PY_FOUND
-else()
- message(WARNING "asciidoc was not found, the man pages will not be installed.")
-endif() # ASCIIDOC
+ if (ASCIIDOC_PY_FOUND)
+ set(MANPAGE_FILES "")
+ set(MANPAGES "")
+ foreach(PAGE IN ITEMS cjxl djxl)
+ # Invoking the Python interpreter ourselves instead of running the a2x binary
+ # directly is necessary on MSYS2, otherwise it is run through cmd.exe which
+ # does not recognize it.
+ add_custom_command(
+ OUTPUT "${PAGE}.1"
+ COMMAND "${ASCIIDOC_PY}"
+ ARGS ${ASCIIDOC}
+ --format manpage --destination-dir="${CMAKE_CURRENT_BINARY_DIR}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/doc/man/${PAGE}.txt"
+ MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/doc/man/${PAGE}.txt")
+ list(APPEND MANPAGE_FILES "${CMAKE_CURRENT_BINARY_DIR}/${PAGE}.1")
+ list(APPEND MANPAGES "${PAGE}.1")
+ endforeach()
+ add_custom_target(manpages ALL DEPENDS ${MANPAGES})
+ install(FILES ${MANPAGE_FILES} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
+ endif() # ASCIIDOC_PY_FOUND
+ else()
+ message(WARNING "asciidoc was not found, the man pages will not be installed.")
+ endif() # ASCIIDOC
endif() # JPEGXL_ENABLE_MANPAGES
# Example usage code.
if (JPEGXL_ENABLE_EXAMPLES)
-include(examples/examples.cmake)
+ include(examples/examples.cmake)
endif ()
# Plugins for third-party software
if (JPEGXL_ENABLE_PLUGINS)
-add_subdirectory(plugins)
+ add_subdirectory(plugins)
endif ()
# Binary tools
add_subdirectory(tools)
+
+
+macro(list_test_targets out dir)
+ get_property(dir_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)
+ foreach(target ${dir_targets})
+ if (target MATCHES ".*_test")
+ list(APPEND ${out} ${target})
+ endif()
+ endforeach()
+ get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)
+ foreach(subdir ${subdirectories})
+ list_test_targets(${out} ${subdir})
+ endforeach()
+endmacro()
+
+set(all_tests_list)
+list_test_targets(all_tests_list ${CMAKE_CURRENT_SOURCE_DIR})
+
+if(all_tests_list)
+ add_custom_target(all_tests)
+ add_dependencies(all_tests ${all_tests_list})
+endif()