Skip to content

Commit 8ac2c38

Browse files
griwesbrycelelbach
authored andcommitted
Thrust CMake conversion:
* Clean up the remains of legacy build systems. * Handle CMAKE_BUILD_TYPE; default to RelWithDebInfo. * Handle CMAKE_{CXX,CUDA}_STANDARD, make sure they are consistent with each other. * Fix detection and handling of compiler flags; make detection no longer depend on the order in which it is requested, and instead depend on the string denoting the flag. * Properly pass the C++ detected flags to NVCC with -Xcompiler, when building with the CUDA backend. * Introduce compilation of all public headers, to test for modularity and warnings. Compilation with the CUDA backend chokes on some of the headers, for reasons currently unknown. * Introduce the notion of partially implemented headers and tests, to handle functionalities that are only implemented on a subset of systems. * Handle CUDA RDC flags with a built-in CMake mechanism, instead of manually detecting and specifying it. * Fix compilation errors found after applying the above.
1 parent ec94d4c commit 8ac2c38

24 files changed

Lines changed: 217 additions & 403 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
thrust/system/cuda/detail/.gitignore
22
.p4config
3+
run
4+
build

CMakeLists.txt

Lines changed: 186 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,22 @@ cmake_minimum_required(VERSION 3.8)
22

33
project(Thrust CXX)
44

5-
list(INSERT CMAKE_MODULE_PATH 0 ${PROJECT_SOURCE_DIR}/cmake)
5+
# Default to a release build.
6+
if ("" STREQUAL "${CMAKE_BUILD_TYPE}")
7+
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build." FORCE)
8+
9+
set_property(
10+
CACHE CMAKE_BUILD_TYPE
11+
PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel
12+
)
13+
endif ()
614

15+
# CONFIGURE_DEPENDS helper
16+
if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.12)
17+
set(CMAKE_CONFIGURE_DEPENDS CONFIGURE_DEPENDS)
18+
endif ()
19+
20+
list(INSERT CMAKE_MODULE_PATH 0 ${PROJECT_SOURCE_DIR}/cmake)
721
include(AppendOptionIfAvailable)
822

923
file(READ "thrust/version.h" THRUST_VERSION_HEADER)
@@ -48,8 +62,26 @@ endif ()
4862

4963
add_definitions(-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_${THRUST_DEVICE_SYSTEM})
5064

65+
set(CMAKE_CXX_STANDARD 98 CACHE STRING "The C++ version to be used.")
66+
set(CMAKE_CXX_EXTENSIONS OFF)
67+
68+
message("-- C++ Standard version: ${CMAKE_CXX_STANDARD}")
69+
5170
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
71+
if (NOT "${CMAKE_CUDA_HOST_COMPILER}" STREQUAL "")
72+
unset(CMAKE_CUDA_HOST_COMPILER CACHE)
73+
message(FATAL_ERROR "Thrust tests and examples require the C++ compiler"
74+
" and the CUDA host compiler to be the same; to set this compiler, please"
75+
" use the CMAKE_CXX_COMPILER variable, not the CMAKE_CUDA_HOST_COMPILER"
76+
" variable.")
77+
endif ()
78+
set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER})
79+
5280
enable_language(CUDA)
81+
82+
# force CUDA C++ standard to be the same as the C++ standard used
83+
unset (CMAKE_CUDA_STANDARD CACHE)
84+
set (CMAKE_CUDA_STANDARD ${CMAKE_CXX_STANDARD})
5385
endif ()
5486

5587
if ("OMP" STREQUAL "${THRUST_DEVICE_SYSTEM}")
@@ -70,6 +102,10 @@ if ("TBB" STREQUAL "${THRUST_DEVICE_SYSTEM}")
70102
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${TBB_LD_FLAGS}")
71103
set (THRUST_ADDITIONAL_LIBRARIES "${TBB_LIBRARIES}")
72104
endif ()
105+
106+
# there's a ton of these in the TBB backend, even though the code is correct
107+
# TODO: silence these warnings in code instead
108+
append_option_if_available("-Wno-unused-parameter" THRUST_CXX_WARNINGS)
73109
endif ()
74110

75111
if ("MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
@@ -86,32 +122,33 @@ endif ()
86122

87123
if ("MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
88124
# TODO Enable /Wall
89-
append_option_if_available(CXX "/WX" THRUST_OPTIONS_WARNINGS)
125+
append_option_if_available("/WX" THRUST_CXX_WARNINGS)
90126

91127
# Disabled loss-of-data conversion warnings.
92128
# TODO Re-enable.
93-
append_option_if_available(CXX "/wd4244" THRUST_OPTIONS_WARNINGS)
94-
append_option_if_available(CXX "/wd4267" THRUST_OPTIONS_WARNINGS)
129+
append_option_if_available("/wd4244" THRUST_CXX_WARNINGS)
130+
append_option_if_available("/wd4267" THRUST_CXX_WARNINGS)
95131

96132
# Suppress numeric conversion-to-bool warnings.
97133
# TODO Re-enable.
98-
append_option_if_available(CXX "/wd4800" THRUST_OPTIONS_WARNINGS)
134+
append_option_if_available("/wd4800" THRUST_CXX_WARNINGS)
99135

100136
# Disable warning about applying unary operator- to unsigned type.
101-
append_option_if_available(CXX "/wd4146" THRUST_OPTIONS_WARNINGS)
137+
append_option_if_available("/wd4146" THRUST_CXX_WARNINGS)
102138

103139
set(THRUST_TREAT_FILE_AS_CXX "/TP")
104140
else ()
105-
append_option_if_available(CXX "-Werror" THRUST_OPTIONS_WARNINGS)
106-
append_option_if_available(CXX "-Wall" THRUST_O:TIONS_WARNINGS)
107-
append_option_if_available(CXX "-Wextra" THRUST_OPTIONS_WARNINGS)
108-
append_option_if_available(CXX "-Winit-self" THRUST_OPTIONS_WARNINGS)
109-
append_option_if_available(CXX "-Woverloaded-virtual" THRUST_OPTIONS_WARNINGS)
110-
append_option_if_available(CXX "-Wcast-qual" THRUST_OPTIONS_WARNINGS)
111-
append_option_if_available(CXX "-Wno-cast-align" THRUST_OPTIONS_WARNINGS)
112-
append_option_if_available(CXX "-Wno-long-long" THRUST_OPTIONS_WARNINGS)
113-
append_option_if_available(CXX "-Wno-variadic-macros" THRUST_OPTIONS_WARNINGS)
114-
append_option_if_available(CXX "-Wno-unused-function" THRUST_OPTIONS_WARNINGS)
141+
append_option_if_available("-Werror" THRUST_CXX_WARNINGS)
142+
append_option_if_available("-Wall" THRUST_CXX_WARNINGS)
143+
append_option_if_available("-Wextra" THRUST_CXX_WARNINGS)
144+
append_option_if_available("-Winit-self" THRUST_CXX_WARNINGS)
145+
append_option_if_available("-Woverloaded-virtual" THRUST_CXX_WARNINGS)
146+
append_option_if_available("-Wcast-qual" THRUST_CXX_WARNINGS)
147+
append_option_if_available("-Wno-cast-align" THRUST_CXX_WARNINGS)
148+
append_option_if_available("-Wno-long-long" THRUST_CXX_WARNINGS)
149+
append_option_if_available("-Wno-variadic-macros" THRUST_CXX_WARNINGS)
150+
append_option_if_available("-Wno-unused-function" THRUST_CXX_WARNINGS)
151+
append_option_if_available("-Wno-unused-variable" THRUST_CXX_WARNINGS)
115152

116153
set(THRUST_TREAT_FILE_AS_CXX "-x c++")
117154
endif ()
@@ -121,19 +158,19 @@ if ("GNU" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
121158
# In GCC 4.4, the CUDA backend's kernel launch templates cause
122159
# impossible-to-decipher "'<anonymous>' is used uninitialized in this
123160
# function" warnings, so we disable uninitialized variable warnings.
124-
append_option_if_available(CXX "-Wno-uninitialized" THRUST_OPTIONS_WARNINGS)
161+
append_option_if_available("-Wno-uninitialized" THRUST_CXX_WARNINGS)
125162
endif ()
126163

127164
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.5)
128165
# This isn't available until GCC 4.3, and misfires on TMP code until
129166
# GCC 4.5.
130-
append_option_if_available(CXX "-Wlogical-op" THRUST_OPTIONS_WARNINGS)
167+
append_option_if_available("-Wlogical-op" THRUST_CXX_WARNINGS)
131168
endif ()
132169

133170
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.3)
134171
# GCC 7.3 complains about name mangling changes due to `noexcept`
135172
# becoming part of the type system; we don't care.
136-
append_option_if_available(CXX "-Wnoexcept-type" THRUST_OPTIONS_WARNINGS)
173+
append_option_if_available("-Wnoexcept-type" THRUST_CXX_WARNINGS)
137174
endif ()
138175
endif ()
139176

@@ -142,22 +179,135 @@ if (("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}") OR
142179
# xlC and Clang warn about unused parameters in uninstantiated templates.
143180
# This causes xlC to choke on the OMP backend, which is mostly #ifdef'd out
144181
# (and thus has unused parameters) when you aren't using it.
145-
append_option_if_available(CXX "-Wno-unused-parameters" THRUST_OPTIONS_WARNINGS)
182+
append_option_if_available("-Wno-unused-parameters" THRUST_CXX_WARNINGS)
146183
endif ()
147184

148185
if ("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
149186
# -Wunneeded-internal-declaration misfires in the unit test framework
150187
# on older versions of Clang.
151-
append_option_if_available(CXX "-Wno-unneeded-internal-declaration" THRUST_OPTIONS_WARNINGS)
188+
append_option_if_available("-Wno-unneeded-internal-declaration" THRUST_CXX_WARNINGS)
152189
endif ()
153190

191+
foreach (CXX_OPTION IN LISTS THRUST_CXX_WARNINGS)
192+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_OPTION}")
193+
endforeach ()
154194

155195
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
156-
append_option_if_available(CUDA "-rdc=true" THRUST_OPTIONS_RDC)
196+
foreach (CXX_OPTION IN LISTS THRUST_CXX_WARNINGS)
197+
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler=${CXX_OPTION}")
198+
endforeach ()
157199
endif ()
158200

159-
set(THRUST_OPTIONS_DEBUG ${THRUST_OPTIONS_WARNINGS})
160-
set(THRUST_OPTIONS_RELEASE ${THRUST_OPTIONS_WARNINGS})
201+
# For every public header, build a translation unit containing `#include <header>`
202+
# to let the compiler try to figure out warnings in that header if it is not otherwise
203+
# included in tests, and also to verify if the headers are modular enough.
204+
list(APPEND THRUST_HEADER_GLOBS thrust/*.h)
205+
list(APPEND THRUST_HEADER_EXCLUDE_SYSTEMS_GLOBS thrust/system/*/*)
206+
207+
string(TOLOWER ${THRUST_HOST_SYSTEM} THRUST_HOST_SYSTEM_LOWERCASE)
208+
list(APPEND THRUST_HEADER_SYSTEMS_GLOBS thrust/system/${THRUST_HOST_SYSTEM_LOWERCASE}/*)
209+
210+
string(TOLOWER ${THRUST_DEVICE_SYSTEM} THRUST_DEVICE_SYSTEM_LOWERCASE)
211+
list(APPEND THRUST_HEADER_SYSTEMS_GLOBS thrust/system/${THRUST_DEVICE_SYSTEM_LOWERCASE}/*)
212+
213+
list(APPEND THRUST_HEADER_EXCLUDE_DETAILS_GLOBS thrust/detail/*)
214+
list(APPEND THRUST_HEADER_EXCLUDE_DETAILS_GLOBS thrust/*/detail/*)
215+
list(APPEND THRUST_HEADER_EXCLUDE_DETAILS_GLOBS thrust/*/*/detail/*)
216+
217+
# Get all .h files...
218+
file(
219+
GLOB_RECURSE THRUST_HEADERS
220+
RELATIVE ${PROJECT_SOURCE_DIR}/thrust
221+
${CMAKE_CONFIGURE_DEPENDS}
222+
${THRUST_HEADER_GLOBS}
223+
)
224+
225+
# ...then remove all system specific headers...
226+
file(
227+
GLOB_RECURSE THRUST_HEADER_EXCLUDE_SYSTEMS
228+
RELATIVE ${PROJECT_SOURCE_DIR}/thrust
229+
${CMAKE_CONFIGURE_DEPENDS}
230+
${THRUST_HEADER_EXCLUDE_SYSTEMS_GLOBS}
231+
)
232+
list(REMOVE_ITEM THRUST_HEADERS ${THRUST_HEADER_EXCLUDE_SYSTEMS})
233+
234+
# ...then add all headers specific to the selected host and device systems back again...
235+
file(
236+
GLOB_RECURSE THRUST_SYSTEMS_HEADERS
237+
RELATIVE ${PROJECT_SOURCE_DIR}/thrust
238+
${CMAKE_CONFIGURE_DEPENDS}
239+
${THRUST_HEADER_SYSTEMS_GLOBS}
240+
)
241+
list(APPEND THRUST_HEADERS ${THRUST_SYSTEMS_HEADERS})
242+
243+
# ...and remove all the detail headers (also removing the detail headers from the selected systems).
244+
file(
245+
GLOB_RECURSE THRUST_HEADER_EXCLUDE_DETAILS
246+
RELATIVE ${PROJECT_SOURCE_DIR}/thrust
247+
${CMAKE_CONFIGURE_DEPENDS}
248+
${THRUST_HEADER_EXCLUDE_DETAILS_GLOBS}
249+
)
250+
list(REMOVE_ITEM THRUST_HEADERS ${THRUST_HEADER_EXCLUDE_DETAILS})
251+
252+
# list of headers that aren't implemented for all backends, but are implemented for CUDA
253+
set(THRUST_PARTIALLY_IMPLEMENTED_HEADERS_CUDA
254+
async/copy.h
255+
async/for_each.h
256+
async/reduce.h
257+
async/sort.h
258+
async/transform.h
259+
event.h
260+
future.h
261+
)
262+
263+
# list of headers that aren't implemented for all backends, but are implemented for CPP
264+
set(THRUST_PARTIALLY_IMPLEMENTED_HEADERS_CPP
265+
)
266+
267+
# list of headers that aren't implemented for all backends, but are implemented for TBB
268+
set(THRUST_PARTIALLY_IMPLEMENTED_HEADERS_TBB
269+
)
270+
271+
# list of headers that aren't implemented for all backends, but are implemented for OMP
272+
set(THRUST_PARTIALLY_IMPLEMENTED_HEADERS_OMP
273+
)
274+
275+
# list of all partially implemented headers
276+
set(THRUST_PARTIALLY_IMPLEMENTED_HEADERS
277+
emptylistguard
278+
${THRUST_PARTIALLY_IMPLEMENTED_HEADERS_CUDA}
279+
${THRUST_PARTIALLY_IMPLEMENTED_HEADERS_CPP}
280+
${THRUST_PARTIALLY_IMPLEMENTED_HEADERS_TBB}
281+
${THRUST_PARTIALLY_IMPLEMENTED_HEADERS_OMP}
282+
)
283+
284+
list(REMOVE_DUPLICATES THRUST_PARTIALLY_IMPLEMENTED_HEADERS)
285+
286+
foreach (THRUST_HEADER IN LISTS THRUST_HEADERS)
287+
if ("${THRUST_HEADER}" IN_LIST THRUST_PARTIALLY_IMPLEMENTED_HEADERS)
288+
# this header is partially implemented on _some_ backends
289+
if (NOT "${THRUST_HEADER}" IN_LIST THRUST_PARTIALLY_IMPLEMENTED_HEADERS_${THRUST_DEVICE_SYSTEM})
290+
# but not on the selected one
291+
continue()
292+
endif ()
293+
endif ()
294+
295+
set(THRUST_HEADER_TEST_EXT .cpp)
296+
if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM}")
297+
set(THRUST_HEADER_TEST_EXT .cu)
298+
endif ()
299+
300+
set(SOURCE_NAME headers/${THRUST_HEADER}${THRUST_HEADER_TEST_EXT})
301+
configure_file(cmake/header_test.in ${SOURCE_NAME})
302+
303+
list(APPEND THRUST_HEADER_TEST_SOURCES ${SOURCE_NAME})
304+
endforeach ()
305+
306+
add_library(header-test OBJECT ${THRUST_HEADER_TEST_SOURCES})
307+
target_include_directories(
308+
header-test
309+
PUBLIC ${PROJECT_SOURCE_DIR}
310+
)
161311

162312
include(CTest)
163313
enable_testing()
@@ -192,20 +342,12 @@ elseif ("OMP" STREQUAL "${THRUST_DEVICE_SYSTEM}")
192342
list(APPEND THRUST_TEST_GLOBS testing/omp/*.cpp)
193343
endif ()
194344

195-
if (CMAKE_VERSION VERSION_LESS 3.12)
196-
file(
197-
GLOB THRUST_TESTS
198-
RELATIVE ${PROJECT_SOURCE_DIR}/testing
199-
${THRUST_TEST_GLOBS}
200-
CONFIGURE_DEPENDS
201-
)
202-
else ()
203-
file(
204-
GLOB THRUST_TESTS
205-
RELATIVE ${PROJECT_SOURCE_DIR}/testing
206-
${THRUST_TEST_GLOBS}
207-
)
208-
endif ()
345+
file(
346+
GLOB THRUST_TESTS
347+
RELATIVE ${PROJECT_SOURCE_DIR}/testing
348+
${CMAKE_CONFIGURE_DEPENDS}
349+
${THRUST_TEST_GLOBS}
350+
)
209351

210352
# list of tests that aren't implemented for all backends, but are implemented for CUDA
211353
set(THRUST_PARTIALLY_IMPLEMENTED_CUDA
@@ -282,10 +424,6 @@ foreach (THRUST_TEST_SOURCE IN LISTS THRUST_TESTS)
282424
${PROJECT_SOURCE_DIR}/testing/${THRUST_TEST_SOURCE}
283425
)
284426

285-
target_compile_options(${THRUST_TEST}
286-
PRIVATE "$<$<CONFIG:DEBUG>:${THRUST_OPTIONS_DEBUG}>"
287-
"$<$<CONFIG:RELEASE>:${THRUST_OPTIONS_RELEASE}>")
288-
289427
target_include_directories(
290428
${THRUST_TEST}
291429
PUBLIC ${PROJECT_SOURCE_DIR}
@@ -310,10 +448,6 @@ foreach (THRUST_TEST_SOURCE IN LISTS THRUST_TESTS)
310448
${PROJECT_SOURCE_DIR}/testing/${THRUST_TEST_SOURCE}
311449
)
312450

313-
target_compile_options(${THRUST_TEST_RDC}
314-
PRIVATE "$<$<CONFIG:DEBUG>:${THRUST_OPTIONS_DEBUG} ${THRUST_OPTIONS_RDC}>"
315-
"$<$<CONFIG:RELEASE>:${THRUST_OPTIONS_RELEASE} ${THRUST_OPTIONS_RDC}>")
316-
317451
target_include_directories(
318452
${THRUST_TEST_RDC}
319453
PUBLIC ${PROJECT_SOURCE_DIR}
@@ -324,6 +458,9 @@ foreach (THRUST_TEST_SOURCE IN LISTS THRUST_TESTS)
324458
thrust_testframework
325459
${THRUST_ADDITIONAL_LIBRARIES})
326460

461+
set_target_properties(${THRUST_TEST_RDC}
462+
PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
463+
327464
if (THRUST_TEST_ADD_TO_CTEST)
328465
add_test(${THRUST_TEST_RDC} ${THRUST_TEST_RDC})
329466
endif ()
@@ -384,10 +521,6 @@ foreach (THRUST_EXAMPLE_SOURCE IN LISTS THRUST_EXAMPLES)
384521
${PROJECT_SOURCE_DIR}/examples/${THRUST_EXAMPLE_SOURCE}
385522
)
386523

387-
target_compile_options(${THRUST_EXAMPLE}
388-
PRIVATE "$<$<CONFIG:DEBUG>:${THRUST_OPTIONS_DEBUG}>"
389-
"$<$<CONFIG:RELEASE>:${THRUST_OPTIONS_RELEASE}>")
390-
391524
target_include_directories(
392525
${THRUST_EXAMPLE}
393526
PUBLIC ${PROJECT_SOURCE_DIR}
@@ -407,10 +540,6 @@ foreach (THRUST_EXAMPLE_SOURCE IN LISTS THRUST_EXAMPLES)
407540
${PROJECT_SOURCE_DIR}/examples/${THRUST_EXAMPLE_SOURCE}
408541
)
409542

410-
target_compile_options(${THRUST_EXAMPLE_RDC}
411-
PRIVATE "$<$<CONFIG:DEBUG>:${THRUST_OPTIONS_DEBUG} ${THRUST_OPTIONS_RDC}>"
412-
"$<$<CONFIG:RELEASE>:${THRUST_OPTIONS_RELEASE} ${THRUST_OPTIONS_RDC}>")
413-
414543
target_include_directories(
415544
${THRUST_EXAMPLE_RDC}
416545
PUBLIC ${PROJECT_SOURCE_DIR}
@@ -420,6 +549,9 @@ foreach (THRUST_EXAMPLE_SOURCE IN LISTS THRUST_EXAMPLES)
420549
target_link_libraries(${THRUST_EXAMPLE_RDC}
421550
${THRUST_ADDITIONAL_LIBRARIES})
422551

552+
set_target_properties(${THRUST_EXAMPLE_RDC}
553+
PROPERTIES CUDA_SEPERABLE_COMPILATION ON)
554+
423555
add_test(${THRUST_EXAMPLE_RDC} ${THRUST_EXAMPLE_RDC})
424556
endif ()
425557
endforeach ()
Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
11
include_guard(GLOBAL)
22
include(CheckCXXCompilerFlag)
3-
include(CheckCUDACompilerFlag)
43

5-
set(_COUNTER 0 CACHE STRING "Counter for `append_option_if_available`")
4+
macro (APPEND_OPTION_IF_AVAILABLE _FLAG _LIST)
65

7-
macro (APPEND_OPTION_IF_AVAILABLE _LANGUAGE _FLAG _LIST)
8-
set(_AVAILABLE_UNIQUE _AVAILABLE_${_COUNTER})
6+
set(_VAR "CXX_FLAG_${_FLAG}")
7+
check_cxx_compiler_flag(${_FLAG} ${_VAR})
98

10-
if ("CXX" STREQUAL "${_LANGUAGE}")
11-
check_cxx_compiler_flag(${_FLAG} ${_AVAILABLE_UNIQUE} "${_FLAG}")
12-
elseif ("CUDA" STREQUAL "${_LANGUAGE}")
13-
check_cuda_compiler_flag(${_FLAG} ${_AVAILABLE_UNIQUE} "${_FLAG}")
14-
else ()
15-
message(FATAL_ERROR "Language ${_LANGUAGE} is not supported!")
16-
endif ()
17-
18-
if (${_AVAILABLE_UNIQUE})
9+
if (${${_VAR}})
1910
list(APPEND ${_LIST} ${_FLAG})
2011
endif ()
2112

22-
math(EXPR _COUNTER "${_COUNTER} + 1")
2313
endmacro ()
2414

0 commit comments

Comments
 (0)