CMake/Modules/CPackFreeBSD.cmake
Adriaan de Groot 2042cae9a5 CPack-FreeBSD: add a generator for FreeBSD pkg(8)
Adds an option CPACK_ENABLE_FREEBSD_PKG to allow CPack to look
for FreeBSD's libpkg / pkg(8). If this is set and the libpkg
headers and library are found (which they will be, by default,
on any FreeBSD system), then add a FreeBSD pkg(8) generator.

The FreeBSD package tool pkg(8) uses tar.xz files (.txz) with two
metadata files embedded (+MANIFEST and +COMPACT_MANIFEST).
This introduces a bunch of FreeBSD-specific CPACK_FREEBSD_PACKAGE_*
variables for filling in the metadata; the Debian generator does
something similar. Documentation for the CPack CMake-script is styled
after the Debian generator.

Implementation notes:
 - Checks for libpkg -- the underlying implementation for pkg(8) --
   and includes FreeBSD package-generation if building CMake on
   a UNIX host. Since libpkg can be used on BSDs, Linux and OSX,
   this potentially adds one more packaging format. In practice,
   this will only happen on FreeBSD and DragonflyBSD.
 - Copy-paste from cmCPackArchiveGenerator to special-case
   the metadata generation and to run around the internal
   archive generation: use libpkg instead.
 - Generating the metadata files is a little contrived.
 - Most of the validation logic for package settings is in
   CPackFreeBSD.cmake, as well as the code that tries to re-use
   packaging settings that may already be set up for Debian.
 - libpkg has its own notion of output filename, so we have
   another contrived bit of code that munges the output file
   list so that CPack can find the output.
 - Stick with C++98.
2017-06-10 07:53:59 -04:00

247 lines
8.0 KiB
CMake

# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
#[=======================================================================[.rst:
CPackFreeBSD
------------
The built in (binary) CPack FreeBSD (pkg) generator (Unix only)
Variables specific to CPack FreeBSD (pkg) generator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
CPackFreeBSD may be used to create pkg(8) packages -- these may be used
on FreeBSD, DragonflyBSD, NetBSD, OpenBSD, but also on Linux or OSX,
depending on the installed package-management tools -- using :module:`CPack`.
CPackFreeBSD is a :module:`CPack` generator and uses the ``CPACK_XXX``
variables used by :module:`CPack`. It tries to re-use packaging information
that may already be specified for Debian packages for the :module:`CPackDeb`
generator. it also tries to re-use RPM packaging information when Debian
does not specify.
CPackFreeBSD generator should work on any host with libpkg installed. The
packages it produces are specific to the host architecture and ABI.
CPackFreeBSD sets package-metadata through :code:`CPACK_FREEBSD_XXX` variables.
CPackFreeBSD, unlike CPackDeb, does not specially support componentized
packages; a single package is created from all the software artifacts
created through CMake.
All of the variables can be set specifically for FreeBSD packaging in
the CPackConfig file or in CMakeLists.txt, but most of them have defaults
that use general settings (e.g. CMAKE_PROJECT_NAME) or Debian-specific
variables when those make sense (e.g. the homepage of an upstream project
is usually unchanged by the flavor of packaging). When there is no Debian
information to fall back on, but the RPM packaging has it, fall back to
the RPM information (e.g. package license).
.. variable:: CPACK_FREEBSD_PACKAGE_NAME
Sets the package name (in the package manifest, but also affects the
output filename).
* Mandatory: YES
* Default:
- :variable:`CPACK_PACKAGE_NAME` (this is always set by CPack itself,
based on CMAKE_PROJECT_NAME).
.. variable:: CPACK_FREEBSD_PACKAGE_COMMENT
Sets the package comment. This is the short description displayed by
pkg(8) in standard "pkg info" output.
* Mandatory: YES
* Default:
- :variable:`CPACK_PACKAGE_DESCRIPTION_SUMMARY` (this is always set
by CPack itself, if nothing else sets it explicitly).
- :variable:`PROJECT_DESCRIPTION` (this can be set with the DESCRIPTION
parameter for :command:`project`).
.. variable:: CPACK_FREEBSD_PACKAGE_DESCRIPTION
Sets the package description. This is the long description of the package,
given by "pkg info" with a specific package as argument.
* Mandatory: YES
* Default:
- :variable:`CPACK_DEBIAN_PACKAGE_DESCRIPTION` (this may be set already
for Debian packaging, so we may as well re-use it).
.. variable:: CPACK_FREEBSD_PACKAGE_WWW
The URL of the web site for this package, preferably (when applicable) the
site from which the original source can be obtained and any additional
upstream documentation or information may be found.
* Mandatory: YES
* Default:
- :variable:`CPACK_DEBIAN_PACKAGE_HOMEPAGE` (this may be set already
for Debian packaging, so we may as well re-use it).
.. variable:: CPACK_FREEBSD_PACKAGE_LICENSE
The license, or licenses, which apply to this software package. This must
be one or more license-identifiers that pkg recognizes as acceptable license
identifiers (e.g. "GPLv2").
* Mandatory: YES
* Default:
- :variable:`CPACK_RPM_PACKAGE_LICENSE`
.. variable:: CPACK_FREEBSD_PACKAGE_LICENSE_LOGIC
This variable is only of importance if there is more than one license.
The default is "single", which is only applicable to a single license.
Other acceptable values are determined by pkg -- those are "dual" or "multi" --
meaning choice (OR) or simultaneous (AND) application of the licenses.
* Mandatory: NO
* Default: single
.. variable:: CPACK_FREEBSD_PACKAGE_MAINTAINER
The FreeBSD maintainer (e.g. kde@freebsd.org) of this package.
* Mandatory: YES
* Default: none
.. variable:: CPACK_FREEBSD_PACKAGE_ORIGIN
The origin (ports label) of this package; for packages built by CPack
outside of the ports system this is of less importance. The default
puts the package somewhere under misc/, as a stopgap.
* Mandatory: YES
* Default: misc/<package name>
.. variable:: CPACK_FREEBSD_PACKAGE_CATEGORIES
The ports categories where this package lives (if it were to be built
from ports). If none is set a single category is determined based on
the package origin.
* Mandatory: YES
* Default: derived from ORIGIN
.. variable:: CPACK_FREEBSD_PACKAGE_DEPS
A list of package origins that should be added as package dependencies.
These are in the form <category>/<packagename>, e.g. x11/libkonq.
No version information needs to be provided (this is not included
in the manifest).
* Mandatory: NO
* Default: empty
#]=======================================================================]
if(CMAKE_BINARY_DIR)
message(FATAL_ERROR "CPackFreeBSD.cmake may only be used by CPack internally.")
endif()
if(NOT UNIX)
message(FATAL_ERROR "CPackFreeBSD.cmake may only be used under UNIX.")
endif()
###
#
# These bits are copied from the Debian packaging file; slightly modified.
# They are used for filling in FreeBSD-packaging variables that can take
# on values from elsewhere -- e.g. the package description may as well be
# copied from Debian.
#
function(_cpack_freebsd_fallback_var OUTPUT_VAR_NAME)
set(FALLBACK_VAR_NAMES ${ARGN})
set(VALUE "${${OUTPUT_VAR_NAME}}")
if(VALUE)
return()
endif()
foreach(variable_name IN LISTS FALLBACK_VAR_NAMES)
if(${variable_name})
set(${OUTPUT_VAR_NAME} "${${variable_name}}" PARENT_SCOPE)
set(VALUE "${${variable_name}}")
break()
endif()
endforeach()
if(NOT VALUE)
message(WARNING "Variable ${OUTPUT_VAR_NAME} could not be given a fallback value from any variable ${FALLBACK_VAR_NAMES}.")
endif()
endfunction()
function(check_required_var VAR_NAME)
if(NOT ${VAR_NAME})
message(FATAL_ERROR "Variable ${VAR_NAME} is not set.")
endif()
endfunction()
set(_cpack_freebsd_fallback_origin "misc/bogus")
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_NAME"
"CPACK_PACKAGE_NAME"
"CMAKE_PROJECT_NAME"
)
set(_cpack_freebsd_fallback_www "http://example.com/?pkg=${CPACK_FREEBSD_PACKAGE_NAME}")
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_COMMENT"
"CPACK_PACKAGE_DESCRIPTION_SUMMARY"
)
# TODO: maybe read the PACKAGE_DESCRIPTION file for the longer
# FreeBSD pkg-descr?
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_DESCRIPTION"
"CPACK_DEBIAN_PACKAGE_DESCRIPTION"
"CPACK_PACKAGE_DESCRIPTION_SUMMARY"
"PACKAGE_DESCRIPTION"
)
# There's really only one homepage for a project, so
# re-use the Debian setting if it's there.
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_WWW"
"CPACK_DEBIAN_PACKAGE_HOMEPAGE"
"_cpack_freebsd_fallback_www"
)
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_VERSION"
"CMAKE_PROJECT_VERSION"
"${CMAKE_PROJECT_NAME}_VERSION"
"PROJECT_VERSION"
"CPACK_PACKAGE_VERSION"
"CPACK_PACKAGE_VERSION"
)
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_MAINTAINER"
"CPACK_PACKAGE_CONTACT"
)
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_LICENSE"
"CPACK_RPM_PACKAGE_LICENSE"
)
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_ORIGIN"
"_cpack_freebsd_fallback_origin"
)
if(NOT CPACK_FREEBSD_PACKAGE_CATEGORIES)
string(REGEX REPLACE "/.*" "" CPACK_FREEBSD_PACKAGE_CATEGORIES ${CPACK_FREEBSD_PACKAGE_ORIGIN})
endif()
check_required_var("CPACK_FREEBSD_PACKAGE_NAME")
check_required_var("CPACK_FREEBSD_PACKAGE_ORIGIN")
check_required_var("CPACK_FREEBSD_PACKAGE_VERSION")
check_required_var("CPACK_FREEBSD_PACKAGE_MAINTAINER")
check_required_var("CPACK_FREEBSD_PACKAGE_COMMENT")
check_required_var("CPACK_FREEBSD_PACKAGE_DESCRIPTION")
check_required_var("CPACK_FREEBSD_PACKAGE_WWW")
check_required_var("CPACK_FREEBSD_PACKAGE_LICENSE")