function(add_jpeg_decoder target runtimeTarget) if(NOT TARGET "${runtimeTarget}") message(FATAL_ERROR "JPEG decoder requires an existing runtime target: ${runtimeTarget}") endif() include(ExternalProject) if(NOT TARGET jpeg_turbo_external) set(jpeg_turbo_prefix "${CMAKE_BINARY_DIR}/libjpeg-turbo") if(WIN32) if(MSVC) set(jpeg_turbo_library "${jpeg_turbo_prefix}/lib/turbojpeg-static.lib") else() set(jpeg_turbo_library "${jpeg_turbo_prefix}/lib/libturbojpeg.a") endif() else() set(jpeg_turbo_library "${jpeg_turbo_prefix}/lib/libturbojpeg.a") endif() file(MAKE_DIRECTORY "${jpeg_turbo_prefix}/include") ExternalProject_Add(jpeg_turbo_external SOURCE_DIR "${PROJECT_SOURCE_DIR}/3rdparty/libjpeg-turbo" BINARY_DIR "${CMAKE_BINARY_DIR}/libjpeg-turbo-build" INSTALL_DIR "${jpeg_turbo_prefix}" CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${jpeg_turbo_prefix} -DBUILD_SHARED_LIBS=OFF -DENABLE_STATIC=ON -DENABLE_SHARED=OFF -DWITH_SIMD=OFF -DWITH_TURBOJPEG=ON -DWITH_TOOLS=OFF -DWITH_TESTS=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_C_VISIBILITY_PRESET=hidden -DCMAKE_VISIBILITY_INLINES_HIDDEN=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} -DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER} -DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER} BUILD_BYPRODUCTS "${jpeg_turbo_library}" ) add_library(jpeg_turbo STATIC IMPORTED GLOBAL) set_target_properties(jpeg_turbo PROPERTIES IMPORTED_LOCATION "${jpeg_turbo_library}" INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/3rdparty/libjpeg-turbo/src;${jpeg_turbo_prefix}/include" ) add_dependencies(jpeg_turbo jpeg_turbo_external) endif() add_library(${target} STATIC ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/src/Jpeg.cpp) target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/include) target_include_directories(${target} SYSTEM PRIVATE ${PROJECT_SOURCE_DIR}/3rdparty/stb) target_link_libraries(${target} PRIVATE ${runtimeTarget} jpeg_turbo) set_target_properties(${target} PROPERTIES CXX_EXTENSIONS OFF CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON POSITION_INDEPENDENT_CODE ON ) if(BUILD_TESTING) add_test_executable(${target}_tests ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/tests/Jpeg.cpp) target_link_libraries(${target}_tests PRIVATE ${target}) configure_windows_unwind(${target}_tests) add_test(NAME ${target} COMMAND ${target}_tests) if(WIN32) set_tests_properties(${target} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() endif() endfunction()