Skip to content

Commit ce66150

Browse files
committed
cmake: rework cpp.cmake
1 parent 06113e8 commit ce66150

File tree

1 file changed

+74
-23
lines changed

1 file changed

+74
-23
lines changed

cmake/cpp.cmake

Lines changed: 74 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,44 +30,95 @@ endif()
3030

3131
include(GNUInstallDirs)
3232

33-
# add_cpp_test()
33+
################
34+
## C++ Test ##
35+
################
36+
# add_cxx_test()
3437
# CMake function to generate and build C++ test.
3538
# Parameters:
36-
# the C++ filename
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
3746
# e.g.:
38-
# add_cpp_test(foo.cpp)
39-
function(add_cpp_test FILE_NAME)
40-
message(STATUS "Configuring test ${FILE_NAME}: ...")
41-
get_filename_component(TEST_NAME ${FILE_NAME} NAME_WE)
42-
get_filename_component(TEST_DIR ${FILE_NAME} DIRECTORY)
43-
get_filename_component(COMPONENT_DIR ${FILE_NAME} DIRECTORY)
44-
get_filename_component(COMPONENT_NAME ${COMPONENT_DIR} NAME)
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()
4571

46-
if(APPLE)
47-
set(CMAKE_INSTALL_RPATH
48-
"@loader_path/../${CMAKE_INSTALL_LIBDIR};@loader_path")
49-
elseif(UNIX)
50-
set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:$ORIGIN")
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")
5177
endif()
78+
message(STATUS "Configuring test ${TEST_NAME} ...")
5279

53-
add_executable(${TEST_NAME} ${FILE_NAME})
80+
add_executable(${TEST_NAME} "")
81+
target_sources(${TEST_NAME} PRIVATE ${TEST_SOURCES})
5482
target_include_directories(${TEST_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
55-
target_compile_features(${TEST_NAME} PRIVATE cxx_std_17)
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})
5686
target_link_libraries(${TEST_NAME} PRIVATE
57-
Catch2 Catch2WithMain
58-
${PROJECT_NAMESPACE}::Foo
59-
${PROJECT_NAMESPACE}::Bar
60-
${PROJECT_NAMESPACE}::FooBar)
87+
GTest::gtest
88+
GTest::gtest_main
89+
${TEST_LINK_LIBRARIES}
90+
)
91+
target_link_options(${TEST_NAME} PRIVATE ${TEST_LINK_OPTIONS})
6192

62-
if(BUILD_TESTING)
63-
add_test(NAME cpp_${COMPONENT_NAME}_${TEST_NAME} COMMAND ${TEST_NAME})
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")
64103
endif()
65-
message(STATUS "Configuring test ${FILE_NAME}: ...DONE")
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")
66111
endfunction()
67112

68113
###################
69114
## CMake Install ##
70115
###################
116+
include(GNUInstallDirs)
117+
#include(GenerateExportHeader)
118+
#GENERATE_EXPORT_HEADER(${PROJECT_NAME})
119+
#install(FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}_export.h
120+
# DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
121+
71122
install(EXPORT ${PROJECT_NAME}Targets
72123
NAMESPACE ${PROJECT_NAMESPACE}::
73124
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}

0 commit comments

Comments
 (0)