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