Skip to content

Commit 1e7cd87

Browse files
committed
Revert require_argument_values to fix logic mistake; Address rabbit nits; Try to improve style consistency.
1 parent 7133493 commit 1e7cd87

File tree

10 files changed

+71
-80
lines changed

10 files changed

+71
-80
lines changed

CMakeLists.txt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,7 @@ endif()
6868

6969
if(ystdlib_ENABLE_TESTS)
7070
find_package(Catch2 3.8.0 REQUIRED)
71-
if(Catch2_FOUND)
72-
message(STATUS "Found Catch2 ${Catch2_VERSION}.")
73-
else()
74-
message(FATAL_ERROR "Could not find libraries for Catch2.")
75-
endif()
71+
message(STATUS "Found Catch2 ${Catch2_VERSION}.")
7672
include(Catch)
7773

7874
set(UNIFIED_UNIT_TEST_TARGET "unit-test-all")

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ task build:unit-test-<lib_name>
6868
To build all libraries, run:
6969

7070
```shell
71-
cmake -S . -D ./build
71+
cmake -S . -B ./build
7272
cmake --build ./build
7373
```
7474

75-
To build a subset of libraries set the variable `YSTDLIB_LIBRARIES` to a semi-colon(`;`) separated
75+
To build a subset of libraries, set the variable `YSTDLIB_LIBRARIES` to a semicolon(`;`) separated
7676
list of library names. The library names match their [directory name in src/](./src/ystdlib).
7777
For example:
7878

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# gersemi: off
2-
if(NOT TARGET "ystdlib::containers")
2+
if(NOT TARGET ystdlib::containers)
33
include("${CMAKE_CURRENT_LIST_DIR}/containers-target.cmake")
44
endif()
55
# gersemi: on

cmake/libs/error_handling-config.cmake.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ if(@Boost_FOUND@)
33
find_dependency(Boost @boost_find_package_args@)
44
endif()
55

6-
if(NOT TARGET "ystdlib::error_handling")
6+
if(NOT TARGET ystdlib::error_handling)
77
include("${CMAKE_CURRENT_LIST_DIR}/error_handling-target.cmake")
88
endif()
99
# gersemi: on
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# gersemi: off
2-
if(NOT TARGET "ystdlib::wrapped_facade_headers")
2+
if(NOT TARGET ystdlib::wrapped_facade_headers)
33
include("${CMAKE_CURRENT_LIST_DIR}/wrapped_facade_headers-target.cmake")
44
endif()
55

6-
if(NOT TARGET "ystdlib::io_interface")
6+
if(NOT TARGET ystdlib::io_interface)
77
include("${CMAKE_CURRENT_LIST_DIR}/io_interface-target.cmake")
88
endif()
99
# gersemi: on
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# gersemi: off
2-
if(NOT TARGET "ystdlib::wrapped_facade_headers")
2+
if(NOT TARGET ystdlib::wrapped_facade_headers)
33
include("${CMAKE_CURRENT_LIST_DIR}/wrapped_facade_headers-target.cmake")
44
endif()
55
# gersemi: on

cmake/ystdlib-config.cmake.in

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ include(CMakeFindDependencyMacro)
77
# If no component is specified we require all libraries.
88
# We guard against repeatedly including targets to support multiple find_package calls.
99
if(NOT ystdlib_FIND_COMPONENTS)
10-
set(_YSTDLIB_LIBRARIES "@YSTDLIB_LIBRARIES@")
11-
foreach(lib IN LISTS _YSTDLIB_LIBRARIES)
12-
if(NOT TARGET "ystdlib::${lib}")
10+
set(YSTDLIB_LIBRARIES_LIST "@YSTDLIB_LIBRARIES@")
11+
foreach(lib IN LISTS YSTDLIB_LIBRARIES_LIST)
12+
if(NOT TARGET ystdlib::${lib})
1313
include("${CMAKE_CURRENT_LIST_DIR}/libs/${lib}-config.cmake")
1414
endif()
1515
endforeach()
1616
else()
1717
foreach(lib IN LISTS ystdlib_FIND_COMPONENTS)
1818
if(NOT TARGET "ystdlib::${lib}")
19-
if(${ystdlib_FIND_REQUIRED_${lib}})
19+
if(ystdlib_FIND_REQUIRED_${lib})
2020
include("${CMAKE_CURRENT_LIST_DIR}/libs/${lib}-config.cmake")
2121
else()
2222
include("${CMAKE_CURRENT_LIST_DIR}/libs/${lib}-config.cmake" OPTIONAL)

cmake/ystdlib-helpers.cmake

Lines changed: 54 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
include(CMakePackageConfigHelpers)
22

3+
# @param {string[]} REQUIRED_ARGS The list of arguments to check.
4+
# @param {string[]} ARG_KEYWORDS_MISSING_VALUES The list of arguments with missing values.
5+
function(require_argument_values REQUIRED_ARGS ARG_KEYWORDS_MISSING_VALUES)
6+
foreach(ARG IN LISTS REQUIRED_ARGS)
7+
if("${ARG}" IN_LIST ARG_KEYWORDS_MISSING_VALUES)
8+
message(FATAL_ERROR "Missing values for argument: '${ARG}'")
9+
endif()
10+
endforeach()
11+
endfunction()
12+
313
# @param {string[]} SOURCE_LIST The list of source files to check.
414
# @param {bool} IS_HEADER_ONLY Returns TRUE if list only contains header files, FALSE otherwise.
515
# @param {string} NON_HEADER_FILE Returns the name of the first, if any, non-header file.
616
function(check_if_header_only SOURCE_LIST IS_HEADER_ONLY NON_HEADER_FILE)
7-
set(_LOCAL_SOURCE_LIST "${${SOURCE_LIST}}")
8-
foreach(src_file IN LISTS _LOCAL_SOURCE_LIST)
9-
if(NOT ${src_file} MATCHES ".*\\.(h|hpp)")
17+
set(LOCAL_SOURCE_LIST "${${SOURCE_LIST}}")
18+
foreach(SRC_FILE IN LISTS LOCAL_SOURCE_LIST)
19+
if(NOT ${SRC_FILE} MATCHES ".*\\.(h|hpp)")
1020
set(${IS_HEADER_ONLY} FALSE PARENT_SCOPE)
11-
set(${NON_HEADER_FILE} ${src_file} PARENT_SCOPE)
21+
set(${NON_HEADER_FILE} ${SRC_FILE} PARENT_SCOPE)
1222
return()
1323
endif()
1424
endforeach()
@@ -25,55 +35,49 @@ endfunction()
2535
# @param {string[]} [PRIVATE_SOURCES]
2636
# @param {string[]} [PUBLIC_LINK_LIBRARIES]
2737
# @param {string[]} [PRIVATE_LINK_LIBRARIES]
28-
# @param {string[]} [BUILD_INCLUDE_DIR="${PROJECT_SOURCE_DIR}/src"] The list of include paths for
29-
# building the library and for external projects that builds `ystdlib` as a CMAKE subproject via
30-
# the add_subdirectory() function.
38+
# @param {string[]} [BUILD_INCLUDE_DIRS="${PROJECT_SOURCE_DIR}/src"] The list of include paths for
39+
# building the library and for external projects that builds `ystdlib` as a CMAKE subproject via the
40+
# add_subdirectory() function.
3141
function(cpp_library)
32-
set(oneValueArgs
42+
set(SINGLE_VALUE_ARGS
3343
NAME
3444
NAMESPACE
3545
)
36-
set(multiValueArgs
46+
set(MULTI_VALUE_ARGS
3747
PUBLIC_HEADERS
3848
PRIVATE_SOURCES
3949
PUBLIC_LINK_LIBRARIES
4050
PRIVATE_LINK_LIBRARIES
41-
BUILD_INCLUDE_DIR
51+
BUILD_INCLUDE_DIRS
4252
)
43-
set(requireValueArgs
53+
set(REQUIRED_ARGS
4454
NAME
4555
NAMESPACE
4656
PUBLIC_HEADERS
47-
BUILD_INCLUDE_DIR
4857
)
49-
cmake_parse_arguments(arg "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
50-
if(arg_KEYWORDS_MISSING_VALUES)
51-
message(
52-
FATAL_ERROR
53-
"cpp_library missing required arguments: ${arg_KEYWORDS_MISSING_VALUES}"
54-
)
55-
endif()
58+
cmake_parse_arguments(arg "" "${SINGLE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
59+
require_argument_values(REQUIRED_ARGS arg_KEYWORDS_MISSING_VALUES)
5660

57-
if(NOT DEFINED arg_BUILD_INCLUDE_DIR)
58-
set(arg_BUILD_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/src")
61+
if(NOT DEFINED arg_BUILD_INCLUDE_DIRS)
62+
set(arg_BUILD_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src")
5963
endif()
6064

61-
set(_ALIAS_TARGET_NAME "${arg_NAMESPACE}::${arg_NAME}")
65+
set(ALIAS_TARGET_NAME "${arg_NAMESPACE}::${arg_NAME}")
6266

63-
check_if_header_only(arg_PUBLIC_HEADERS _IS_VALID_INTERFACE _INVALID_HEADER_FILE)
64-
if(NOT _IS_VALID_INTERFACE)
67+
check_if_header_only(arg_PUBLIC_HEADERS IS_VALID_INTERFACE INVALID_HEADER_FILE)
68+
if(NOT IS_VALID_INTERFACE)
6569
message(
6670
FATAL_ERROR
67-
"Invalid interface header file ${_INVALID_HEADER_FILE} for ${_ALIAS_TARGET_NAME}."
71+
"Invalid interface header file ${INVALID_HEADER_FILE} for ${ALIAS_TARGET_NAME}."
6872
)
6973
endif()
7074

71-
check_if_header_only(arg_PRIVATE_SOURCES _IS_INTERFACE_LIB _)
72-
if(_IS_INTERFACE_LIB)
75+
check_if_header_only(arg_PRIVATE_SOURCES IS_INTERFACE_LIB _)
76+
if(IS_INTERFACE_LIB)
7377
if(arg_PRIVATE_LINK_LIBRARIES)
7478
message(
7579
FATAL_ERROR
76-
"`PRIVATE_LINK_LIBRARIES` disabled for header-only library ${_ALIAS_TARGET_NAME}."
80+
"`PRIVATE_LINK_LIBRARIES` disabled for header-only library ${ALIAS_TARGET_NAME}."
7781
)
7882
endif()
7983
add_library(${arg_NAME} INTERFACE)
@@ -98,14 +102,14 @@ function(cpp_library)
98102
target_compile_features(${arg_NAME} PUBLIC cxx_std_20)
99103
endif()
100104

101-
add_library(${_ALIAS_TARGET_NAME} ALIAS ${arg_NAME})
105+
add_library(${ALIAS_TARGET_NAME} ALIAS ${arg_NAME})
102106

103107
target_sources(
104108
${arg_NAME}
105109
PUBLIC
106110
FILE_SET HEADERS
107111
BASE_DIRS
108-
"$<BUILD_INTERFACE:${arg_BUILD_INCLUDE_DIR}>"
112+
"$<BUILD_INTERFACE:${arg_BUILD_INCLUDE_DIRS}>"
109113
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
110114
FILES ${arg_PUBLIC_HEADERS}
111115
)
@@ -120,45 +124,39 @@ endfunction()
120124
# @param {string[]} [LINK_LIBRARIES]
121125
# @param {string} [UNIFIED_TEST_TARGET] If set the tests are also added to this unified target.
122126
function(catch2_tests)
123-
set(oneValueArgs
127+
set(SINGLE_VALUE_ARGS
124128
NAME
125129
NAMESPACE
126130
UNIFIED_TEST_TARGET
127131
)
128-
set(multiValueArgs
132+
set(MULTI_VALUE_ARGS
129133
SOURCES
130134
LINK_LIBRARIES
131135
)
132-
set(requireValueArgs
136+
set(REQUIRED_ARGS
133137
NAME
134138
NAMESPACE
135139
SOURCES
136140
)
137-
cmake_parse_arguments(arg "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
138-
if(arg_KEYWORDS_MISSING_VALUES)
139-
message(
140-
FATAL_ERROR
141-
"catch2_tests missing required arguments:
142-
${arg_KEYWORDS_MISSING_VALUES}"
143-
)
144-
endif()
141+
cmake_parse_arguments(arg "" "${SINGLE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
142+
require_argument_values(REQUIRED_ARGS arg_KEYWORDS_MISSING_VALUES)
145143

146-
set(_ALIAS_TARGET "${arg_NAMESPACE}::${arg_NAME}")
147-
set(_UNIT_TEST_TARGET "unit-test-${arg_NAME}")
144+
set(ALIAS_TARGET "${arg_NAMESPACE}::${arg_NAME}")
145+
set(UNIT_TEST_TARGET "unit-test-${arg_NAME}")
148146

149-
add_executable(${_UNIT_TEST_TARGET})
150-
target_sources(${_UNIT_TEST_TARGET} PRIVATE ${arg_SOURCES})
147+
add_executable(${UNIT_TEST_TARGET})
148+
target_sources(${UNIT_TEST_TARGET} PRIVATE ${arg_SOURCES})
151149
target_link_libraries(
152-
${_UNIT_TEST_TARGET}
150+
${UNIT_TEST_TARGET}
153151
PRIVATE
154152
Catch2::Catch2WithMain
155-
${_ALIAS_TARGET}
153+
${ALIAS_TARGET}
156154
${arg_LINK_LIBRARIES}
157155
)
158-
target_compile_features(${_UNIT_TEST_TARGET} PRIVATE cxx_std_20)
156+
target_compile_features(${UNIT_TEST_TARGET} PRIVATE cxx_std_20)
159157
set_property(
160158
TARGET
161-
${_UNIT_TEST_TARGET}
159+
${UNIT_TEST_TARGET}
162160
PROPERTY
163161
RUNTIME_OUTPUT_DIRECTORY
164162
${CMAKE_BINARY_DIR}/testbin
@@ -169,7 +167,7 @@ function(catch2_tests)
169167
target_link_libraries(
170168
${arg_UNIFIED_TEST_TARGET}
171169
PRIVATE
172-
${_ALIAS_TARGET}
170+
${ALIAS_TARGET}
173171
${arg_LINK_LIBRARIES}
174172
)
175173
endif()
@@ -183,29 +181,24 @@ endfunction()
183181
# @param {string} NAMESPACE
184182
# @param {string} [CONFIG_DEST_PATH] Destination to install generated config file
185183
# (NAME-config.cmake).
186-
# @param {string} [CONFIG_INPUT_PATH] Paht to read configure_package_config_file input file
184+
# @param {string} [CONFIG_INPUT_PATH] Path to read configure_package_config_file input file
187185
# (NAME-config.cmake.in).
188-
# @param {string} [CONFIG_OUTPUT_PATH] Paht to write configure_package_config_file output file
186+
# @param {string} [CONFIG_OUTPUT_PATH] Path to write configure_package_config_file output file
189187
# (NAME-config.cmake).
190188
function(install_library)
191-
set(oneValueArgs
189+
set(SINGLE_VALUE_ARGS
192190
NAME
193191
NAMESPACE
194192
CONFIG_DEST_PATH
195193
CONFIG_INPUT_PATH
196194
CONFIG_OUTPUT_PATH
197195
)
198-
set(requireValueArgs
196+
set(REQUIRED_ARGS
199197
NAME
200198
NAMESPACE
201199
)
202-
cmake_parse_arguments(arg "" "${oneValueArgs}" "" ${ARGN})
203-
if(arg_KEYWORDS_MISSING_VALUES)
204-
message(
205-
FATAL_ERROR
206-
"install_library missing required arguments: ${arg_KEYWORDS_MISSING_VALUES}"
207-
)
208-
endif()
200+
cmake_parse_arguments(arg "" "${SINGLE_VALUE_ARGS}" "" ${ARGN})
201+
require_argument_values(REQUIRED_ARGS arg_KEYWORDS_MISSING_VALUES)
209202

210203
if(NOT DEFINED arg_CONFIG_DEST_PATH)
211204
set(arg_CONFIG_DEST_PATH "${CMAKE_INSTALL_LIBDIR}/cmake/${arg_NAMESPACE}/libs")

src/ystdlib/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
if(NOT YSTDLIB_LIBRARIES)
2+
message(FATAL_ERROR "YSTDLIB_LIBRARIES must be defined and non-empty.")
3+
endif()
4+
15
foreach(lib IN LISTS YSTDLIB_LIBRARIES)
26
add_subdirectory("${lib}")
37
endforeach()

src/ystdlib/error_handling/CMakeLists.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ set(boost_find_package_args
99
headers
1010
)
1111
find_package(Boost ${boost_find_package_args})
12-
if(Boost_FOUND)
13-
message(STATUS "Found Boost ${Boost_VERSION}.")
14-
endif()
12+
message(STATUS "Found Boost ${Boost_VERSION}.")
1513

1614
cpp_library(
1715
NAME error_handling

0 commit comments

Comments
 (0)