#!/usr/bin/cmake cmake_minimum_required (VERSION 3.18) # ------------------------------------------------------------------------------------------------- project( JPEG-XL VERSION 0.3.7 DESCRIPTION "Intended successor to the JPEG format with alpha and HDR support" ) include("../../BuildSystem/cmake/cplusplus.cmake") if(NOT (TARGET Highway)) add_subdirectory(${PROJECT_SOURCE_DIR}/../highway ${CMAKE_BINARY_DIR}/highway) endif() if(NOT (TARGET Brotli)) add_subdirectory(${PROJECT_SOURCE_DIR}/../brotli ${CMAKE_BINARY_DIR}/brotli) endif() # ------------------------------------------------------------------------------------------------- if(NOT EXISTS ${PROJECT_SOURCE_DIR}/downloads/jpeg-xl-v0.3.7.tar.gz) message(STATUS "Downloading JPEG-XL sources") file( DOWNLOAD https://gitlab.com/wg1/jpeg-xl/-/archive/v0.3.7/jpeg-xl-v0.3.7.tar.gz ${PROJECT_SOURCE_DIR}/downloads/jpeg-xl-v0.3.7.tar.gz SHOW_PROGRESS EXPECTED_HASH SHA256=1da84510a7e11f616fe55ac23db876b462585fd5916683ba8454761f5495a547 ) endif() # ------------------------------------------------------------------------------------------------- if(NOT EXISTS ${PROJECT_SOURCE_DIR}/build) message(STATUS "Extracting JPEG-XL sources") file( ARCHIVE_EXTRACT INPUT ${PROJECT_SOURCE_DIR}/downloads/jpeg-xl-v0.3.7.tar.gz DESTINATION ${CMAKE_BINARY_DIR}/extract ) file( RENAME ${CMAKE_BINARY_DIR}/extract/jpeg-xl-v0.3.7 ${PROJECT_SOURCE_DIR}/build ) endif() file( COPY "${PROJECT_SOURCE_DIR}/jxl_export.h" DESTINATION "${PROJECT_SOURCE_DIR}/build/lib/include/jxl/" ) file( COPY "${PROJECT_SOURCE_DIR}/jxl_threads_export.h" DESTINATION "${PROJECT_SOURCE_DIR}/build/lib/include/jxl/" ) # ------------------------------------------------------------------------------------------------- set( sourceFiles "build/lib/jxl/ac_strategy.cc" "build/lib/jxl/alpha.cc" "build/lib/jxl/ans_common.cc" "build/lib/jxl/aux_out.cc" "build/lib/jxl/base/cache_aligned.cc" "build/lib/jxl/base/data_parallel.cc" "build/lib/jxl/base/descriptive_statistics.cc" "build/lib/jxl/base/padded_bytes.cc" "build/lib/jxl/base/status.cc" "build/lib/jxl/base/time.cc" "build/lib/jxl/blending.cc" "build/lib/jxl/butteraugli/butteraugli.cc" "build/lib/jxl/butteraugli_wrapper.cc" "build/lib/jxl/chroma_from_luma.cc" "build/lib/jxl/coeff_order.cc" "build/lib/jxl/color_encoding_internal.cc" "build/lib/jxl/compressed_dc.cc" "build/lib/jxl/convolve.cc" "build/lib/jxl/dct_scales.cc" "build/lib/jxl/decode.cc" "build/lib/jxl/dec_ans.cc" "build/lib/jxl/dec_context_map.cc" "build/lib/jxl/dec_external_image.cc" "build/lib/jxl/dec_file.cc" "build/lib/jxl/dec_frame.cc" "build/lib/jxl/dec_group.cc" "build/lib/jxl/dec_group_border.cc" "build/lib/jxl/dec_modular.cc" "build/lib/jxl/dec_noise.cc" "build/lib/jxl/dec_patch_dictionary.cc" "build/lib/jxl/dec_reconstruct.cc" "build/lib/jxl/dec_transforms.cc" "build/lib/jxl/dec_upsample.cc" "build/lib/jxl/color_management.cc" "build/lib/jxl/dec_huffman.cc" "build/lib/jxl/dec_xyb.cc" "build/lib/jxl/enc_external_image.cc" "build/lib/jxl/enc_modular.cc" "build/lib/jxl/entropy_coder.cc" "build/lib/jxl/encode.cc" "build/lib/jxl/enc_ac_strategy.cc" "build/lib/jxl/enc_adaptive_quantization.cc" "build/lib/jxl/enc_ans.cc" "build/lib/jxl/enc_ar_control_field.cc" "build/lib/jxl/enc_bit_writer.cc" "build/lib/jxl/enc_butteraugli_comparator.cc" "build/lib/jxl/enc_butteraugli_pnorm.cc" "build/lib/jxl/enc_cache.cc" "build/lib/jxl/enc_chroma_from_luma.cc" "build/lib/jxl/enc_cluster.cc" "build/lib/jxl/enc_coeff_order.cc" "build/lib/jxl/enc_comparator.cc" "build/lib/jxl/enc_context_map.cc" "build/lib/jxl/enc_detect_dots.cc" "build/lib/jxl/enc_dot_dictionary.cc" "build/lib/jxl/enc_fast_heuristics.cc" "build/lib/jxl/enc_file.cc" "build/lib/jxl/enc_frame.cc" "build/lib/jxl/enc_group.cc" "build/lib/jxl/enc_heuristics.cc" "build/lib/jxl/enc_huffman.cc" "build/lib/jxl/enc_icc_codec.cc" "build/lib/jxl/enc_noise.cc" "build/lib/jxl/enc_patch_dictionary.cc" "build/lib/jxl/enc_quant_weights.cc" "build/lib/jxl/enc_splines.cc" "build/lib/jxl/enc_toc.cc" "build/lib/jxl/enc_transforms.cc" "build/lib/jxl/enc_xyb.cc" "build/lib/jxl/epf.cc" "build/lib/jxl/fields.cc" "build/lib/jxl/filters.cc" "build/lib/jxl/frame_header.cc" "build/lib/jxl/gaborish.cc" "build/lib/jxl/gauss_blur.cc" "build/lib/jxl/headers.cc" "build/lib/jxl/huffman_table.cc" "build/lib/jxl/huffman_tree.cc" "build/lib/jxl/icc_codec.cc" "build/lib/jxl/icc_codec_common.cc" "build/lib/jxl/image.cc" "build/lib/jxl/image_bundle.cc" "build/lib/jxl/image_metadata.cc" "build/lib/jxl/jpeg/dec_jpeg_data.cc" "build/lib/jxl/jpeg/dec_jpeg_data_writer.cc" "build/lib/jxl/jpeg/enc_jpeg_data.cc" "build/lib/jxl/jpeg/enc_jpeg_data_reader.cc" "build/lib/jxl/jpeg/enc_jpeg_huffman_decode.cc" "build/lib/jxl/jpeg/jpeg_data.cc" "build/lib/jxl/linalg.cc" "build/lib/jxl/loop_filter.cc" "build/lib/jxl/luminance.cc" "build/lib/jxl/memory_manager_internal.cc" "build/lib/jxl/modular/encoding/encoding.cc" "build/lib/jxl/modular/encoding/enc_encoding.cc" "build/lib/jxl/modular/encoding/ma.cc" "build/lib/jxl/modular/modular_image.cc" "build/lib/jxl/modular/transform/transform.cc" "build/lib/jxl/opsin_params.cc" "build/lib/jxl/optimize.cc" "build/lib/jxl/passes_state.cc" "build/lib/jxl/progressive_split.cc" "build/lib/jxl/quantizer.cc" "build/lib/jxl/quant_weights.cc" "build/lib/jxl/splines.cc" "build/lib/jxl/toc.cc" ) # "build/lib/jxl/tf_gbench.cc" # "build/lib/jxl/dec_external_image_gbench.cc" # "build/lib/jxl/enc_external_image_gbench.cc" # "build/lib/jxl/splines_gbench.cc" set( headerFiles "build/lib/include/jxl/butteraugli.h" "build/lib/include/jxl/butteraugli_cxx.h" "build/lib/include/jxl/codestream_header.h" "build/lib/include/jxl/color_encoding.h" "build/lib/include/jxl/decode.h" "build/lib/include/jxl/decode_cxx.h" "build/lib/include/jxl/encode.h" "build/lib/include/jxl/encode_cxx.h" "build/lib/include/jxl/memory_manager.h" "build/lib/include/jxl/parallel_runner.h" "build/lib/include/jxl/thread_parallel_runner.h" "build/lib/include/jxl/thread_parallel_runner_cxx.h" "build/lib/include/jxl/types.h" ) set( testFiles "build/lib/jxl/ac_strategy_test.cc" "build/lib/jxl/adaptive_reconstruction_test.cc" "build/lib/jxl/alpha_test.cc" "build/lib/jxl/ans_common_test.cc" "build/lib/jxl/ans_test.cc" "build/lib/jxl/bit_reader_test.cc" "build/lib/jxl/butteraugli_test.cc" "build/lib/jxl/byte_order_test.cc" "build/lib/jxl/coeff_order_test.cc" "build/lib/jxl/color_encoding_internal_test.cc" "build/lib/jxl/color_management_test.cc" "build/lib/jxl/compressed_image_test.cc" "build/lib/jxl/convolve_test.cc" "build/lib/jxl/data_parallel_test.cc" "build/lib/jxl/dct_test.cc" "build/lib/jxl/encode_test.cc" "build/lib/jxl/decode_test.cc" "build/lib/jxl/bits_test.cc" "build/lib/jxl/icc_codec_test.cc" "build/lib/jxl/lehmer_code_test.cc" "build/lib/jxl/descriptive_statistics_test.cc" "build/lib/jxl/entropy_coder_test.cc" "build/lib/jxl/fast_math_test.cc" "build/lib/jxl/fields_test.cc" "build/lib/jxl/filters_internal_test.cc" "build/lib/jxl/gaborish_test.cc" "build/lib/jxl/gamma_correct_test.cc" "build/lib/jxl/gauss_blur_test.cc" "build/lib/jxl/gradient_test.cc" "build/lib/jxl/iaca_test.cc" "build/lib/jxl/image_bundle_test.cc" "build/lib/jxl/modular_test.cc" "build/lib/jxl/opsin_image_test.cc" "build/lib/jxl/opsin_inverse_test.cc" "build/lib/jxl/optimize_test.cc" "build/lib/jxl/padded_bytes_test.cc" "build/lib/jxl/passes_test.cc" "build/lib/jxl/patch_dictionary_test.cc" "build/lib/jxl/preview_test.cc" "build/lib/jxl/quantizer_test.cc" "build/lib/jxl/quant_weights_test.cc" "build/lib/jxl/rational_polynomial_test.cc" "build/lib/jxl/robust_statistics_test.cc" "build/lib/jxl/roundtrip_test.cc" "build/lib/jxl/speed_tier_test.cc" "build/lib/jxl/splines_test.cc" "build/lib/jxl/toc_test.cc" "build/lib/jxl/xorshift128plus_test.cc" ) # ------------------------------------------------------------------------------------------------- add_library(JPEG-XL STATIC) add_library(JPEG-XL::Static ALIAS JPEG-XL) if(${CMAKE_PROJECT_NAME} STREQUAL "JPEG-XL") # enable_target_compiler_warnings(JPEG-XL) else() # disable_target_compiler_warnings(JPEG-XL) endif() disable_target_compiler_warnings(JPEG-XL) target_compile_definitions( JPEG-XL PRIVATE JPEGXL_MAJOR_VERSION=${PROJECT_VERSION_MAJOR} PRIVATE JPEGXL_MINOR_VERSION=${PROJECT_VERSION_MINOR} PRIVATE JPEGXL_PATCH_VERSION=${PROJECT_VERSION_PATCH} PRIVATE JXL_INTERNAL_LIBRARY_BUILD PUBLIC JXL_STATIC_DEFINE ) # PRIVATE JPEGXL_ENABLE_SKCMS=1 target_link_libraries( JPEG-XL PRIVATE Highway::Static PRIVATE Brotli::Static ) #if(NOT WIN32) # target_compile_options(JPEG-XL PRIVATE -fexceptions) #endif() target_include_directories( JPEG-XL PUBLIC "build" PUBLIC "build/lib/include" ) target_sources( JPEG-XL PUBLIC ${headerFiles} PRIVATE ${sourceFiles} ) #set_target_properties(JPEG-XL PROPERTIES PREFIX "") set_target_properties(JPEG-XL PROPERTIES OUTPUT_NAME "jpegxl") # ------------------------------------------------------------------------------------------------- install( DIRECTORY build/lib/include/jxl DESTINATION ${PROJECT_SOURCE_DIR}/Include FILES_MATCHING PATTERN "*.h" ) install( TARGETS JPEG-XL ARCHIVE DESTINATION ${PROJECT_SOURCE_DIR}/bin/${CMAKE_COMPILER_TAG} ) # ------------------------------------------------------------------------------------------------- file( WRITE "${PROJECT_SOURCE_DIR}/JPEG-XLConfig.cmake" "#!/usr/bin/cmake # Configuration to include JPEG-XL in a CMake-based project. If you want to # reference JPEG-XL as an externally compiled static library, do this: # # set(JPEG-XL_DIR \"../ThirdParty/jpeg-xl\") # find_package(JPEG-XL REQUIRED CONFIG) # # target_link_libraries( # MyAwesomeProject # PRIVATE JPEG-XL::Static # ) # # Alternatively, if you want to build JPEG-XL together with your project, # use the normal CMakeLists.txt with CMake's add_subdirectory() command: # # add_subdirectory( # \"\${PROJECT_SOURCE_DIR}/../ThirdParty/jpeg-xl\" # \"\${CMAKE_BINARY_DIR}/jpeg-xl\" # ) # # target_link_libraries( # MyAwesomeProject # PRIVATE JPEG-XL # ) # # ------------------------------------------------------------------------------------------------- if(NOT DEFINED NUCLEX_COMPILER_TAG) message( FATAL_ERROR \"NUCLEX_COMPILER_TAG not defined! Include cplusplus.cmake before importing this package \\ in order to generate a tag identifying the platform/compiler/architecture/variant!\" ) endif() # ------------------------------------------------------------------------------------------------- if(NOT EXISTS \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}\") # TODO: Warn and link release build when compiling in debug mode # TODO: Warn and link build for older compiler version if found message( FATAL_ERROR \"Directory '\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}' not found. \\ Please either build and install this project before importing it via \\ find_package() or use this project's main CMakeFiles.txt via add_subdirectory()!\" ) endif() # ------------------------------------------------------------------------------------------------- add_library(JPEG-XL::Static STATIC IMPORTED) # This may cause warnings on recent GCC versions (10.0.0+?) with LTO because GCC detects # that the headers used during build (residing in build/) are not the same used when # linking the library (copies resising in Include/). # # CMake doesn't run the install step during build, so the only way to get the headers # in place before building would be by copying them rather than installing them. set_target_properties( JPEG-XL::Static PROPERTIES INTERFACE_INCLUDE_DIRECTORIES \"\${CMAKE_CURRENT_LIST_DIR}/Include\" IMPORTED_LINK_INTERFACE_LANGUAGES \"C\" ) if(WIN32) set_target_properties( JPEG-XL::Static PROPERTIES IMPORTED_LOCATION \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}/jpegxl.lib\" COMPILE_DEFINITIONS OS_LINUX ) else() set_target_properties( JPEG-XL::Static PROPERTIES IMPORTED_LOCATION \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}/libjpegxl.a\" ) endif() message(STATUS \"Imported JPEG-XL targets with binaries in '\${CMAKE_CURRENT_LIST_DIR}'\")" ) # -------------------------------------------------------------------------------------------------