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