mirror of
https://github.com/reactos/CMake.git
synced 2024-12-02 00:26:18 +00:00
2042cae9a5
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.
247 lines
8.0 KiB
CMake
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")
|