Skip to content

Commit 97a2bb4

Browse files
committed
Added release and debian source package generation
1 parent bd34b1d commit 97a2bb4

2 files changed

Lines changed: 195 additions & 0 deletions

File tree

.github/workflows/release.yml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
env:
8+
distroseries: jammy
9+
10+
jobs:
11+
release:
12+
runs-on: ubuntu-latest
13+
defaults:
14+
run:
15+
shell: bash
16+
steps:
17+
- name: Install prerequisites
18+
run: sudo apt-get update -qq && sudo apt-get install -y cmake devscripts debhelper-compat=13
19+
20+
- name: Import GPG signing key
21+
run: echo "${{ secrets.DEB_SIGNING_KEY }}" | gpg --import
22+
23+
- name: Download and extract source code
24+
run: |
25+
wget -O $GITHUB_WORKSPACE/source.orig.tar.gz https://github.com/$GITHUB_REPOSITORY/archive/refs/tags/$GITHUB_REF_NAME.tar.gz
26+
tar -xvf $GITHUB_WORKSPACE/source.orig.tar.gz
27+
28+
- name: Configure project out-of-tree
29+
run: cmake
30+
-S $GITHUB_WORKSPACE/OpenCL-Headers*
31+
-B $GITHUB_WORKSPACE/../build
32+
-D CMAKE_BUILD_TYPE=Release
33+
-D CMAKE_INSTALL_PREFIX=/usr
34+
-D BUILD_TESTING=OFF
35+
-D LATEST_RELEASE_VERSION=$GITHUB_REF_NAME
36+
-D CPACK_DEBIAN_PACKAGE_MAINTAINER="${{ vars.DEB_MAINTAINER }}"
37+
-D DEBIAN_VERSION_SUFFIX=${{ vars.DEB_VERSION_SUFFIX }}
38+
39+
- name: Generate packaging scripts
40+
run: cmake
41+
-D CMAKE_CACHE_PATH=$GITHUB_WORKSPACE/../build/CMakeCache.txt
42+
-D ORIG_ARCHIVE=$GITHUB_WORKSPACE/source.orig.tar.gz
43+
-D LATEST_RELEASE_VERSION=$GITHUB_REF_NAME
44+
-D DEBIAN_DISTROSERIES=${{ env.distroseries }}
45+
-D DEBIAN_PACKAGE_MAINTAINER="${{ vars.DEB_MAINTAINER }}"
46+
-D DEBIAN_VERSION_SUFFIX=${{ vars.DEB_VERSION_SUFFIX }}
47+
-P $GITHUB_WORKSPACE/OpenCL-Headers*/cmake/DebSourcePkg.cmake
48+
49+
- name: Build source package
50+
run: |
51+
cd $GITHUB_WORKSPACE/OpenCL-Headers*/
52+
debuild -S -sa
53+
54+
- name: Build binary package
55+
run: cpack
56+
-G DEB
57+
-C Release
58+
-B $GITHUB_WORKSPACE/../build
59+
--config $GITHUB_WORKSPACE/../build/CPackConfig.cmake
60+
61+
# The following step does not depend on the previous step "Build binary package",
62+
# but if the binary package build is unsuccessful, it is better not to push the
63+
# source packages to the PPA
64+
- name: Push source package to the PPA
65+
run: dput ppa:${{ vars.PPA }} $GITHUB_WORKSPACE/*source.changes
66+
67+
- name: Create GitHub release
68+
uses: softprops/action-gh-release@v1
69+
with:
70+
files: ${{ github.workspace }}/../build/*.deb

cmake/DebSourcePkg.cmake

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
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-Headers
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-Headers.tar.gz
11+
# -DLATEST_RELEASE_VERSION=v2023.08.29
12+
# -P cmake/DebSourcePkg.cmake
13+
# $ debuild -S -sa
14+
15+
cmake_minimum_required(VERSION 3.21) # file(COPY_FILE) is added in CMake 3.21
16+
17+
set(DEB_SOURCE_PKG_NAME "khronos-opencl-headers")
18+
set(DEB_CLHPP_PKG_NAME "opencl-clhpp-headers")
19+
set(DEB_META_PKG_NAME "opencl-headers")
20+
set(DEB_META_PKG_DESCRIPTION "OpenCL (Open Computing Language) header files
21+
OpenCL (Open Computing Language) is a multi-vendor open standard for
22+
general-purpose parallel programming of heterogeneous systems that include
23+
CPUs, GPUs and other processors.
24+
.
25+
This metapackage depends on packages providing the C and C++ headers files
26+
for the OpenCL API as published by The Khronos Group Inc. The corresponding
27+
specification and documentation can be found on the Khronos website.")
28+
29+
if(NOT EXISTS "${CMAKE_CACHE_PATH}")
30+
message(FATAL_ERROR "CMAKE_CACHE_PATH is not set or does not exist")
31+
endif()
32+
if(NOT DEFINED DEBIAN_PACKAGE_MAINTAINER)
33+
message(FATAL_ERROR "DEBIAN_PACKAGE_MAINTAINER is not set")
34+
endif()
35+
if(NOT DEFINED DEBIAN_DISTROSERIES)
36+
message(FATAL_ERROR "DEBIAN_DISTROSERIES is not set")
37+
endif()
38+
if(NOT DEFINED ORIG_ARCHIVE)
39+
message(WARNING "ORIG_ARCHIVE is not set")
40+
elseif(NOT EXISTS "${ORIG_ARCHIVE}")
41+
message(FATAL_ERROR "ORIG_ARCHIVE is defined, but the file does not exist at \"${ORIG_ARCHIVE}\"")
42+
endif()
43+
if(NOT DEFINED LATEST_RELEASE_VERSION)
44+
message(WARNING "LATEST_RELEASE_VERSION is not set")
45+
endif()
46+
if(NOT DEFINED DEBIAN_VERSION_SUFFIX)
47+
message(WARNING "DEBIAN_VERSION_SUFFIX is not set")
48+
endif()
49+
50+
# Extracting the project version from the main CMakeLists.txt via regex
51+
file(READ "${CMAKE_CACHE_PATH}" CMAKE_CACHE)
52+
string(REGEX MATCH "CMAKE_PROJECT_VERSION[^=]*=([^\n]*)" REGEX_MATCH "${CMAKE_CACHE}")
53+
if(NOT REGEX_MATCH)
54+
message(FATAL_ERROR "Could not extract project version from CMakeLists.txt")
55+
endif()
56+
set(PROJECT_VERSION "${CMAKE_MATCH_1}")
57+
58+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
59+
# Package.cmake contains all details for packaging
60+
include(PackageSetup)
61+
62+
# Append a space after every newline in the description. This format is required
63+
# in the control file.
64+
string(REPLACE "\n" "\n " CPACK_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION}")
65+
66+
set(DEB_SOURCE_PKG_DIR "${CMAKE_CURRENT_LIST_DIR}/../debian")
67+
# Write debian/control
68+
file(WRITE "${DEB_SOURCE_PKG_DIR}/control"
69+
"Source: ${DEB_SOURCE_PKG_NAME}
70+
Section: ${CPACK_DEBIAN_PACKAGE_SECTION}
71+
Priority: optional
72+
Maintainer: ${DEBIAN_PACKAGE_MAINTAINER}
73+
Build-Depends: cmake, debhelper-compat (=13)
74+
Rules-Requires-Root: no
75+
Homepage: ${CPACK_DEBIAN_PACKAGE_HOMEPAGE}
76+
Standards-Version: 4.6.2
77+
78+
Package: ${DEBIAN_PACKAGE_NAME}
79+
Architecture: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}
80+
Multi-Arch: foreign
81+
Breaks: ${CPACK_DEBIAN_PACKAGE_BREAKS}
82+
Replaces: ${CPACK_DEBIAN_PACKAGE_REPLACES}
83+
Description: ${CPACK_PACKAGE_DESCRIPTION}
84+
85+
Package: ${DEB_META_PKG_NAME}
86+
Architecture: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}
87+
Multi-Arch: foreign
88+
Depends: ${DEBIAN_PACKAGE_NAME} (= ${PACKAGE_VERSION_REVISION}), ${DEB_CLHPP_PKG_NAME} (= ${PACKAGE_VERSION_REVISION})
89+
Description: ${DEB_META_PKG_DESCRIPTION}
90+
"
91+
)
92+
# Write debian/changelog
93+
string(TIMESTAMP CURRENT_TIMESTAMP "%a, %d %b %Y %H:%M:%S +0000" UTC)
94+
file(WRITE "${DEB_SOURCE_PKG_DIR}/changelog"
95+
"${DEB_SOURCE_PKG_NAME} (${PACKAGE_VERSION_REVISION}) ${DEBIAN_DISTROSERIES}; urgency=medium
96+
97+
* Released version ${PACKAGE_VERSION_REVISION}
98+
99+
-- ${DEBIAN_PACKAGE_MAINTAINER} ${CURRENT_TIMESTAMP}
100+
")
101+
# Write debian/rules
102+
file(WRITE "${DEB_SOURCE_PKG_DIR}/rules"
103+
"#!/usr/bin/make -f
104+
%:
105+
\tdh $@
106+
107+
override_dh_auto_configure:
108+
\tdh_auto_configure -- -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF
109+
110+
override_dh_auto_install:
111+
\tdh_auto_install --destdir=debian/${DEBIAN_PACKAGE_NAME}/
112+
")
113+
114+
if(DEFINED ORIG_ARCHIVE)
115+
# Copy the passed orig.tar.gz file. The target filename is deduced from the version number, as expected by debuild
116+
cmake_path(IS_ABSOLUTE ORIG_ARCHIVE IS_ORIG_ARCHIVE_ABSOLUTE)
117+
if (NOT IS_ORIG_ARCHIVE_ABSOLUTE)
118+
message(FATAL_ERROR "ORIG_ARCHIVE must be an absolute path (passed: \"${ORIG_ARCHIVE}\")")
119+
endif()
120+
cmake_path(GET ORIG_ARCHIVE EXTENSION ORIG_ARCHIVE_EXT)
121+
cmake_path(GET ORIG_ARCHIVE PARENT_PATH ORIG_ARCHIVE_PARENT)
122+
set(TARGET_PATH "${ORIG_ARCHIVE_PARENT}/${DEB_SOURCE_PKG_NAME}_${CPACK_DEBIAN_PACKAGE_VERSION}${ORIG_ARCHIVE_EXT}")
123+
message(STATUS "Copying \"${ORIG_ARCHIVE}\" to \"${TARGET_PATH}\"")
124+
file(COPY_FILE "${ORIG_ARCHIVE}" "${TARGET_PATH}")
125+
endif()

0 commit comments

Comments
 (0)