Skip to content

Commit 07d2d69

Browse files
Adding property SYSTEMINCLUDE_DIRECTORIES to bucket definition
- new property SYSTEMINCLUDE_DIRECTORIES can now be used in the definition of buckets to indicate include directories which schould be declared 'SYSTEM' in target_include_directories - added check for recursive bucket dependencies - unique variable names in the recursive loop GET_BUCKET_CONTENT - TODO: the syntax for defining dependencies does not allow to check for missing buckets, e.g. a simple typo can lead to unintended treatment of a dependency as library instead of a bucket
1 parent 119e352 commit 07d2d69

1 file changed

Lines changed: 62 additions & 30 deletions

File tree

cmake/O2Utils.cmake

Lines changed: 62 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ endmacro()
2020
#------------------------------------------------------------------------------
2121
# O2_DEFINE_BUCKET
2222
# arg NAME
23-
# arg LIBRARIES
24-
# arg INCLUDE_DIRECTORIES
23+
# arg DEPENDENCIES # either libraries or buckets
24+
# arg INCLUDE_DIRECTORIES # project include directories
25+
# arg SYSTEMINCLUDE_DIRECTORIES # system include directories (no compiler warnings)
2526
function(O2_DEFINE_BUCKET)
2627
cmake_parse_arguments(
2728
PARSED_ARGS
2829
"" # bool args
2930
"NAME" # mono-valued arguments
30-
"DEPENDENCIES;INCLUDE_DIRECTORIES" # multi-valued arguments
31+
"DEPENDENCIES;INCLUDE_DIRECTORIES;SYSTEMINCLUDE_DIRECTORIES" # multi-valued arguments
3132
${ARGN} # arguments
3233
)
3334
CHECK_VARIABLE(PARSED_ARGS_NAME "You must provide a name")
@@ -41,8 +42,10 @@ function(O2_DEFINE_BUCKET)
4142
# endforeach ()
4243

4344
# Save this information
45+
set("bucket_map_${PARSED_ARGS_NAME}" "${PARSED_ARGS_NAME}" PARENT_SCOPE) # emulation of a map
4446
set("bucket_map_libs_${PARSED_ARGS_NAME}" "${PARSED_ARGS_DEPENDENCIES}" PARENT_SCOPE) # emulation of a map
4547
set("bucket_map_inc_dirs_${PARSED_ARGS_NAME}" "${PARSED_ARGS_INCLUDE_DIRECTORIES}" PARENT_SCOPE) # emulation of a map
48+
set("bucket_map_systeminc_dirs_${PARSED_ARGS_NAME}" "${PARSED_ARGS_SYSTEMINCLUDE_DIRECTORIES}" PARENT_SCOPE) # emulation of a map
4649
endfunction()
4750

4851
macro(INDENT NUMBER_SPACES INDENTATION)
@@ -59,55 +62,80 @@ endmacro()
5962
# arg BUCKET_NAME -
6063
# arg RESULT_LIBS_VAR_NAME - Name of the variable in the parent scope that should be populated with list of libraries.
6164
# arg RESULT_INC_DIRS_VAR_NAME - Name of the variable in the parent scope that should be populated with list of include directories.
65+
# arg RESULT_SYSTEMINC_DIRS_VAR_NAME - Name of the variable in the parent scope that should be populated with list of system include directories.
6266
# arg DEPTH - Use 0 when calling the first time (can be omitted).
6367
function(GET_BUCKET_CONTENT
6468
BUCKET_NAME
6569
RESULT_LIBS_VAR_NAME
6670
RESULT_INC_DIRS_VAR_NAME
67-
# DEPTH
71+
RESULT_SYSTEMINC_DIRS_VAR_NAME
6872
)
69-
# Check arguments
70-
if (${ARGC} GREATER 3)
71-
set(DEPTH ${ARGV2})
72-
else ()
73-
set(DEPTH 0)
74-
endif ()
75-
if (${DEPTH} GREATER 10)
76-
message(FATAL_ERROR "It seems that you have a loop in your bucket definitions. Aborted.")
77-
endif ()
78-
INDENT(${DEPTH} INDENTATION)
79-
if (NOT DEFINED bucket_map_libs_${BUCKET_NAME})
73+
INDENT(0 INDENTATION)
74+
# message("${INDENTATION}Get content of bucket ${BUCKET_NAME} (from parent(s): ${RECURSIVE_BUCKETS})")
75+
# message("${INDENTATION} RESULT_LIBS_VAR_NAME = ${RESULT_LIBS_VAR_NAME} ")
76+
# message("${INDENTATION} RESULT_INC_DIRS_VAR_NAME = ${RESULT_INC_DIRS_VAR_NAME} ")
77+
# message("${INDENTATION} RESULT_SYSTEMINC_DIRS_VAR_NAME = ${RESULT_SYSTEMINC_DIRS_VAR_NAME}")
78+
79+
if (NOT DEFINED bucket_map_${BUCKET_NAME})
8080
message(FATAL_ERROR "${INDENTATION}bucket ${BUCKET_NAME} not defined. Use o2_define_bucket to define it.")
8181
endif ()
82-
83-
# message("${INDENTATION}Get content of bucket ${BUCKET_NAME}")
82+
list (FIND RECURSIVE_BUCKETS ${BUCKET_NAME} _index)
83+
if (${_index} GREATER -1)
84+
message(FATAL_ERROR "circular dependency detected for bucket ${BUCKET_NAME} from parent(s):${RECURSIVE_BUCKETS}")
85+
endif ()
8486

8587
# Fetch the content (recursively)
8688
set(libs ${bucket_map_libs_${BUCKET_NAME}})
8789
set(inc_dirs ${bucket_map_inc_dirs_${BUCKET_NAME}})
88-
set(LOCAL_RESULT_libs_${DEPTH} "")
89-
set(LOCAL_RESULT_inc_dirs_${DEPTH} "")
90+
set(systeminc_dirs ${bucket_map_systeminc_dirs_${BUCKET_NAME}})
91+
set(LOCAL_VARIABLE_EXTENSION "_${BUCKET_NAME}")
92+
set(LOCAL_RESULT_libs${LOCAL_VARIABLE_EXTENSION} "")
93+
set(LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION} "")
94+
set(LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION} "")
9095
foreach (dependency ${libs})
9196
# message("${INDENTATION}- ${dependency} (lib or bucket)")
9297
# if it is a bucket we call recursively
93-
if (DEFINED bucket_map_libs_${dependency})
94-
MATH(EXPR new_depth "${DEPTH}+1")
98+
if (DEFINED bucket_map_${dependency})
99+
list(APPEND RECURSIVE_BUCKETS ${BUCKET_NAME})
95100
GET_BUCKET_CONTENT(${dependency}
96-
LOCAL_RESULT_libs_${DEPTH}
97-
LOCAL_RESULT_inc_dirs_${DEPTH}
98-
${new_depth})
101+
LOCAL_RESULT_libs${LOCAL_VARIABLE_EXTENSION}
102+
LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION}
103+
LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION}
104+
)
105+
list(REMOVE_ITEM RECURSIVE_BUCKETS ${BUCKET_NAME})
106+
# message(" ${INDENTATION}dependencies ${LOCAL_RESULT_libs${LOCAL_VARIABLE_EXTENSION}}")
107+
# message(" ${INDENTATION}include ${LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION}}")
108+
# message(" ${INDENTATION}systeminclude ${LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION}}")
99109
else ()
100110
# else we add the dependency to the results
101-
set(LOCAL_RESULT_libs_${DEPTH} "${LOCAL_RESULT_libs_${DEPTH}};${dependency}")
111+
set(LOCAL_RESULT_libs${LOCAL_VARIABLE_EXTENSION} "${LOCAL_RESULT_libs${LOCAL_VARIABLE_EXTENSION}};${dependency}")
102112
endif ()
103113
endforeach ()
104-
set(LOCAL_RESULT_inc_dirs_${DEPTH} "${LOCAL_RESULT_inc_dirs_${DEPTH}};${inc_dirs}")
114+
115+
if (LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION} AND inc_dirs)
116+
set(LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION} "${LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION}};")
117+
endif ()
118+
set(LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION} "${LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION}}${inc_dirs}")
119+
if (LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION} AND systeminc_dirs)
120+
set(LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION} "${LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION}};")
121+
endif ()
122+
set(LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION} "${LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION}}${systeminc_dirs}")
105123
# foreach (inc_dir ${inc_dirs})
106124
# message("${INDENTATION}- ${inc_dir} (inc_dir)")
125+
# endforeach ()
126+
# foreach (inc_dir ${systeminc_dirs})
127+
# message("${INDENTATION}- ${inc_dir} (systeminc_dir)")
107128
# endforeach ()
108129

109-
set(${RESULT_LIBS_VAR_NAME} "${${RESULT_LIBS_VAR_NAME}};${LOCAL_RESULT_libs_${DEPTH}}" PARENT_SCOPE)
110-
set(${RESULT_INC_DIRS_VAR_NAME} "${${RESULT_INC_DIRS_VAR_NAME}};${LOCAL_RESULT_inc_dirs_${DEPTH}}" PARENT_SCOPE)
130+
if (LOCAL_RESULT_libs${LOCAL_VARIABLE_EXTENSION})
131+
set(${RESULT_LIBS_VAR_NAME} "${${RESULT_LIBS_VAR_NAME}};${LOCAL_RESULT_libs${LOCAL_VARIABLE_EXTENSION}}" PARENT_SCOPE)
132+
endif ()
133+
if (LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION})
134+
set(${RESULT_INC_DIRS_VAR_NAME} "${${RESULT_INC_DIRS_VAR_NAME}};${LOCAL_RESULT_inc_dirs${LOCAL_VARIABLE_EXTENSION}}" PARENT_SCOPE)
135+
endif ()
136+
if (LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION})
137+
set(${RESULT_SYSTEMINC_DIRS_VAR_NAME} "${${RESULT_SYSTEMINC_DIRS_VAR_NAME}};${LOCAL_RESULT_systeminc_dirs${LOCAL_VARIABLE_EXTENSION}}" PARENT_SCOPE)
138+
endif ()
111139
endfunction()
112140

113141
#------------------------------------------------------------------------------
@@ -138,7 +166,8 @@ function(O2_TARGET_LINK_BUCKET)
138166

139167
set(RESULT_libs "")
140168
set(RESULT_inc_dirs "")
141-
GET_BUCKET_CONTENT(${PARSED_ARGS_BUCKET} RESULT_libs RESULT_inc_dirs) # RESULT_lib_dirs)
169+
set(RESULT_systeminc_dirs "")
170+
GET_BUCKET_CONTENT(${PARSED_ARGS_BUCKET} RESULT_libs RESULT_inc_dirs RESULT_systeminc_dirs) # RESULT_lib_dirs)
142171
# message(STATUS "All dependencies of the bucket : ${RESULT_libs}")
143172
# message(STATUS "All inc_dirs of the bucket ${PARSED_ARGS_BUCKET} : ${RESULT_inc_dirs}")
144173

@@ -150,6 +179,7 @@ function(O2_TARGET_LINK_BUCKET)
150179

151180
# Same thing for lib_dirs and inc_dirs
152181
target_include_directories(${PARSED_ARGS_TARGET} PUBLIC ${RESULT_inc_dirs})
182+
target_include_directories(${PARSED_ARGS_TARGET} SYSTEM PUBLIC ${RESULT_systeminc_dirs})
153183
endfunction()
154184

155185
#------------------------------------------------------------------------------
@@ -353,9 +383,11 @@ macro(O2_ROOT_GENERATE_DICTIONARY)
353383
# Get the include directories (from the bucket and from the internal dependencies)
354384
set(RESULT_libs "")
355385
set(Int_INC "")
356-
GET_BUCKET_CONTENT(${BUCKET_NAME} RESULT_libs Int_INC)
386+
set(Int_SYSTEMINC "")
387+
GET_BUCKET_CONTENT(${BUCKET_NAME} RESULT_libs Int_INC Int_SYSTEMINC)
357388
set(Int_INC ${Int_INC} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include)
358389
set(Int_INC ${Int_INC} ${GLOBAL_ALL_MODULES_INCLUDE_DIRECTORIES})
390+
set(Int_INC ${Int_INC} ${Int_SYSTEMINC})
359391

360392
# Format neccesary arguments
361393
# Add -I and -D to include directories and definitions

0 commit comments

Comments
 (0)