1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
# This file is part of dh-cmake, and is distributed under the OSI-approved
# BSD 3-Clause license. See top-level LICENSE file or
# https://gitlab.kitware.com/debian/dh-cmake/blob/master/LICENSE for details.
import json
import os.path
import re
from dhcmake import common
class DHCPack(common.DHCommon):
def read_cpack_metadata(self):
with open("debian/.cpack/cpack-metadata.json", "r") as f:
self.cpack_metadata = json.load(f)
def get_cpack_components(self, package):
opened_file = self.read_package_file(package, "cpack-components")
if opened_file:
retval = []
with opened_file as f:
for l in f:
if not re.search("^($|#)", l):
group = l.rstrip()
if group in self.cpack_metadata["components"]:
retval.append(group)
else:
raise ValueError(
"Invalid CPack components in %s" % package)
return retval
else:
return []
def get_cpack_component_groups(self, package):
opened_file = self.read_package_file(package, "cpack-component-groups")
if opened_file:
retval = []
with opened_file as f:
for l in f:
if not re.search("^($|#)", l):
group = l.rstrip()
if group in self.cpack_metadata["componentGroups"]:
retval.append(group)
else:
raise ValueError(
"Invalid CPack component groups in %s" %
package)
return retval
else:
return []
def get_all_cpack_components_for_group(self, group, visited=None):
if visited is None:
visited = set()
if group in visited:
return set()
visited.add(group)
all_components = set(self.cpack_metadata["componentGroups"][group]
["components"])
for sub_group in self.cpack_metadata["componentGroups"][group]["subgroups"]:
all_components.update(
self.get_all_cpack_components_for_group(
sub_group, visited))
return all_components
def get_all_cpack_components(self, package):
all_components = set(self.get_cpack_components(package))
for group in self.get_cpack_component_groups(package):
all_components.update(
self.get_all_cpack_components_for_group(group))
return all_components
def get_package_dependencies(self, package):
deps = set()
for component in self.get_all_cpack_components(package):
for component_dep in self.cpack_metadata["components"][component]["dependencies"]:
for other_package in self.get_packages():
if component_dep in \
self.get_all_cpack_components(other_package):
deps.add(other_package)
return deps
@common.DHEntryPoint("dh_cpack_generate")
def generate(self, args=None):
self.parse_args(args)
cmd_args = [
"cpack",
"--config",
os.path.join(self.get_build_directory(), "CPackConfig.cmake"),
"-G", "External",
"-D", "CPACK_PACKAGE_FILE_NAME=cpack-metadata",
"-D", "CPACK_EXT_REQUESTED_VERSIONS=1.0",
"-B", "debian/.cpack",
]
self.do_cmd(cmd_args)
@common.DHEntryPoint("dh_cpack_substvars")
def substvars(self, args=None):
self.parse_args(args)
self.read_cpack_metadata()
for package in self.get_packages():
depends = ", ".join(dep + " (= ${binary:Version})" for dep in
sorted(self.get_package_dependencies(package)))
if depends:
self.write_substvar("cpack:Depends", depends, package)
def install_make_arg_parser(self, parser):
self.make_arg_parser(parser)
parser.add_argument(
"--sourcedir", action="store",
help="Source directory for installation (not used except to notify"
" dh_missing)",
default="debian/tmp")
@common.DHEntryPoint("dh_cpack_install")
def install(self, args=None):
self.parse_args(args, make_arg_parser=self.install_make_arg_parser)
self.read_cpack_metadata()
for package in self.get_packages():
for component in self.get_all_cpack_components(package):
for project in self.cpack_metadata["projects"]:
if component in project["components"]:
extra_args = []
try:
extra_args.extend([
"--config",
self.cpack_metadata["buildType"]
])
except KeyError:
pass
# TODO Fix this in CMake (https://gitlab.kitware.com/cmake/cmake/-/issues/20700)
# try:
# extra_args.append(
# "-DCMAKE_INSTALL_DEFAULT_"
# "DIRECTORY_PERMISSIONS:STRING=" +
# self.cpack_metadata[
# "defaultDirectoryPermissions"])
# except KeyError:
# pass
if self.cpack_metadata["stripFiles"]:
extra_args.append("--strip")
self.do_cmake_install(
project["directory"], package,
component=component,
extra_args=extra_args)
def generate():
dhcpack = DHCPack()
dhcpack.generate()
def substvars():
dhcpack = DHCPack()
dhcpack.substvars()
def install():
dhcpack = DHCPack()
dhcpack.install()
|