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