mirror of
https://github.com/morgan9e/helium
synced 2026-04-14 00:14:20 +09:00
Implement genpkg, refactor packaging, and other improvements
* buildkit: Implement genpkg with current packaging types * Revert Debian minimal packaging type to files because patches require more effort to implement propertly * Some tweaks to packaging scripts * Various improvements to buildkit
This commit is contained in:
140
buildkit/cli.py
140
buildkit/cli.py
@@ -23,16 +23,14 @@ from pathlib import Path
|
||||
from . import config
|
||||
from . import source_retrieval
|
||||
from . import domain_substitution
|
||||
from .common import CONFIG_BUNDLES_DIR, get_resources_dir, get_logger
|
||||
from .common import (
|
||||
CONFIG_BUNDLES_DIR, BUILDSPACE_DOWNLOADS, BUILDSPACE_TREE,
|
||||
BUILDSPACE_TREE_PACKAGING, BUILDSPACE_USER_BUNDLE,
|
||||
BuildkitAbort, get_resources_dir, get_logger)
|
||||
from .config import ConfigBundle
|
||||
|
||||
# Classes
|
||||
|
||||
class _MainArgumentParserFormatter(argparse.RawTextHelpFormatter,
|
||||
argparse.ArgumentDefaultsHelpFormatter):
|
||||
"""Custom argparse.HelpFormatter for the main argument parser"""
|
||||
pass
|
||||
|
||||
class _CLIError(RuntimeError):
|
||||
"""Custom exception for printing argument parser errors from callbacks"""
|
||||
pass
|
||||
@@ -60,7 +58,7 @@ class _NewBaseBundleAction(argparse.Action): #pylint: disable=too-few-public-met
|
||||
except ValueError as exc:
|
||||
get_logger().error('Base bundle metadata has an issue: %s', exc)
|
||||
parser.exit(status=1)
|
||||
except Exception as exc: #pylint: disable=broad-except
|
||||
except BaseException:
|
||||
get_logger().exception('Unexpected exception caught.')
|
||||
parser.exit(status=1)
|
||||
setattr(namespace, self.dest, base_bundle)
|
||||
@@ -77,7 +75,7 @@ def setup_bundle_group(parser):
|
||||
'Mutually exclusive with --user-bundle-path. '
|
||||
'Default value is nothing; a default is specified by --user-bundle-path.'))
|
||||
config_group.add_argument(
|
||||
'-u', '--user-bundle-path', dest='bundle', default='buildspace/user_bundle',
|
||||
'-u', '--user-bundle-path', dest='bundle', default=BUILDSPACE_USER_BUNDLE,
|
||||
type=lambda x: ConfigBundle(Path(x)),
|
||||
help=('The path to a user bundle to use. '
|
||||
'Mutually exclusive with --base-bundle-name. '))
|
||||
@@ -122,14 +120,14 @@ def _add_genbun(subparsers):
|
||||
except ValueError as exc:
|
||||
get_logger().error('Error with base bundle: %s', exc)
|
||||
raise _CLIError()
|
||||
except Exception as exc:
|
||||
except BaseException:
|
||||
get_logger().exception('Unexpected exception caught.')
|
||||
raise _CLIError()
|
||||
parser = subparsers.add_parser(
|
||||
'genbun', formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
help=_add_genbun.__doc__, description=_add_genbun.__doc__)
|
||||
parser.add_argument(
|
||||
'-u', '--user-bundle-path', type=Path, default='buildspace/user_bundle',
|
||||
'-u', '--user-bundle-path', type=Path, default=BUILDSPACE_USER_BUNDLE,
|
||||
help=('The output path for the user config bundle. '
|
||||
'The path must not already exist. '))
|
||||
parser.add_argument(
|
||||
@@ -159,27 +157,28 @@ def _add_getsrc(subparsers):
|
||||
except source_retrieval.HashMismatchError as exc:
|
||||
get_logger().error('Archive checksum is invalid: %s', exc)
|
||||
raise _CLIError()
|
||||
except Exception as exc:
|
||||
except BaseException:
|
||||
get_logger().exception('Unexpected exception caught.')
|
||||
raise _CLIError()
|
||||
parser = subparsers.add_parser(
|
||||
'getsrc', formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
help=_add_getsrc.__doc__ + '.', description=_add_getsrc.__doc__ + '; ' + (
|
||||
'getsrc', help=_add_getsrc.__doc__ + '.',
|
||||
description=_add_getsrc.__doc__ + '; ' + (
|
||||
'these are the Chromium source code and any extra dependencies. '
|
||||
'By default, binary pruning is performed during extraction. '
|
||||
'The buildspace/downloads directory must already exist for storing downloads. '
|
||||
'The %s directory must already exist for storing downloads. '
|
||||
'If the buildspace tree already exists or there is a checksum mismatch, '
|
||||
'this command will abort. '
|
||||
'Only files that are missing will be downloaded. '
|
||||
'If the files are already downloaded, their checksums are '
|
||||
'confirmed and unpacked if necessary.'))
|
||||
'confirmed and then they are unpacked.') % BUILDSPACE_DOWNLOADS)
|
||||
setup_bundle_group(parser)
|
||||
parser.add_argument(
|
||||
'-t', '--tree', type=Path, default='buildspace/tree',
|
||||
help='The buildspace tree path')
|
||||
'-t', '--tree', type=Path, default=BUILDSPACE_TREE,
|
||||
help='The buildspace tree path. Default: %s' % BUILDSPACE_TREE)
|
||||
parser.add_argument(
|
||||
'-d', '--downloads', type=Path, default='buildspace/downloads',
|
||||
help='Path to store archives of Chromium source code and extra deps.')
|
||||
'-d', '--downloads', type=Path, default=BUILDSPACE_DOWNLOADS,
|
||||
help=('Path to store archives of Chromium source code and extra deps. '
|
||||
'Default: %s') % BUILDSPACE_DOWNLOADS)
|
||||
parser.add_argument(
|
||||
'--disable-binary-pruning', action='store_false', dest='prune_binaries',
|
||||
help='Disables binary pruning during extraction.')
|
||||
@@ -207,18 +206,17 @@ def _add_prubin(subparsers):
|
||||
if missing_file:
|
||||
raise _CLIError()
|
||||
parser = subparsers.add_parser(
|
||||
'prubin', formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
help=_add_prubin.__doc__, description=_add_prubin.__doc__ + (
|
||||
'prubin', help=_add_prubin.__doc__, description=_add_prubin.__doc__ + (
|
||||
' This is NOT necessary if the source code was already pruned '
|
||||
'during the getsrc command.'))
|
||||
setup_bundle_group(parser)
|
||||
parser.add_argument(
|
||||
'-t', '--tree', type=Path, default='buildspace/tree',
|
||||
help='The buildspace tree path to apply binary pruning.')
|
||||
'-t', '--tree', type=Path, default=BUILDSPACE_TREE,
|
||||
help='The buildspace tree path to apply binary pruning. Default: %s' % BUILDSPACE_TREE)
|
||||
parser.set_defaults(callback=_callback)
|
||||
|
||||
def _add_subdom(subparsers):
|
||||
"""Substitutes domain names in buildspace tree with blockable strings."""
|
||||
"""Substitutes domain names in buildspace tree or patches with blockable strings."""
|
||||
def _callback(args):
|
||||
try:
|
||||
if not args.only or args.only == 'tree':
|
||||
@@ -232,8 +230,7 @@ def _add_subdom(subparsers):
|
||||
get_logger().error('Patches directory does not exist: %s', exc)
|
||||
raise _CLIError()
|
||||
parser = subparsers.add_parser(
|
||||
'subdom', formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
help=_add_subdom.__doc__, description=_add_subdom.__doc__ + (
|
||||
'subdom', help=_add_subdom.__doc__, description=_add_subdom.__doc__ + (
|
||||
' By default, it will substitute the domains on both the buildspace tree and '
|
||||
'the bundle\'s patches.'))
|
||||
setup_bundle_group(parser)
|
||||
@@ -242,27 +239,98 @@ def _add_subdom(subparsers):
|
||||
help=('Specifies a component to exclusively apply domain substitution to. '
|
||||
'"tree" is for the buildspace tree, and "patches" is for the bundle\'s patches.'))
|
||||
parser.add_argument(
|
||||
'-t', '--tree', type=Path, default='buildspace/tree',
|
||||
'-t', '--tree', type=Path, default=BUILDSPACE_TREE,
|
||||
help=('The buildspace tree path to apply domain substitution. '
|
||||
'Not applicable when --only is "patches".'))
|
||||
'Not applicable when --only is "patches". Default: %s') % BUILDSPACE_TREE)
|
||||
parser.set_defaults(callback=_callback)
|
||||
|
||||
def _add_genpkg_debian(subparsers):
|
||||
"""Generate Debian packaging files"""
|
||||
def _callback(args):
|
||||
from .packaging import debian as packaging_debian
|
||||
try:
|
||||
packaging_debian.generate_packaging(args.bundle, args.flavor, args.output)
|
||||
except FileExistsError as exc:
|
||||
get_logger().error('debian directory already exists: %s', exc)
|
||||
raise _CLIError()
|
||||
except FileNotFoundError as exc:
|
||||
get_logger().error(
|
||||
'Parent directories do not exist for path: %s', exc)
|
||||
raise _CLIError()
|
||||
parser = subparsers.add_parser(
|
||||
'debian', help=_add_genpkg_debian.__doc__, description=_add_genpkg_debian.__doc__)
|
||||
parser.add_argument(
|
||||
'-f', '--flavor', required=True, help='The Debian packaging flavor to use.')
|
||||
parser.add_argument(
|
||||
'-o', '--output', type=Path, default='%s/debian' % BUILDSPACE_TREE,
|
||||
help=('The path to the debian directory to be created. '
|
||||
'It must not already exist, but the parent directories must exist. '
|
||||
'Default: %s/debian') % BUILDSPACE_TREE)
|
||||
parser.set_defaults(callback=_callback)
|
||||
|
||||
def _add_genpkg_linux_simple(subparsers):
|
||||
"""Generate Linux Simple packaging files"""
|
||||
def _callback(args):
|
||||
from .packaging import linux_simple as packaging_linux_simple
|
||||
try:
|
||||
packaging_linux_simple.generate_packaging(args.bundle, args.output)
|
||||
except FileExistsError as exc:
|
||||
get_logger().error('Output directory already exists: %s', exc)
|
||||
raise _CLIError()
|
||||
except FileNotFoundError as exc:
|
||||
get_logger().error(
|
||||
'Parent directories do not exist for path: %s', exc)
|
||||
raise _CLIError()
|
||||
parser = subparsers.add_parser(
|
||||
'linux_simple', help=_add_genpkg_linux_simple.__doc__,
|
||||
description=_add_genpkg_linux_simple.__doc__)
|
||||
parser.add_argument(
|
||||
'-o', '--output', type=Path, default=BUILDSPACE_TREE_PACKAGING,
|
||||
help=('The directory to store packaging files. '
|
||||
'It must not already exist, but the parent directories must exist. '
|
||||
'Default: %s') % BUILDSPACE_TREE_PACKAGING)
|
||||
parser.set_defaults(callback=_callback)
|
||||
|
||||
def _add_genpkg_macos(subparsers):
|
||||
"""Generate macOS packaging files"""
|
||||
def _callback(args):
|
||||
from .packaging import macos as packaging_macos
|
||||
try:
|
||||
packaging_macos.generate_packaging(args.bundle, args.output)
|
||||
except FileExistsError as exc:
|
||||
get_logger().error('Output directory already exists: %s', exc)
|
||||
raise _CLIError()
|
||||
except FileNotFoundError as exc:
|
||||
get_logger().error(
|
||||
'Parent directories do not exist for path: %s', exc)
|
||||
raise _CLIError()
|
||||
parser = subparsers.add_parser(
|
||||
'macos', help=_add_genpkg_macos.__doc__, description=_add_genpkg_macos.__doc__)
|
||||
parser.add_argument(
|
||||
'-o', '--output', type=Path, default=BUILDSPACE_TREE_PACKAGING,
|
||||
help=('The directory to store packaging files. '
|
||||
'It must not already exist, but the parent directories must exist. '
|
||||
'Default: %s') % BUILDSPACE_TREE_PACKAGING)
|
||||
parser.set_defaults(callback=_callback)
|
||||
|
||||
def _add_genpkg(subparsers):
|
||||
"""Generates a packaging script."""
|
||||
parser = subparsers.add_parser(
|
||||
'genpkg', formatter_class=argparse.ArgumentDefaultsHelpFormatter, help=_add_genpkg.__doc__,
|
||||
'genpkg', help=_add_genpkg.__doc__,
|
||||
description=_add_genpkg.__doc__ + ' Specify no arguments to get a list of different types.')
|
||||
setup_bundle_group(parser)
|
||||
parser.add_argument(
|
||||
'-o', '--output-path', type=Path, default='buildspace/tree/ungoogled_packaging',
|
||||
help=('The directory to store packaging files. '
|
||||
'If it does not exist, just the leaf directory will be created. '
|
||||
'If it already exists, this command will abort. '))
|
||||
# Add subcommands to genpkg for handling different packaging types in the same manner as main()
|
||||
# However, the top-level argparse.ArgumentParser will be passed the callback.
|
||||
subsubparsers = parser.add_subparsers(title='Available packaging types', dest='packaging')
|
||||
subsubparsers.required = True # Workaround for http://bugs.python.org/issue9253#msg186387
|
||||
_add_genpkg_debian(subsubparsers)
|
||||
_add_genpkg_linux_simple(subsubparsers)
|
||||
_add_genpkg_macos(subsubparsers)
|
||||
|
||||
def main(arg_list=None):
|
||||
"""CLI entry point"""
|
||||
parser = argparse.ArgumentParser(description=__doc__,
|
||||
formatter_class=_MainArgumentParserFormatter)
|
||||
formatter_class=argparse.RawTextHelpFormatter)
|
||||
|
||||
subparsers = parser.add_subparsers(title='Available commands', dest='command')
|
||||
subparsers.required = True # Workaround for http://bugs.python.org/issue9253#msg186387
|
||||
@@ -276,5 +344,5 @@ def main(arg_list=None):
|
||||
args = parser.parse_args(args=arg_list)
|
||||
try:
|
||||
args.callback(args=args)
|
||||
except _CLIError:
|
||||
except (_CLIError, BuildkitAbort):
|
||||
parser.exit(status=1)
|
||||
|
||||
@@ -18,9 +18,26 @@ CONFIG_BUNDLES_DIR = "config_bundles"
|
||||
PACKAGING_DIR = "packaging"
|
||||
PATCHES_DIR = "patches"
|
||||
|
||||
BUILDSPACE_DOWNLOADS = 'buildspace/downloads'
|
||||
BUILDSPACE_TREE = 'buildspace/tree'
|
||||
BUILDSPACE_TREE_PACKAGING = 'buildspace/tree/ungoogled_packaging'
|
||||
BUILDSPACE_USER_BUNDLE = 'buildspace/user_bundle'
|
||||
|
||||
_ENV_FORMAT = "BUILDKIT_{}"
|
||||
|
||||
# Module-wide methods
|
||||
# Public classes
|
||||
|
||||
class BuildkitError(Exception):
|
||||
"""Represents a generic custom error from buildkit"""
|
||||
|
||||
class BuildkitAbort(BuildkitError):
|
||||
"""
|
||||
Exception thrown when all details have been logged and buildkit aborts.
|
||||
|
||||
It should only be caught by the user of buildkit's library interface.
|
||||
"""
|
||||
|
||||
# Public methods
|
||||
|
||||
def get_logger(name=__package__, initial_level=logging.DEBUG):
|
||||
'''Gets the named logger'''
|
||||
|
||||
@@ -15,7 +15,9 @@ import itertools
|
||||
import re
|
||||
import shutil
|
||||
|
||||
from .common import ENCODING, CONFIG_BUNDLES_DIR, get_logger, get_resources_dir
|
||||
from pathlib import Path
|
||||
|
||||
from .common import ENCODING, CONFIG_BUNDLES_DIR, BuildkitAbort, get_logger, get_resources_dir
|
||||
from .third_party import schema
|
||||
|
||||
# Constants
|
||||
@@ -32,11 +34,13 @@ VERSION_INI = "version.ini"
|
||||
|
||||
# Helpers for third_party.schema
|
||||
|
||||
def _DictCast(data): #pylint: disable=invalid-name
|
||||
def schema_dictcast(data):
|
||||
"""Cast data to dictionary for third_party.schema and configparser data structures"""
|
||||
return schema.And(schema.Use(dict), data)
|
||||
|
||||
def _IniSchema(data): #pylint: disable=invalid-name
|
||||
return _DictCast({configparser.DEFAULTSECT: object, **data})
|
||||
def schema_inisections(data):
|
||||
"""Cast configparser data structure to dict and remove DEFAULT section"""
|
||||
return schema_dictcast({configparser.DEFAULTSECT: object, **data})
|
||||
|
||||
# Classes
|
||||
|
||||
@@ -48,7 +52,8 @@ class _ConfigABC(abc.ABC):
|
||||
Initializes the config class.
|
||||
|
||||
path is a pathlib.Path to a config file or directory.
|
||||
name is a type identifier and the actual file or directory name.
|
||||
name is the actual file or directory name. This is also used for type identification.
|
||||
Defaults to the last element of path.
|
||||
|
||||
Raises FileNotFoundError if path does not exist.
|
||||
"""
|
||||
@@ -163,7 +168,7 @@ class IniConfigFile(_CacheConfigMixin, _ConfigABC):
|
||||
def _parse_data(self):
|
||||
"""
|
||||
Returns a parsed INI file.
|
||||
Raises third_party.schema.SchemaError if validation fails
|
||||
Raises BuildkitAbort if validation fails
|
||||
"""
|
||||
parsed_ini = configparser.ConfigParser()
|
||||
for ini_path in self._path_order:
|
||||
@@ -171,10 +176,10 @@ class IniConfigFile(_CacheConfigMixin, _ConfigABC):
|
||||
parsed_ini.read_file(ini_file, source=str(ini_path))
|
||||
try:
|
||||
self._schema.validate(parsed_ini)
|
||||
except schema.SchemaError as exc:
|
||||
get_logger().error(
|
||||
except schema.SchemaError:
|
||||
get_logger().exception(
|
||||
'Merged INI files failed schema validation: %s', tuple(self._path_order))
|
||||
raise exc
|
||||
raise BuildkitAbort()
|
||||
return parsed_ini
|
||||
|
||||
def write(self, path):
|
||||
@@ -225,6 +230,12 @@ class MappingConfigFile(_CacheConfigMixin, _ConfigABC):
|
||||
"""Returns an iterator over the keys"""
|
||||
return iter(self._config_data)
|
||||
|
||||
def items(self):
|
||||
"""
|
||||
Returns an iterator of (key, value) tuples, like dict.items()
|
||||
"""
|
||||
return self._config_data.items()
|
||||
|
||||
def _parse_data(self):
|
||||
"""Return a dictionary of the mapping of keys and values"""
|
||||
new_dict = dict()
|
||||
@@ -299,6 +310,31 @@ class ConfigBundle(_CacheConfigMixin, _ConfigABC):
|
||||
"""
|
||||
return item in self._config_data
|
||||
|
||||
def __getattr__(self, name): #pylint: disable=too-many-return-statements
|
||||
"""
|
||||
Friendly interface to access config file objects via attributes.
|
||||
|
||||
Raises BuildkitAbort if a config file is missing
|
||||
"""
|
||||
try:
|
||||
if name == 'pruning':
|
||||
return self._config_data[PRUNING_LIST]
|
||||
elif name == 'domain_regex':
|
||||
return self._config_data[DOMAIN_REGEX_LIST]
|
||||
elif name == 'domain_substitution':
|
||||
return self._config_data[DOMAIN_SUBSTITUTION_LIST]
|
||||
elif name == 'extra_deps':
|
||||
return self._config_data[EXTRA_DEPS_INI]
|
||||
elif name == 'gn_flags':
|
||||
return self._config_data[GN_FLAGS_MAP]
|
||||
elif name == 'patches':
|
||||
return self._config_data[PATCH_ORDER_LIST]
|
||||
elif name == 'version':
|
||||
return self._config_data[VERSION_INI]
|
||||
except KeyError as exc:
|
||||
get_logger().error('Bundle is missing requested file: %s', exc)
|
||||
raise BuildkitAbort()
|
||||
|
||||
def _parse_data(self):
|
||||
"""
|
||||
Returns a dictionary of config file names to their respective objects.
|
||||
@@ -334,46 +370,11 @@ class ConfigBundle(_CacheConfigMixin, _ConfigABC):
|
||||
for config_file in self._config_data.values():
|
||||
config_file.write(path / config_file.name)
|
||||
|
||||
@property
|
||||
def pruning(self):
|
||||
"""Property to access pruning.list config file"""
|
||||
return self._config_data[PRUNING_LIST]
|
||||
|
||||
@property
|
||||
def domain_regex(self):
|
||||
"""Property to access domain_regex.list config file"""
|
||||
return self._config_data[DOMAIN_REGEX_LIST]
|
||||
|
||||
@property
|
||||
def domain_substitution(self):
|
||||
"""Property to access domain_substitution.list config file"""
|
||||
return self._config_data[DOMAIN_SUBSTITUTION_LIST]
|
||||
|
||||
@property
|
||||
def extra_deps(self):
|
||||
"""Property to access extra_deps.ini config file"""
|
||||
return self._config_data[EXTRA_DEPS_INI]
|
||||
|
||||
@property
|
||||
def gn_flags(self):
|
||||
"""Property to access gn_flags.map config file"""
|
||||
return self._config_data[GN_FLAGS_MAP]
|
||||
|
||||
@property
|
||||
def patches(self):
|
||||
"""Property to access patch_order.list and patches"""
|
||||
return self._config_data[PATCH_ORDER_LIST]
|
||||
|
||||
@property
|
||||
def version(self):
|
||||
"""Property to access version.ini config file"""
|
||||
return self._config_data[VERSION_INI]
|
||||
|
||||
class BaseBundleMetaIni(IniConfigFile):
|
||||
"""Represents basebundlemeta.ini files"""
|
||||
|
||||
_schema = schema.Schema(_IniSchema({
|
||||
'basebundle': _DictCast({
|
||||
_schema = schema.Schema(schema_inisections({
|
||||
'basebundle': schema_dictcast({
|
||||
'display_name': schema.And(str, len),
|
||||
schema.Optional('depends'): schema.And(str, len),
|
||||
})
|
||||
@@ -430,7 +431,7 @@ class DomainRegexList(ListConfigFile):
|
||||
Generates a regex pair tuple with inverted pattern and replacement for
|
||||
the given line.
|
||||
|
||||
Raises undetermined exceptions if this fragile code breaks or some assumption
|
||||
Raises BuildkitAbort if this fragile code breaks or some assumption
|
||||
checking fails.
|
||||
"""
|
||||
# Because domain substitution regex expressions are really simple, some
|
||||
@@ -483,9 +484,9 @@ class DomainRegexList(ListConfigFile):
|
||||
self._regex_escaped_period_repl, replacement)
|
||||
|
||||
return self._regex_pair_tuple(re.compile(pattern), replacement)
|
||||
except Exception as exc:
|
||||
except BaseException:
|
||||
get_logger().error('Error inverting regex for line: %s', line)
|
||||
raise exc
|
||||
raise BuildkitAbort()
|
||||
|
||||
def _check_invertible(self):
|
||||
"""
|
||||
@@ -539,8 +540,8 @@ class ExtraDepsIni(IniConfigFile):
|
||||
_optional_keys = ('strip_leading_dirs')
|
||||
_passthrough_properties = (*_required_keys, *_optional_keys)
|
||||
|
||||
_schema = schema.Schema(_IniSchema({
|
||||
schema.And(str, len): _DictCast({
|
||||
_schema = schema.Schema(schema_inisections({
|
||||
schema.And(str, len): schema_dictcast({
|
||||
**{x: schema.And(str, len) for x in _required_keys},
|
||||
**{schema.Optional(x): schema.And(str, len) for x in _optional_keys},
|
||||
schema.Or(*_hashes): schema.And(str, len),
|
||||
@@ -609,20 +610,37 @@ class PatchesConfig(ListConfigFile):
|
||||
for relative_path in self:
|
||||
yield self._get_patches_dir() / relative_path
|
||||
|
||||
def export_patches(self, path, series=Path('series')):
|
||||
"""
|
||||
Writes patches and a series file to the directory specified by path.
|
||||
This is useful for writing a quilt-compatible patches directory and series file.
|
||||
|
||||
path is a pathlib.Path to the patches directory to create. It must not already exist.
|
||||
series is a pathlib.Path to the series file, relative to path.
|
||||
|
||||
Raises FileExistsError if path already exists.
|
||||
Raises FileNotFoundError if the parent directories for path do not exist.
|
||||
"""
|
||||
path.mkdir() # Raises FileExistsError, FileNotFoundError
|
||||
for relative_path in self:
|
||||
destination = path / relative_path
|
||||
destination.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copyfile(str(self._get_patches_dir() / relative_path), str(destination))
|
||||
super().write(path / series)
|
||||
|
||||
def write(self, path):
|
||||
"""Writes patch_order and patches/ directory to the same directory"""
|
||||
super().write(path)
|
||||
for relative_path in self:
|
||||
destination = path.parent / PATCHES_DIR / relative_path
|
||||
if not destination.parent.exists():
|
||||
destination.parent.mkdir(parents=True)
|
||||
destination.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copyfile(str(self._get_patches_dir() / relative_path), str(destination))
|
||||
|
||||
class VersionIni(IniConfigFile):
|
||||
"""Representation of a version.ini file"""
|
||||
|
||||
_schema = schema.Schema(_IniSchema({
|
||||
'version': _DictCast({
|
||||
_schema = schema.Schema(schema_inisections({
|
||||
'version': schema_dictcast({
|
||||
'chromium_version': schema.And(str, len),
|
||||
'release_revision': schema.And(str, len),
|
||||
schema.Optional('release_extra'): schema.And(str, len),
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
Module for substituting domain names in buildspace tree with blockable strings.
|
||||
"""
|
||||
|
||||
from .common import ENCODING, get_logger
|
||||
from .common import ENCODING, BuildkitAbort, get_logger
|
||||
from .third_party import unidiff
|
||||
|
||||
def substitute_domains_for_files(regex_iter, file_iter, log_warnings=True):
|
||||
@@ -26,9 +26,9 @@ def substitute_domains_for_files(regex_iter, file_iter, log_warnings=True):
|
||||
try:
|
||||
encoding = ENCODING # TODO: Try other encodings on failure
|
||||
content = file_bytes.decode(encoding)
|
||||
except Exception as exc:
|
||||
get_logger().error('Exception thrown while substituting: %s', path)
|
||||
raise exc
|
||||
except BaseException:
|
||||
get_logger().exception('Exception thrown while substituting: %s', path)
|
||||
raise BuildkitAbort()
|
||||
file_subs = 0
|
||||
for regex_pair in regex_iter:
|
||||
content, sub_count = regex_pair.pattern.subn(
|
||||
|
||||
0
buildkit/packaging/__init__.py
Normal file
0
buildkit/packaging/__init__.py
Normal file
@@ -1,6 +1,6 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
# Copyright (c) 2017 The ungoogled-chromium Authors. All rights reserved.
|
||||
# Copyright (c) 2018 The ungoogled-chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
@@ -9,6 +9,16 @@
|
||||
import string
|
||||
import re
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
# Constants
|
||||
|
||||
SHARED_PACKAGING = 'shared'
|
||||
LIST_BUILD_OUTPUTS = 'list_build_outputs.py'
|
||||
DEFAULT_BUILD_OUTPUT = Path('out/Default')
|
||||
|
||||
# Classes
|
||||
|
||||
class BuildFileStringTemplate(string.Template):
|
||||
"""
|
||||
Custom string substitution class
|
||||
@@ -26,7 +36,9 @@ class BuildFileStringTemplate(string.Template):
|
||||
)
|
||||
""".format(delim=re.escape("$ungoog"), id=string.Template.idpattern)
|
||||
|
||||
def generate_from_templates(root_dir, build_file_subs):
|
||||
# Methods
|
||||
|
||||
def process_templates(root_dir, build_file_subs):
|
||||
"""Substitute '$ungoog' strings in '.in' template files and remove the suffix"""
|
||||
for old_path in root_dir.glob("*.in"):
|
||||
new_path = root_dir / old_path.stem
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
# Copyright (c) 2017 The ungoogled-chromium Authors. All rights reserved.
|
||||
# Copyright (c) 2018 The ungoogled-chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
@@ -11,14 +11,34 @@ import datetime
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from .. import _common
|
||||
from .. import export_resources as _export_resources
|
||||
from . import _common as _build_files_common
|
||||
from ..third_party import schema
|
||||
|
||||
from ..common import PACKAGING_DIR, PATCHES_DIR, get_resources_dir
|
||||
from ..config import IniConfigFile, schema_inisections, schema_dictcast
|
||||
from ._common import DEFAULT_BUILD_OUTPUT, process_templates
|
||||
|
||||
# Private definitions
|
||||
|
||||
_DEPENDENCIES_INI = 'dependencies.ini'
|
||||
|
||||
class _DependenciesIni(IniConfigFile):
|
||||
_schema = schema.Schema(schema_inisections({
|
||||
schema.And(str, len): schema_dictcast({
|
||||
'parent': schema.And(str, len),
|
||||
}),
|
||||
}))
|
||||
|
||||
def get_parent(self, name):
|
||||
"""
|
||||
Returns the parent name for the given flavor, or None if there is no parent.
|
||||
"""
|
||||
try:
|
||||
return self._config_data[name]['parent']
|
||||
except KeyError:
|
||||
return None
|
||||
|
||||
def _get_packaging_resources():
|
||||
return _common.get_resources_dir() / _common.PACKAGING_DIR / "debian"
|
||||
return get_resources_dir() / PACKAGING_DIR / 'debian'
|
||||
|
||||
def _traverse_directory(directory):
|
||||
"""Traversal of an entire directory tree in random order"""
|
||||
@@ -35,7 +55,7 @@ def _traverse_directory(directory):
|
||||
|
||||
class _Flavor:
|
||||
"""
|
||||
Represents a certain flavor
|
||||
Represents a Debian packaging flavor
|
||||
"""
|
||||
|
||||
_loaded_flavors = dict()
|
||||
@@ -63,10 +83,8 @@ class _Flavor:
|
||||
@classmethod
|
||||
def _get_parent_name(cls, child):
|
||||
if not cls._flavor_tree:
|
||||
cls._flavor_tree = _common.read_ini(_get_packaging_resources() / "dependencies.ini")
|
||||
if child in cls._flavor_tree and "parent" in cls._flavor_tree[child]:
|
||||
return cls._flavor_tree[child]["parent"]
|
||||
return None
|
||||
cls._flavor_tree = _DependenciesIni(_get_packaging_resources() / _DEPENDENCIES_INI)
|
||||
return cls._flavor_tree.get_parent(child)
|
||||
|
||||
@property
|
||||
def parent(self):
|
||||
@@ -132,26 +150,30 @@ def _get_parsed_gn_flags(gn_flags):
|
||||
|
||||
# Public definitions
|
||||
|
||||
def generate_build_files(resources, output_dir, build_output, flavor, #pylint: disable=too-many-arguments
|
||||
distribution_version, apply_domain_substitution):
|
||||
def generate_packaging(config_bundle, flavor, debian_dir,
|
||||
build_output=DEFAULT_BUILD_OUTPUT, distro_version='stable'):
|
||||
"""
|
||||
Generates the `debian` directory in `output_dir` using resources from
|
||||
`resources`
|
||||
Generates a debian directory in the buildspace tree
|
||||
|
||||
config_bundle is a config.ConfigBundle to use for configuration
|
||||
flavor is a Debian packaging flavor name to use
|
||||
debian_dir is a pathlib.Path to the Debian directory to be created.
|
||||
build_output is the pathlib.Path for building intermediates and outputs to be stored
|
||||
distro_version is the distribution version name to use in debian/changelog
|
||||
|
||||
Raises FileExistsError if debian_dir already exists.
|
||||
Raises FileNotFoundError if the parent directories for debian_dir do not exist.
|
||||
"""
|
||||
# Use config_bundle.version.version_string for Debian version string
|
||||
build_file_subs = dict(
|
||||
changelog_version="{}-{}".format(*resources.read_version()),
|
||||
changelog_version=config_bundle.version.version_string,
|
||||
changelog_datetime=_get_dpkg_changelog_datetime(),
|
||||
build_output=build_output,
|
||||
distribution_version=distribution_version,
|
||||
gn_flags=_get_parsed_gn_flags(resources.read_gn_flags())
|
||||
distribution_version=distro_version,
|
||||
gn_flags=_get_parsed_gn_flags(config_bundle.gn_flags)
|
||||
)
|
||||
|
||||
debian_dir = output_dir / "debian"
|
||||
debian_dir.mkdir(exist_ok=True)
|
||||
debian_dir.mkdir() # Raises FileNotFoundError, FileExistsError
|
||||
_Flavor(flavor).assemble_files(debian_dir)
|
||||
_export_resources.export_patches_dir(resources, debian_dir / _common.PATCHES_DIR,
|
||||
apply_domain_substitution)
|
||||
_common.write_list(debian_dir / _common.PATCHES_DIR / "series",
|
||||
resources.read_patch_order())
|
||||
|
||||
_build_files_common.generate_from_templates(debian_dir, build_file_subs)
|
||||
process_templates(debian_dir, build_file_subs)
|
||||
config_bundle.patches.export_patches(debian_dir / PATCHES_DIR)
|
||||
52
buildkit/packaging/linux_simple.py
Normal file
52
buildkit/packaging/linux_simple.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
# Copyright (c) 2017 The ungoogled-chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
"""Linux Simple-specific build files generation code"""
|
||||
|
||||
import shutil
|
||||
|
||||
from ..common import PACKAGING_DIR, PATCHES_DIR, get_resources_dir
|
||||
from ._common import DEFAULT_BUILD_OUTPUT, process_templates
|
||||
|
||||
# Private definitions
|
||||
|
||||
def _get_packaging_resources():
|
||||
return get_resources_dir() / PACKAGING_DIR / 'linux_simple'
|
||||
|
||||
def _copy_from_resources(name, output_dir):
|
||||
shutil.copyfile(
|
||||
str(_get_packaging_resources() / name),
|
||||
str(output_dir / name))
|
||||
|
||||
# Public definitions
|
||||
|
||||
def generate_packaging(config_bundle, output_dir, build_output=DEFAULT_BUILD_OUTPUT):
|
||||
"""
|
||||
Generates the linux_simple packaging into output_dir
|
||||
|
||||
config_bundle is the config.ConfigBundle to use for configuration
|
||||
output_dir is the pathlib.Path directory that will be created to contain packaging files
|
||||
build_output is a pathlib.Path for building intermediates and outputs to be stored
|
||||
|
||||
Raises FileExistsError if output_dir already exists.
|
||||
Raises FileNotFoundError if the parent directories for output_dir do not exist.
|
||||
"""
|
||||
build_file_subs = dict(
|
||||
build_output=build_output,
|
||||
gn_args_string=' '.join(
|
||||
'{}={}'.format(flag, value) for flag, value in config_bundle.gn_flags.items()),
|
||||
version_string=config_bundle.version.version_string
|
||||
)
|
||||
|
||||
output_dir.mkdir() # Raises FileNotFoundError, FileExistsError
|
||||
|
||||
# Build and packaging scripts
|
||||
_copy_from_resources('build.sh.in', output_dir)
|
||||
_copy_from_resources('package.sh.in', output_dir)
|
||||
process_templates(output_dir, build_file_subs)
|
||||
|
||||
# Patches
|
||||
config_bundle.patches.export_patches(output_dir / PATCHES_DIR)
|
||||
51
buildkit/packaging/macos.py
Normal file
51
buildkit/packaging/macos.py
Normal file
@@ -0,0 +1,51 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
# Copyright (c) 2017 The ungoogled-chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
"""macOS-specific build files generation code"""
|
||||
|
||||
import shutil
|
||||
|
||||
from ..common import PACKAGING_DIR, PATCHES_DIR, get_resources_dir
|
||||
from ._common import DEFAULT_BUILD_OUTPUT, process_templates
|
||||
|
||||
# Private definitions
|
||||
|
||||
def _get_packaging_resources():
|
||||
return get_resources_dir() / PACKAGING_DIR / 'macos'
|
||||
|
||||
def _copy_from_resources(name, output_dir):
|
||||
shutil.copyfile(
|
||||
str(_get_packaging_resources() / name),
|
||||
str(output_dir / name))
|
||||
|
||||
# Public definitions
|
||||
|
||||
def generate_packaging(config_bundle, output_dir, build_output=DEFAULT_BUILD_OUTPUT):
|
||||
"""
|
||||
Generates the macOS packaging into output_dir
|
||||
|
||||
config_bundle is the config.ConfigBundle to use for configuration
|
||||
output_dir is the pathlib.Path directory that will be created to contain packaging files
|
||||
build_output is a pathlib.Path for building intermediates and outputs to be stored
|
||||
|
||||
Raises FileExistsError if output_dir already exists.
|
||||
Raises FileNotFoundError if the parent directories for output_dir do not exist.
|
||||
"""
|
||||
build_file_subs = dict(
|
||||
build_output=build_output,
|
||||
gn_args_string=' '.join(
|
||||
'{}={}'.format(flag, value) for flag, value in config_bundle.gn_flags.items()),
|
||||
version_string=config_bundle.version.version_string
|
||||
)
|
||||
|
||||
output_dir.mkdir() # Raises FileNotFoundError, FileExistsError
|
||||
|
||||
# Build script
|
||||
_copy_from_resources('build.sh.in', output_dir)
|
||||
process_templates(output_dir, build_file_subs)
|
||||
|
||||
# Patches
|
||||
config_bundle.patches.export_patches(output_dir / PATCHES_DIR)
|
||||
@@ -14,7 +14,7 @@ import urllib.request
|
||||
import hashlib
|
||||
from pathlib import Path, PurePosixPath
|
||||
|
||||
from .common import ENCODING, get_logger
|
||||
from .common import ENCODING, BuildkitAbort, get_logger
|
||||
|
||||
# Constants
|
||||
|
||||
@@ -48,7 +48,7 @@ def _extract_tar_file(tar_path, buildspace_tree, unpack_dir, ignore_files, relat
|
||||
relative_to is a pathlib.Path for directories that should be stripped relative to the
|
||||
root of the archive.
|
||||
|
||||
May raise undetermined exceptions during unpacking.
|
||||
Raises BuildkitAbort if unexpected issues arise during unpacking.
|
||||
"""
|
||||
|
||||
class NoAppendList(list):
|
||||
@@ -66,10 +66,10 @@ def _extract_tar_file(tar_path, buildspace_tree, unpack_dir, ignore_files, relat
|
||||
# Symlinks probably not supported
|
||||
get_logger().info('System does not support symlinks. Ignoring them.')
|
||||
symlink_supported = False
|
||||
except Exception as exc:
|
||||
except BaseException:
|
||||
# Unexpected exception
|
||||
get_logger().error('Unexpected exception during symlink support check.')
|
||||
raise exc
|
||||
get_logger().exception('Unexpected exception during symlink support check.')
|
||||
raise BuildkitAbort()
|
||||
|
||||
resolved_tree = buildspace_tree.resolve()
|
||||
|
||||
@@ -100,9 +100,9 @@ def _extract_tar_file(tar_path, buildspace_tree, unpack_dir, ignore_files, relat
|
||||
if destination.is_symlink():
|
||||
destination.unlink()
|
||||
tar_file_obj._extract_member(tarinfo, str(destination)) # pylint: disable=protected-access
|
||||
except Exception as exc:
|
||||
get_logger().error('Exception thrown for tar member: %s', tarinfo.name)
|
||||
raise exc
|
||||
except BaseException:
|
||||
get_logger().exception('Exception thrown for tar member: %s', tarinfo.name)
|
||||
raise BuildkitAbort()
|
||||
|
||||
class _UrlRetrieveReportHook: #pylint: disable=too-few-public-methods
|
||||
"""Hook for urllib.request.urlretrieve to log progress information to console"""
|
||||
@@ -170,7 +170,7 @@ def _setup_chromium_source(config_bundle, buildspace_downloads, buildspace_tree,
|
||||
if source_hashes.exists() and not source_hashes.is_file():
|
||||
raise NotAFileError(source_hashes)
|
||||
|
||||
get_logger().info('Download Chromium source code...')
|
||||
get_logger().info('Downloading Chromium source code...')
|
||||
_download_if_needed(
|
||||
source_archive,
|
||||
_SOURCE_ARCHIVE_URL.format(config_bundle.version.chromium_version),
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
--- a/clean
|
||||
+++ b/clean
|
||||
@@ -1,23 +1 @@
|
||||
debian/files
|
||||
-
|
||||
-Makefile
|
||||
-third_party/flot/*.js
|
||||
-chrome/test/data/webui/i18n_process_css_test.html
|
||||
-
|
||||
-third_party/ffmpeg/BUILD.gn
|
||||
-third_party/flac/BUILD.gn
|
||||
-base/third_party/libevent/BUILD.gn
|
||||
-build/secondary/third_party/libjpeg_turbo/BUILD.gn
|
||||
-third_party/libdrm/BUILD.gn
|
||||
-third_party/libpng/BUILD.gn
|
||||
-third_party/libvpx/BUILD.gn
|
||||
-third_party/libwebp/BUILD.gn
|
||||
-third_party/libxml/BUILD.gn
|
||||
-third_party/libxslt/BUILD.gn
|
||||
-third_party/re2/BUILD.gn
|
||||
-third_party/snappy/BUILD.gn
|
||||
-third_party/yasm/yasm_assemble.gni
|
||||
-third_party/zlib/BUILD.gn
|
||||
-third_party/icu/BUILD.gn
|
||||
-third_party/opus/BUILD.gn
|
||||
-third_party/freetype/BUILD.gn
|
||||
--- a/compat
|
||||
+++ b/compat
|
||||
@@ -1 +1 @@
|
||||
-10
|
||||
+9
|
||||
--- a/control
|
||||
+++ b/control
|
||||
@@ -12,7 +12,7 @@ Build-Depends:
|
||||
# clang (>= 3.5),
|
||||
clang-3.9,
|
||||
llvm-3.9-dev,
|
||||
- debhelper (>= 10),
|
||||
+ debhelper (>= 9),
|
||||
python,
|
||||
python3,
|
||||
pkg-config,
|
||||
@@ -51,7 +51,6 @@ Build-Depends:
|
||||
libffi-dev,
|
||||
libkrb5-dev,
|
||||
libexif-dev,
|
||||
- libflac-dev,
|
||||
libudev-dev,
|
||||
libopus-dev,
|
||||
libwebp-dev,
|
||||
@@ -67,13 +66,12 @@ Build-Depends:
|
||||
libsnappy-dev,
|
||||
libgconf2-dev,
|
||||
libavutil-dev,
|
||||
- libavcodec-dev (>= 7),
|
||||
libavformat-dev,
|
||||
libglib2.0-dev,
|
||||
libasound2-dev,
|
||||
libsqlite3-dev,
|
||||
libjsoncpp-dev,
|
||||
- libspeechd-dev (>= 0.8.3),
|
||||
+ libspeechd-dev,
|
||||
libminizip-dev,
|
||||
libhunspell-dev,
|
||||
libharfbuzz-dev,
|
||||
--- a/rules.in
|
||||
+++ b/rules.in
|
||||
@@ -42,12 +42,8 @@
|
||||
njobs=-j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
|
||||
endif
|
||||
|
||||
-# paths to files needed by flot
|
||||
-flotpaths=/usr/share/javascript/jquery/*min.js \
|
||||
- /usr/share/javascript/jquery-flot/*min.js \
|
||||
-
|
||||
%:
|
||||
- dh $@
|
||||
+ dh $@ --parallel
|
||||
|
||||
$ungoog{build_output}/gn:
|
||||
mkdir -p $ungoog{build_output} || true
|
||||
@@ -56,13 +52,6 @@ $ungoog{build_output}/gn:
|
||||
override_dh_auto_configure:
|
||||
# output compiler information
|
||||
$(CXX) --version
|
||||
- # use system flot
|
||||
- for file in $(flotpaths); do ln -sf $$file third_party/flot; done
|
||||
- # strip out system third_party libraries
|
||||
- cp third_party/freetype/src/src/psnames/pstables.h .
|
||||
- ./debian/scripts/unbundle
|
||||
- mkdir -p third_party/freetype/src/src/psnames
|
||||
- mv pstables.h third_party/freetype/src/src/psnames
|
||||
|
||||
override_dh_auto_build-arch: $ungoog{build_output}/gn
|
||||
./$ungoog{build_output}/gn gen $ungoog{build_output} --args="$(defines)" --fail-on-unused-args
|
||||
--- a/ungoogled-chromium-common.install.in
|
||||
+++ b/ungoogled-chromium-common.install.in
|
||||
@@ -1 +1,6 @@
|
||||
$ungoog{build_output}/*.bin usr/lib/chromium
|
||||
+$ungoog{build_output}/icudtl.dat usr/lib/chromium
|
||||
+$ungoog{build_output}/libEGL.so usr/lib/chromium
|
||||
+$ungoog{build_output}/libGLESv2.so usr/lib/chromium
|
||||
+$ungoog{build_output}/xdg-mime usr/lib/chromium
|
||||
+$ungoog{build_output}/xdg-settings usr/lib/chromium
|
||||
1
resources/packaging/debian/minimal/clean
Normal file
1
resources/packaging/debian/minimal/clean
Normal file
@@ -0,0 +1 @@
|
||||
debian/files
|
||||
1
resources/packaging/debian/minimal/compat
Normal file
1
resources/packaging/debian/minimal/compat
Normal file
@@ -0,0 +1 @@
|
||||
9
|
||||
216
resources/packaging/debian/minimal/control
Normal file
216
resources/packaging/debian/minimal/control
Normal file
@@ -0,0 +1,216 @@
|
||||
Source: ungoogled-chromium-browser
|
||||
Section: web
|
||||
Priority: optional
|
||||
Maintainer: ungoogled-chromium Maintainers <github@null>
|
||||
Uploaders:
|
||||
Maintainer <maintainer@null>,
|
||||
Vcs-Git: https://github.com/Eloston/ungoogled-chromium.git
|
||||
Vcs-Browser: https://github.com/Eloston/ungoogled-chromium
|
||||
Homepage: https://github.com/Eloston/ungoogled-chromium
|
||||
Build-Depends:
|
||||
# TODO: Should we depend on a specific version of clang or the system default?
|
||||
# clang (>= 3.5),
|
||||
clang-3.9,
|
||||
llvm-3.9-dev,
|
||||
debhelper (>= 9),
|
||||
python,
|
||||
python3,
|
||||
pkg-config,
|
||||
ninja-build,
|
||||
python-jinja2,
|
||||
ca-certificates,
|
||||
time,
|
||||
wget,
|
||||
flex,
|
||||
yasm,
|
||||
xvfb,
|
||||
wdiff,
|
||||
gperf,
|
||||
bison,
|
||||
valgrind,
|
||||
xz-utils,
|
||||
x11-apps,
|
||||
xfonts-base,
|
||||
libglew-dev,
|
||||
libgl1-mesa-dev,
|
||||
libglu1-mesa-dev,
|
||||
libegl1-mesa-dev,
|
||||
libgles2-mesa-dev,
|
||||
mesa-common-dev,
|
||||
libxt-dev,
|
||||
libre2-dev,
|
||||
libgbm-dev,
|
||||
libpng-dev,
|
||||
libxss-dev,
|
||||
libelf-dev,
|
||||
libvpx-dev,
|
||||
libpci-dev,
|
||||
libcap-dev,
|
||||
libdrm-dev,
|
||||
libicu-dev,
|
||||
libffi-dev,
|
||||
libkrb5-dev,
|
||||
libexif-dev,
|
||||
libudev-dev,
|
||||
libopus-dev,
|
||||
libwebp-dev,
|
||||
libxtst-dev,
|
||||
libsrtp-dev,
|
||||
libjpeg-dev,
|
||||
libxml2-dev,
|
||||
libgtk-3-dev,
|
||||
libxslt1-dev,
|
||||
liblcms2-dev,
|
||||
libpulse-dev,
|
||||
libpam0g-dev,
|
||||
libsnappy-dev,
|
||||
libgconf2-dev,
|
||||
libavutil-dev,
|
||||
libavformat-dev,
|
||||
libglib2.0-dev,
|
||||
libasound2-dev,
|
||||
libsqlite3-dev,
|
||||
libjsoncpp-dev,
|
||||
libspeechd-dev,
|
||||
libminizip-dev,
|
||||
libhunspell-dev,
|
||||
libharfbuzz-dev,
|
||||
libusb-1.0-0-dev,
|
||||
libmodpbase64-dev,
|
||||
libnss3-dev (>= 3.12.3),
|
||||
libnspr4-dev (>= 2:4.9),
|
||||
libcups2-dev (>= 1.5.0),
|
||||
libevent-dev (>= 1.4.13),
|
||||
libjs-jquery,
|
||||
libjs-excanvas,
|
||||
libjs-jquery-flot,
|
||||
libgcrypt20-dev,
|
||||
libva-dev,
|
||||
Standards-Version: 4.1.2
|
||||
|
||||
Package: ungoogled-chromium
|
||||
Architecture: i386 amd64 arm64 armhf
|
||||
Built-Using: ${Built-Using}
|
||||
Depends:
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
ungoogled-chromium-common (= ${binary:Version}),
|
||||
Recommends:
|
||||
fonts-liberation,
|
||||
libva1,
|
||||
Suggests:
|
||||
ungoogled-chromium-l10n,
|
||||
ungoogled-chromium-shell,
|
||||
ungoogled-chromium-driver,
|
||||
ungoogled-chromium-widevine,
|
||||
Provides:
|
||||
www-browser,
|
||||
gnome-www-browser,
|
||||
Conflicts:
|
||||
libnettle4,
|
||||
libsecret-1-0 (<< 0.18),
|
||||
libgl1-mesa-swx11,
|
||||
Replaces:
|
||||
chromium,
|
||||
chromium-browser,
|
||||
Breaks:
|
||||
chromium,
|
||||
chromium-browser,
|
||||
Description: web browser
|
||||
Web browser that aims to build a safer, faster, and more stable internet
|
||||
browsing experience.
|
||||
.
|
||||
This package contains the web browser component.
|
||||
|
||||
Package: ungoogled-chromium-l10n
|
||||
Architecture: all
|
||||
Section: localization
|
||||
Depends:
|
||||
${misc:Depends},
|
||||
ungoogled-chromium (>= ${source:Version}),
|
||||
ungoogled-chromium (<< ${source:Version}.1~),
|
||||
Replaces:
|
||||
chromium-l10n,
|
||||
Breaks:
|
||||
chromium-l10n,
|
||||
Description: web browser - language packs
|
||||
Web browser that aims to build a safer, faster, and more stable internet
|
||||
browsing experience.
|
||||
.
|
||||
This package contains language packages for:
|
||||
am, ar, bg, bn, ca, cs, da, de, el, en-GB, es-419, es, et, fi, fil, fr, gu, he,
|
||||
hi, hr, hu, id, it, ja, kn, ko, lt, lv, ml, mr, nb, nl, pl, pt-BR, pt-PT,
|
||||
ro, ru, sk, sl, sr, sv, sw, ta, te, th, tr, uk, vi, zh-CN, zh-TW
|
||||
|
||||
Package: ungoogled-chromium-shell
|
||||
Architecture: i386 amd64 arm64 armhf
|
||||
Depends:
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
ungoogled-chromium-common (= ${binary:Version}),
|
||||
Replaces:
|
||||
chromium-shell,
|
||||
Breaks:
|
||||
chromium-shell,
|
||||
Description: web browser - minimal shell
|
||||
Web browser that aims to build a safer, faster, and more stable internet
|
||||
browsing experience.
|
||||
.
|
||||
This package provides a minimal version of the chromium user interface
|
||||
(the content shell).
|
||||
|
||||
Package: ungoogled-chromium-widevine
|
||||
Section: contrib/web
|
||||
Architecture: i386 amd64 arm64 armhf
|
||||
Depends:
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
ungoogled-chromium (= ${binary:Version}),
|
||||
Replaces:
|
||||
chromium-widevine,
|
||||
Breaks:
|
||||
chromium-widevine,
|
||||
Description: web browser - widevine content decryption support
|
||||
Web browser that aims to build a safer, faster, and more stable internet
|
||||
browsing experience.
|
||||
.
|
||||
This package provides support for the widevine content decryption module.
|
||||
|
||||
Package: ungoogled-chromium-driver
|
||||
Architecture: i386 amd64 arm64 armhf
|
||||
Depends:
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
ungoogled-chromium (= ${binary:Version}),
|
||||
Replaces:
|
||||
chromedriver,
|
||||
chromium-driver,
|
||||
Breaks:
|
||||
chromium-driver,
|
||||
Description: web browser - WebDriver support
|
||||
Web browser that aims to build a safer, faster, and more stable internet
|
||||
browsing experience.
|
||||
.
|
||||
This package provides a bridge between the browser component and the selenium
|
||||
automatic webdriver.
|
||||
.
|
||||
See http://code.google.com/p/selenium/wiki/ChromeDriver for details.
|
||||
|
||||
Package: ungoogled-chromium-common
|
||||
Architecture: i386 amd64 arm64 armhf
|
||||
Depends:
|
||||
${misc:Depends},
|
||||
x11-utils,
|
||||
xdg-utils,
|
||||
Breaks:
|
||||
ungoogled-chromium (<< 60.0.3112.72-1),
|
||||
chromium-common,
|
||||
Replaces:
|
||||
ungoogled-chromium (<< 60.0.3112.72-1),
|
||||
chromium-common,
|
||||
Description: web browser - common resources used by ungoogled-chromium packages
|
||||
Web browser that aims to build a safer, faster, and more stable internet
|
||||
browsing experience.
|
||||
.
|
||||
This package contains resources that are in common to different
|
||||
ungoogled-chromium packages.
|
||||
115
resources/packaging/debian/minimal/rules.in
Executable file
115
resources/packaging/debian/minimal/rules.in
Executable file
@@ -0,0 +1,115 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
# enable verbose build messages
|
||||
export DH_VERBOSE=1
|
||||
|
||||
# enable all build hardening flags
|
||||
export DEB_BUILD_MAINT_OPTIONS=hardening=+all
|
||||
|
||||
export CLANG_BASE_PATH=/usr/lib/llvm-3.9
|
||||
|
||||
# more verbose linker output
|
||||
defines+=target_extra_ldflags=\"-Wl,--stats\"
|
||||
|
||||
# avoid error in v8's garbage collector (see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=68853)
|
||||
defines+=target_extra_cxxflags=\"-fno-delete-null-pointer-checks -Wno-deprecated-declarations\"
|
||||
|
||||
# set the appropriate cpu architecture
|
||||
DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
|
||||
ifeq (i386,$(DEB_HOST_ARCH))
|
||||
defines+=host_cpu=\"x86\"
|
||||
endif
|
||||
ifeq (amd64,$(DEB_HOST_ARCH))
|
||||
defines+=host_cpu=\"x64\"
|
||||
endif
|
||||
ifeq (arm64,$(DEB_HOST_ARCH))
|
||||
defines+=host_cpu=\"arm64\"
|
||||
endif
|
||||
ifeq (armhf,$(DEB_HOST_ARCH))
|
||||
defines+=host_cpu=\"arm\" \
|
||||
arm_use_neon=false
|
||||
endif
|
||||
|
||||
# auto-inserted gn flags
|
||||
$ungoog{gn_flags}
|
||||
|
||||
# some notes about embedded libraries
|
||||
# can't use system nss since net/third_party/nss is heavily patched
|
||||
# can't use system ots (open text *summarizer*) since that's not google's ots (open text *sanitizer*)
|
||||
|
||||
# handle parallel build options
|
||||
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
|
||||
njobs=-j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
|
||||
endif
|
||||
|
||||
%:
|
||||
dh $@ --parallel
|
||||
|
||||
$ungoog{build_output}/gn:
|
||||
mkdir -p $ungoog{build_output} || true
|
||||
./tools/gn/bootstrap/bootstrap.py -o $ungoog{build_output}/gn -s $(njobs)
|
||||
|
||||
override_dh_auto_configure:
|
||||
# output compiler information
|
||||
$(CXX) --version
|
||||
|
||||
override_dh_auto_build-arch: $ungoog{build_output}/gn
|
||||
./$ungoog{build_output}/gn gen $ungoog{build_output} --args="$(defines)" --fail-on-unused-args
|
||||
ninja $(njobs) -C $ungoog{build_output} chrome chrome_sandbox content_shell chromedriver
|
||||
cp $ungoog{build_output}/chrome $ungoog{build_output}/chromium
|
||||
cp $ungoog{build_output}/content_shell $ungoog{build_output}/chromium-shell
|
||||
cp $ungoog{build_output}/chrome_sandbox $ungoog{build_output}/chrome-sandbox
|
||||
cp $ungoog{build_output}/locales/en-US.pak $ungoog{build_output}/resources
|
||||
chmod 4755 $ungoog{build_output}/chrome-sandbox # suid sandbox
|
||||
sed -e s/@@PACKAGE@@/chromium/g -e s/@@MENUNAME@@/Chromium/g \
|
||||
< chrome/app/resources/manpage.1.in > $ungoog{build_output}/chromium.1
|
||||
|
||||
override_dh_auto_build-indep: $ungoog{build_output}/gn
|
||||
./$ungoog{build_output}/gn gen $ungoog{build_output} --args="$(defines)" --fail-on-unused-args
|
||||
ninja $(njobs) -C $ungoog{build_output} packed_resources
|
||||
rm -f $ungoog{build_output}/locales/en-US.pak
|
||||
|
||||
override_dh_auto_install-arch:
|
||||
dh_auto_install
|
||||
# create /etc/chromium.d README file
|
||||
echo "Any files placed in this directory will be sourced prior to executing chromium." \
|
||||
> debian/ungoogled-chromium/etc/chromium.d/README
|
||||
# update launcher script with build information
|
||||
sed 's|@BUILD_DIST@|$(shell printf "%s %s/%s" $(shell lsb_release -si) $(shell lsb_release -sc) $(shell lsb_release -sr))|' \
|
||||
< debian/scripts/chromium > debian/ungoogled-chromium/usr/bin/chromium
|
||||
# move icons into /usr/share
|
||||
./debian/scripts/icons
|
||||
|
||||
override_dh_fixperms:
|
||||
dh_fixperms --exclude chrome-sandbox
|
||||
|
||||
override_dh_strip:
|
||||
dh_strip --no-automatic-dbgsym # Do not build any debug packages
|
||||
|
||||
override_dh_gencontrol:
|
||||
dh_gencontrol -- -VBuilt-Using="$(shell dpkg-query -f '$${source:Package} (= $${source:Version}), ' -W libjs-jquery libjs-jquery-flot)"
|
||||
|
||||
override_dh_auto_clean:
|
||||
rm -rf out
|
||||
find . -name \*.pyc -execdir rm -f {} \;
|
||||
dh_auto_clean
|
||||
|
||||
###################### upstream source downloading ############################
|
||||
|
||||
url=https://gsdview.appspot.com/chromium-browser-official
|
||||
version=$(shell dpkg-parsechangelog -S Version | sed s/-.*//)
|
||||
extract=chromium-$(version)
|
||||
tarball=$(extract).tar.xz
|
||||
debian=chromium-browser_$(version)
|
||||
output=$(debian).orig.tar.xz
|
||||
removed=$(debian).files-removed
|
||||
|
||||
get-orig-source:
|
||||
wget -nv --show-progress -c $(url)/$(tarball) -O ../$(tarball)
|
||||
/usr/bin/time --portability ./debian/scripts/mk-origtargz ../$(tarball) > ../$(removed)
|
||||
test ! -e $(extract) || rm -rf $(extract)
|
||||
/usr/bin/time --portability tar xaf ../$(tarball)
|
||||
while read line; do rm -rf $$line; done < ../$(removed)
|
||||
test ! -e ../$(output) || rm -f ../$(output)
|
||||
/usr/bin/time --portability tar caf ../$(output) $(extract)
|
||||
/usr/bin/time --portability rm -rf $(extract)
|
||||
@@ -0,0 +1,6 @@
|
||||
$ungoog{build_output}/*.bin usr/lib/chromium
|
||||
$ungoog{build_output}/icudtl.dat usr/lib/chromium
|
||||
$ungoog{build_output}/libEGL.so usr/lib/chromium
|
||||
$ungoog{build_output}/libGLESv2.so usr/lib/chromium
|
||||
$ungoog{build_output}/xdg-mime usr/lib/chromium
|
||||
$ungoog{build_output}/xdg-settings usr/lib/chromium
|
||||
@@ -11,7 +11,7 @@ true ${CLANG_BASE_PATH:=/usr} # http://www.tldp.org/LDP/abs/html/parameter-subst
|
||||
rm -rf out || true
|
||||
mkdir out
|
||||
mkdir $ungoog{build_output}
|
||||
env QUILT_PATCHES=$ungoog{build_files_dir}/patches quilt push -a
|
||||
./tools/gn/bootstrap/bootstrap.py -o $ungoog{build_output}/gn -s -j 2
|
||||
env QUILT_PATCHES=$(dirname $(readlink -f $0))/patches quilt push -a
|
||||
./tools/gn/bootstrap/bootstrap.py -o $ungoog{build_output}/gn -s -j 4
|
||||
./$ungoog{build_output}/gn gen $ungoog{build_output} --args='$ungoog{gn_args_string}' --fail-on-unused-args
|
||||
ninja -C $ungoog{build_output} chrome chrome_sandbox chromedriver
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
set -eux
|
||||
|
||||
FILENAME=ungoogled-chromium_$ungoog{version}_linux.tar.xz
|
||||
FILENAME=ungoogled-chromium_$ungoog{version_string}_linux.tar.xz
|
||||
OUTPUT=$(dirname $(dirname $(readlink -f $0)))/$FILENAME
|
||||
|
||||
# TODO: Use scripts/list_build_outputs.py to create a .tar.xz archive of build outputs using tar
|
||||
|
||||
@@ -4,11 +4,13 @@ set -eux
|
||||
|
||||
# Simple build script for macOS
|
||||
|
||||
packaging_dir=$(dirname $(greadlink -f $0))
|
||||
|
||||
rm -rf out || true
|
||||
mkdir out
|
||||
mkdir $ungoog{build_output}
|
||||
env QUILT_PATCHES=$ungoog{build_files_dir}/patches quilt push -a
|
||||
env QUILT_PATCHES="${packaging_dir}/patches" quilt push -a
|
||||
./tools/gn/bootstrap/bootstrap.py -o $ungoog{build_output}/gn -s -j 2
|
||||
./$ungoog{build_output}/gn gen $ungoog{build_output} --args='$ungoog{gn_args_string}' --fail-on-unused-args
|
||||
ninja -C $ungoog{build_output} chrome chromedriver
|
||||
chrome/installer/mac/pkg-dmg --source /var/empty --target "$ungoog{build_files_dir}/ungoogled-chromium_$ungoog{chromium_version}-$ungoog{release_revision}_macos.dmg" --format UDBZ --verbosity 2 --volname Chromium --copy "$ungoog{build_output}/Chromium.app/:/Chromium.app/" --symlink "/Applications:/Drag to here to install"
|
||||
chrome/installer/mac/pkg-dmg --source /var/empty --target "${packaging_dir}/ungoogled-chromium_$ungoog{version_string}_macos.dmg" --format UDBZ --verbosity 2 --volname Chromium --copy "$ungoog{build_output}/Chromium.app/:/Chromium.app/" --symlink "/Applications:/Drag to here to install"
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
# Copyright (c) 2017 The ungoogled-chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
"""Linux Simple-specific build files generation code"""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import pathlib
|
||||
|
||||
from .. import _common
|
||||
from .. import export_resources as _export_resources
|
||||
from . import _common as _build_files_common
|
||||
|
||||
_BUILD_FILES_DIR = "ungoogled_linux_simple"
|
||||
|
||||
def _get_packaging_resources():
|
||||
return _common.get_resources_dir() / _common.PACKAGING_DIR / "linux_simple"
|
||||
|
||||
def generate_build_files(resources, output_dir, build_output, apply_domain_substitution):
|
||||
"""
|
||||
Generates the `linux_simple` directory in `output_dir` using resources from
|
||||
`resources`
|
||||
"""
|
||||
gn_flags = resources.read_gn_flags()
|
||||
build_file_subs = dict(
|
||||
build_output=build_output,
|
||||
build_files_dir=_BUILD_FILES_DIR,
|
||||
gn_args_string=" ".join(
|
||||
[flag + "=" + value for flag, value in gn_flags.items()]
|
||||
)
|
||||
)
|
||||
|
||||
linux_simple_dir = output_dir / _BUILD_FILES_DIR
|
||||
os.makedirs(str(linux_simple_dir), exist_ok=True)
|
||||
|
||||
# Build script
|
||||
shutil.copy(
|
||||
str(_get_packaging_resources() / "build.sh.in"),
|
||||
str(linux_simple_dir / "build.sh.in")
|
||||
)
|
||||
_build_files_common.generate_from_templates(linux_simple_dir, build_file_subs)
|
||||
|
||||
# Patches
|
||||
_export_resources.export_patches_dir(resources, linux_simple_dir / _common.PATCHES_DIR,
|
||||
apply_domain_substitution)
|
||||
_common.write_list(linux_simple_dir / _common.PATCHES_DIR / "series",
|
||||
resources.read_patch_order())
|
||||
@@ -1,51 +0,0 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
# Copyright (c) 2017 The ungoogled-chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
"""macOS-specific build files generation code"""
|
||||
|
||||
import shutil
|
||||
import pathlib
|
||||
|
||||
from .. import _common
|
||||
from .. import export_resources as _export_resources
|
||||
from . import _common as _build_files_common
|
||||
|
||||
_BUILD_FILES_DIR = "ungoogled_macos"
|
||||
|
||||
def _get_packaging_resources():
|
||||
return _common.get_resources_dir() / _common.PACKAGING_DIR / "macos"
|
||||
|
||||
def generate_build_files(resources, output_dir, build_output, apply_domain_substitution):
|
||||
"""
|
||||
Generates the `macos` directory in `output_dir` using resources from
|
||||
`resources`
|
||||
"""
|
||||
gn_flags = resources.read_gn_flags()
|
||||
build_file_subs = dict(
|
||||
build_output=build_output,
|
||||
build_files_dir=_BUILD_FILES_DIR,
|
||||
gn_args_string=" ".join(
|
||||
[flag + "=" + value for flag, value in gn_flags.items()]
|
||||
),
|
||||
chromium_version=resources.read_version()[0],
|
||||
release_revision=resources.read_version()[1]
|
||||
)
|
||||
|
||||
macos_dir = output_dir / _BUILD_FILES_DIR
|
||||
macos_dir.mkdir(exist_ok=True)
|
||||
|
||||
# Build script
|
||||
shutil.copy(
|
||||
str(_get_packaging_resources() / "build.sh.in"),
|
||||
str(macos_dir / "build.sh.in")
|
||||
)
|
||||
_build_files_common.generate_from_templates(macos_dir, build_file_subs)
|
||||
|
||||
# Patches
|
||||
_export_resources.export_patches_dir(resources, macos_dir / _common.PATCHES_DIR,
|
||||
apply_domain_substitution)
|
||||
_common.write_list(macos_dir / _common.PATCHES_DIR / "series",
|
||||
resources.read_patch_order())
|
||||
Reference in New Issue
Block a user