Skip to content

Commit caba67c

Browse files
committed
Add macros for clean initialization of configuration variables for different projects
1 parent 19fc919 commit caba67c

3 files changed

Lines changed: 133 additions & 48 deletions

File tree

CMakeLists.txt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,9 @@ option(YGGDRASIL_RAPIDJSON_CREATE_METASCHEMA "Re-create the metaschema" OFF)
4343
option(YGGDRASIL_RAPIDJSON_CREATE_METASCHEMA_FULL "Re-create the metaschema and the full_schema.yaml file" OFF)
4444
option(YGGDRASIL_RAPIDJSON_SCHEMA_TESTS "Build tests using the yggdrasil schema" OFF)
4545

46-
set(INTERFACE_PUBLIC_COMPILE_FLAGS -D_USE_MATH_DEFINES)
47-
set(INTERFACE_PUBLIC_LINK_FLAGS)
48-
set(INTERFACE_INCLUDE_DIRS)
49-
set(INTERFACE_PUBLIC_LIBRARIES)
50-
set(LOCAL_PUBLIC_COMPILE_FLAGS)
51-
set(LOCAL_PUBLIC_LINK_FLAGS)
52-
set(LOCAL_INCLUDE_DIRS)
53-
set(LOCAL_PUBLIC_LIBRARIES)
46+
yggdrasil_rapidjson_config_init(INTERFACE)
47+
yggdrasil_rapidjson_config_init(LOCAL)
48+
list(APPEND INTERFACE_PUBLIC_COMPILE_FLAGS -D_USE_MATH_DEFINES)
5449

5550
if(DISABLE_YGGDRASIL_RAPIDJSON)
5651
set(RAPIDJSON_CREATE_METASCHEMA OFF)

YggdrasilRapidJSONConfig.cmake.in

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ get_target_property(
2727
)
2828
list(GET @PROJECT_NAME@_INCLUDE_DIR 0 @PROJECT_NAME@_INCLUDE_DIR)
2929

30-
set(INTERFACE_LIBRARIES)
31-
set(INTERFACE_PUBLIC_COMPILE_FLAGS)
32-
3330
if(NOT (YGGDRASIL_DISABLE_PYTHON_C_API OR DISABLE_YGGDRASIL_RAPIDJSON))
3431
include(CMakeFindDependencyMacro)
3532
find_dependency(Python3 COMPONENTS Interpreter Development NumPy)
3633
endif()
3734

38-
yggdrasil_rapidjson_options_config(INTERFACE)
39-
yggdrasil_rapidjson_target_config(@PROJECT_NAME@ INTERFACE INTERFACE)
35+
yggdrasil_rapidjson_config_init(@PROJECT_NAME@_INTERFACE)
36+
yggdrasil_rapidjson_options_config(@PROJECT_NAME@_INTERFACE)
37+
yggdrasil_rapidjson_target_config(
38+
@PROJECT_NAME@ INTERFACE @PROJECT_NAME@_INTERFACE
39+
)
4040

4141
set_and_check(
4242
@PROJECT_NAME@_INCLUDE_DIRS "${@PROJECT_NAME@_INCLUDE_DIR}"

YggdrasilRapidJSONMacros.cmake

Lines changed: 125 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -27,54 +27,144 @@ macro(yggdrasil_rapidjson_options_create)
2727
option(YGGDRASIL_RAPIDJSON_ENABLE_INSTRUMENTATION_OPT "Build yggdrasil_rapidjson with -march or -mcpu options" ON)
2828
endmacro()
2929

30+
macro(yggdrasil_rapidjson_config_vars PREFIX)
31+
foreach(suffix LIBRARIES INCLUDE_DIRS COMPILE_FLAGS LINK_FLAGS)
32+
list(
33+
APPEND ${PREFIX}_CONFIG_VARS
34+
${PREFIX}_${suffix}
35+
${PREFIX}_PUBLIC_${suffix}
36+
${PREFIX}_PRIVATE_${suffix}
37+
)
38+
set(suffix_lang ${suffix})
39+
if(suffix STREQUAL "LIBRARIES")
40+
set(suffix_lang "LIBS")
41+
endif()
42+
foreach(lang C CXX Fortran)
43+
list(
44+
APPEND ${PREFIX}_CONFIG_VARS
45+
${PREFIX}_PUBLIC_${lang}_${suffix_lang}
46+
${PREFIX}_PRIVATE_${lang}_${suffix_lang}
47+
)
48+
endforeach()
49+
endforeach()
50+
endmacro()
51+
52+
macro(yggdrasil_rapidjson_config_init PREFIX)
53+
yggdrasil_rapidjson_config_vars(${PREFIX})
54+
foreach(var IN LISTS ${PREFIX}_CONFIG_VARS)
55+
set(${var})
56+
endforeach()
57+
endmacro()
58+
59+
macro(yggdrasil_rapidjson_config_show PREFIX LEVEL)
60+
foreach(var IN LISTS ${PREFIX}_CONFIG_VARS)
61+
message(${LEVEL} "${var} = ${${var}}")
62+
endforeach()
63+
endmacro()
64+
65+
macro(yggdrasil_rapidjson_config_accum PREFIX)
66+
foreach(suffix LIBRARIES INCLUDE_DIRS COMPILE_FLAGS LINK_FLAGS)
67+
set(${PREFIX}_ALL_PUBLIC_${suffix} ${${PREFIX}_PUBLIC_${suffix}}
68+
${${PREFIX}_${suffix}})
69+
set(${PREFIX}_ALL_PRIVATE_${suffix} ${${PREFIX}_PRIVATE_${suffix}})
70+
if(suffix STREQUAL "LIBRARIES" OR suffix STREQUAL "LINK_FLAGS")
71+
set(gentype "LINK")
72+
else()
73+
set(gentype "COMPILE")
74+
endif()
75+
set(suffix_lang ${suffix})
76+
if(suffix STREQUAL "LIBRARIES")
77+
set(suffix_lang "LIBS")
78+
endif()
79+
foreach(lang C CXX Fortran)
80+
set(kpublic ${PREFIX}_PUBLIC_${lang}_${suffix_lang})
81+
set(kprivate ${PREFIX}_PRIVATE_${lang}_${suffix_lang})
82+
if(${kpublic})
83+
list(
84+
APPEND ${PREFIX}_ALL_PUBLIC_${suffix}
85+
"$<$<${gentype}_LANGUAGE:${lang}>:${${kpublic}}>"
86+
)
87+
endif()
88+
if(${kprivate})
89+
list(
90+
APPEND ${PREFIX}_ALL_PRIVATE_${suffix}
91+
"$<$<${gentype}_LANGUAGE:${lang}>:${${kprivate}}>"
92+
)
93+
endif()
94+
endforeach()
95+
message(DEBUG "${PREFIX}_ALL_PUBLIC_${suffix} = ${${PREFIX}_ALL_PUBLIC_${suffix}}")
96+
message(DEBUG "${PREFIX}_ALL_PRIVATE_${suffix} = ${${PREFIX}_ALL_PRIVATE_${suffix}}")
97+
endforeach()
98+
endmacro()
99+
30100
macro(yggdrasil_rapidjson_global_config LANGUAGE PREFIX)
101+
yggdrasil_rapidjson_config_show(${PREFIX} DEBUG)
31102
add_compile_options(
103+
${${PREFIX}_COMPILE_FLAGS}
32104
${${PREFIX}_PUBLIC_COMPILE_FLAGS}
33-
${${PREFIX}_PUBLIC_${LANGUAGE}_FLAGS}
105+
${${PREFIX}_PUBLIC_${LANGUAGE}_COMPILE_FLAGS}
34106
)
35107
add_link_options(
108+
${${PREFIX}_LINK_FLAGS}
36109
${${PREFIX}_PUBLIC_LINK_FLAGS}
37110
${${PREFIX}_PUBLIC_${LANGUAGE}_LINK_FLAGS}
38111
)
39-
include_directories(${${PREFIX}_INCLUDE_DIRS})
40-
link_libraries(${${PREFIX}_PUBLIC_LIBRARIES})
112+
include_directories(
113+
${${PREFIX}_INCLUDE_DIRS}
114+
${${PREFIX}_PUBLIC_INCLUDE_DIRS}
115+
${${PREFIX}_PUBLIC_${LANGUAGE}_INCLUDE_DIRS}
116+
)
117+
link_libraries(
118+
${${PREFIX}_LIBRARIES}
119+
${${PREFIX}_PUBLIC_LIBRARIES}
120+
${${PREFIX}_PUBLIC_${LANGUAGE}_LIBRARIES}
121+
)
41122
endmacro()
42123

43124
macro(yggdrasil_rapidjson_target_config TARGET TYPE PREFIX)
44-
target_link_libraries(
45-
${TARGET} ${TYPE} ${${PREFIX}_PUBLIC_LIBRARIES}
46-
"$<$<LINK_LANGUAGE:C>:${${PREFIX}_PUBLIC_C_LIBS}>"
47-
"$<$<LINK_LANGUAGE:CXX>:${${PREFIX}_PUBLIC_CXX_LIBS}>"
48-
"$<$<LINK_LANGUAGE:Fortran>:${${PREFIX}_PUBLIC_Fortran_LIBS}>"
49-
)
50-
target_include_directories(
51-
${TARGET} ${TYPE} ${${PREFIX}_INCLUDE_DIRS}
52-
)
53-
target_compile_options(
54-
${TARGET} ${TYPE} ${${PREFIX}_PUBLIC_COMPILE_FLAGS}
55-
"$<$<COMPILE_LANGUAGE:C>:${${PREFIX}_PUBLIC_C_COMPILE_FLAGS}>"
56-
"$<$<COMPILE_LANGUAGE:CXX>:${${PREFIX}_PUBLIC_CXX_COMPILE_FLAGS}>"
57-
"$<$<COMPILE_LANGUAGE:Fortran>:${${PREFIX}_PUBLIC_Fortran_COMPILE_FLAGS}>"
58-
)
59-
target_link_options(
60-
${TARGET} ${TYPE} ${${PREFIX}_PUBLIC_LINK_FLAGS}
61-
"$<$<LINK_LANGUAGE:C>:${${PREFIX}_PUBLIC_C_LINK_FLAGS}>"
62-
"$<$<LINK_LANGUAGE:CXX>:${${PREFIX}_PUBLIC_CXX_LINK_FLAGS}>"
63-
"$<$<LINK_LANGUAGE:Fortran>:${${PREFIX}_PUBLIC_Fortran_LINK_FLAGS}>"
64-
)
65-
if(NOT TYPE STREQUAL "INTERFACE")
125+
yggdrasil_rapidjson_config_show(${PREFIX} DEBUG)
126+
yggdrasil_rapidjson_config_accum(${PREFIX})
127+
if(${PREFIX}_ALL_PUBLIC_LIBRARIES)
66128
target_link_libraries(
67-
${TARGET} ${TYPE} ${${PREFIX}_PRIVATE_LIBRARIES}
129+
${TARGET} ${TYPE} ${${PREFIX}_ALL_PUBLIC_LIBRARIES}
130+
)
131+
endif()
132+
if(${PREFIX}_ALL_PUBLIC_INCLUDE_DIRS)
133+
target_include_directories(
134+
${TARGET} ${TYPE} ${${PREFIX}_ALL_PUBLIC_INCLUDE_DIRS}
135+
)
136+
endif()
137+
if(${PREFIX}_ALL_PUBLIC_COMPILE_FLAGS)
138+
target_compile_options(
139+
${TARGET} ${TYPE} ${${PREFIX}_ALL_PUBLIC_COMPILE_FLAGS}
68140
)
69-
# target_include_directories(
70-
# ${TARGET} ${TYPE} ${${PREFIX}_INCLUDE_DIRS_PRIVATE}
71-
# )
72-
# target_compile_options(
73-
# ${TARGET} ${TYPE} ${${PREFIX}_PRIVATE_COMPILE_FLAGS}
74-
# )
75-
# target_link_options(
76-
# ${TARGET} ${TYPE} ${${PREFIX}_PRIVATE_LINK_FLAGS}
77-
# )
141+
endif()
142+
if(${PREFIX}_ALL_PUBLIC_LINK_FLAGS)
143+
target_link_options(
144+
${TARGET} ${TYPE} ${${PREFIX}_ALL_PUBLIC_LINK_FLAGS}
145+
)
146+
endif()
147+
if(NOT ("${TYPE}" STREQUAL "INTERFACE"))
148+
if(${PREFIX}_ALL_PRIVATE_LIBRARIES)
149+
target_link_libraries(
150+
${TARGET} PRIVATE ${${PREFIX}_ALL_PRIVATE_LIBRARIES}
151+
)
152+
endif()
153+
if(${PREFIX}_ALL_PRIVATE_INCLUDE_DIRS)
154+
target_include_directories(
155+
${TARGET} PRIVATE ${${PREFIX}_ALL_PRIVATE_INCLUDE_DIRS}
156+
)
157+
endif()
158+
if(${PREFIX}_ALL_PRIVATE_COMPILE_FLAGS)
159+
target_compile_options(
160+
${TARGET} PRIVATE ${${PREFIX}_ALL_PRIVATE_COMPILE_FLAGS}
161+
)
162+
endif()
163+
if(${PREFIX}_ALL_PRIVATE_LINK_FLAGS)
164+
target_link_options(
165+
${TARGET} PRIVATE ${${PREFIX}_ALL_PRIVATE_LINK_FLAGS}
166+
)
167+
endif()
78168
endif()
79169
endmacro()
80170

0 commit comments

Comments
 (0)