Skip to content

Commit d781bf9

Browse files
committed
Improve libjpeg-turbo external build paths
Derive libjpeg-turbo runtime and import-library artifact names from CMake platform variables instead of hardcoded suffixes. Forward runtime, library, and archive output directories into the external build and track only actual byproduct paths for imported target dependencies.
1 parent 219c594 commit d781bf9

1 file changed

Lines changed: 99 additions & 78 deletions

File tree

Codecs/CodecJPG/CMakeLists.txt

Lines changed: 99 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,145 @@
1-
#Codec JPG
1+
# Codec JPG
22
cmake_minimum_required(VERSION 3.10)
33

44
include(ExternalProject)
55

6-
set(LibJpegTurboFolder ${CMAKE_CURRENT_SOURCE_DIR}/../../External/libjpeg-turbo)
6+
set(LibJpegTurboFolder "${CMAKE_CURRENT_SOURCE_DIR}/../../External/libjpeg-turbo")
77
get_filename_component(LibJpegTurboFolder "${LibJpegTurboFolder}" ABSOLUTE)
8-
set(NASMPATH ${CMAKE_CURRENT_SOURCE_DIR}/../../External/bintools/nasm-2.15.05/nasm.exe)
8+
set(NASMPATH "${CMAKE_CURRENT_SOURCE_DIR}/../../External/bintools/nasm-2.15.05/nasm.exe")
99
get_filename_component(NASMPATH "${NASMPATH}" ABSOLUTE)
1010

11-
12-
# =========================
13-
# =========================
14-
1511
# ======== Detect Multi-config vs Single-config ========
1612
if(CMAKE_CONFIGURATION_TYPES)
1713
set(IS_MULTI_CONFIG TRUE)
1814
else()
1915
set(IS_MULTI_CONFIG FALSE)
2016
endif()
2117

22-
# ======== Platform-specific file extensions ========
18+
# ======== Platform-specific file names ========
19+
set(JPG_OUTPUT_NAME turbojpeg)
20+
set(JPG_RUNTIME_NAME "${CMAKE_SHARED_LIBRARY_PREFIX}${JPG_OUTPUT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
21+
set(JPG_IMPLIB_NAME "")
22+
2323
if(WIN32)
24-
if (MINGW)
25-
set(JPG_RUNTIME_NAME "libturbojpeg.dll")
26-
set(JPG_IMPLIB_NAME "libturbojpeg.dll.a")
27-
else()
28-
set(JPG_RUNTIME_NAME "turbojpeg.dll")
29-
set(JPG_IMPLIB_NAME "turbojpeg.lib")
30-
endif()
31-
elseif(APPLE)
32-
set(JPG_RUNTIME_NAME "libturbojpeg.dylib")
33-
set(JPG_IMPLIB_NAME "") # No import libs on macOS
34-
else()
35-
set(JPG_RUNTIME_NAME "libturbojpeg.so")
36-
set(JPG_IMPLIB_NAME "") # No import libs on Linux
24+
set(JPG_IMPLIB_NAME "${CMAKE_IMPORT_LIBRARY_PREFIX}${JPG_OUTPUT_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}")
3725
endif()
3826

3927
# ======== External build directory ========
4028
set(TurboJpegBinBaseDir "${CMAKE_BINARY_DIR}/libjpeg-turbo")
4129

42-
# ======== CMake arguments for libjpeg-turbo ========
43-
set(LibJpegTurboArgs
44-
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
45-
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
46-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
47-
-DCMAKE_MT=${CMAKE_MT}
48-
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
49-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
50-
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
51-
-DCMAKE_RC_COMPILER=${CMAKE_RC_COMPILER}
52-
-DENABLE_STATIC=FALSE
53-
-DWITH_FUZZ=FALSE
54-
-DWITH_JPEG=FALSE
55-
-DCMAKE_INSTALL_PREFIX=${TurboJpegBinBaseDir}/install
56-
)
30+
# ======== Output directories ========
31+
if(CMAKE_RUNTIME_OUTPUT_DIRECTORY)
32+
set(JPG_RUNTIME_OUTPUT_DIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
33+
else()
34+
set(JPG_RUNTIME_OUTPUT_DIR "${TurboJpegBinBaseDir}")
35+
endif()
5736

58-
if (CMAKE_TOOLCHAIN_FILE)
59-
get_filename_component(CMAKE_TOOLCHAIN_FILE_ABSOLUTE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE)
60-
list(APPEND LibJpegTurboArgs -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE_ABSOLUTE})
37+
if(CMAKE_LIBRARY_OUTPUT_DIRECTORY)
38+
set(JPG_LIBRARY_OUTPUT_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
39+
else()
40+
set(JPG_LIBRARY_OUTPUT_DIR "${TurboJpegBinBaseDir}")
6141
endif()
62-
# Enable NASM on Windows if needed
63-
if(WIN32 AND NOT ${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux")
64-
list(APPEND LibJpegTurboArgs -DCMAKE_ASM_NASM_COMPILER=${NASMPATH})
42+
43+
if(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
44+
set(JPG_ARCHIVE_OUTPUT_DIR "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
45+
elseif(WIN32)
46+
set(JPG_ARCHIVE_OUTPUT_DIR "${JPG_RUNTIME_OUTPUT_DIR}")
47+
else()
48+
set(JPG_ARCHIVE_OUTPUT_DIR "${TurboJpegBinBaseDir}")
6549
endif()
6650

67-
# Support Custom runtime and library output directories
68-
if (CMAKE_RUNTIME_OUTPUT_DIRECTORY)
69-
set(JPG_RUNTIME_OUTPUT_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
51+
if(WIN32)
52+
set(JPG_IMPORTED_LOCATION_DIR "${JPG_RUNTIME_OUTPUT_DIR}")
7053
else()
71-
set(JPG_RUNTIME_OUTPUT_DIR ${TurboJpegBinBaseDir})
54+
set(JPG_IMPORTED_LOCATION_DIR "${JPG_LIBRARY_OUTPUT_DIR}")
7255
endif()
7356

57+
function(jpg_get_config_path result output_dir config file_name)
58+
set(path "${output_dir}/${file_name}")
59+
if(IS_MULTI_CONFIG
60+
AND NOT "${output_dir}" MATCHES "\\$<CONFIG>|\\$\\(Configuration\\)|\\$\\{CMAKE_CFG_INTDIR\\}"
61+
AND NOT "${output_dir}" MATCHES "(^|/)${config}(/|$)")
62+
set(path "${output_dir}/${config}/${file_name}")
63+
endif()
64+
set(${result} "${path}" PARENT_SCOPE)
65+
endfunction()
7466

75-
if (CMAKE_LIBRARY_OUTPUT_DIRECTORY)
76-
set(JPG_LIB_OUTPUT_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
77-
else()
78-
set(JPG_LIB_OUTPUT_DIR ${TurboJpegBinBaseDir})
67+
# ======== CMake arguments for libjpeg-turbo ========
68+
set(LibJpegTurboArgs
69+
"-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${JPG_RUNTIME_OUTPUT_DIR}"
70+
"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${JPG_LIBRARY_OUTPUT_DIR}"
71+
"-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=${JPG_ARCHIVE_OUTPUT_DIR}"
72+
"-DENABLE_STATIC=FALSE"
73+
"-DWITH_FUZZ=FALSE"
74+
"-DWITH_JPEG=FALSE"
75+
"-DCMAKE_INSTALL_PREFIX=${TurboJpegBinBaseDir}/install"
76+
)
77+
78+
if(NOT IS_MULTI_CONFIG AND CMAKE_BUILD_TYPE)
79+
list(APPEND LibJpegTurboArgs "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
80+
endif()
81+
82+
foreach(cmake_arg CMAKE_MT CMAKE_C_COMPILER CMAKE_CXX_COMPILER CMAKE_MAKE_PROGRAM CMAKE_RC_COMPILER)
83+
if(DEFINED ${cmake_arg} AND NOT "${${cmake_arg}}" STREQUAL "")
84+
list(APPEND LibJpegTurboArgs "-D${cmake_arg}=${${cmake_arg}}")
85+
endif()
86+
endforeach()
87+
88+
if(CMAKE_TOOLCHAIN_FILE)
89+
get_filename_component(CMAKE_TOOLCHAIN_FILE_ABSOLUTE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE)
90+
list(APPEND LibJpegTurboArgs "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE_ABSOLUTE}")
91+
endif()
92+
93+
# Enable NASM on Windows when building on Windows.
94+
if(WIN32 AND NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND EXISTS "${NASMPATH}")
95+
list(APPEND LibJpegTurboArgs "-DCMAKE_ASM_NASM_COMPILER=${NASMPATH}")
7996
endif()
8097

8198
# ======== Declare Imported Library ========
8299
add_library(libjpeg-turbo::libjpeg-turbo SHARED IMPORTED GLOBAL)
83100

84101
set(JPG_IMPORTED_LOCATION "")
85102
set(JPG_IMPORTED_IMPLIB "")
86-
103+
set(JPG_BYPRODUCTS "")
87104

88105
if(IS_MULTI_CONFIG)
89106
# Multi-config: set per-config imported locations
90107
foreach(cfg ${CMAKE_CONFIGURATION_TYPES})
91108
string(TOUPPER "${cfg}" cfg_upper)
92-
list(APPEND JPG_IMPORTED_LOCATION "IMPORTED_LOCATION_${cfg_upper}" "${JPG_RUNTIME_OUTPUT_DIR}/${cfg}/${JPG_RUNTIME_NAME}")
93-
set_target_properties(libjpeg-turbo::libjpeg-turbo PROPERTIES
94-
"IMPORTED_LOCATION_${cfg_upper}" "${JPG_RUNTIME_OUTPUT_DIR}/${cfg}/${JPG_RUNTIME_NAME}")
109+
110+
jpg_get_config_path(JPG_CFG_IMPORTED_LOCATION "${JPG_IMPORTED_LOCATION_DIR}" "${cfg}" "${JPG_RUNTIME_NAME}")
111+
list(APPEND JPG_IMPORTED_LOCATION "${JPG_CFG_IMPORTED_LOCATION}")
112+
list(APPEND JPG_BYPRODUCTS "${JPG_CFG_IMPORTED_LOCATION}")
113+
set_target_properties(libjpeg-turbo::libjpeg-turbo PROPERTIES
114+
"IMPORTED_LOCATION_${cfg_upper}" "${JPG_CFG_IMPORTED_LOCATION}"
115+
)
116+
95117
# Set import library on Windows
96118
if(WIN32)
97-
list(APPEND JPG_IMPORTED_IMPLIB "IMPORTED_IMPLIB_${cfg_upper}" "${JPG_LIB_OUTPUT_DIR}/${cfg}/${JPG_IMPLIB_NAME}")
98-
set_target_properties(libjpeg-turbo::libjpeg-turbo PROPERTIES
99-
"IMPORTED_IMPLIB_${cfg_upper}" "${JPG_LIB_OUTPUT_DIR}/${cfg}/${JPG_IMPLIB_NAME}")
119+
jpg_get_config_path(JPG_CFG_IMPORTED_IMPLIB "${JPG_ARCHIVE_OUTPUT_DIR}" "${cfg}" "${JPG_IMPLIB_NAME}")
120+
list(APPEND JPG_IMPORTED_IMPLIB "${JPG_CFG_IMPORTED_IMPLIB}")
121+
list(APPEND JPG_BYPRODUCTS "${JPG_CFG_IMPORTED_IMPLIB}")
122+
set_target_properties(libjpeg-turbo::libjpeg-turbo PROPERTIES
123+
"IMPORTED_IMPLIB_${cfg_upper}" "${JPG_CFG_IMPORTED_IMPLIB}"
124+
)
100125
endif()
101126
endforeach()
102127
else()
103128

104-
set(JPG_IMPORTED_LOCATION "${JPG_RUNTIME_OUTPUT_DIR}/${JPG_RUNTIME_NAME}")
129+
set(JPG_IMPORTED_LOCATION "${JPG_IMPORTED_LOCATION_DIR}/${JPG_RUNTIME_NAME}")
130+
list(APPEND JPG_BYPRODUCTS "${JPG_IMPORTED_LOCATION}")
105131
# Single-config: flat directory
106-
set_target_properties(libjpeg-turbo::libjpeg-turbo PROPERTIES IMPORTED_LOCATION
107-
"${JPG_RUNTIME_OUTPUT_DIR}/${JPG_RUNTIME_NAME}")
132+
set_target_properties(libjpeg-turbo::libjpeg-turbo PROPERTIES
133+
IMPORTED_LOCATION "${JPG_IMPORTED_LOCATION}"
134+
)
108135

109136
# Set import library on Windows
110137
if(WIN32)
111-
set(JPG_IMPORTED_IMPLIB "${JPG_LIB_OUTPUT_DIR}/${JPG_IMPLIB_NAME}")
112-
set_target_properties(libjpeg-turbo::libjpeg-turbo PROPERTIES IMPORTED_IMPLIB
113-
"${JPG_LIB_OUTPUT_DIR}/${JPG_IMPLIB_NAME}")
138+
set(JPG_IMPORTED_IMPLIB "${JPG_ARCHIVE_OUTPUT_DIR}/${JPG_IMPLIB_NAME}")
139+
list(APPEND JPG_BYPRODUCTS "${JPG_IMPORTED_IMPLIB}")
140+
set_target_properties(libjpeg-turbo::libjpeg-turbo PROPERTIES
141+
IMPORTED_IMPLIB "${JPG_IMPORTED_IMPLIB}"
142+
)
114143
endif()
115144
endif()
116145

@@ -119,33 +148,25 @@ set_target_properties(libjpeg-turbo::libjpeg-turbo PROPERTIES
119148
INTERFACE_INCLUDE_DIRECTORIES "${LibJpegTurboFolder}/src"
120149
)
121150

122-
list ( APPEND JPG_BYPRODUCTS ${JPG_IMPORTED_LOCATION} )
123-
if (WIN32)
124-
list (APPEND JPG_BYPRODUCTS ${JPG_IMPORTED_IMPLIB} )
125-
endif()
126-
127151
# ======== Add ExternalProject ========
128152
ExternalProject_Add(libjpeg-turbo
129153
SOURCE_DIR ${LibJpegTurboFolder}
130154
BINARY_DIR ${TurboJpegBinBaseDir}
131155
CMAKE_ARGS ${LibJpegTurboArgs}
132156
INSTALL_COMMAND ""
133157
BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> --target turbojpeg
134-
BYPRODUCTS ${JPG_BYPRODUCTS}
158+
BYPRODUCTS ${JPG_BYPRODUCTS}
135159
)
136160

137161
# ======== Depend on ExternalProject ========
138162
add_dependencies(libjpeg-turbo::libjpeg-turbo libjpeg-turbo)
139163

140-
141-
# =========================
142-
143-
file(GLOB_RECURSE sourceFiles
144-
"./Source/*.h"
145-
"./Source/*.cpp"
146-
)
164+
file(GLOB_RECURSE sourceFiles
165+
"./Source/*.h"
166+
"./Source/*.cpp"
167+
)
147168

148169
set(TargetName CodecJPG)
149-
add_library (${TargetName} ${sourceFiles} )
170+
add_library(${TargetName} ${sourceFiles})
150171

151-
target_link_libraries(${TargetName} PRIVATE libjpeg-turbo::libjpeg-turbo) # adjust to match built target name
172+
target_link_libraries(${TargetName} PRIVATE libjpeg-turbo::libjpeg-turbo)

0 commit comments

Comments
 (0)