Skip to content

Commit acc4305

Browse files
committed
Add cmake support with cmake-config file
Add full cmake support. The project can either be used with `add_subdirectory` or be installed into the system (or some other directory) and be found with `find_package(lodepng)`. In both cases the cmake target `lodepng::lodepng` is all that needs to be linked. Having an install target also makes packaging easier. - add libraries - loadepng - lodepng_util - add executables (also installed) - pngdetail - generate lodepng-config.cmake and install in lib/cmake/lodepng - add unittest and target `test` (enabled by flag ENABLE_TESTING) - add benchmark (enabled by flag BUILD_BENCHMARK) - add examples (enabled by flag BUILD_EXAMPLES) note: I was only able to install SDL2 from my package manager, but benchmark, example_opengl and example_sdl use SDL (1)
1 parent ba9fc1f commit acc4305

File tree

3 files changed

+146
-0
lines changed

3 files changed

+146
-0
lines changed

CMakeLists.txt

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
cmake_minimum_required(VERSION 3.1)
2+
project(lodepng)
3+
4+
# define target to install and link tests against
5+
add_library(${CMAKE_PROJECT_NAME}
6+
lodepng.h
7+
lodepng.cpp)
8+
target_include_directories(${CMAKE_PROJECT_NAME}
9+
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
10+
add_library(${CMAKE_PROJECT_NAME}_util
11+
lodepng_util.h
12+
lodepng_util.cpp)
13+
target_link_libraries(${CMAKE_PROJECT_NAME}_util PUBLIC ${CMAKE_PROJECT_NAME})
14+
add_executable(pngdetail
15+
pngdetail.cpp)
16+
target_link_libraries(pngdetail PRIVATE ${CMAKE_PROJECT_NAME}_util)
17+
18+
# ALIAS same as in configure file
19+
# the ALIAS can be used to create examples which use the same syntax as a client
20+
# application, which uses `find_package(lodepng CONFIG)`
21+
# create the alias lodepng::lodepng
22+
add_library(${CMAKE_PROJECT_NAME}::${CMAKE_PROJECT_NAME} ALIAS ${CMAKE_PROJECT_NAME})
23+
add_library(${CMAKE_PROJECT_NAME}::${CMAKE_PROJECT_NAME}_util ALIAS ${CMAKE_PROJECT_NAME}_util)
24+
25+
option(ENABLE_TESTING "enable creation of unittest" ON)
26+
if(ENABLE_TESTING)
27+
enable_testing()
28+
add_executable(${CMAKE_PROJECT_NAME}_unittest lodepng_unittest.cpp)
29+
# add compiler flags for test target only for GCC and Clang
30+
target_compile_options(${CMAKE_PROJECT_NAME}_unittest PRIVATE
31+
$<BUILD_INTERFACE:
32+
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:
33+
-Werror -Wall -pedantic>>
34+
)
35+
36+
add_test(test_${CMAKE_PROJECT_NAME}_unittest ${CMAKE_PROJECT_NAME}_unittest)
37+
target_link_libraries(${CMAKE_PROJECT_NAME}_unittest PRIVATE ${CMAKE_PROJECT_NAME}_util)
38+
endif()
39+
40+
option(BUILD_EXAMPLES "build examples using ${CMAKE_PROJECT_NAME}" OFF)
41+
if(BUILD_EXAMPLES)
42+
add_subdirectory(examples)
43+
endif()
44+
45+
option(BUILD_BENCHMARK "build benchmark for ${CMAKE_PROJECT_NAME}, requires SDL2" OFF)
46+
if(BUILD_BENCHMARK)
47+
add_executable(${CMAKE_PROJECT_NAME}_benchmark lodepng_benchmark.cpp)
48+
target_link_libraries(${CMAKE_PROJECT_NAME}_benchmark PRIVATE ${CMAKE_PROJECT_NAME}::${CMAKE_PROJECT_NAME})
49+
# SDL2 Dependency
50+
find_package(SDL2 CONFIG REQUIRED)
51+
if (TARGET SDL2::SDL2)
52+
message(STATUS "using TARGET SDL2::SDL2")
53+
target_link_libraries(${CMAKE_PROJECT_NAME}_benchmark PUBLIC SDL2::SDL2)
54+
else()
55+
message(STATUS "no TARGET SDL2::SDL2, or SDL2, using variables")
56+
target_include_directories(${CMAKE_PROJECT_NAME}_benchmark PUBLIC $<BUILD_INTERFACE:${SDL2_INCLUDE_DIRS}>)
57+
target_link_libraries(${CMAKE_PROJECT_NAME}_benchmark PUBLIC ${SDL2_LIBRARIES})
58+
endif()
59+
add_custom_target(benchmark COMMAND ${CMAKE_PROJECT_NAME}_benchmark)
60+
endif()
61+
62+
# create install target
63+
include(GNUInstallDirs)
64+
install(
65+
TARGETS
66+
${CMAKE_PROJECT_NAME}
67+
${CMAKE_PROJECT_NAME}_util
68+
pngdetail
69+
EXPORT ${CMAKE_PROJECT_NAME}-targets
70+
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # set include path for installed library target
71+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
72+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
73+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
74+
)
75+
install(
76+
FILES
77+
lodepng.h
78+
lodepng_util.h
79+
DESTINATION include
80+
)
81+
82+
# Include module for fuctions
83+
# - 'write_basic_package_version_file'
84+
# - 'configure_package_config_file'
85+
include(CMakePackageConfigHelpers)
86+
87+
# generate and install termcolor-config.cmake file
88+
# Configure '<PROJECT-NAME>-config.cmake'
89+
configure_package_config_file(
90+
"cmake/config.cmake.in"
91+
"${CMAKE_CURRENT_BINARY_DIR}/generated/lodepng-config.cmake"
92+
INSTALL_DESTINATION "lib/cmake/lodepng"
93+
)
94+
# install config file
95+
install(
96+
FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/lodepng-config.cmake"
97+
DESTINATION "lib/cmake/lodepng"
98+
)
99+
# install targets file
100+
install(
101+
EXPORT "${CMAKE_PROJECT_NAME}-targets"
102+
NAMESPACE "${CMAKE_PROJECT_NAME}::"
103+
DESTINATION "lib/cmake/lodepng"
104+
)

cmake/config.cmake.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@PACKAGE_INIT@
2+
3+
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
4+
check_required_components("@CMAKE_PROJECT_NAME@")
5+

examples/CMakeLists.txt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
2+
foreach(example
3+
4bit_palette
4+
bmp2png
5+
decode
6+
encode
7+
gzip
8+
#opengl
9+
optimize_png
10+
png2bmp
11+
png_info
12+
reencode
13+
#sdl
14+
)
15+
add_executable(example_${example}
16+
example_${example}.cpp)
17+
target_link_libraries(example_${example} PRIVATE lodepng)
18+
endforeach()
19+
20+
# SDL2 Dependency
21+
find_package(SDL2 CONFIG REQUIRED)
22+
if (TARGET SDL2::SDL2)
23+
message(STATUS "using TARGET SDL2::SDL2")
24+
else()
25+
message(STATUS "no TARGET SDL2::SDL2, or SDL2, using variables")
26+
endif()
27+
foreach(example
28+
#opengl
29+
#sdl
30+
)
31+
if (TARGET SDL2::SDL2)
32+
target_link_libraries(example_${example} PRIVATE SDL2::SDL2)
33+
else()
34+
target_include_directories(example_${example} PRIVATE $<BUILD_INTERFACE:${SDL2_INCLUDE_DIRS}>)
35+
target_link_libraries(example_${example} PRIVATE ${SDL2_LIBRARIES})
36+
endif()
37+
endforeach()

0 commit comments

Comments
 (0)