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 get_fq_deps_list(fq_deps_list ${ADD_LOADER_OBJECT_DEPENDS}) 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(loader_object ${fq_dep_name} LOADER_OBJECT) 23 set_target_properties( 24 ${fq_target_name} 25 PROPERTIES 26 "TARGET_TYPE" "${OBJECT_LIBRARY_TARGET_TYPE}" 27 "LOADER_OBJECT" "${loader_object}" 28 "OBJECT_FILES" "" 29 "DEPS" "${fq_dep_name}" 30 ) 31 return() 32 endif() 33 34 add_object_library( 35 ${name}.__objects__ 36 SRCS ${ADD_LOADER_OBJECT_SRC} 37 DEPENDS ${ADD_LOADER_OBJECT_DEPENDS} 38 COMPILE_OPTIONS ${ADD_LOADER_OBJECT_COMPILE_OPTIONS} 39 ) 40 41 set(objfile ${LIBC_BUILD_DIR}/lib/${name}.o) 42 add_custom_command( 43 OUTPUT ${objfile} 44 COMMAND cp $<TARGET_OBJECTS:${fq_target_name}.__objects__> ${objfile} 45 DEPENDS $<TARGET_OBJECTS:${fq_target_name}.__objects__> 46 ) 47 add_custom_target( 48 ${fq_target_name} 49 DEPENDS ${objfile} 50 ) 51 set_target_properties( 52 ${fq_target_name} 53 PROPERTIES 54 "TARGET_TYPE" "${OBJECT_LIBRARY_TARGET_TYPE}" 55 "LOADER_OBJECT" "${objfile}" 56 "OBJECT_FILES" "" 57 "DEPS" "${fq_target_name}.__objects__" 58 ) 59endfunction() 60 61if(NOT (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_ARCHITECTURE})) 62 message(STATUS "Skipping loader for target architecture ${LIBC_TARGET_ARCHITECTURE}") 63 return() 64endif() 65 66add_subdirectory(${LIBC_TARGET_ARCHITECTURE}) 67 68add_loader_object( 69 crt1 70 ALIAS 71 DEPENDS 72 .${LIBC_TARGET_ARCHITECTURE}.crt1 73) 74 75add_loader_object( 76 crti 77 SRC 78 crti.cpp 79) 80 81add_loader_object( 82 crtn 83 SRC 84 crtn.cpp 85) 86