@@ -94,32 +94,35 @@ function(add_gen_header target_name)
94
94
)
95
95
endfunction (add_gen_header )
96
96
97
- set (SINGLE_OBJECT_TARGET_TYPE "LIBC_SINGLE_OBJECT " )
97
+ set (OBJECT_LIBRARY_TARGET_TYPE "OBJECT_LIBRARY " )
98
98
99
- # Function to generate single object file.
99
+ # Rule which is essentially a wrapper over add_library to compile a set of
100
+ # sources to object files.
100
101
# Usage:
101
- # add_object (
102
+ # add_object_library (
102
103
# <target_name>
103
- # SRC <source file to compile>
104
+ # HDRS <list of header files>
105
+ # SRCS <list of source files>
104
106
# DEPENDS <list of dependencies>
105
107
# COMPILE_OPTIONS <optional list of special compile options for this target>
106
- function (add_object target_name )
108
+ function (add_object_library target_name )
107
109
cmake_parse_arguments (
108
110
"ADD_OBJECT"
109
111
"" # No option arguments
110
- "SRC " # Single value arguments
111
- "COMPILE_OPTIONS;DEPENDS" # Multivalue arguments
112
+ "" # Single value arguments
113
+ "SRCS;HDRS; COMPILE_OPTIONS;DEPENDS" # Multivalue arguments
112
114
${ARGN}
113
115
)
114
116
115
- if (NOT ADD_OBJECT_SRC )
116
- message (FATAL_ERROR "'add_object' rules requires a SRC to be specified." )
117
+ if (NOT ADD_OBJECT_SRCS )
118
+ message (FATAL_ERROR "'add_object_library' rule requires SRCS to be specified." )
117
119
endif ()
118
120
119
121
add_library (
120
122
${target_name}
121
123
OBJECT
122
- ${ADD_OBJECT_SRC}
124
+ ${ADD_OBJECT_SRCS}
125
+ ${ADD_OBJECT_HDRS}
123
126
)
124
127
target_include_directories (
125
128
${target_name}
@@ -132,19 +135,33 @@ function(add_object target_name)
132
135
PRIVATE ${ADD_OBJECT_COMPILE_OPTIONS}
133
136
)
134
137
endif ()
138
+
139
+ set (all_object_files $< TARGET_OBJECTS:${target_name} > )
135
140
if (ADD_OBJECT_DEPENDS )
136
141
add_dependencies (
137
142
${target_name}
138
143
${ADD_OBJECT_DEPENDS}
139
144
)
145
+ foreach (obj_target IN LISTS ADD_ENTRYPOINT_OBJ_SPECIAL_OBJECTS )
146
+ get_target_property (obj_type ${obj_target} "TARGET_TYPE" )
147
+ if ((NOT obj_type ) OR (NOT (${obj_type} STREQUAL ${OBJECT_LIBRARY_TARGET_TYPE} )))
148
+ continue ()
149
+ endif ()
150
+ # If a dependency is also a object file library, we will collect the list of
151
+ # object files from it.
152
+ get_target_property (obj_files ${obj_target} "OBJECT_FILES" )
153
+ list (APPEND all_object_files ${obj_files} )
154
+ endforeach (obj_target )
140
155
endif ()
156
+ list (REMOVE_DUPLICATES all_object_files )
157
+
141
158
set_target_properties (
142
159
${target_name}
143
160
PROPERTIES
144
- "TARGET_TYPE" ${SINGLE_OBJECT_TARGET_TYPE }
145
- "OBJECT_FILE" $< TARGET_OBJECTS: ${target_name} >
161
+ "TARGET_TYPE" ${OBJECT_LIBRARY_TARGET_TYPE }
162
+ "OBJECT_FILES" " ${all_object_files} "
146
163
)
147
- endfunction (add_object )
164
+ endfunction (add_object_library )
148
165
149
166
set (ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ" )
150
167
@@ -165,7 +182,7 @@ function(add_entrypoint_object target_name)
165
182
"ADD_ENTRYPOINT_OBJ"
166
183
"REDIRECTED" # Optional argument
167
184
"NAME" # Single value arguments
168
- "SRCS;HDRS;SPECIAL_OBJECTS; DEPENDS;COMPILE_OPTIONS" # Multi value arguments
185
+ "SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments
169
186
${ARGN}
170
187
)
171
188
if (NOT ADD_ENTRYPOINT_OBJ_SRCS )
@@ -203,12 +220,34 @@ function(add_entrypoint_object target_name)
203
220
${target_name} _objects
204
221
support_common_h
205
222
)
223
+ set (dep_objects "" )
206
224
if (ADD_ENTRYPOINT_OBJ_DEPENDS )
207
225
add_dependencies (
208
226
${target_name} _objects
209
227
${ADD_ENTRYPOINT_OBJ_DEPENDS}
210
228
)
229
+ foreach (dep_target IN LISTS ADD_ENTRYPOINT_OBJ_DEPENDS )
230
+ if (NOT TARGET ${dep_target} )
231
+ # Not all targets will be visible. So, we will ignore those which aren't
232
+ # visible yet.
233
+ continue ()
234
+ endif ()
235
+ get_target_property (obj_type ${dep_target} "TARGET_TYPE" )
236
+ if ((NOT obj_type ) OR (NOT (${obj_type} STREQUAL ${OBJECT_LIBRARY_TARGET_TYPE} )))
237
+ # Even from among the visible targets, we will collect object files
238
+ # only from add_object_library targets.
239
+ continue ()
240
+ endif ()
241
+ # Calling get_target_property requires that the target be visible at this
242
+ # point. For object library dependencies, this is a reasonable requirement.
243
+ # We can revisit this in future if we need cases which break under this
244
+ # requirement.
245
+ get_target_property (obj_files ${dep_target} "OBJECT_FILES" )
246
+ list (APPEND dep_objects ${obj_files} )
247
+ endforeach (dep_target )
211
248
endif ()
249
+ list (REMOVE_DUPLICATES dep_objects )
250
+
212
251
if (ADD_ENTRYPOINT_OBJ_COMPILE_OPTIONS )
213
252
target_compile_options (
214
253
${target_name} _objects
@@ -220,16 +259,6 @@ function(add_entrypoint_object target_name)
220
259
set (object_file "${CMAKE_CURRENT_BINARY_DIR} /${target_name} .o" )
221
260
222
261
set (input_objects $< TARGET_OBJECTS:${target_name} _objects> )
223
- if (ADD_ENTRYPOINT_OBJ_SPECIAL_OBJECTS )
224
- foreach (obj_target IN LISTS ADD_ENTRYPOINT_OBJ_SPECIAL_OBJECTS )
225
- get_target_property (obj_type ${obj_target} "TARGET_TYPE" )
226
- if ((NOT obj_type ) OR (NOT (${obj_type} STREQUAL ${SINGLE_OBJECT_TARGET_TYPE} )))
227
- message (FATAL_ERROR "Unexpected target type for 'SPECIAL_OBJECT' - should be a target introduced by the `add_object` rule." )
228
- endif ()
229
- list (APPEND input_objects $< TARGET_OBJECTS:${obj_target} > )
230
- endforeach (obj_target )
231
- endif ()
232
-
233
262
add_custom_command (
234
263
OUTPUT ${object_file_raw}
235
264
DEPENDS ${input_objects}
@@ -253,12 +282,16 @@ function(add_entrypoint_object target_name)
253
282
ALL
254
283
DEPENDS ${object_file}
255
284
)
285
+ set (all_objects ${object_file} )
286
+ list (APPEND all_objects ${dep_objects} )
287
+ set (all_objects_raw ${object_file_raw} )
288
+ list (APPEND all_objects_raw ${dep_objects} )
256
289
set_target_properties (
257
290
${target_name}
258
291
PROPERTIES
259
292
"TARGET_TYPE" ${ENTRYPOINT_OBJ_TARGET_TYPE}
260
- "OBJECT_FILE" ${object_file}
261
- "OBJECT_FILE_RAW" ${object_file_raw}
293
+ "OBJECT_FILES" " ${all_objects} "
294
+ "OBJECT_FILES_RAW" " ${all_objects_raw} "
262
295
)
263
296
endfunction (add_entrypoint_object )
264
297
@@ -282,13 +315,13 @@ function(add_entrypoint_library target_name)
282
315
set (obj_list "" )
283
316
foreach (dep IN LISTS ENTRYPOINT_LIBRARY_DEPENDS )
284
317
get_target_property (dep_type ${dep} "TARGET_TYPE" )
285
- string (COMPARE EQUAL ${dep_type} ${ENTRYPOINT_OBJ_TARGET_TYPE} dep_is_entrypoint )
286
- if (NOT dep_is_entrypoint )
318
+ if (NOT (${dep_type} STREQUAL ${ENTRYPOINT_OBJ_TARGET_TYPE} ))
287
319
message (FATAL_ERROR "Dependency '${dep} ' of 'add_entrypoint_collection' is not an 'add_entrypoint_object' target." )
288
320
endif ()
289
- get_target_property (target_obj_file ${dep} "OBJECT_FILE " )
290
- list (APPEND obj_list "${target_obj_file } " )
321
+ get_target_property (target_obj_files ${dep} "OBJECT_FILES " )
322
+ list (APPEND obj_list "${target_obj_files } " )
291
323
endforeach (dep )
324
+ list (REMOVE_DUPLICATES obj_list )
292
325
293
326
set (library_file "${CMAKE_CURRENT_BINARY_DIR} /${CMAKE_STATIC_LIBRARY_PREFIX}${target_name}${CMAKE_STATIC_LIBRARY_SUFFIX} " )
294
327
add_custom_command (
@@ -396,17 +429,17 @@ function(add_libc_unittest target_name)
396
429
set (library_deps "" )
397
430
foreach (dep IN LISTS LIBC_UNITTEST_DEPENDS )
398
431
get_target_property (dep_type ${dep} "TARGET_TYPE" )
399
- if (dep_type )
400
- string (COMPARE EQUAL ${dep_type} ${ENTRYPOINT_OBJ_TARGET_TYPE} dep_is_entrypoint )
401
- if (dep_is_entrypoint )
402
- get_target_property (obj_file ${dep} "OBJECT_FILE_RAW" )
403
- list (APPEND library_deps ${obj_file} )
404
- continue ()
405
- endif ()
432
+ if (${dep_type} STREQUAL ${ENTRYPOINT_OBJ_TARGET_TYPE} )
433
+ get_target_property (obj_files ${dep} "OBJECT_FILES_RAW" )
434
+ list (APPEND library_deps ${obj_files} )
435
+ elseif (${dep_type} STREQUAL ${OBJECT_LIBRARY_TARGET_TYPE} )
436
+ get_target_property (obj_files ${dep} "OBJECT_FILES" )
437
+ list (APPEND library_deps ${obj_files} )
406
438
endif ()
407
439
# TODO: Check if the dep is a normal CMake library target. If yes, then add it
408
440
# to the list of library_deps.
409
441
endforeach (dep )
442
+ list (REMOVE_DUPLICATES library_deps )
410
443
411
444
add_executable (
412
445
${target_name}
@@ -488,7 +521,7 @@ function(add_libc_fuzzer target_name)
488
521
if (dep_type )
489
522
string (COMPARE EQUAL ${dep_type} ${ENTRYPOINT_OBJ_TARGET_TYPE} dep_is_entrypoint )
490
523
if (dep_is_entrypoint )
491
- get_target_property (obj_file ${dep} "OBJECT_FILE_RAW " )
524
+ get_target_property (obj_file ${dep} "OBJECT_FILES_RAW " )
492
525
list (APPEND library_deps ${obj_file} )
493
526
continue ()
494
527
endif ()
0 commit comments