Skip to content

Commit 6db2748

Browse files
committed
Fix: ImagecCodec example
1 parent 0f0f5d9 commit 6db2748

File tree

3 files changed

+136
-37
lines changed

3 files changed

+136
-37
lines changed

Codecs/CodecJPG/CMakeLists.txt

Lines changed: 116 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,134 @@ cmake_minimum_required(VERSION 3.10)
33

44
include(ExternalProject)
55

6-
set(LibJpegTurboFolder ../../External/libjpeg-turbo)
6+
set(LibJpegTurboFolder ${CMAKE_CURRENT_SOURCE_DIR}/../../External/libjpeg-turbo)
77
get_filename_component(LibJpegTurboFolder "${LibJpegTurboFolder}" ABSOLUTE)
88
set(NASMPATH ${CMAKE_CURRENT_SOURCE_DIR}/../../External/bintools/nasm-2.15.05/nasm.exe)
99
get_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 ========
1238
set(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})
2356
endif()
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 ========
25119
ExternalProject_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
39139
set(TargetName CodecJPG)
40140
add_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()
52146
endif()

Codecs/CodecTiff/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ target_include_directories(${TargetName} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/ext
6868

6969

7070
target_link_libraries(${TargetName} tiff)
71-
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows" AND NOT MINGW)
71+
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows" AND (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") AND NOT MINGW)
7272
target_link_options(${TargetName} PUBLIC "/DELAYLOAD:$<TARGET_FILE_BASE_NAME:tiff>.dll")
7373
endif()

Example/CMakeLists.txt

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required (VERSION 3.8)
1+
cmake_minimum_required (VERSION 3.10)
22

33
#Image Codec
44
set(CMAKE_CXX_STANDARD 20)
@@ -16,21 +16,26 @@ add_executable(${TargetName} ${sourceFiles})
1616
target_include_directories(${TargetName} PRIVATE ./Imageloader/Include)
1717
target_link_libraries(${TargetName} PRIVATE ImageCodec)
1818

19+
1920
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
20-
target_link_libraries(${TargetName} PRIVATE delayimp)
21+
target_link_libraries(${TargetName} PRIVATE delayimp dbghelp)
2122
endif()
2223

2324

25+
set(OUTPUT_PATH $<TARGET_FILE_DIR:${TargetName}>)
26+
2427
#Copy oiv library resources to the output dir
25-
add_custom_command(TARGET ${TargetName}
26-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/cat.jpg ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/)
27-
28-
#Copy needed dependencies to output dir
29-
add_custom_command(TARGET ${TargetName} POST_BUILD
30-
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:png_shared> ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/)
31-
32-
add_custom_command(TARGET ${TargetName} POST_BUILD
33-
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:zlib> ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/)
34-
35-
add_custom_command(TARGET ${TargetName} POST_BUILD
36-
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:turbojpeg> ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/)
28+
add_custom_command(TARGET ${TargetName} POST_BUILD
29+
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/cat.jpg ${OUTPUT_PATH}/)
30+
31+
#copy zlib, libpng and libjpeg-turbo dlls to the output dir
32+
add_custom_command(TARGET ${TargetName} POST_BUILD
33+
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:zlib> ${OUTPUT_PATH}/)
34+
35+
add_custom_command(TARGET ${TargetName} POST_BUILD
36+
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:png_shared> ${OUTPUT_PATH}/)
37+
38+
add_custom_command(TARGET ${TargetName} POST_BUILD
39+
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:libjpeg-turbo::libjpeg-turbo> ${OUTPUT_PATH}/)
40+
41+

0 commit comments

Comments
 (0)