build script: improve target registration

target can be named with arbitrary string
This commit is contained in:
alexey.lysiuk 2020-05-11 12:42:38 +03:00
parent 7acd7e532b
commit a34f525cdf

View file

@ -24,18 +24,48 @@ if sys.hexversion < 0x3070000:
print('Build module requires Python 3.7 or newer') print('Build module requires Python 3.7 or newer')
exit(1) exit(1)
import argparse import argparse
import re import re
import os import os
import shutil import shutil
import subprocess import subprocess
import tarfile import tarfile
from typing import KeysView
class Target(object): class TargetRegistry:
_SETUP_PREFIX = '_setup_' _SETUPS = {}
_TARGETS = {}
@staticmethod
def get_names() -> KeysView:
return TargetRegistry._SETUPS.keys()
@staticmethod
def get_targets() -> dict:
if len(TargetRegistry._TARGETS) == 0:
TargetRegistry._TARGETS = {name: Target(name) for name in TargetRegistry.get_names()}
return TargetRegistry._TARGETS
@staticmethod
def get_setup(name: str):
return TargetRegistry._SETUPS[name]
@staticmethod
def setup(name):
def register(func):
assert name not in TargetRegistry._SETUPS
TargetRegistry._SETUPS[name] = func
return func
return register
target_setup = TargetRegistry.setup
class Target:
def __init__(self, name: str): def __init__(self, name: str):
self.name = name self.name = name
self.url = None self.url = None
@ -43,41 +73,32 @@ class Target(object):
self.post_build = None self.post_build = None
def setup(self, builder: 'Builder'): def setup(self, builder: 'Builder'):
setup_func = getattr(Target, Target._SETUP_PREFIX + self.name) setup_func = TargetRegistry.get_setup(self.name)
setup_func(self, builder) setup_func(self, builder)
@staticmethod @target_setup('gzdoom')
def get_target_names() -> list:
targets = []
for member in dir(Target):
if member.startswith(Target._SETUP_PREFIX):
targets.append(member[len(Target._SETUP_PREFIX):])
return targets
@staticmethod
def create_targets() -> dict:
return {name: Target(name) for name in Target.get_target_names()}
def _setup_gzdoom(self, builder: 'Builder'): def _setup_gzdoom(self, builder: 'Builder'):
self.url = 'https://github.com/coelckers/gzdoom.git' self.url = 'https://github.com/coelckers/gzdoom.git'
self.post_build = Target._copy_moltenvk self.post_build = Target._copy_moltenvk
self._assign_zdoom_raze_cmake_options(builder) self._assign_zdoom_raze_cmake_options(builder)
@target_setup('qzdoom')
def _setup_qzdoom(self, builder: 'Builder'): def _setup_qzdoom(self, builder: 'Builder'):
self.url = 'https://github.com/madame-rachelle/qzdoom.git' self.url = 'https://github.com/madame-rachelle/qzdoom.git'
self.post_build = Target._copy_moltenvk self.post_build = Target._copy_moltenvk
self._assign_zdoom_raze_cmake_options(builder) self._assign_zdoom_raze_cmake_options(builder)
@target_setup('lzdoom')
def _setup_lzdoom(self, builder: 'Builder'): def _setup_lzdoom(self, builder: 'Builder'):
self.url = 'https://github.com/drfrag666/gzdoom.git' self.url = 'https://github.com/drfrag666/gzdoom.git'
self._assign_zdoom_raze_cmake_options(builder) self._assign_zdoom_raze_cmake_options(builder)
@target_setup('raze')
def _setup_raze(self, builder: 'Builder'): def _setup_raze(self, builder: 'Builder'):
self.url = 'https://github.com/coelckers/Raze.git' self.url = 'https://github.com/coelckers/Raze.git'
self._assign_zdoom_raze_cmake_options(builder) self._assign_zdoom_raze_cmake_options(builder)
@target_setup('zandronum')
def _setup_zandronum(self, builder: 'Builder'): def _setup_zandronum(self, builder: 'Builder'):
self.url = 'https://github.com/TorrSamaho/zandronum.git' self.url = 'https://github.com/TorrSamaho/zandronum.git'
opts = self.cmake_options opts = self.cmake_options
@ -164,7 +185,7 @@ class Builder(object):
self.sdk_path = arguments.sdk_path self.sdk_path = arguments.sdk_path
self.create_package = arguments.create_package self.create_package = arguments.create_package
targets = Target.create_targets() targets = TargetRegistry.get_targets()
if arguments.target: if arguments.target:
self.target = targets[arguments.target] self.target = targets[arguments.target]
@ -304,7 +325,7 @@ class Builder(object):
parser = argparse.ArgumentParser(description='*ZDoom binary dependencies for macOS') parser = argparse.ArgumentParser(description='*ZDoom binary dependencies for macOS')
group = parser.add_mutually_exclusive_group(required=True) group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--target', choices=Target.get_target_names(), help='target to build') group.add_argument('--target', choices=TargetRegistry.get_names(), help='target to build')
group.add_argument('--source-path', metavar='path', help='path to target\'s source code') group.add_argument('--source-path', metavar='path', help='path to target\'s source code')
group = parser.add_argument_group() group = parser.add_argument_group()