Skip to content

Commit

Permalink
Add Ubuntu packaging
Browse files Browse the repository at this point in the history
  • Loading branch information
alexreinking committed Feb 18, 2021
1 parent 8124e04 commit b67e378
Show file tree
Hide file tree
Showing 7 changed files with 234 additions and 0 deletions.
5 changes: 5 additions & 0 deletions packaging/ubuntu/changelog
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@package_name@ (@CPACK_PACKAGE_VERSION@) UNRELEASED; urgency=low

* Initial package release.

-- @CPACK_PACKAGE_CONTACT@ @timestamp@ -0000
137 changes: 137 additions & 0 deletions packaging/ubuntu/config.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
cmake_minimum_required(VERSION 3.19)

include("shared-Release/CPackConfig.cmake")

## General setup

set(CPACK_PACKAGE_CONTACT "Alex Reinking <[email protected]>")
set(CPACK_STRIP_FILES TRUE)
set(CPACK_PRE_BUILD_SCRIPTS "${CMAKE_CURRENT_LIST_DIR}/pre_build.cmake")

##############################
## Components configuration ##
##############################

# This is a mapping from CPack component names to CMake install() components.
# We use the identity mapping here for simplicity; some advanced configurations
# with GUI installers require these to diverge.
set(CPACK_COMPONENTS_HALIDE_RUNTIME Halide_Runtime)
set(CPACK_COMPONENTS_HALIDE_DEVELOPMENT Halide_Development)
set(CPACK_COMPONENTS_HALIDE_DOCUMENTATION Halide_Documentation)

set(CPACK_COMPONENTS_ALL Halide_Runtime Halide_Development Halide_Documentation)

set(CPACK_INSTALL_CMAKE_PROJECTS
static-Release Halide ALL /
shared-Release Halide ALL /)

###################################
## Ubuntu-specific configuration ##
###################################

# We set every variable documented here: https://cmake.org/cmake/help/latest/cpack_gen/deb.html
# even if it's just to the default. That way there are no surprises.

set(CPACK_DEB_COMPONENT_INSTALL YES)

set(CPACK_DEBIAN_HALIDE_RUNTIME_PACKAGE_NAME libHalide${CPACK_PACKAGE_VERSION_MAJOR})
set(CPACK_DEBIAN_HALIDE_DEVELOPMENT_PACKAGE_NAME libHalide${CPACK_PACKAGE_VERSION_MAJOR}-dev)
set(CPACK_DEBIAN_HALIDE_DOCUMENTATION_PACKAGE_NAME libHalide${CPACK_PACKAGE_VERSION_MAJOR}-doc)

set(CPACK_DEBIAN_HALIDE_RUNTIME_FILE_NAME DEB-DEFAULT)
set(CPACK_DEBIAN_HALIDE_DEVELOPMENT_FILE_NAME DEB-DEFAULT)
set(CPACK_DEBIAN_HALIDE_DOCUMENTATION_FILE_NAME DEB-DEFAULT)

# Debian package versions look like: <epoch>:<version>-<release>
# <epoch> is a number that increases when changing the whole versioning schema.
# We would ideally _never_ have to set this since we're using semver.
# <version> is the version number of the actual software being packaged.
# <release> is the version number of the _package_. Set/increment this when fixing
# bugs in the package itself. This should also not be incremented too
# frequently. It's always safe to bump the patch version when in doubt.
unset(CPACK_DEBIAN_PACKAGE_EPOCH)
set(CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}")
unset(CPACK_DEBIAN_PACKAGE_RELEASE)

# The default here is the host system architecture. It will generally be best
# to package for ARM on ARM, for x86 on x86, etc. The documentation gets the
# pseudo-architecture "all" to indicate that it has no binaries (ie. is arch
# independent).
unset(CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
set(CPACK_DEBIAN_HALIDE_DOCUMENTATION_PACKAGE_ARCHITECTURE all)

# Package dependencies.
# TODO: figure out how to get LLVM major version piped in here.
set(CPACK_DEBIAN_HALIDE_RUNTIME_PACKAGE_DEPENDS "llvm-11 (= 11.0.0)")
set(CPACK_DEBIAN_HALIDE_DEVELOPMENT_PACKAGE_DEPENDS "llvm-11-dev (= 11.0.0), liblld-11-dev (= 11.0.0)")
set(CPACK_DEBIAN_HALIDE_DOCUMENTATION_PACKAGE_DEPENDS "")

# Sets up package dependencies based on CPack component dependencies
set(CPACK_DEBIAN_ENABLE_COMPONENT_DEPENDS ON)

# Uses CPACK_PACKAGE_CONTACT as default
unset(CPACK_DEBIAN_PACKAGE_MAINTAINER)

# These inherit their values from cpack cpack_add_component
unset(CPACK_DEBIAN_HALIDE_RUNTIME_DESCRIPTION)
unset(CPACK_DEBIAN_HALIDE_DEVELOPMENT_DESCRIPTION)
unset(CPACK_DEBIAN_HALIDE_DOCUMENTATION_DESCRIPTION)

# The Debian repository package section.
# See: https://packages.debian.org/unstable/
# libs = Libraries to make other programs work. They provide special features to developers.
# libdevel = Libraries necessary for developers to write programs that use them.
# doc = FAQs, HOWTOs and other documents trying to explain everything related to
# Debian, and software needed to browse documentation (man, info, etc).
set(CPACK_DEBIAN_HALIDE_RUNTIME_PACKAGE_SECTION libs)
set(CPACK_DEBIAN_HALIDE_DEVELOPMENT_PACKAGE_SECTION libdevel)
set(CPACK_DEBIAN_HALIDE_DOCUMENTATION_PACKAGE_SECTION doc)

# Deprecated: do not use
unset(CPACK_DEBIAN_ARCHIVE_TYPE)

# Could also choose from lzma, xz, or bzip2 if one gave a better ratio.
set(CPACK_DEBIAN_COMPRESSION_TYPE "gzip")

# Optional just means that it is optional for the safe running of
# a Debian system to have our package installed. The other categories
# do not apply to us: required (won't boot without), important (core
# system utils), and standard (basic niceties for a character-mode
# system).
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")

# Uses CMAKE_PROJECT_HOMEPAGE_URL as default.
unset(CPACK_DEBIAN_PACKAGE_HOMEPAGE)

# Call dpkg-shlibdeps to get dependencies on system libraries.
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
unset(CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS) # CMake 3.20+ only

# Disable debug messaging
unset(CPACK_DEBIAN_PACKAGE_DEBUG)

# Special variables for package constraints. We don't have any yet.
unset(CPACK_DEBIAN_PACKAGE_PREDEPENDS)
unset(CPACK_DEBIAN_PACKAGE_ENHANCES)
unset(CPACK_DEBIAN_PACKAGE_BREAKS)
unset(CPACK_DEBIAN_PACKAGE_CONFLICTS)
unset(CPACK_DEBIAN_PACKAGE_PROVIDES)
unset(CPACK_DEBIAN_PACKAGE_REPLACES)
unset(CPACK_DEBIAN_PACKAGE_RECOMMENDS)
unset(CPACK_DEBIAN_PACKAGE_SUGGESTS)

# Generate debian/shlibs control file; require exact versions.
set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS YES)
set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY "=")

# Add custom scripts to package. Used to ensure ldconfig runs.
unset(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA)
set(CPACK_DEBIAN_HALIDE_RUNTIME_PACKAGE_CONTROL_EXTRA
"${CMAKE_CURRENT_LIST_DIR}/triggers")
set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)

# Name the source package for this one. TODO?
unset(CPACK_DEBIAN_PACKAGE_SOURCE)

# Name the package containing debug symbols for this one. TODO?
unset(CPACK_DEBIAN_DEBUGINFO_PACKAGE)
26 changes: 26 additions & 0 deletions packaging/ubuntu/copyright
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: @CPACK_PACKAGE_NAME@
Upstream-Contact: @CPACK_PACKAGE_CONTACT@
Source: @CPACK_PACKAGE_HOMEPAGE_URL@

Files: *
Copyright: @copyright_line@
License: MIT
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject
to the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
6 changes: 6 additions & 0 deletions packaging/ubuntu/extra-strip.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash

# See https://github.com/Debian/debhelper/blob/5d1bb29841043d8e47ebbdd043e6cd086cad508e/dh_strip#L362-L384
# for what dh_strip removes.

strip --remove-section=.comment --remove-section=.note "$@"
34 changes: 34 additions & 0 deletions packaging/ubuntu/package.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/bin/bash
set -e -o pipefail

halide_source=$(readlink -f "$1")
halide_build_root=$(readlink -f "$2")

[ -z "$halide_source" ] && echo "Usage: $0 <source-dir> <build-dir>" && exit
[ -z "$halide_build_root" ] && echo "Usage: $0 <source-dir> <build-dir>" && exit

cmake --preset=package-ubuntu-shared -S "$halide_source" -B "$halide_build_root/shared-Release"
cmake --preset=package-ubuntu-static -S "$halide_source" -B "$halide_build_root/static-Release"

cmake --build "$halide_build_root/shared-Release"
cmake --build "$halide_build_root/static-Release"

cd "$halide_build_root"

rm -rf ./_CPack_Packages ./*.deb lintian.log

# ensure correct umask is set for creating packages
umask 0022

cpack -G DEB -C Release --config "$halide_source/packaging/ubuntu/config.cmake"

# Lintian: some love it, some hate it---but everyone listens.
# https://lintian.debian.org/tags.html

echo "Running lintian checks ..."
lintian --no-tag-display-limit --color=never -i ./*.deb | tee -a lintian.log

echo "Running lintian EXTRA checks ..."
lintian --no-tag-display-limit --color=never -L "=info" -i ./*.deb | tee -a lintian.log

echo "Success!"
25 changes: 25 additions & 0 deletions packaging/ubuntu/pre_build.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
cmake_minimum_required(VERSION 3.19)

file(STRINGS "${CPACK_RESOURCE_FILE_LICENSE}" copyright_line LIMIT_COUNT 1)
string(TIMESTAMP timestamp "%a, %d %b %Y %H:%M:%S" UTC)

find_program(GZIP gzip)
if (NOT GZIP)
message(FATAL_ERROR "Could not find gzip")
endif ()

foreach (comp IN LISTS CPACK_COMPONENTS_ALL)
string(TOUPPER "CPACK_DEBIAN_${comp}_PACKAGE_NAME" package_name_var)
string(TOLOWER "${${package_name_var}}" package_name)

# Write copyright information to the package.
configure_file("${CMAKE_CURRENT_LIST_DIR}/copyright"
"${CPACK_TEMPORARY_DIRECTORY}/${comp}/usr/share/doc/${package_name}/copyright"
@ONLY NO_SOURCE_PERMISSIONS)

# Write changelog to the package.
set(changelog "${CPACK_TEMPORARY_DIRECTORY}/${comp}/usr/share/doc/${package_name}/changelog")
configure_file("${CMAKE_CURRENT_LIST_DIR}/changelog" "${changelog}"
@ONLY NO_SOURCE_PERMISSIONS)
execute_process(COMMAND "${GZIP}" -n9 "${changelog}" COMMAND_ERROR_IS_FATAL ANY)
endforeach ()
1 change: 1 addition & 0 deletions packaging/ubuntu/triggers
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
activate-noawait ldconfig

0 comments on commit b67e378

Please sign in to comment.