@@ -3,34 +3,108 @@ cmake_minimum_required(VERSION 3.10)
33
44include (ExternalProject )
55
6- set (LibJpegTurboFolder ../../External/libjpeg-turbo)
6+ set (LibJpegTurboFolder ${CMAKE_CURRENT_SOURCE_DIR} / ../../External/libjpeg-turbo)
77get_filename_component (LibJpegTurboFolder "${LibJpegTurboFolder} " ABSOLUTE )
88set (NASMPATH ${CMAKE_CURRENT_SOURCE_DIR} /../../External/bintools/nasm-2.15.05/nasm.exe)
99get_filename_component (NASMPATH "${NASMPATH} " ABSOLUTE )
10- set (TurboJpegBinDir ${CMAKE_BINARY_DIR} /libjpeg-turbo)
1110
11+
12+ # =========================
13+ # =========================
14+
15+ # ======== Detect Multi-config vs Single-config ========
16+ if (CMAKE_CONFIGURATION_TYPES )
17+ set (IS_MULTI_CONFIG TRUE )
18+ else ()
19+ set (IS_MULTI_CONFIG FALSE )
20+ endif ()
21+
22+ # ======== Platform-specific file extensions ========
23+ if (WIN32 )
24+ set (JPG_RUNTIME_NAME "turbojpeg.dll" )
25+ set (JPG_IMPLIB_NAME "turbojpeg.lib" )
26+ elseif (APPLE )
27+ set (JPG_RUNTIME_NAME "libturbojpeg.dylib" )
28+ set (JPG_IMPLIB_NAME "" ) # No import libs on macOS
29+ else ()
30+ set (JPG_RUNTIME_NAME "libturbojpeg.so" )
31+ set (JPG_IMPLIB_NAME "" ) # No import libs on Linux
32+ endif ()
33+
34+ # ======== External build directory ========
35+ set (TurboJpegBinBaseDir "${CMAKE_BINARY_DIR} /libjpeg-turbo" )
36+
37+ # ======== CMake arguments for libjpeg-turbo ========
1238set (LibJpegTurboArgs
13- -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
14- -DENABLE_STATIC=FALSE
15- -DWITH_FUZZ=FALSE
16- -DCMAKE_INSTALL_PREFIX=${TurboJpegBinDir} /install
17- -DWITH_JPEG=FALSE # Disable JPEG codec, we only need TurboJPEG
39+ -DENABLE_STATIC=FALSE
40+ -DWITH_FUZZ=FALSE
41+ -DWITH_JPEG=FALSE
42+ -DCMAKE_INSTALL_PREFIX=${TurboJpegBinBaseDir} /install
1843)
1944
20- #Enable ASM provided by NASM
21- if ( ${CMAKE_SYSTEM_NAME} MATCHES "Windows" AND NOT ${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux" )
45+ # Enable NASM on Windows if needed
46+ if ( WIN32 AND NOT ${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux" )
2247 list (APPEND LibJpegTurboArgs -DCMAKE_ASM_NASM_COMPILER=${NASMPATH} )
2348endif ()
2449
50+ # ======== Add ExternalProject ========
2551ExternalProject_Add (libjpeg-turbo
26- SOURCE_DIR ${LibJpegTurboFolder}
27- BINARY_DIR ${TurboJpegBinDir }
52+ SOURCE_DIR ${LibJpegTurboFolder}
53+ BINARY_DIR ${TurboJpegBinBaseDir }
2854 CMAKE_ARGS ${LibJpegTurboArgs}
29- INSTALL_COMMAND "" # <--- disables 'ninja install'
30- BUILD_COMMAND ${CMAKE_COMMAND} --build . --target turbojpeg
31- BUILD_BYPRODUCTS ${TurboJpegBinDir} /turbojpeg.dll
55+ INSTALL_COMMAND ""
56+ BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR > --config $<CONFIG > --target turbojpeg
57+ )
58+
59+ # ======== Declare Imported Library ========
60+ add_library (libjpeg-turbo::libjpeg-turbo SHARED IMPORTED GLOBAL )
61+
62+ if (IS_MULTI_CONFIG)
63+ # Multi-config: set per-config imported locations
64+ foreach (cfg ${CMAKE_CONFIGURATION_TYPES} )
65+ string (TOUPPER "${cfg} " cfg_upper)
66+ set (cfg_bin_dir "${TurboJpegBinBaseDir} /${cfg} " )
67+
68+ # Set runtime library
69+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES
70+ "IMPORTED_LOCATION_${cfg_upper} " "${cfg_bin_dir} /${JPG_RUNTIME_NAME} "
71+ )
72+
73+ # Set import library on Windows
74+ if (WIN32 )
75+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES
76+ "IMPORTED_IMPLIB_${cfg_upper} " "${cfg_bin_dir} /${JPG_IMPLIB_NAME} "
77+ )
78+ endif ()
79+ endforeach ()
80+ else ()
81+ # Single-config: flat directory
82+ set (cfg_bin_dir "${TurboJpegBinBaseDir} " )
83+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES
84+ IMPORTED_LOCATION "${cfg_bin_dir} /${JPG_RUNTIME_NAME} "
85+ )
86+
87+ # Set import library on Windows
88+ if (WIN32 )
89+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES
90+ IMPORTED_IMPLIB "${cfg_bin_dir} /${JPG_IMPLIB_NAME} "
91+ )
92+ endif ()
93+ endif ()
94+
95+ # ======== Include directories ========
96+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES
97+ INTERFACE_INCLUDE_DIRECTORIES "${LibJpegTurboFolder} /src"
3298)
3399
100+ # ======== Depend on ExternalProject ========
101+ add_dependencies (libjpeg-turbo::libjpeg-turbo libjpeg-turbo )
102+
103+
104+
105+ # =========================
106+ # =========================
107+
34108 file (GLOB_RECURSE sourceFiles
35109 "./Source/*.h"
36110 "./Source/*.cpp"
@@ -39,14 +113,36 @@ ExternalProject_Add(libjpeg-turbo
39113set (TargetName CodecJPG)
40114add_library (${TargetName} ${sourceFiles} )
41115
42- add_dependencies (${TargetName} libjpeg-turbo )
43- target_link_libraries (${TargetName} PRIVATE ${TurboJpegBinDir} /turbojpeg.lib ) # adjust to match built target name
116+ target_link_libraries (${TargetName} PRIVATE libjpeg-turbo::libjpeg-turbo ) # adjust to match built target name
117+
118+ # ======== Copy runtime to ${CMAKE_CURRENT_BINARY_DIR} ========
119+ if (IS_MULTI_CONFIG)
120+ # Copy all configs' DLLs/SOs/DYLIBs
121+ foreach (cfg ${CMAKE_CONFIGURATION_TYPES} )
122+ add_custom_command (TARGET ${TargetName} POST_BUILD
123+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
124+ "$<TARGET_FILE :libjpeg -turbo ::libjpeg -turbo >"
125+ "${CMAKE_CURRENT_BINARY_DIR} /$<CONFIGURATION >/" )
126+
127+ endforeach ()
128+ else ()
129+
130+ add_custom_command (TARGET ${TargetName} POST_BUILD
131+ COMMAND ls /home/runner/work/ImageCodec/ImageCodec/build/libjpeg-turbo )
132+
133+ add_custom_command (TARGET ${TargetName} POST_BUILD
134+ COMMAND ls /home/runner/work/ImageCodec/ImageCodec/build/Codecs/CodecJPG )
135+
136+ add_custom_command (TARGET ${TargetName} POST_BUILD
137+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
138+ "$<TARGET_FILE :libjpeg -turbo ::libjpeg -turbo >"
139+ "${CMAKE_CURRENT_BINARY_DIR} /" )
140+ endif ()
44141
45- add_custom_command (TARGET libjpeg-turbo POST_BUILD
46- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TurboJpegBinDir} /turbojpeg.dll ${CMAKE_BINARY_DIR} /${CMAKE_CFG_INTDIR}/bin/ )
47- target_include_directories (${TargetName} PRIVATE ${LibJpegTurboFolder} /src )
142+
143+ target_include_directories (${TargetName} PRIVATE ${LibJpegTurboFolder} /src )
48144
49- if (${CMAKE_SYSTEM_NAME} MATCHES "Windows" AND NOT MINGW)
145+ if (${CMAKE_SYSTEM_NAME} MATCHES "Windows" AND ( CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC" ) AND NOT MINGW)
50146 target_link_options (${TargetName} PUBLIC "/DELAYLOAD:turbojpeg.dll" )
51147else ()
52148endif ()
0 commit comments