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