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