@@ -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)
2526function (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
4649endfunction ()
4750
4851macro (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).
6367function (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 ()
111139endfunction ()
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} )
153183endfunction ()
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