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