vyos-build/scripts/build-config
Daniil Baturin ea48b7bd74 Switch all build scripts to python3.
Since we only support jessie as build host, and jessie knowingly does have
python3 (although not by default), we don't really need to worry about being
both 2 and 3 compatible.
2017-01-25 17:01:16 -05:00

106 lines
4.0 KiB
Python
Executable File

#!/usr/bin/env python3
#
# Copyright (C) 2015 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# File: build-config
# Purpose:
# This script serves the same purpose as ./configure in traditional
# autoconf setups.
# It takes build configuration options from command line, checks them,
# builds a config dictionary, augments it with some default and/or
# computed values and saves it to build/build-config.json
# for other build scripts to read.
import argparse
import re
import sys
import os
import getpass
import platform
import json
import distutils.dir_util
import defaults
# argparse converts hyphens to underscores,
# so for lookups in the original options hash we have to
# convert them back
def field_to_option(s):
return re.sub(r'_', '-', s)
def get_default_build_by():
return "{user}@{host}".format(user= getpass.getuser(), host=platform.node())
# Options dict format:
# '$option_name_without_leading_dashes': { ('$help_string', $default_value_generator_thunk, $value_checker_thunk) }
options = {
'architecture': ('Image target architecture (amd64 or i586 or armhf)', lambda: 'amd64', lambda x: x in ['amd64', 'i586', 'armhf']),
'build-by': ('Builder identifier (e.g. jrandomhacker@example.net)', get_default_build_by, None),
'debian-mirror': ('Debian repository mirror for ISO build', lambda: defaults.DEBIAN_MIRROR, None),
'debian-security-mirror': ('Debian security updated mirror', lambda: defaults.DEBIAN_SECURITY_MIRROR, None),
'pbuilder-debian-mirror': ('Debian repository mirror for pbuilder env bootstrap', lambda: defaults.DEBIAN_MIRROR, None),
'build-type': ('Build type, release or development', lambda: 'development', lambda x: x in ['release', 'development']),
'version': ('Version number (release builds only)', None, None)
}
# Create the option parser
parser = argparse.ArgumentParser()
for k, v in options.items():
help_string, default_value_thunk = v[0], v[1]
if default_value_thunk is None:
parser.add_argument('--' + k, type=str, help=help_string)
else:
parser.add_argument('--' + k, type=str, help=help_string, default=default_value_thunk())
args = vars(parser.parse_args())
# Validate options
for k, v in args.items():
key = field_to_option(k)
func = options[key][2]
if func is not None:
if not func(v):
print("{v} is not a valid value for --{o} option".format(o=key, v=v))
sys.exit(1)
# Some fixup for mirror settings.
# The idea is: if --debian-mirror is specified but --pbuilder-debian-mirror is not,
# use the --debian-mirror value for both lb and pbuilder bootstrap
if (args['debian_mirror'] != defaults.DEBIAN_MIRROR) and \
(args['pbuilder_debian_mirror'] == defaults.DEBIAN_MIRROR):
args['pbuilder_debian_mirror'] = args['debian_mirror']
# Version can only be set for release builds,
# for dev builds it hardly makes any sense
if args['build_type'] == 'development':
if args['version'] is not None:
print("Version can only be set for release builds")
print("Use --build-type=release option if you want to set version number")
sys.exit(1)
# Populate some defaults that are not configurable,
# but that are handy to have in the options hash
args['distribution'] = defaults.DEBIAN_DISTRIBUTION
args['build_dir'] = os.path.join(os.getcwd(), defaults.BUILD_DIR)
args['pbuilder_config'] = defaults.PBUILDER_CONFIG
# Save to file
distutils.dir_util.mkpath(defaults.BUILD_DIR)
with open(defaults.BUILD_CONFIG, 'w') as f:
json.dump(args, f)