include(CMakeParseArguments)
include(CompilerRTUtils)

function(get_aix_libatomic_default_link_flags link_flags export_list)
set(linkopts
  -Wl,-H512 -Wl,-D0
  -Wl,-T512 -Wl,-bhalt:4 -Wl,-bernotok
  -Wl,-bnoentry -Wl,-bexport:${export_list}
  -Wl,-bmodtype:SRE -Wl,-lc)
  # Add `-Wl,-G`. Quoted from release notes of cmake-3.16.0
  # > On AIX, runtime linking is no longer enabled by default.
  # See https://cmake.org/cmake/help/latest/release/3.16.html
  if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0")
    set(linkopts -Wl,-G ${linkopts})
  endif()
  set(${link_flags} ${linkopts} PARENT_SCOPE)
endfunction()

function(get_aix_libatomic_type type)
  if(${CMAKE_VERSION} VERSION_LESS "3.16.0")
    set(${type} SHARED PARENT_SCOPE)
  else()
    set(${type} MODULE PARENT_SCOPE)
  endif()
endfunction()

macro(archive_aix_libatomic name libname)
  cmake_parse_arguments(LIB
    ""
    ""
    "ARCHS;PARENT_TARGET"
    ${ARGN})
  set(objects_to_archive "")
  foreach (arch ${LIB_ARCHS})
    if(CAN_TARGET_${arch})
      set(output_dir "${CMAKE_CURRENT_BINARY_DIR}/${libname}-${arch}.dir")
      # FIXME: Target name should be kept consistent with definition
      # in AddCompilerRT.cmake added by
      # add_compiler_rt_runtime(<name> SHARED ...)
      set(target ${name}-dynamic-${arch})
      if(TARGET ${target})
        file(MAKE_DIRECTORY ${output_dir})
        add_custom_command(OUTPUT "${output_dir}/libatomic.so.1"
                           POST_BUILD
                           COMMAND ${CMAKE_COMMAND} -E
                           copy "$<TARGET_FILE:${target}>"
                                "${output_dir}/libatomic.so.1"
                           # If built with MODULE, F_LOADONLY is set.
                           # We have to remove this flag at POST_BUILD.
                           COMMAND ${CMAKE_STRIP} -X32_64 -E
                                "${output_dir}/libatomic.so.1"
                           DEPENDS ${target})
        list(APPEND objects_to_archive "${output_dir}/libatomic.so.1")
      endif()
    endif()
  endforeach()
  if(objects_to_archive)
    set(output_dir "")
    set(install_dir "")
    # If LLVM defines top level library directory, we want to deliver
    # libatomic.a at top level. See `llvm/cmake/modules/AddLLVM.cmake'
    # setting _install_rpath on AIX for reference.
    if(LLVM_LIBRARY_OUTPUT_INTDIR AND CMAKE_INSTALL_PREFIX)
      set(output_dir "${LLVM_LIBRARY_OUTPUT_INTDIR}")
      set(install_dir "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}")
    else()
      get_compiler_rt_output_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} output_dir)
      get_compiler_rt_install_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} install_dir)
    endif()
    add_custom_command(OUTPUT "${output_dir}/${libname}.a"
                       COMMAND ${CMAKE_AR} -X32_64 r "${output_dir}/${libname}.a"
                       ${objects_to_archive}
                       DEPENDS ${objects_to_archive})
    install(FILES "${output_dir}/${libname}.a"
            DESTINATION ${install_dir})
    add_custom_target(aix-${libname}
                      DEPENDS "${output_dir}/${libname}.a")
    add_dependencies(${LIB_PARENT_TARGET} aix-${libname})
  endif()
endmacro()
