CPack/Deb: enable per component setting of dependencies

This commit is contained in:
Domen Vrankar 2015-09-09 23:57:58 +02:00
parent f281c6214b
commit 4de7c8126b
4 changed files with 109 additions and 28 deletions

View File

@ -0,0 +1,12 @@
cpack-deb-component-dependencies
--------------------------------
* The :module:`CPackDeb` module learned to set package dependencies
per component. See :variable:`CPACK_DEBIAN_<COMPONENT>_PACKAGE_PREDEPENDS`,
:variable:`CPACK_DEBIAN_<COMPONENT>_PACKAGE_ENHANCES`,
:variable:`CPACK_DEBIAN_<COMPONENT>_PACKAGE_BREAKS`,
:variable:`CPACK_DEBIAN_<COMPONENT>_PACKAGE_CONFLICTS`,
:variable:`CPACK_DEBIAN_<COMPONENT>_PACKAGE_PROVIDES`,
:variable:`CPACK_DEBIAN_<COMPONENT>_PACKAGE_REPLACES`,
:variable:`CPACK_DEBIAN_<COMPONENT>_PACKAGE_RECOMMENDS` and
:variable:`CPACK_DEBIAN_<COMPONENT>_PACKAGE_SUGGESTS`.

View File

@ -78,6 +78,7 @@
# #
# set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.1-6), libc6 (< 2.4)") # set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.1-6), libc6 (< 2.4)")
# #
#
# .. variable:: CPACK_DEBIAN_PACKAGE_MAINTAINER # .. variable:: CPACK_DEBIAN_PACKAGE_MAINTAINER
# #
# The Debian package maintainer # The Debian package maintainer
@ -164,6 +165,7 @@
# * Default : - # * Default : -
# #
# .. variable:: CPACK_DEBIAN_PACKAGE_PREDEPENDS # .. variable:: CPACK_DEBIAN_PACKAGE_PREDEPENDS
# CPACK_DEBIAN_<COMPONENT>_PACKAGE_PREDEPENDS
# #
# Sets the `Pre-Depends` field of the Debian package. # Sets the `Pre-Depends` field of the Debian package.
# Like :variable:`Depends <CPACK_DEBIAN_PACKAGE_DEPENDS>`, except that it # Like :variable:`Depends <CPACK_DEBIAN_PACKAGE_DEPENDS>`, except that it
@ -172,11 +174,16 @@
# pre-dependency. # pre-dependency.
# #
# * Mandatory : NO # * Mandatory : NO
# * Default : - # * Default :
#
# - An empty string for non-component based installations
# - :variable:`CPACK_DEBIAN_PACKAGE_PREDEPENDS` for component-based
# installations.
# #
# See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps # See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
# #
# .. variable:: CPACK_DEBIAN_PACKAGE_ENHANCES # .. variable:: CPACK_DEBIAN_PACKAGE_ENHANCES
# CPACK_DEBIAN_<COMPONENT>_PACKAGE_ENHANCES
# #
# Sets the `Enhances` field of the Debian package. # Sets the `Enhances` field of the Debian package.
# Similar to :variable:`Suggests <CPACK_DEBIAN_PACKAGE_SUGGESTS>` but works # Similar to :variable:`Suggests <CPACK_DEBIAN_PACKAGE_SUGGESTS>` but works
@ -184,11 +191,16 @@
# functionality of another package. # functionality of another package.
# #
# * Mandatory : NO # * Mandatory : NO
# * Default : - # * Default :
#
# - An empty string for non-component based installations
# - :variable:`CPACK_DEBIAN_PACKAGE_ENHANCES` for component-based
# installations.
# #
# See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps # See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
# #
# .. variable:: CPACK_DEBIAN_PACKAGE_BREAKS # .. variable:: CPACK_DEBIAN_PACKAGE_BREAKS
# CPACK_DEBIAN_<COMPONENT>_PACKAGE_BREAKS
# #
# Sets the `Breaks` field of the Debian package. # Sets the `Breaks` field of the Debian package.
# When a binary package (P) declares that it breaks other packages (B), # When a binary package (P) declares that it breaks other packages (B),
@ -199,12 +211,17 @@
# packages (B) cannot be reconfigured again. # packages (B) cannot be reconfigured again.
# #
# * Mandatory : NO # * Mandatory : NO
# * Default : - # * Default :
#
# - An empty string for non-component based installations
# - :variable:`CPACK_DEBIAN_PACKAGE_BREAKS` for component-based
# installations.
# #
# See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-breaks # See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-breaks
# #
# #
# .. variable:: CPACK_DEBIAN_PACKAGE_CONFLICTS # .. variable:: CPACK_DEBIAN_PACKAGE_CONFLICTS
# CPACK_DEBIAN_<COMPONENT>_PACKAGE_CONFLICTS
# #
# Sets the `Conflicts` field of the Debian package. # Sets the `Conflicts` field of the Debian package.
# When one binary package declares a conflict with another using a `Conflicts` # When one binary package declares a conflict with another using a `Conflicts`
@ -212,7 +229,11 @@
# the same time. # the same time.
# #
# * Mandatory : NO # * Mandatory : NO
# * Default : - # * Default :
#
# - An empty string for non-component based installations
# - :variable:`CPACK_DEBIAN_PACKAGE_CONFLICTS` for component-based
# installations.
# #
# See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-conflicts # See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-conflicts
# #
@ -225,48 +246,68 @@
# time. # time.
# #
# .. variable:: CPACK_DEBIAN_PACKAGE_PROVIDES # .. variable:: CPACK_DEBIAN_PACKAGE_PROVIDES
# CPACK_DEBIAN_<COMPONENT>_PACKAGE_PROVIDES
# #
# Sets the `Provides` field of the Debian package. # Sets the `Provides` field of the Debian package.
# A virtual package is one which appears in the `Provides` control field of # A virtual package is one which appears in the `Provides` control field of
# another package. # another package.
# #
# * Mandatory : NO # * Mandatory : NO
# * Default : - # * Default :
#
# - An empty string for non-component based installations
# - :variable:`CPACK_DEBIAN_PACKAGE_PROVIDES` for component-based
# installations.
# #
# See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-virtual # See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-virtual
# #
# #
# .. variable:: CPACK_DEBIAN_PACKAGE_REPLACES # .. variable:: CPACK_DEBIAN_PACKAGE_REPLACES
# CPACK_DEBIAN_<COMPONENT>_PACKAGE_REPLACES
# #
# Sets the `Replaces` field of the Debian package. # Sets the `Replaces` field of the Debian package.
# Packages can declare in their control file that they should overwrite # Packages can declare in their control file that they should overwrite
# files in certain other packages, or completely replace other packages. # files in certain other packages, or completely replace other packages.
# #
# * Mandatory : NO # * Mandatory : NO
# * Default : - # * Default :
#
# - An empty string for non-component based installations
# - :variable:`CPACK_DEBIAN_PACKAGE_REPLACES` for component-based
# installations.
# #
# See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps # See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
# #
# #
# .. variable:: CPACK_DEBIAN_PACKAGE_RECOMMENDS # .. variable:: CPACK_DEBIAN_PACKAGE_RECOMMENDS
# CPACK_DEBIAN_<COMPONENT>_PACKAGE_RECOMMENDS
# #
# Sets the `Recommends` field of the Debian package. # Sets the `Recommends` field of the Debian package.
# Allows packages to declare a strong, but not absolute, dependency on other # Allows packages to declare a strong, but not absolute, dependency on other
# packages. # packages.
# #
# * Mandatory : NO # * Mandatory : NO
# * Default : - # * Default :
#
# - An empty string for non-component based installations
# - :variable:`CPACK_DEBIAN_PACKAGE_RECOMMENDS` for component-based
# installations.
# #
# See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps # See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
# #
# #
# .. variable:: CPACK_DEBIAN_PACKAGE_SUGGESTS # .. variable:: CPACK_DEBIAN_PACKAGE_SUGGESTS
# CPACK_DEBIAN_<COMPONENT>_PACKAGE_SUGGESTS
# #
# Sets the `Suggests` field of the Debian package. # Sets the `Suggests` field of the Debian package.
# Allows packages to declare a suggested package install grouping. # Allows packages to declare a suggested package install grouping.
# #
# * Mandatory : NO # * Mandatory : NO
# * Default : - # * Default :
#
# - An empty string for non-component based installations
# - :variable:`CPACK_DEBIAN_PACKAGE_SUGGESTS` for component-based
# installations.
# #
# See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps # See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
# #
@ -496,18 +537,21 @@ function(cpack_deb_prepare_package_vars)
# You should set: DEBIAN_PACKAGE_DEPENDS # You should set: DEBIAN_PACKAGE_DEPENDS
# TODO: automate 'objdump -p | grep NEEDED' # TODO: automate 'objdump -p | grep NEEDED'
# if per-component dependency, overrides the global CPACK_DEBIAN_PACKAGE_DEPENDS # if per-component dependency, overrides the global CPACK_DEBIAN_PACKAGE_${dependency_type_}
# automatic dependency discovery will be performed afterwards. # automatic dependency discovery will be performed afterwards.
if(CPACK_DEB_PACKAGE_COMPONENT) if(CPACK_DEB_PACKAGE_COMPONENT)
set(_component_depends_var "CPACK_DEBIAN_${_local_component_name}_PACKAGE_DEPENDS") foreach(dependency_type_ DEPENDS RECOMMENDS SUGGESTS PREDEPENDS ENHANCES BREAKS CONFLICTS PROVIDES REPLACES)
set(_component_var "CPACK_DEBIAN_${_local_component_name}_PACKAGE_${dependency_type_}")
# if set, overrides the global dependency # if set, overrides the global dependency
if(DEFINED ${_component_depends_var}) if(DEFINED ${_component_var})
set(CPACK_DEBIAN_PACKAGE_DEPENDS "${${_component_depends_var}}") set(CPACK_DEBIAN_PACKAGE_${dependency_type_} "${${_component_var}}")
if(CPACK_DEBIAN_PACKAGE_DEBUG) if(CPACK_DEBIAN_PACKAGE_DEBUG)
message("CPackDeb Debug: component '${_local_component_name}' dependencies set to '${CPACK_DEBIAN_PACKAGE_DEPENDS}'") message("CPackDeb Debug: component '${_local_component_name}' ${dependency_type_}"
"dependencies set to '${CPACK_DEBIAN_PACKAGE_${dependency_}}'")
endif()
endif() endif()
endif() endforeach()
endif() endif()
# at this point, the CPACK_DEBIAN_PACKAGE_DEPENDS is properly set # at this point, the CPACK_DEBIAN_PACKAGE_DEPENDS is properly set

View File

@ -1,4 +1,4 @@
function(checkDepends_ FILE REGEX) function(checkDependencies_ FILE REGEX)
set(whitespaces_ "[\t\n\r ]*") set(whitespaces_ "[\t\n\r ]*")
getPackageInfo("${FILE}" "FILE_INFO_") getPackageInfo("${FILE}" "FILE_INFO_")
@ -7,9 +7,28 @@ function(checkDepends_ FILE REGEX)
endif() endif()
endfunction() endfunction()
checkDepends_("${FOUND_FILE_1}" ".*Depends${whitespaces_}:${whitespaces_}depend-application, depend-application-b.*") foreach(dependency_type_ DEPENDS CONFLICTS ENHANCES BREAKS REPLACES RECOMMENDS SUGGESTS)
# use wildcard as we are using dependency auto detection string(TOLOWER "${dependency_type_}" lower_dependency_type_)
checkDepends_("${FOUND_FILE_2}" ".*Depends${whitespaces_}:${whitespaces_}.*depend-application, depend-application-b.*") string(SUBSTRING ${lower_dependency_type_} 1 -1 lower_dependency_type_tail_)
checkDepends_("${FOUND_FILE_3}" ".*Depends${whitespaces_}:${whitespaces_}depend-headers.*") string(SUBSTRING ${dependency_type_} 0 1 dependency_type_head_)
checkDepends_("${FOUND_FILE_4}" ".*Depends${whitespaces_}:${whitespaces_}depend-default, depend-default-b.*") set(dependency_type_name_ "${dependency_type_head_}${lower_dependency_type_tail_}")
checkDepends_("${FOUND_FILE_5}" ".*Depends${whitespaces_}:${whitespaces_}depend-default, depend-default-b.*")
checkDependencies_("${FOUND_FILE_1}" ".*${dependency_type_name_}${whitespaces_}:${whitespaces_}${lower_dependency_type_}-application, ${lower_dependency_type_}-application-b.*")
checkDependencies_("${FOUND_FILE_2}" ".*${dependency_type_name_}${whitespaces_}:${whitespaces_}.*${lower_dependency_type_}-application, ${lower_dependency_type_}-application-b.*")
checkDependencies_("${FOUND_FILE_3}" ".*${dependency_type_name_}${whitespaces_}:${whitespaces_}${lower_dependency_type_}-headers.*")
checkDependencies_("${FOUND_FILE_4}" ".*${dependency_type_name_}${whitespaces_}:${whitespaces_}${lower_dependency_type_}-default, ${lower_dependency_type_}-default-b.*")
checkDependencies_("${FOUND_FILE_5}" ".*${dependency_type_name_}${whitespaces_}:${whitespaces_}${lower_dependency_type_}-default, ${lower_dependency_type_}-default-b.*")
endforeach()
checkDependencies_("${FOUND_FILE_1}" ".*Provides${whitespaces_}:${whitespaces_}provided-default, provided-default-b")
checkDependencies_("${FOUND_FILE_2}" ".*Provides${whitespaces_}:${whitespaces_}provided-default, provided-default-b")
checkDependencies_("${FOUND_FILE_3}" ".*Provides${whitespaces_}:${whitespaces_}provided-default, provided-default-b")
checkDependencies_("${FOUND_FILE_4}" ".*Provides${whitespaces_}:${whitespaces_}provided-lib.*")
checkDependencies_("${FOUND_FILE_5}" ".*Provides${whitespaces_}:${whitespaces_}provided-lib_auto.*, provided-lib_auto-b.*")
# PREDEPENDS
checkDependencies_("${FOUND_FILE_1}" ".*Pre-Depends${whitespaces_}:${whitespaces_}predepends-application, predepends-application-b.*")
checkDependencies_("${FOUND_FILE_2}" ".*Pre-Depends${whitespaces_}:${whitespaces_}.*predepends-application, predepends-application-b.*")
checkDependencies_("${FOUND_FILE_3}" ".*Pre-Depends${whitespaces_}:${whitespaces_}predepends-headers.*")
checkDependencies_("${FOUND_FILE_4}" ".*Pre-Depends${whitespaces_}:${whitespaces_}predepends-default, predepends-default-b.*")
checkDependencies_("${FOUND_FILE_5}" ".*Pre-Depends${whitespaces_}:${whitespaces_}predepends-default, predepends-default-b.*")

View File

@ -7,9 +7,15 @@ set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS FALSE)
# to determine their dependencies and we can not be certain if there will be any # to determine their dependencies and we can not be certain if there will be any
set(CPACK_DEBIAN_APPLICATIONS_AUTO_PACKAGE_SHLIBDEPS TRUE) set(CPACK_DEBIAN_APPLICATIONS_AUTO_PACKAGE_SHLIBDEPS TRUE)
set(CPACK_DEBIAN_PACKAGE_DEPENDS "depend-default, depend-default-b") foreach(dependency_type_ DEPENDS CONFLICTS PREDEPENDS ENHANCES BREAKS REPLACES RECOMMENDS SUGGESTS)
set(CPACK_DEBIAN_APPLICATIONS_PACKAGE_DEPENDS "depend-application, depend-application-b") string(TOLOWER "${dependency_type_}" lower_dependency_type_)
set(CPACK_DEBIAN_APPLICATIONS_AUTO_PACKAGE_DEPENDS "depend-application, depend-application-b")
set(CPACK_DEBIAN_HEADERS_PACKAGE_DEPENDS "depend-headers")
# TODO add other dependency tests once CPackDeb supports them set(CPACK_DEBIAN_PACKAGE_${dependency_type_} "${lower_dependency_type_}-default, ${lower_dependency_type_}-default-b")
set(CPACK_DEBIAN_APPLICATIONS_PACKAGE_${dependency_type_} "${lower_dependency_type_}-application, ${lower_dependency_type_}-application-b")
set(CPACK_DEBIAN_APPLICATIONS_AUTO_PACKAGE_${dependency_type_} "${lower_dependency_type_}-application, ${lower_dependency_type_}-application-b")
set(CPACK_DEBIAN_HEADERS_PACKAGE_${dependency_type_} "${lower_dependency_type_}-headers")
endforeach()
set(CPACK_DEBIAN_PACKAGE_PROVIDES "provided-default, provided-default-b")
set(CPACK_DEBIAN_LIBS_PACKAGE_PROVIDES "provided-lib")
set(CPACK_DEBIAN_LIBS_AUTO_PACKAGE_PROVIDES "provided-lib_auto, provided-lib_auto-b")