b256c1b6de
1) When `clang` is used as system compiler, libraries were built without respecting LDFLAGS. For example, this affected LTO flags, if any (and it only affected clang, not gcc). 2) Linker flags are registered as CXX flags, which produces warnings during compilation: ``` clang++: warning: -Wl,-z,noexecstack: 'linker' input unused [-Wunused-command-line-argument] clang++: warning: -Wl,-znoexecheap: 'linker' input unused [-Wunused-command-line-argument] clang++: warning: -Wl,-z,relro: 'linker' input unused [-Wunused-command-line-argument] clang++: warning: -Wl,-z,now: 'linker' input unused [-Wunused-command-line-argument] ``` 3) Clang does not support `-Wtrampolines` flag: ``` warning: unknown warning option '-Wtrampolines' [-Wunknown-warning-option] ``` 4) No linkers support `noexecheap` anymore. `noexecheap` linker flag was a part of PaX patches to GNU ld, (which were dropped in 2017)[https://www.gentoo.org/support/news-items/2017-08-19-hardened-sources-removal.html]. Now ld/ld.lld/ld.gold don't support it and protection of heap is managed by NX bit. Therefore every compiler produces this warning: ``` ld.lld: warning: unknown -z value: noexecheap ``` Change-Id: I2334a4d4c745df2abc12d543616ca179f85c3575 Signed-off-by: Galantsev, Dmitrii <dmitrii.galantsev@amd.com> Co-authored-by: Sv. Lockal <lockalsash@gmail.com>
160 líneas
6.8 KiB
CMake
160 líneas
6.8 KiB
CMake
# This module provides common functions used for building
|
|
# and packaging ROCm projects
|
|
|
|
option(CMAKE_VERBOSE_MAKEFILE "Enable verbose output" ON)
|
|
option(CMAKE_EXPORT_COMPILE_COMMANDS "Export compile commands for linters and autocompleters" ON)
|
|
|
|
function(generic_add_rocm)
|
|
set(ROCM_DIR
|
|
"/opt/rocm"
|
|
CACHE STRING "ROCm directory.")
|
|
if(DEFINED ENV{ROCM_RPATH} AND NOT DEFINED LIB_RUNPATH)
|
|
set(LIB_RUNPATH "\$ORIGIN:\$ORIGIN/../lib:\$ORIGIN/../lib64" PARENT_SCOPE)
|
|
endif()
|
|
|
|
set(CMAKE_INSTALL_PREFIX ${ROCM_DIR} CACHE STRING "Default installation directory.")
|
|
set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE STRING "Default packaging prefix.")
|
|
# add package search paths
|
|
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} /usr/local PARENT_SCOPE)
|
|
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /usr/lib64 /usr/lib/x86_64-linux-gnu PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function(generic_package)
|
|
# Used by test and example CMakeLists
|
|
set(SHARE_INSTALL_PREFIX "share/${CMAKE_PROJECT_NAME}" CACHE STRING "Tests and Example install directory")
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.4.0)
|
|
message("Compiler version is " ${CMAKE_CXX_COMPILER_VERSION})
|
|
message(FATAL_ERROR "Require at least gcc-5.4.0")
|
|
endif()
|
|
|
|
if("${CMAKE_BUILD_TYPE}" STREQUAL Release)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2" PARENT_SCOPE)
|
|
else()
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb -O0 -DDEBUG" PARENT_SCOPE)
|
|
endif()
|
|
|
|
# Add address sanitizer
|
|
# derived from:
|
|
# https://github.com/RadeonOpenCompute/ROCm-OpenCL-Runtime/blob/e176056061bf11fdd98b58dd57deb4ac5625844d/amdocl/CMakeLists.txt#L27
|
|
if(${ADDRESS_SANITIZER})
|
|
set(ASAN_COMPILER_FLAGS "-fno-omit-frame-pointer -fsanitize=address")
|
|
set(ASAN_LINKER_FLAGS "-fsanitize=address")
|
|
|
|
if(BUILD_SHARED_LIBS)
|
|
set(ASAN_COMPILER_FLAGS "${ASAN_COMPILER_FLAGS} -shared-libsan")
|
|
set(ASAN_LINKER_FLAGS "${ASAN_LINKER_FLAGS} -shared-libsan")
|
|
else()
|
|
set(ASAN_LINKER_FLAGS "${ASAN_LINKER_FLAGS} -static-libsan")
|
|
endif()
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ASAN_COMPILER_FLAGS}" PARENT_SCOPE)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ASAN_COMPILER_FLAGS}" PARENT_SCOPE)
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ASAN_LINKER_FLAGS}" PARENT_SCOPE)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ASAN_LINKER_FLAGS}" PARENT_SCOPE)
|
|
else()
|
|
## Security breach mitigation flags
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFORTIFY_SOURCE=2 -fstack-protector-all -Wcast-align" PARENT_SCOPE)
|
|
## More security breach mitigation flags
|
|
set(HARDENING_LDFLAGS
|
|
"${HARDENING_LDFLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${HARDENING_LDFLAGS}" PARENT_SCOPE)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${HARDENING_LDFLAGS}" PARENT_SCOPE)
|
|
|
|
include(CheckCXXCompilerFlag)
|
|
check_cxx_compiler_flag("-Wtrampolines" CXX_SUPPORTS_WTRAMPOLINES)
|
|
if(CXX_SUPPORTS_WTRAMPOLINES)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wtrampolines" PARENT_SCOPE)
|
|
endif()
|
|
endif()
|
|
|
|
# Clang does not set the build-id
|
|
# similar to if(NOT CMAKE_COMPILER_IS_GNUCC)
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id=sha1" PARENT_SCOPE)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--build-id=sha1" PARENT_SCOPE)
|
|
endif()
|
|
|
|
# configure packaging
|
|
# cpack version is populated with CMAKE_PROJECT_VERSION implicitly
|
|
set(CPACK_PACKAGE_NAME
|
|
${CMAKE_PROJECT_NAME}
|
|
CACHE STRING "")
|
|
set(CPACK_PACKAGE_VENDOR
|
|
"Advanced Micro Devices, Inc."
|
|
CACHE STRING "")
|
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
|
|
"Placeholder Tool"
|
|
CACHE STRING "")
|
|
set(CPACK_PACKAGE_DESCRIPTION
|
|
"This package contains the AMD ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}."
|
|
CACHE STRING "")
|
|
set(CPACK_PACKAGING_INSTALL_PREFIX
|
|
"${CMAKE_INSTALL_PREFIX}"
|
|
CACHE STRING "Default packaging prefix.")
|
|
set(CPACK_RESOURCE_FILE_LICENSE
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/LICENSE"
|
|
CACHE STRING "")
|
|
set(CPACK_RPM_PACKAGE_LICENSE
|
|
"MIT"
|
|
CACHE STRING "")
|
|
set(CPACK_GENERATOR
|
|
"DEB;RPM"
|
|
CACHE STRING "Default packaging generators.")
|
|
set(CPACK_DEB_COMPONENT_INSTALL ON PARENT_SCOPE)
|
|
set(CPACK_RPM_COMPONENT_INSTALL ON PARENT_SCOPE)
|
|
mark_as_advanced(CPACK_PACKAGE_NAME CPACK_PACKAGE_VENDOR CPACK_PACKAGE_CONTACT CPACK_PACKAGE_DESCRIPTION_SUMMARY
|
|
CPACK_PACKAGE_DESCRIPTION CPACK_RESOURCE_FILE_LICENSE CPACK_RPM_PACKAGE_LICENSE CPACK_GENERATOR)
|
|
|
|
# Debian package specific variables
|
|
if(DEFINED ENV{CPACK_DEBIAN_PACKAGE_RELEASE})
|
|
set(CPACK_DEBIAN_PACKAGE_RELEASE $ENV{CPACK_DEBIAN_PACKAGE_RELEASE} PARENT_SCOPE)
|
|
else()
|
|
set(CPACK_DEBIAN_PACKAGE_RELEASE "local" PARENT_SCOPE)
|
|
endif()
|
|
message("Using CPACK_DEBIAN_PACKAGE_RELEASE ${CPACK_DEBIAN_PACKAGE_RELEASE}")
|
|
set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT" PARENT_SCOPE)
|
|
|
|
# RPM package specific variables
|
|
if(DEFINED ENV{CPACK_RPM_PACKAGE_RELEASE})
|
|
set(CPACK_RPM_PACKAGE_RELEASE $ENV{CPACK_RPM_PACKAGE_RELEASE} PARENT_SCOPE)
|
|
else()
|
|
set(CPACK_RPM_PACKAGE_RELEASE "local" PARENT_SCOPE)
|
|
endif()
|
|
message("Using CPACK_RPM_PACKAGE_RELEASE ${CPACK_RPM_PACKAGE_RELEASE}")
|
|
set(CPACK_RPM_FILE_NAME "RPM-DEFAULT" PARENT_SCOPE)
|
|
set(CPACK_RPM_PACKAGE_AUTOREQ 0 PARENT_SCOPE)
|
|
set(CPACK_RPM_PACKAGE_AUTOPROV 0 PARENT_SCOPE)
|
|
list(
|
|
APPEND
|
|
CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION
|
|
"/lib"
|
|
"/usr/sbin"
|
|
"/lib/systemd"
|
|
"/lib/systemd/system"
|
|
"/usr"
|
|
"/opt")
|
|
|
|
# PACKAGE-tests need PACKAGE
|
|
set(CPACK_DEBIAN_TESTS_PACKAGE_DEPENDS "${CPACK_PACKAGE_NAME}" PARENT_SCOPE)
|
|
set(CPACK_RPM_TESTS_PACKAGE_REQUIRES "${CPACK_PACKAGE_NAME}" PARENT_SCOPE)
|
|
|
|
# Treat runtime group as package base.
|
|
# Without it - the base package would be named 'rdc-runtime'
|
|
# resulting in rdc-runtime*.deb and rdc-runtime*.rpm
|
|
set(CPACK_DEBIAN_RUNTIME_PACKAGE_NAME "${CPACK_PACKAGE_NAME}" PARENT_SCOPE)
|
|
set(CPACK_RPM_RUNTIME_PACKAGE_NAME "${CPACK_PACKAGE_NAME}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# this function goes after 'include(CPack)'
|
|
function(generic_package_post)
|
|
# PACKAGE package, no postfix
|
|
cpack_add_component_group("runtime")
|
|
cpack_add_component(dev GROUP runtime)
|
|
cpack_add_component(unspecified GROUP runtime)
|
|
|
|
# PACKAGE-tests package, -tests postfix
|
|
cpack_add_component_group("tests")
|
|
cpack_add_component(tests GROUP tests)
|
|
endfunction()
|