set(libc_archive_targets "")
set(libc_archive_names "")
set(libc_archive_entrypoint_lists "")
if(LLVM_LIBC_FULL_BUILD)
  list(APPEND libc_archive_names c m)
  list(APPEND libc_archive_targets libc libm)
  list(APPEND libc_archive_entrypoint_lists
       TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS)
else()
  list(APPEND libc_archive_names llvmlibc)
  list(APPEND libc_archive_targets libc)
  list(APPEND libc_archive_entrypoint_lists TARGET_LLVMLIBC_ENTRYPOINTS)
endif()

set(added_archive_targets "")
foreach(archive IN ZIP_LISTS
        libc_archive_names libc_archive_targets libc_archive_entrypoint_lists)
  if(NOT ${archive_2})
    # If an entrypoint list is missing, then skip adding targets for it.
    continue()
  endif()
  add_entrypoint_library(
    ${archive_1}
    DEPENDS
      ${${archive_2}}
  )
  set_target_properties(
    ${archive_1}
    PROPERTIES
      ARCHIVE_OUTPUT_NAME ${archive_0}
  )
  if(LLVM_LIBC_FULL_BUILD)
    target_link_libraries(${archive_1} PUBLIC libc-headers)
    if(TARGET libc-startup)
      add_dependencies(${archive_1} libc-startup)
    endif()
  endif()
  list(APPEND added_archive_targets ${archive_1})

  # Add the offloading version of the library for offloading languages. These
  # are installed in the standard search path separate from the other libraries.
  if(LIBC_TARGET_OS_IS_GPU)
    add_bitcode_entrypoint_library(
      ${archive_1}bitcode
      ${archive_1}
      DEPENDS
        ${${archive_2}}
    )
    set_target_properties(
      ${archive_1}bitcode
      PROPERTIES
        OUTPUT_NAME ${archive_1}.bc
    )
    list(APPEND added_bitcode_targets ${archive_1}bitcode)
  endif()
endforeach()

install(
  TARGETS ${added_archive_targets}
  ARCHIVE DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
  COMPONENT libc
)

foreach(file ${added_bitcode_targets})
  install(FILES $<TARGET_FILE:${file}>
          DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
          RENAME $<TARGET_PROPERTY:${file},OUTPUT_NAME>
          COMPONENT libc
  )
endforeach()

if(NOT LIBC_TARGET_OS_IS_BAREMETAL)
  # For now we will disable libc-startup installation for baremetal. The
  # correct way to do it would be to make a hookable startup for baremetal
  # and install it as part of the libc installation.
  set(startup_target "libc-startup")
endif()

if(LLVM_LIBC_FULL_BUILD)
  set(header_install_target install-libc-headers)
endif()

add_custom_target(install-libc
                  DEPENDS ${added_archive_targets}
                          ${added_bitcode_targets}
                          ${startup_target}
                          ${header_install_target}
                  COMMAND "${CMAKE_COMMAND}"
                          -DCMAKE_INSTALL_COMPONENT=libc
                          -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
add_custom_target(install-libc-stripped
                  DEPENDS ${added_archive_targets}
                          ${added_bitcode_targets}
                          ${startup_target}
                          ${header_install_target}
                  COMMAND "${CMAKE_COMMAND}"
                          -DCMAKE_INSTALL_COMPONENT=libc
                          -DCMAKE_INSTALL_DO_STRIP=1
                          -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
