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