• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# This script produces the changelog, control and rules file in the debian
2# directory. These files are needed to build a Debian source package from the repository.
3# Run this in CMake script mode, e.g.
4# $ cd OpenCL-ICD-Loader
5# $ cmake -S . -B ../build -D BUILD_TESTING=OFF
6# $ cmake
7#    -DCMAKE_CACHE_PATH=../build/CMakeCache.txt
8#    -DCPACK_DEBIAN_PACKAGE_MAINTAINER="Example Name <example@example.com>"
9#    -DDEBIAN_DISTROSERIES=jammy
10#    -DORIG_ARCHIVE=../OpenCL-ICD-Loader.tar.gz
11#    -DLATEST_RELEASE_VERSION=v2023.08.29
12#    -P cmake/DebSourcePkg.cmake
13# $ debuild -S -sa
14
15cmake_minimum_required(VERSION 3.21) # file(COPY_FILE) is added in CMake 3.21
16
17if(NOT EXISTS "${CMAKE_CACHE_PATH}")
18    message(FATAL_ERROR "CMAKE_CACHE_PATH is not set or does not exist")
19endif()
20if(NOT DEFINED DEBIAN_PACKAGE_MAINTAINER)
21    message(FATAL_ERROR "DEBIAN_PACKAGE_MAINTAINER is not set")
22endif()
23if(NOT DEFINED DEBIAN_DISTROSERIES)
24    message(FATAL_ERROR "DEBIAN_DISTROSERIES is not set")
25endif()
26if(NOT DEFINED ORIG_ARCHIVE)
27    message(WARNING "ORIG_ARCHIVE is not set")
28elseif(NOT EXISTS "${ORIG_ARCHIVE}")
29    message(FATAL_ERROR "ORIG_ARCHIVE is defined, but the file does not exist at \"${ORIG_ARCHIVE}\"")
30endif()
31if(NOT DEFINED LATEST_RELEASE_VERSION)
32    message(WARNING "LATEST_RELEASE_VERSION is not set")
33endif()
34if(NOT DEFINED DEBIAN_VERSION_SUFFIX)
35    message(WARNING "DEBIAN_VERSION_SUFFIX is not set")
36endif()
37
38# Extracting the project version from the main CMakeLists.txt via regex
39file(READ "${CMAKE_CACHE_PATH}" CMAKE_CACHE)
40string(REGEX MATCH "CMAKE_PROJECT_VERSION[^=]*=([^\n]*)" REGEX_MATCH "${CMAKE_CACHE}")
41if(NOT REGEX_MATCH)
42    message(FATAL_ERROR "Could not extract project version from CMakeLists.txt")
43endif()
44set(PROJECT_VERSION "${CMAKE_MATCH_1}")
45
46list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
47# Package.cmake contains all details for packaging
48include(PackageSetup)
49
50# Append a space after every newline in the description. This format is required
51# in the control file.
52string(REPLACE "\n" "\n " CPACK_DEBIAN_DEV_DESCRIPTION "${CPACK_DEBIAN_DEV_DESCRIPTION}")
53string(REPLACE "\n" "\n " CPACK_DEBIAN_RUNTIME_DESCRIPTION "${CPACK_DEBIAN_RUNTIME_DESCRIPTION}")
54string(REPLACE "\n" "\n " CPACK_DEBIAN_CLLAYERINFO_DESCRIPTION "${CPACK_DEBIAN_CLLAYERINFO_DESCRIPTION}")
55
56set(DEB_SOURCE_PKG_DIR "${CMAKE_CURRENT_LIST_DIR}/../debian")
57# Write debian/control
58file(WRITE "${DEB_SOURCE_PKG_DIR}/control"
59"Source: ${PACKAGE_NAME_PREFIX}
60Section: ${CPACK_DEBIAN_DEV_PACKAGE_SECTION}
61Priority: optional
62Maintainer: ${DEBIAN_PACKAGE_MAINTAINER}
63Build-Depends: cmake, debhelper-compat (=13), opencl-c-headers
64Rules-Requires-Root: no
65Homepage: ${CPACK_DEBIAN_PACKAGE_HOMEPAGE}
66Standards-Version: 4.6.2
67
68Package: ${CPACK_DEBIAN_DEV_PACKAGE_NAME}
69Architecture: any
70Multi-Arch: same
71Depends: ${CPACK_DEBIAN_DEV_PACKAGE_DEPENDS}, ${CPACK_DEBIAN_RUNTIME_PACKAGE_NAME} (=${PACKAGE_VERSION_REVISION})
72Recommends: ${CPACK_DEBIAN_DEV_PACKAGE_RECOMMENDS}
73Conflicts: ${CPACK_DEBIAN_DEV_PACKAGE_CONFLICTS}
74Breaks: ${CPACK_DEBIAN_DEV_PACKAGE_BREAKS}
75Replaces: ${CPACK_DEBIAN_DEV_PACKAGE_REPLACES}
76Provides: ${CPACK_DEBIAN_DEV_PACKAGE_PROVIDES}
77Description: ${CPACK_DEBIAN_DEV_DESCRIPTION}
78
79Package: ${CPACK_DEBIAN_RUNTIME_PACKAGE_NAME}
80Section: ${CPACK_DEBIAN_RUNTIME_PACKAGE_SECTION}
81Architecture: any
82Multi-Arch: same
83Depends: ${CPACK_DEBIAN_RUNTIME_PACKAGE_DEPENDS}
84# Conflicts and replaces deliberately not added
85# The runtime package provides libOpenCL.so.1.0.0 and libOpenCL.so.1 via update-alternatives
86# Conflicts: ${CPACK_DEBIAN_RUNTIME_PACKAGE_CONFLICTS}
87# Replaces: ${CPACK_DEBIAN_RUNTIME_PACKAGE_REPLACES}
88Provides: ${CPACK_DEBIAN_RUNTIME_PACKAGE_PROVIDES}
89Description: ${CPACK_DEBIAN_RUNTIME_DESCRIPTION}
90
91Package: ${CPACK_DEBIAN_CLLAYERINFO_PACKAGE_NAME}
92Section: ${CPACK_DEBIAN_CLLAYERINFO_PACKAGE_SECTION}
93Architecture: any
94Depends: ${CPACK_DEBIAN_CLLAYERINFO_PACKAGE_DEPENDS}, ${CPACK_DEBIAN_RUNTIME_PACKAGE_NAME} (=${PACKAGE_VERSION_REVISION})
95Conflicts: ${CPACK_DEBIAN_CLLAYERINFO_PACKAGE_CONFLICTS}
96Replaces: ${CPACK_DEBIAN_CLLAYERINFO_PACKAGE_REPLACES}
97Provides: ${CPACK_DEBIAN_CLLAYERINFO_PACKAGE_PROVIDES}
98Description: ${CPACK_DEBIAN_CLLAYERINFO_DESCRIPTION}
99"
100)
101# Write debian/changelog
102string(TIMESTAMP CURRENT_TIMESTAMP "%a, %d %b %Y %H:%M:%S +0000" UTC)
103file(WRITE "${DEB_SOURCE_PKG_DIR}/changelog"
104"${PACKAGE_NAME_PREFIX} (${PACKAGE_VERSION_REVISION}) ${DEBIAN_DISTROSERIES}; urgency=medium
105
106  * Released version ${PACKAGE_VERSION_REVISION}
107
108 -- ${DEBIAN_PACKAGE_MAINTAINER}  ${CURRENT_TIMESTAMP}
109")
110# Write debian/rules
111file(WRITE "${DEB_SOURCE_PKG_DIR}/rules"
112"#!/usr/bin/make -f
113%:
114\tdh $@
115
116override_dh_auto_configure:
117\tdh_auto_configure -- -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF
118
119GENERATED_MAINTAINER_SCRIPTS := $(patsubst %.in,%,$(wildcard debian/*.alternatives.in))
120
121$(GENERATED_MAINTAINER_SCRIPTS): %: %.in
122\tsed \"s%@DEB_HOST_MULTIARCH@%$(DEB_HOST_MULTIARCH)%g\" < $< > $@
123
124execute_before_dh_install: $(GENERATED_MAINTAINER_SCRIPTS)
125\ttrue # An empty rule would confuse dh
126")
127file(WRITE "${DEB_SOURCE_PKG_DIR}/${CPACK_DEBIAN_DEV_PACKAGE_NAME}.install"
128"usr/lib/*/pkgconfig
129usr/lib/*/lib*.so
130usr/share
131")
132# The .so files are installed to a different directory, and then linked back
133# the the original location via update-alternatives.
134file(WRITE "${DEB_SOURCE_PKG_DIR}/${CPACK_DEBIAN_RUNTIME_PACKAGE_NAME}.install"
135"usr/lib/*/lib*.so.* usr/lib/\${DEB_HOST_MULTIARCH}/KhronosOpenCLICDLoader
136")
137file(WRITE "${DEB_SOURCE_PKG_DIR}/${CPACK_DEBIAN_RUNTIME_PACKAGE_NAME}.alternatives.in"
138"Name: libOpenCL.so.1.0.0-@DEB_HOST_MULTIARCH@
139Link: /usr/lib/@DEB_HOST_MULTIARCH@/libOpenCL.so.1.0.0
140Alternative: /usr/lib/@DEB_HOST_MULTIARCH@/KhronosOpenCLICDLoader/libOpenCL.so.1.0.0
141Dependents:
142  /usr/lib/@DEB_HOST_MULTIARCH@/libOpenCL.so.1 libOpenCL.so.1-@DEB_HOST_MULTIARCH@ /usr/lib/@DEB_HOST_MULTIARCH@/KhronosOpenCLICDLoader/libOpenCL.so.1
143Priority: 100
144")
145file(WRITE "${DEB_SOURCE_PKG_DIR}/${CPACK_DEBIAN_CLLAYERINFO_PACKAGE_NAME}.install"
146"usr/bin
147")
148
149if(DEFINED ORIG_ARCHIVE)
150    # Copy the passed orig.tar.gz file. The target filename is deduced from the version number, as expected by debuild
151    cmake_path(IS_ABSOLUTE ORIG_ARCHIVE IS_ORIG_ARCHIVE_ABSOLUTE)
152    if (NOT IS_ORIG_ARCHIVE_ABSOLUTE)
153        message(FATAL_ERROR "ORIG_ARCHIVE must be an absolute path (passed: \"${ORIG_ARCHIVE}\")")
154    endif()
155    cmake_path(GET ORIG_ARCHIVE EXTENSION ORIG_ARCHIVE_EXT)
156    cmake_path(GET ORIG_ARCHIVE PARENT_PATH ORIG_ARCHIVE_PARENT)
157    set(TARGET_PATH "${ORIG_ARCHIVE_PARENT}/${PACKAGE_NAME_PREFIX}_${CPACK_DEBIAN_PACKAGE_VERSION}${ORIG_ARCHIVE_EXT}")
158    message(STATUS "Copying \"${ORIG_ARCHIVE}\" to \"${TARGET_PATH}\"")
159    file(COPY_FILE "${ORIG_ARCHIVE}" "${TARGET_PATH}")
160endif()
161