Skip to content

Commit 1e87061

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

3 files changed

Lines changed: 136 additions & 35 deletions

File tree

Codecs/CodecJPG/CMakeLists.txt

Lines changed: 116 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,108 @@ 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+
-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})
2348
endif()
2449

50+
# ======== Add ExternalProject ========
2551
ExternalProject_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
39113
set(TargetName CodecJPG)
40114
add_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")
51147
else()
52148
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)