xref: /llvm-project/compiler-rt/cmake/Modules/CompilerRTAIXUtils.cmake (revision b07e7b76c5d532a611cf19ae083a94d44bfe0c5d)
1d56729b4SKai Luoinclude(CompilerRTUtils)
2d56729b4SKai Luo
3d56729b4SKai Luofunction(get_aix_libatomic_default_link_flags link_flags export_list)
46393164cSKai Luoset(linkopts
5acc22aebSKai Luo  -Wl,-H512 -Wl,-D0
6acc22aebSKai Luo  -Wl,-T512 -Wl,-bhalt:4 -Wl,-bernotok
7acc22aebSKai Luo  -Wl,-bnoentry -Wl,-bexport:${export_list}
8acc22aebSKai Luo  -Wl,-bmodtype:SRE -Wl,-lc)
96393164cSKai Luo  # Add `-Wl,-G`. Quoted from release notes of cmake-3.16.0
106393164cSKai Luo  # > On AIX, runtime linking is no longer enabled by default.
116393164cSKai Luo  # See https://cmake.org/cmake/help/latest/release/3.16.html
1272ec31afSPetr Hosek  set(linkopts -Wl,-G ${linkopts})
136393164cSKai Luo  set(${link_flags} ${linkopts} PARENT_SCOPE)
146393164cSKai Luoendfunction()
156393164cSKai Luo
166393164cSKai Luofunction(get_aix_libatomic_type type)
176393164cSKai Luo  set(${type} MODULE PARENT_SCOPE)
18d56729b4SKai Luoendfunction()
19d56729b4SKai Luo
20eb3730cfSKai Luomacro(archive_aix_libatomic name libname)
21d56729b4SKai Luo  cmake_parse_arguments(LIB
22d56729b4SKai Luo    ""
23d56729b4SKai Luo    ""
24d56729b4SKai Luo    "ARCHS;PARENT_TARGET"
25d56729b4SKai Luo    ${ARGN})
26a5943624SKai Luo  set(objects_to_archive "")
27d56729b4SKai Luo  foreach (arch ${LIB_ARCHS})
28d56729b4SKai Luo    if(CAN_TARGET_${arch})
29eb3730cfSKai Luo      set(output_dir "${CMAKE_CURRENT_BINARY_DIR}/${libname}-${arch}.dir")
30d56729b4SKai Luo      # FIXME: Target name should be kept consistent with definition
31d56729b4SKai Luo      # in AddCompilerRT.cmake added by
32d56729b4SKai Luo      # add_compiler_rt_runtime(<name> SHARED ...)
33d56729b4SKai Luo      set(target ${name}-dynamic-${arch})
34d56729b4SKai Luo      if(TARGET ${target})
35d56729b4SKai Luo        file(MAKE_DIRECTORY ${output_dir})
36d56729b4SKai Luo        add_custom_command(OUTPUT "${output_dir}/libatomic.so.1"
37d56729b4SKai Luo                           POST_BUILD
38d56729b4SKai Luo                           COMMAND ${CMAKE_COMMAND} -E
39d56729b4SKai Luo                           copy "$<TARGET_FILE:${target}>"
40d56729b4SKai Luo                                "${output_dir}/libatomic.so.1"
416393164cSKai Luo                           # If built with MODULE, F_LOADONLY is set.
426393164cSKai Luo                           # We have to remove this flag at POST_BUILD.
436393164cSKai Luo                           COMMAND ${CMAKE_STRIP} -X32_64 -E
446393164cSKai Luo                                "${output_dir}/libatomic.so.1"
45d56729b4SKai Luo                           DEPENDS ${target})
46a5943624SKai Luo        list(APPEND objects_to_archive "${output_dir}/libatomic.so.1")
47d56729b4SKai Luo      endif()
48d56729b4SKai Luo    endif()
49d56729b4SKai Luo  endforeach()
50a5943624SKai Luo  if(objects_to_archive)
51d56729b4SKai Luo    set(output_dir "")
52d56729b4SKai Luo    set(install_dir "")
53ae79854eSKai Luo    # If LLVM defines top level library directory, we want to deliver
54ae79854eSKai Luo    # libatomic.a at top level. See `llvm/cmake/modules/AddLLVM.cmake'
55ae79854eSKai Luo    # setting _install_rpath on AIX for reference.
56ae79854eSKai Luo    if(LLVM_LIBRARY_OUTPUT_INTDIR AND CMAKE_INSTALL_PREFIX)
57ae79854eSKai Luo      set(output_dir "${LLVM_LIBRARY_OUTPUT_INTDIR}")
58*e941b031SJohn Ericson      set(install_dir "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}")
59ae79854eSKai Luo    else()
60d56729b4SKai Luo      get_compiler_rt_output_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} output_dir)
61d56729b4SKai Luo      get_compiler_rt_install_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} install_dir)
62ae79854eSKai Luo    endif()
63eb3730cfSKai Luo    add_custom_command(OUTPUT "${output_dir}/${libname}.a"
64eb3730cfSKai Luo                       COMMAND ${CMAKE_AR} -X32_64 r "${output_dir}/${libname}.a"
65a5943624SKai Luo                       ${objects_to_archive}
66a5943624SKai Luo                       DEPENDS ${objects_to_archive})
67eb3730cfSKai Luo    install(FILES "${output_dir}/${libname}.a"
68d56729b4SKai Luo            DESTINATION ${install_dir})
69eb3730cfSKai Luo    add_custom_target(aix-${libname}
70eb3730cfSKai Luo                      DEPENDS "${output_dir}/${libname}.a")
71eb3730cfSKai Luo    add_dependencies(${LIB_PARENT_TARGET} aix-${libname})
7222b8a198SKai Luo  endif()
73d56729b4SKai Luoendmacro()
74