@@ -94,6 +94,58 @@ function(add_gen_header target_name)
9494 )
9595endfunction (add_gen_header)
9696
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+
97149set (ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ" )
98150
99151# A rule for entrypoint object targets.
@@ -105,14 +157,15 @@ set(ENTRYPOINT_OBJ_TARGET_TYPE "ENTRYPOINT_OBJ")
105157# SRCS <list of .cpp files>
106158# HDRS <list of .h files>
107159# 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`>
109162# )
110163function (add_entrypoint_object target_name)
111164 cmake_parse_arguments (
112165 "ADD_ENTRYPOINT_OBJ"
113166 "REDIRECTED" # Optional argument
114167 "NAME" # Single value arguments
115- "SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments
168+ "SRCS;HDRS;SPECIAL_OBJECTS; DEPENDS;COMPILE_OPTIONS" # Multi value arguments
116169 ${ARGN}
117170 )
118171 if (NOT ADD_ENTRYPOINT_OBJ_SRCS)
@@ -166,10 +219,21 @@ function(add_entrypoint_object target_name)
166219 set (object_file_raw "${CMAKE_CURRENT_BINARY_DIR} /${target_name} _raw.o" )
167220 set (object_file "${CMAKE_CURRENT_BINARY_DIR} /${target_name} .o" )
168221
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+
169233 add_custom_command (
170234 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}
173237 )
174238
175239 set (alias_attributes "0,function,global" )
0 commit comments