1function(add_loader_object name) 2 cmake_parse_arguments( 3 "ADD_LOADER_OBJECT" 4 "ALIAS" # Option argument 5 "SRC" # Single value arguments 6 "DEPENDS;COMPILE_OPTIONS" # Multi value arguments 7 ${ARGN} 8 ) 9 10 get_fq_target_name(${name} fq_target_name) 11 12 if(ADD_LOADER_OBJECT_ALIAS) 13 list(LENGTH ADD_LOADER_OBJECT_DEPENDS deps_size) 14 if(NOT (${deps_size} EQUAL "1")) 15 message(FATAL_ERROR "A loader object alias should have exactly one dependency.") 16 endif() 17 list(GET ADD_LOADER_OBJECT_DEPENDS 0 dep) 18 get_fq_dep_name(fq_dep_name ${dep}) 19 20 add_custom_target(${fq_target_name}) 21 add_dependencies(${fq_target_name} ${fq_dep_name}) 22 get_target_property(dep_objfile ${fq_dep_name} OBJECT_FILES) 23 set_target_properties( 24 ${fq_target_name} 25 PROPERTIES 26 "TARGET_TYPE" "LOADER_OBJECT" 27 "OBJECT_FILES" ${dep_objfile} 28 ) 29 return() 30 endif() 31 32 add_object_library( 33 ${name}_objects 34 SRCS ${ADD_LOADER_OBJECT_SRC} 35 DEPENDS ${ADD_LOADER_OBJECT_DEPENDS} 36 COMPILE_OPTIONS ${ADD_LOADER_OBJECT_COMPILE_OPTIONS} 37 ) 38 39 set(objfile ${LIBC_BUILD_DIR}/lib/${name}.o) 40 add_custom_command( 41 OUTPUT ${objfile} 42 COMMAND cp $<TARGET_OBJECTS:${fq_target_name}_objects> ${objfile} 43 DEPENDS $<TARGET_OBJECTS:${fq_target_name}_objects> 44 ) 45 add_custom_target( 46 ${fq_target_name} 47 DEPENDS ${objfile} 48 ) 49 set_target_properties( 50 ${fq_target_name} 51 PROPERTIES 52 "TARGET_TYPE" "LOADER_OBJECT" 53 "OBJECT_FILES" ${objfile} 54 ) 55endfunction() 56 57add_subdirectory(${LIBC_TARGET_MACHINE}) 58 59add_loader_object( 60 crt1 61 ALIAS 62 DEPENDS 63 .${LIBC_TARGET_MACHINE}.crt1 64) 65