86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			CMake
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			CMake
		
	
	
	
| function(add_loader_object name)
 | |
|   cmake_parse_arguments(
 | |
|     "ADD_LOADER_OBJECT"
 | |
|     "ALIAS" # Option argument
 | |
|     "SRC"   # Single value arguments
 | |
|     "DEPENDS;COMPILE_OPTIONS" # Multi value arguments
 | |
|     ${ARGN}
 | |
|   )
 | |
| 
 | |
|   get_fq_target_name(${name} fq_target_name)
 | |
|   get_fq_deps_list(fq_deps_list ${ADD_LOADER_OBJECT_DEPENDS})
 | |
|   if(ADD_LOADER_OBJECT_ALIAS)
 | |
|     list(LENGTH ADD_LOADER_OBJECT_DEPENDS deps_size)
 | |
|     if(NOT (${deps_size} EQUAL "1"))
 | |
|       message(FATAL_ERROR "A loader object alias should have exactly one dependency.")
 | |
|     endif()
 | |
|     list(GET ADD_LOADER_OBJECT_DEPENDS 0 dep)
 | |
|     get_fq_dep_name(fq_dep_name ${dep})
 | |
| 
 | |
|     add_custom_target(${fq_target_name})
 | |
|     add_dependencies(${fq_target_name} ${fq_dep_name})
 | |
|     get_target_property(loader_object ${fq_dep_name} LOADER_OBJECT)
 | |
|     set_target_properties(
 | |
|       ${fq_target_name}
 | |
|       PROPERTIES
 | |
|         "TARGET_TYPE" "${OBJECT_LIBRARY_TARGET_TYPE}"
 | |
|         "LOADER_OBJECT" "${loader_object}"
 | |
|         "OBJECT_FILES" ""
 | |
|         "DEPS" "${fq_dep_name}"
 | |
|     )
 | |
|     return()
 | |
|   endif()
 | |
| 
 | |
|   add_object_library(
 | |
|     ${name}.__objects__
 | |
|     SRCS ${ADD_LOADER_OBJECT_SRC}
 | |
|     DEPENDS ${ADD_LOADER_OBJECT_DEPENDS}
 | |
|     COMPILE_OPTIONS ${ADD_LOADER_OBJECT_COMPILE_OPTIONS}
 | |
|   )
 | |
| 
 | |
|   set(objfile ${LIBC_BUILD_DIR}/lib/${name}.o)
 | |
|   add_custom_command(
 | |
|     OUTPUT ${objfile}
 | |
|     COMMAND cp $<TARGET_OBJECTS:${fq_target_name}.__objects__> ${objfile}
 | |
|     DEPENDS $<TARGET_OBJECTS:${fq_target_name}.__objects__>
 | |
|   )
 | |
|   add_custom_target(
 | |
|     ${fq_target_name}
 | |
|     DEPENDS ${objfile}
 | |
|   )
 | |
|   set_target_properties(
 | |
|     ${fq_target_name}
 | |
|     PROPERTIES
 | |
|       "TARGET_TYPE" "${OBJECT_LIBRARY_TARGET_TYPE}"
 | |
|       "LOADER_OBJECT" "${objfile}"
 | |
|       "OBJECT_FILES" ""
 | |
|       "DEPS" "${fq_target_name}.__objects__"
 | |
|   )
 | |
| endfunction()
 | |
| 
 | |
| if(NOT (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_ARCHITECTURE}))
 | |
|   message(STATUS "Skipping loader for target architecture ${LIBC_TARGET_ARCHITECTURE}")
 | |
|   return()
 | |
| endif()
 | |
| 
 | |
| add_subdirectory(${LIBC_TARGET_ARCHITECTURE})
 | |
| 
 | |
| add_loader_object(
 | |
|   crt1
 | |
|   ALIAS
 | |
|   DEPENDS
 | |
|     .${LIBC_TARGET_ARCHITECTURE}.crt1
 | |
| )
 | |
| 
 | |
| add_loader_object(
 | |
|   crti
 | |
|   SRC
 | |
|     crti.cpp
 | |
| )
 | |
| 
 | |
| add_loader_object(
 | |
|   crtn
 | |
|   SRC
 | |
|     crtn.cpp
 | |
| )
 |