1include(CMakeParseArguments)
2include(CompilerRTUtils)
3
4function(get_aix_libatomic_default_link_flags link_flags export_list)
5  set(linkopts
6    "-Wl,-H512 -Wl,-D0 \
7     -Wl,-T512 -Wl,-bhalt:4 -Wl,-bernotok \
8     -Wl,-bnoentry -Wl,-bexport:${export_list} \
9     -Wl,-bmodtype:SRE -Wl,-lc")
10  # Add `-Wl,-G`. Quoted from release notes of cmake-3.16.0
11  # > On AIX, runtime linking is no longer enabled by default.
12  # See https://cmake.org/cmake/help/latest/release/3.16.html
13  if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0")
14    set(linkopts "-Wl,-G" "${linkopts}")
15  endif()
16  set(${link_flags} ${linkopts} PARENT_SCOPE)
17endfunction()
18
19function(get_aix_libatomic_type type)
20  if(${CMAKE_VERSION} VERSION_LESS "3.16.0")
21    set(${type} SHARED PARENT_SCOPE)
22  else()
23    set(${type} MODULE PARENT_SCOPE)
24  endif()
25endfunction()
26
27macro(archive_aix_libatomic name)
28  cmake_parse_arguments(LIB
29    ""
30    ""
31    "ARCHS;PARENT_TARGET"
32    ${ARGN})
33  set(shared_libraries_to_archive "")
34  foreach (arch ${LIB_ARCHS})
35    if(CAN_TARGET_${arch})
36      set(output_dir "${CMAKE_CURRENT_BINARY_DIR}/libatomic-${arch}.dir")
37      # FIXME: Target name should be kept consistent with definition
38      # in AddCompilerRT.cmake added by
39      # add_compiler_rt_runtime(<name> SHARED ...)
40      set(target ${name}-dynamic-${arch})
41      if(TARGET ${target})
42        file(MAKE_DIRECTORY ${output_dir})
43        add_custom_command(OUTPUT "${output_dir}/libatomic.so.1"
44                           POST_BUILD
45                           COMMAND ${CMAKE_COMMAND} -E
46                           copy "$<TARGET_FILE:${target}>"
47                                "${output_dir}/libatomic.so.1"
48                           # If built with MODULE, F_LOADONLY is set.
49                           # We have to remove this flag at POST_BUILD.
50                           COMMAND ${CMAKE_STRIP} -X32_64 -E
51                                "${output_dir}/libatomic.so.1"
52                           DEPENDS ${target})
53        list(APPEND shared_libraries_to_archive "${output_dir}/libatomic.so.1")
54      endif()
55    endif()
56  endforeach()
57  if(shared_libraries_to_archive)
58    set(output_dir "")
59    set(install_dir "")
60    # If LLVM defines top level library directory, we want to deliver
61    # libatomic.a at top level. See `llvm/cmake/modules/AddLLVM.cmake'
62    # setting _install_rpath on AIX for reference.
63    if(LLVM_LIBRARY_OUTPUT_INTDIR AND CMAKE_INSTALL_PREFIX)
64      set(output_dir "${LLVM_LIBRARY_OUTPUT_INTDIR}")
65      set(install_dir "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}")
66    else()
67      get_compiler_rt_output_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} output_dir)
68      get_compiler_rt_install_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} install_dir)
69    endif()
70    add_custom_command(OUTPUT "${output_dir}/libatomic.a"
71                       COMMAND ${CMAKE_AR} -X32_64 r "${output_dir}/libatomic.a"
72                       ${shared_libraries_to_archive}
73                       DEPENDS ${shared_libraries_to_archive})
74    install(FILES "${output_dir}/libatomic.a"
75            DESTINATION ${install_dir})
76    add_custom_target(aix-libatomic
77                      DEPENDS "${output_dir}/libatomic.a")
78  endif()
79  add_dependencies(${LIB_PARENT_TARGET} aix-libatomic)
80endmacro()
81