blob: d8ca9382012e89533e926c1c2878178a9d108ea1 [file] [log] [blame]
# Library subdir within installation.
# FIXME: select 32/64 based on default target triple
# NOTE: default target triple has not been set at this point,
# we remain libsubdir unchanged with arm64 linux configuration
# for now, so libgo libraries and go*begin.a are put
# under 'lib64' as well, further fix required
set(libsubdir "lib64")
# Set version number string (used by install rules)
set(libversion ${LLVM_VERSION_MAJOR})
if (NOT ${LLVM_VERSION_MINOR} EQUAL 0 AND NOT ${LLVM_VERSION_PATCH} EQUAL 0)
set(libversion "${libversion}.${LLVM_VERSION_MINOR}")
endif()
if (NOT ${LLVM_VERSION_PATCH} EQUAL 0)
set(libversion "${libversion}.${LLVM_VERSION_PATCH}")
endif()
# These are incorporated into GollvmConfig.h
set(GOLLVM_LIBVERSION "${libversion}")
set(GOLLVM_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}")
set(GOLLVM_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/${libsubdir}")
message(STATUS "default linker set to \"${GOLLVM_DEFAULT_LINKER}\"")
# Check to see whether the build compiler supports -fcf-protection=branch
set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_FLAGS "-fcf-protection=branch")
check_c_source_compiles("#include<stdio.h>\nint main(){printf(\"hello\");\nreturn 0;}" C_SUPPORTS_CF_PROTECTION_BRANCH)
set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
# We need to check if '-fsplit-stack' is supported with 'USING_SPLIT_STACK'
# at compile time. So define this macro in GollvmConfig.h if it's supported.
if(GOLLVM_USE_SPLIT_STACK)
# For amd64, as gcc, clang, ld and ld.gold all support -fsplit-stack, so all
# going well. For arm64, the situation is very complicated, none of gcc, ld
# and ld.gold support this option, but clang does. When using clang compiler
# and ld linker, the test passes, but in fact ld does not support stack
# splitting. So here we do this test with ld.gold linker.
# FIXME: update here once one day there is a linker that supports '-fsplit-stack'
# on arm64.
set(C_SUPPORTS_SPLIT_STACK 0)
set(LVARIANT "")
if(GOLLVM_DEFAULT_LINKER)
set(LVARIANT "-fuse-ld=${GOLLVM_DEFAULT_LINKER}")
endif()
set(CMAKE_REQUIRED_FLAGS "${LVARIANT} -fsplit-stack")
check_c_source_compiles("#include<stdio.h>\nint main(){printf(\"hello\");\nreturn 0;}" SPLIT_STACK_FUNCTIONAL)
if(NOT SPLIT_STACK_FUNCTIONAL)
if(C_SUPPORTS_CF_PROTECTION_BRANCH)
# Try again with -fcf-protection=none, since that option
# can cause unpleasant interactions with gold (see
# https://sourceware.org/bugzilla/show_bug.cgi?id=25921 for details).
message(STATUS "trying -fcf-protection=none workaround")
set(CMAKE_REQUIRED_FLAGS "${LVARIANT} -fsplit-stack -fcf-protection=none")
check_c_source_compiles("#include<stdio.h>\nint main(){printf(\"hello\");\nreturn 0;}" SPLIT_STACK_WORKAROUND)
if(SPLIT_STACK_WORKAROUND)
message(STATUS "applying -fcf-protection=none workaround")
add_compile_options(-fcf-protection=none)
set(CFPROTECTION_WORKAROUND "-fcf-protection=none")
set(C_SUPPORTS_SPLIT_STACK 1)
endif()
endif()
else()
set(C_SUPPORTS_SPLIT_STACK 1)
endif()
if(NOT C_SUPPORTS_SPLIT_STACK)
message(SEND_ERROR "C compiler does not support -fsplit-stack")
else()
set(USING_SPLIT_STACK 1)
endif()
endif()
macro(add_gollvm_library name)
llvm_add_library(${name} ${ARGN})
# Configure for install.
install(TARGETS ${name}
COMPONENT ${name}
LIBRARY DESTINATION ${libsubdir}
ARCHIVE DESTINATION ${libsubdir}
RUNTIME DESTINATION bin)
# Add an install target.
add_custom_target(install-${name}
DEPENDS ${name}
COMMAND "${CMAKE_COMMAND}"
-DCMAKE_INSTALL_COMPONENT=${name}
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
add_dependencies(install-gollvm install-${name})
set_target_properties(${name} PROPERTIES FOLDER "Gollvm libraries")
endmacro(add_gollvm_library)
macro(add_gollvm_executable name)
add_llvm_executable(${name} ${ARGN} )
set_target_properties(${name} PROPERTIES FOLDER "Gollvm executables")
endmacro(add_gollvm_executable)
macro(add_gollvm_tool name)
add_gollvm_executable(${name} ${ARGN})
# Configure for install.
install(TARGETS ${name}
COMPONENT ${name}
LIBRARY DESTINATION ${libsubdir}
ARCHIVE DESTINATION ${libsubdir}
RUNTIME DESTINATION bin)
# Add an install target.
add_custom_target(install-${name}
DEPENDS ${name}
COMMAND "${CMAKE_COMMAND}"
-DCMAKE_INSTALL_COMPONENT=${name}
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
add_dependencies(install-gollvm install-${name})
set_target_properties(${name} PROPERTIES FOLDER "Gollvm tools")
endmacro()