@@ -94,6 +94,58 @@ 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" )
98
+
99
+ # Function to generate single object file.
100
+ # Usage:
101
+ # add_object(
102
+ # <target_name>
103
+ # SRC <source file to compile>
104
+ # DEPENDS <list of dependencies>
105
+ # COMPILE_OPTIONS <optional list of special compile options for this target>
106
+ function (add_object target_name)
107
+ cmake_parse_arguments (
108
+ "ADD_OBJECT"
109
+ "" # No option arguments
110
+ "SRC" # Single value arguments
111
+ "COMPILE_OPTIONS;DEPENDS" # Multivalue arguments
112
+ ${ARGN}
113
+ )
114
+
115
+ if (NOT ADD_OBJECT_SRC)
116
+ message (FATAL_ERROR "'add_object' rules requires a SRC to be specified." )
117
+ endif ()
118
+
119
+ add_library (
120
+ ${target_name}
121
+ OBJECT
122
+ ${ADD_OBJECT_SRC}
123
+ )
124
+ target_include_directories (
125
+ ${target_name}
126
+ PRIVATE
127
+ "${LIBC_BUILD_DIR} /include;${LIBC_SOURCE_DIR} ;${LIBC_BUILD_DIR} "
128
+ )
129
+ if (ADD_OBJECT_COMPILE_OPTIONS)
130
+ target_compile_options (
131
+ ${target_name}
132
+ PRIVATE ${ADD_OBJECT_COMPILE_OPTIONS}
133
+ )
134
+ endif ()
135
+ if (ADD_OBJECT_DEPENDS)
136
+ add_dependencies (
137
+ ${target_name}
138
+ ${ADD_OBJECT_DEPENDS}
139
+ )
140
+ endif ()
141
+ set_target_properties (
142
+ ${target_name}
143
+ PROPERTIES
144
+ "TARGET_TYPE" ${SINGLE_OBJECT_TARGET_TYPE}
145
+ "OBJECT_FILE" $<TARGET_OBJECTS:${target_name} >
146
+ )
147
+ endfunction (add_object)
148
+
97
149
set (ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ" )
98
150
99
151
# A rule for entrypoint object targets.
@@ -105,14 +157,15 @@ set(ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ")
105
157
# SRCS <list of .cpp files>
106
158
# HDRS <list of .h files>
107
159
# DEPENDS <list of dependencies>
108
- # COMPILE_OPTIONS <list of special compile options for this target>
160
+ # COMPILE_OPTIONS <optional list of special compile options for this target>
161
+ # SPECIAL_OBJECTS <optional list of special object targets added by the rule `add_object`>
109
162
# )
110
163
function (add_entrypoint_object target_name)
111
164
cmake_parse_arguments (
112
165
"ADD_ENTRYPOINT_OBJ"
113
166
"REDIRECTED" # Optional argument
114
167
"NAME" # Single value arguments
115
- "SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments
168
+ "SRCS;HDRS;SPECIAL_OBJECTS; DEPENDS;COMPILE_OPTIONS" # Multi value arguments
116
169
${ARGN}
117
170
)
118
171
if (NOT ADD_ENTRYPOINT_OBJ_SRCS)
@@ -166,10 +219,21 @@ function(add_entrypoint_object target_name)
166
219
set (object_file_raw "${CMAKE_CURRENT_BINARY_DIR} /${target_name} _raw.o" )
167
220
set (object_file "${CMAKE_CURRENT_BINARY_DIR} /${target_name} .o" )
168
221
222
+ 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
+
169
233
add_custom_command (
170
234
OUTPUT ${object_file_raw}
171
- DEPENDS $<TARGET_OBJECTS: ${target_name} _objects>
172
- COMMAND ${CMAKE_LINKER} -r $<TARGET_OBJECTS: ${target_name} _objects> -o ${object_file_raw}
235
+ DEPENDS ${input_objects}
236
+ COMMAND ${CMAKE_LINKER} -r ${input_objects} -o ${object_file_raw}
173
237
)
174
238
175
239
set (alias_attributes "0,function,global" )
0 commit comments