@@ -3,34 +3,134 @@ 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+ -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
40+ -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
41+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
42+ -DCMAKE_MT=${CMAKE_MT}
43+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
44+ -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
45+ -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
46+ -DCMAKE_RC_COMPILER=${CMAKE_RC_COMPILER}
47+ -DENABLE_STATIC=FALSE
48+ -DWITH_FUZZ=FALSE
49+ -DWITH_JPEG=FALSE
50+ -DCMAKE_INSTALL_PREFIX=${TurboJpegBinBaseDir} /install
1851)
1952
20- #Enable ASM provided by NASM
21- if ( ${CMAKE_SYSTEM_NAME} MATCHES "Windows" AND NOT ${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux" )
53+ # Enable NASM on Windows if needed
54+ if ( WIN32 AND NOT ${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux" )
2255 list (APPEND LibJpegTurboArgs -DCMAKE_ASM_NASM_COMPILER=${NASMPATH} )
2356endif ()
2457
58+ # Support Custom runtime and library output directories
59+ if (CMAKE_RUNTIME_OUTPUT_DIRECTORY )
60+ set (JPG_RUNTIME_OUTPUT_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} )
61+ else ()
62+ set (JPG_RUNTIME_OUTPUT_DIR ${TurboJpegBinBaseDir} )
63+ endif ()
64+
65+
66+ if (CMAKE_LIBRARY_OUTPUT_DIRECTORY )
67+ set (JPG_LIB_OUTPUT_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} )
68+ else ()
69+ set (JPG_LIB_OUTPUT_DIR ${TurboJpegBinBaseDir} )
70+ endif ()
71+
72+ # ======== Declare Imported Library ========
73+ add_library (libjpeg-turbo::libjpeg-turbo SHARED IMPORTED GLOBAL )
74+
75+ set (JPG_IMPORTED_LOCATION "" )
76+ set (JPG_IMPORTED_IMPLIB "" )
77+
78+
79+ if (IS_MULTI_CONFIG)
80+ # Multi-config: set per-config imported locations
81+ foreach (cfg ${CMAKE_CONFIGURATION_TYPES} )
82+ string (TOUPPER "${cfg} " cfg_upper)
83+ list (APPEND JPG_IMPORTED_LOCATION "IMPORTED_LOCATION_${cfg_upper} " "${JPG_RUNTIME_OUTPUT_DIR} /${cfg} /${JPG_RUNTIME_NAME} " )
84+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES
85+ "IMPORTED_LOCATION_${cfg_upper} " "${JPG_RUNTIME_OUTPUT_DIR} /${cfg} /${JPG_RUNTIME_NAME} " )
86+ # Set import library on Windows
87+ if (WIN32 )
88+ list (APPEND JPG_IMPORTED_IMPLIB "IMPORTED_IMPLIB_${cfg_upper} " "${JPG_LIB_OUTPUT_DIR} /${cfg} /${JPG_IMPLIB_NAME} " )
89+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES
90+ "IMPORTED_IMPLIB_${cfg_upper} " "${JPG_LIB_OUTPUT_DIR} /${cfg} /${JPG_IMPLIB_NAME} " )
91+ endif ()
92+ endforeach ()
93+ else ()
94+
95+ set (JPG_IMPORTED_LOCATION "${JPG_RUNTIME_OUTPUT_DIR} /${JPG_RUNTIME_NAME} " )
96+ # Single-config: flat directory
97+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES IMPORTED_LOCATION
98+ "${JPG_RUNTIME_OUTPUT_DIR} /${JPG_RUNTIME_NAME} " )
99+
100+ # Set import library on Windows
101+ if (WIN32 )
102+ set (JPG_IMPORTED_IMPLIB "${JPG_LIB_OUTPUT_DIR} /${JPG_IMPLIB_NAME} " )
103+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES IMPORTED_IMPLIB
104+ "${JPG_LIB_OUTPUT_DIR} /${JPG_IMPLIB_NAME} " )
105+ endif ()
106+ endif ()
107+
108+ # ======== Include directories ========
109+ set_target_properties (libjpeg-turbo::libjpeg-turbo PROPERTIES
110+ INTERFACE_INCLUDE_DIRECTORIES "${LibJpegTurboFolder} /src"
111+ )
112+
113+ list ( APPEND JPG_BYPRODUCTS ${JPG_IMPORTED_LOCATION} )
114+ if (WIN32 )
115+ list (APPEND JPG_BYPRODUCTS ${JPG_IMPORTED_IMPLIB} )
116+ endif ()
117+
118+ # ======== Add ExternalProject ========
25119ExternalProject_Add(libjpeg-turbo
26- SOURCE_DIR ${LibJpegTurboFolder}
27- BINARY_DIR ${TurboJpegBinDir }
120+ SOURCE_DIR ${LibJpegTurboFolder}
121+ BINARY_DIR ${TurboJpegBinBaseDir }
28122 CMAKE_ARGS ${LibJpegTurboArgs}
29- INSTALL_COMMAND "" # <--- disables 'ninja install'
30- BUILD_COMMAND ${CMAKE_COMMAND} --build . --target turbojpeg
31- BUILD_BYPRODUCTS ${TurboJpegBinDir} /turbojpeg.dll
123+ INSTALL_COMMAND ""
124+ BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> --target turbojpeg
125+ BYPRODUCTS ${JPG_BYPRODUCTS}
32126)
33127
128+ # ======== Depend on ExternalProject ========
129+ add_dependencies (libjpeg-turbo::libjpeg-turbo libjpeg-turbo)
130+
131+
132+ # =========================
133+
34134 file (GLOB_RECURSE sourceFiles
35135 "./Source/*.h"
36136 "./Source/*.cpp"
@@ -39,14 +139,8 @@ ExternalProject_Add(libjpeg-turbo
39139set (TargetName CodecJPG)
40140add_library (${TargetName} ${sourceFiles} )
41141
42- add_dependencies (${TargetName} libjpeg-turbo)
43- target_link_libraries (${TargetName} PRIVATE ${TurboJpegBinDir} /turbojpeg.lib) # adjust to match built target name
142+ target_link_libraries (${TargetName} PRIVATE libjpeg-turbo::libjpeg-turbo) # adjust to match built target name
44143
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)
48-
49- if (${CMAKE_SYSTEM_NAME} MATCHES "Windows" AND NOT MINGW)
144+ if (${CMAKE_SYSTEM_NAME} MATCHES "Windows" AND (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC" ) AND NOT MINGW)
50145 target_link_options (${TargetName} PUBLIC "/DELAYLOAD:turbojpeg.dll" )
51- else ()
52146endif ()
0 commit comments