Skip to content

Commit b8093fd

Browse files
committed
cmake: rework cpp.cmake
1 parent dba11d9 commit b8093fd

File tree

2 files changed

+90
-97
lines changed

2 files changed

+90
-97
lines changed

cmake/cpp.cmake

Lines changed: 80 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -28,88 +28,6 @@ if(CHECK_TYPE)
2828
cmake_pop_check_state()
2929
endif()
3030

31-
include(GNUInstallDirs)
32-
33-
################
34-
## C++ Test ##
35-
################
36-
# add_cxx_test()
37-
# CMake function to generate and build C++ test.
38-
# Parameters:
39-
# NAME: CMake target name
40-
# SOURCES: List of source files
41-
# [COMPILE_DEFINITIONS]: List of private compile definitions
42-
# [COMPILE_OPTIONS]: List of private compile options
43-
# [LINK_LIBRARIES]: List of private libraries to use when linking
44-
# note: ortools::ortools is always linked to the target
45-
# [LINK_OPTIONS]: List of private link options
46-
# e.g.:
47-
# add_cxx_test(
48-
# NAME
49-
# foo_test
50-
# SOURCES
51-
# foo_test.cc
52-
# ${PROJECT_SOURCE_DIR}/Foo/foo_test.cc
53-
# LINK_LIBRARIES
54-
# GTest::gmock
55-
# GTest::gtest_main
56-
# )
57-
function(add_cxx_test)
58-
set(options "")
59-
set(oneValueArgs "NAME")
60-
set(multiValueArgs
61-
"SOURCES;COMPILE_DEFINITIONS;COMPILE_OPTIONS;LINK_LIBRARIES;LINK_OPTIONS")
62-
cmake_parse_arguments(TEST
63-
"${options}"
64-
"${oneValueArgs}"
65-
"${multiValueArgs}"
66-
${ARGN}
67-
)
68-
if(NOT BUILD_TESTING)
69-
return()
70-
endif()
71-
72-
if(NOT TEST_NAME)
73-
message(FATAL_ERROR "no NAME provided")
74-
endif()
75-
if(NOT TEST_SOURCES)
76-
message(FATAL_ERROR "no SOURCES provided")
77-
endif()
78-
message(STATUS "Configuring test ${TEST_NAME} ...")
79-
80-
add_executable(${TEST_NAME} "")
81-
target_sources(${TEST_NAME} PRIVATE ${TEST_SOURCES})
82-
target_include_directories(${TEST_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
83-
target_compile_definitions(${TEST_NAME} PRIVATE ${TEST_COMPILE_DEFINITIONS})
84-
target_compile_features(${TEST_NAME} PRIVATE cxx_std_20)
85-
target_compile_options(${TEST_NAME} PRIVATE ${TEST_COMPILE_OPTIONS})
86-
target_link_libraries(${TEST_NAME} PRIVATE
87-
GTest::gtest
88-
GTest::gtest_main
89-
${TEST_LINK_LIBRARIES}
90-
)
91-
target_link_options(${TEST_NAME} PRIVATE ${TEST_LINK_OPTIONS})
92-
93-
include(GNUInstallDirs)
94-
if(APPLE)
95-
set_target_properties(${TEST_NAME} PROPERTIES
96-
INSTALL_RPATH "@loader_path/../${CMAKE_INSTALL_LIBDIR};@loader_path")
97-
elseif(UNIX)
98-
cmake_path(RELATIVE_PATH CMAKE_INSTALL_FULL_LIBDIR
99-
BASE_DIRECTORY ${CMAKE_INSTALL_FULL_BINDIR}
100-
OUTPUT_VARIABLE libdir_relative_path)
101-
set_target_properties(${TEST_NAME} PROPERTIES
102-
INSTALL_RPATH "$ORIGIN/${libdir_relative_path}:$ORIGIN")
103-
endif()
104-
105-
add_test(
106-
NAME cxx_${TEST_NAME}
107-
COMMAND ${TEST_NAME}
108-
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
109-
)
110-
message(STATUS "Configuring test ${TEST_NAME} ...DONE")
111-
endfunction()
112-
11331
###################
11432
## C++ Library ##
11533
###################
@@ -210,6 +128,86 @@ function(add_cxx_library)
210128
message(STATUS "Configuring library ${LIBRARY_NAME} ...DONE")
211129
endfunction()
212130

131+
################
132+
## C++ Test ##
133+
################
134+
# add_cxx_test()
135+
# CMake function to generate and build C++ test.
136+
# Parameters:
137+
# NAME: CMake target name
138+
# SOURCES: List of source files
139+
# [COMPILE_DEFINITIONS]: List of private compile definitions
140+
# [COMPILE_OPTIONS]: List of private compile options
141+
# [LINK_LIBRARIES]: List of private libraries to use when linking
142+
# note: ortools::ortools is always linked to the target
143+
# [LINK_OPTIONS]: List of private link options
144+
# e.g.:
145+
# add_cxx_test(
146+
# NAME
147+
# foo_test
148+
# SOURCES
149+
# foo_test.cc
150+
# ${PROJECT_SOURCE_DIR}/Foo/foo_test.cc
151+
# LINK_LIBRARIES
152+
# GTest::gmock
153+
# GTest::gtest_main
154+
# )
155+
function(add_cxx_test)
156+
set(options "")
157+
set(oneValueArgs "NAME")
158+
set(multiValueArgs
159+
"SOURCES;COMPILE_DEFINITIONS;COMPILE_OPTIONS;LINK_LIBRARIES;LINK_OPTIONS")
160+
cmake_parse_arguments(TEST
161+
"${options}"
162+
"${oneValueArgs}"
163+
"${multiValueArgs}"
164+
${ARGN}
165+
)
166+
if(NOT BUILD_TESTING)
167+
return()
168+
endif()
169+
170+
if(NOT TEST_NAME)
171+
message(FATAL_ERROR "no NAME provided")
172+
endif()
173+
if(NOT TEST_SOURCES)
174+
message(FATAL_ERROR "no SOURCES provided")
175+
endif()
176+
message(STATUS "Configuring test ${TEST_NAME} ...")
177+
178+
add_executable(${TEST_NAME} "")
179+
target_sources(${TEST_NAME} PRIVATE ${TEST_SOURCES})
180+
target_include_directories(${TEST_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
181+
target_compile_definitions(${TEST_NAME} PRIVATE ${TEST_COMPILE_DEFINITIONS})
182+
target_compile_features(${TEST_NAME} PRIVATE cxx_std_20)
183+
target_compile_options(${TEST_NAME} PRIVATE ${TEST_COMPILE_OPTIONS})
184+
target_link_libraries(${TEST_NAME} PRIVATE
185+
GTest::gtest
186+
GTest::gtest_main
187+
${TEST_LINK_LIBRARIES}
188+
)
189+
target_link_options(${TEST_NAME} PRIVATE ${TEST_LINK_OPTIONS})
190+
191+
include(GNUInstallDirs)
192+
if(APPLE)
193+
set_target_properties(${TEST_NAME} PROPERTIES
194+
INSTALL_RPATH "@loader_path/../${CMAKE_INSTALL_LIBDIR};@loader_path")
195+
elseif(UNIX)
196+
cmake_path(RELATIVE_PATH CMAKE_INSTALL_FULL_LIBDIR
197+
BASE_DIRECTORY ${CMAKE_INSTALL_FULL_BINDIR}
198+
OUTPUT_VARIABLE libdir_relative_path)
199+
set_target_properties(${TEST_NAME} PROPERTIES
200+
INSTALL_RPATH "$ORIGIN/${libdir_relative_path}:$ORIGIN")
201+
endif()
202+
203+
add_test(
204+
NAME cxx_${TEST_NAME}
205+
COMMAND ${TEST_NAME}
206+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
207+
)
208+
message(STATUS "Configuring test ${TEST_NAME} ...DONE")
209+
endfunction()
210+
213211
###################
214212
## C++ Example ##
215213
###################
@@ -298,7 +296,6 @@ include(GNUInstallDirs)
298296
#GENERATE_EXPORT_HEADER(${PROJECT_NAME})
299297
#install(FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}_export.h
300298
# DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
301-
302299
install(EXPORT ${PROJECT_NAME}Targets
303300
NAMESPACE ${PROJECT_NAMESPACE}::
304301
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}

examples/CMakeLists.txt

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,16 @@ if(NOT BUILD_EXAMPLES)
22
return()
33
endif()
44

5-
file(GLOB CPP_SRCS "*.cpp")
6-
foreach(FILE_NAME IN LISTS CPP_SRCS)
7-
get_filename_component(NAME ${FILE_NAME} NAME_WE)
8-
add_cxx_example(
9-
NAME
10-
${NAME}
11-
SOURCES
12-
${FILE_NAME}
13-
LINK_LIBRARIES
14-
${PROJECT_NAMESPACE}::Foo
15-
${PROJECT_NAMESPACE}::Bar
16-
${PROJECT_NAMESPACE}::FooBar
17-
)
18-
endforeach()
5+
add_cxx_example(
6+
NAME
7+
example
8+
SOURCES
9+
example.cpp
10+
LINK_LIBRARIES
11+
${PROJECT_NAMESPACE}::Foo
12+
${PROJECT_NAMESPACE}::Bar
13+
${PROJECT_NAMESPACE}::FooBar
14+
)
1915

2016
file(GLOB PYTHON_SRCS "*.py")
2117
foreach(FILE_NAME IN LISTS PYTHON_SRCS)

0 commit comments

Comments
 (0)