function(add_startup_object name)
  cmake_parse_arguments(
    "ADD_STARTUP_OBJECT"
    "ALIAS" # Option argument
    "SRC"   # Single value arguments
    "DEPENDS;COMPILE_OPTIONS" # Multi value arguments
    ${ARGN}
  )

  get_fq_target_name(${name} fq_target_name)
  if(ADD_STARTUP_OBJECT_ALIAS)
    get_fq_deps_list(fq_dep_list ${ADD_STARTUP_OBJECT_DEPENDS})
    add_library(${fq_target_name} ALIAS ${fq_dep_list})
    return()
  endif()

  add_object_library(
    ${name}
    SRCS ${ADD_STARTUP_OBJECT_SRC}
    DEPENDS ${ADD_STARTUP_OBJECT_DEPENDS}
    COMPILE_OPTIONS ${ADD_STARTUP_OBJECT_COMPILE_OPTIONS}
  )
  set_target_properties(
    ${fq_target_name}
    PROPERTIES
      OUTPUT_NAME ${name}.o
  )
endfunction()

if(LIBC_GPU_TARGET_ARCHITECTURE_IS_AMDGPU)
  add_subdirectory(amdgpu)

  add_startup_object(
    crt1
    ALIAS
    DEPENDS
      .amdgpu.crt1
  )
elseif(LIBC_GPU_TARGET_ARCHITECTURE_IS_NVPTX)
  add_subdirectory(nvptx)

  add_startup_object(
    crt1
    ALIAS
    DEPENDS
      .nvptx.crt1
  )
else()
  # Skip building the startup code if there are no supported GPUs.
  message(STATUS "Skipping startup for gpu target, no GPUs were detected")
  return()
endif()

add_custom_target(libc-startup)
set(startup_components crt1)
foreach(target IN LISTS startup_components)
  set(fq_target_name libc.startup.gpu.${target})
  add_dependencies(libc-startup ${fq_target_name})
endforeach()
