diff --git a/mpcdf_common.py b/mpcdf_common.py index 10ef7f13f0fa36004a62e36fba41be582a8ef758..884d417193ca840b59e85ceb1e1d8d5fa98f3f7c 100644 --- a/mpcdf_common.py +++ b/mpcdf_common.py @@ -9,6 +9,8 @@ from osc.util.helper import decode_it from functools import partial from xml.etree import ElementTree +known_microarchs = {"sandybridge", "haswell", "skylake"} + package_attributes = ["MPCDF:enable_repositories"] config_attributes = ["MPCDF:compiler_modules", "MPCDF:cuda_modules", "MPCDF:mpi_modules", "MPCDF:pgi_modules"] default_attributes = ["MPCDF:default_compiler", "MPCDF:default_cuda", "MPCDF:default_mpi", "MPCDF:default_python2", "MPCDF:default_python3"] @@ -204,6 +206,19 @@ def remove_attribute(api_url, project, package, attribute_name): raise osc.oscerr.APIError("Could not remove attribute") +def get_microarchitecture(project): + if project == "software": + # Stupid special case + microarch = "sandybridge" + else: + microarch = project.split(":")[2] + + if microarch in known_microarchs: + return microarch + else: + raise Exception("Unknown micro-architecture '{0}'".format(microarch)) + + def mpcdf_enable_repositories(api_url, project, package, verbose=False, filter_repos=None): from itertools import product import sys @@ -343,7 +358,8 @@ def mpcdf_enable_repositories(api_url, project, package, verbose=False, filter_r return True -def mpcdf_setup_repositories(api_url, project, distribution=None, parent=None, packages=None, dry_run=False, filter_repos=None, only_project=False, remove_old=False): +def mpcdf_setup_repositories(api_url, project, microarchitecture=None, distribution=None, parent=None, + packages=None, dry_run=False, filter_repos=None, only_project=False, remove_old=False): import threading if parent: @@ -374,6 +390,9 @@ def mpcdf_setup_repositories(api_url, project, distribution=None, parent=None, p raise osc.oscerr.WrongArgs("No repository '{0}' is defined in project 'distributions' on the server".format(distribution)) architectures = list(arch.text for arch in dist_repo.findall("./arch")) + if microarchitecture is None: + microarchitecture = get_microarchitecture(project) + root = project_meta(api_url, project) prjconf = list(map(decode_it, osc.core.show_project_conf(api_url, project))) @@ -391,6 +410,15 @@ def mpcdf_setup_repositories(api_url, project, distribution=None, parent=None, p prjconf_tail = "".join(prjconf[end + 1:]) prjconf = [start_marker] + prjconf.append("Constraint: hostlabel {0}".format(microarchitecture)) + prjconf.append( + """ +%if %_repository != System +Macros: +%microarchitecture {0} +:Macros +%endif""".format(microarchitecture)) + prjconf.append("") prjconf.append("Prefer: mpcdf_python2_" + default_python2) prjconf.append("Prefer: mpcdf_python3_" + default_python3) prjconf.append("") @@ -653,7 +681,7 @@ def sync_projects(api_url, package=None, from_project="software", to_projects=No distribution = sys_repo.find('./path[@project="distributions"]').get("repository") print("Creating repository configuration") - mpcdf_setup_repositories(api_url, to_project, distribution) + mpcdf_setup_repositories(api_url, to_project, distribution=distribution) else: for orig_package in from_packages: if not mpcdf_enable_repositories(api_url, to_project, orig_package): diff --git a/mpcdf_setup_repositories.py b/mpcdf_setup_repositories.py index dc13c683d00a0eb2714a2d492a6fe18919f6c41b..53800023b774bf1078529f65ec631210e1e5eeef 100644 --- a/mpcdf_setup_repositories.py +++ b/mpcdf_setup_repositories.py @@ -22,6 +22,8 @@ import osc.cmdln help="Only change project metadata 'prj' and 'prjconf', leave individual packages unchanged") @osc.cmdln.option('--remove-old', action="store_true", default=False, help="Remove all obsolete repositories instead of only disabling builds for packages there") +@osc.cmdln.option('--microarchitecture', metavar="ARCH", nargs=1, + help="Configure project to use ARCH as microarchitecture") @osc.cmdln.alias("mpcdf_setup_repos") def do_mpcdf_setup_repositories(self, subcmd, opts, *args): """${cmd_name}: Create all repository combinations for an MPCDF project @@ -48,6 +50,6 @@ def do_mpcdf_setup_repositories(self, subcmd, opts, *args): raise osc.oscerr.WrongArgs("Too many arguments") mpcdf_setup_repositories(self.get_api_url(), - project, opts.distribution, + project, microarchitecture=opts.microarchitecture, distribution=opts.distribution, parent=opts.parent, dry_run=opts.dry_run, filter_repos=opts.disable_repo, only_project=opts.only_project, remove_old=opts.remove_old)