bf36e5f620
Fix spurious character that caused CI issue.
144 строки
6.8 KiB
CMake
144 строки
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)
|
|
# Clang-specific flag for shared ASAN library
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
set(ASAN_COMPILER_FLAGS "${ASAN_COMPILER_FLAGS} -shared-libsan")
|
|
set(ASAN_LINKER_FLAGS "${ASAN_LINKER_FLAGS} -shared-libsan")
|
|
endif()
|
|
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} -D_FORTIFY_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_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_VERBATIM_VARIABLES ON CACHE BOOL "Escape strings passed to CPACK.")
|
|
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_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 1 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 DESCRIPTION "Development components of the library")
|
|
cpack_add_component(unspecified GROUP runtime)
|
|
# not quite sure why this is the only way to populate cpack description
|
|
cpack_add_component(runtime GROUP runtime DESCRIPTION "Runtime components of the library")
|
|
|
|
# PACKAGE-tests package, -tests postfix
|
|
cpack_add_component_group("tests")
|
|
cpack_add_component(tests GROUP tests DESCRIPTION "Test components of the library")
|
|
endfunction()
|