File: help_package.cmake

package info (click to toggle)
amdsmi 7.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 7,428 kB
  • sloc: cpp: 42,484; python: 22,906; ansic: 12,578; sh: 762; makefile: 20
file content (143 lines) | stat: -rw-r--r-- 7,007 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# 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} -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_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()