diff --git a/build/lib b/build/lib index 1a4b6cde..0587c311 160000 --- a/build/lib +++ b/build/lib @@ -1 +1 @@ -Subproject commit 1a4b6cdee297357d403ac2dfda54b8b4b8dd8945 +Subproject commit 0587c311b7bcdb82ab5d9f06138f190f31fc601d diff --git a/configure b/configure index 5975b47f..40cdf5c6 100755 --- a/configure +++ b/configure @@ -3,12 +3,8 @@ # This file is part of Antares, a tactical space combat game. # Antares is free software, distributed under the LGPL+. See COPYING. -from __future__ import division, print_function, unicode_literals - import argparse -import collections import os -import platform import shlex import sys @@ -17,13 +13,14 @@ sys.path[0:0] = [ os.path.join(os.path.dirname(__file__), "build", "lib", "scripts"), ] try: - import deps import cfg except ImportError: pass def main(): + check_submodules() + config_dir = os.path.dirname(sys.argv[0]) if config_dir != "": os.chdir(config_dir) @@ -54,33 +51,22 @@ def main(): help="override antares_version string") args = parser.parse_args() - check_submodules() - config = check_deps(args) - - script_executable = "python3" - if cfg.host_os() == "win": - script_executable = "python" - - with open('.gn', 'w') as gnf: - gnf.write('buildconfig = "//build/BUILDCONFIG.gn"\n') - gnf.write('script_executable = "' + script_executable + '"\n') - - with cfg.step("configure mode") as msg: - msg(args.mode, color="green") - config["mode"] = args.mode - config["target_os"] = args.target_os - config["prefix"] = args.prefix - config["add_cflags"] = shlex.split(os.environ.get("CPPFLAGS", "")) - config["add_cflags_c"] = shlex.split(os.environ.get("CFLAGS", "")) - config["add_cflags_cc"] = shlex.split(os.environ.get("CXXFLAGS", "")) - config["add_ldflags"] = shlex.split(os.environ.get("LDFLAGS", "")) + config = { + "mode": args.mode, + "target_os": args.target_os, + "prefix": args.prefix, + "add_cflags": shlex.split(os.environ.get("CPPFLAGS", "")), + "add_cflags_c": shlex.split(os.environ.get("CFLAGS", "")), + "add_cflags_cc": shlex.split(os.environ.get("CXXFLAGS", "")), + "add_ldflags": shlex.split(os.environ.get("LDFLAGS", "")), + } if args.antares_version: config["antares_version"] = args.antares_version - if args.target_os == "mac": + if config["target_os"] == "mac": config["macosx_version_min"] = "10.7" - cfg.gn(**config) - print("make(1) it so!") + import deps + cfg.configure("Antares", deps.DISTROS, config) def check_submodules(): @@ -111,121 +97,5 @@ def check_submodules(): sys.exit(1) -def check_deps(args): - with cfg.step("checking host os") as msg: - if cfg.host_os() in ["mac", "linux", "win"]: - msg(cfg.host_os(), color="green") - else: - msg(cfg.host_os(), color="red") - print("\nSorry! Antares requires Mac OS X or Linux") - sys.exit(1) - - with cfg.step("checking target os") as msg: - if args.target_os is None: - args.target_os = cfg.host_os() - checker = { - ("mac", "mac"): check_mac, - ("linux", "linux"): check_linux_native, - ("linux", "win"): check_win_on_linux, - ("win", "win"): check_win_native, - }.get((cfg.host_os(), args.target_os)) - if checker is None: - msg(args.target_os, color="red") - sys.exit(1) - msg(args.target_os, color="green") - - return checker(args) - - -def check_mac(args): - with cfg.step("checking Mac OS X version") as msg: - ver = platform.mac_ver()[0] - ver = tuple(int(x) for x in ver.split(".")[:2]) - if ver < (10, 9): - msg("%d.%d" % ver, color="red") - print("\nSorry! Antares requires Mac OS X 10.9+") - sys.exit(1) - msg("%d.%d" % ver, color="green") - - missing = collections.OrderedDict() - if not (cfg.check_clang() and cfg.check_libcxx()): - missing["xcode"] = ("* To install Xcode, open the App Store:\n" - " https://itunes.apple.com/en/app/xcode/id497799835\n" - " After installing, open it and accept the license agreement\n") - if not cfg.check_brew(): - missing["brew"] = ( - "* To install Homebrew, run:\n" - ' $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"\n' - ) - - if missing: - print("\nmissing dependencies: %s\n" % " ".join(missing.keys())) - for step in missing.values(): - sys.stdout.write(step) - print("") - print("Then, try ./configure again") - sys.exit(1) - - config = deps.check(distro="mac", codename="mac") - if config is None: - sys.exit(1) - return config - - -def check_linux_native(args): - with cfg.step("checking Linux distro") as msg: - pretty, distro, codename = cfg.dist_proto() - if distro in deps.INSTALL: - msg(pretty, color="green") - else: - msg(pretty + " (untested)", color="yellow") - distro = "debian" - config = deps.check(distro=distro, codename=codename, prefix="sudo") - if config is None: - sys.exit(1) - return config - -def check_win_native(args): - config = deps.check(distro="win", codename="win") - config["gn"] = "gn" - config["ninja"] = "ninja" - return config - -def check_win_on_linux(args): - with cfg.step("checking Linux distro") as msg: - pretty, distro, codename = cfg.dist_proto() - if (distro, codename) == ("debian", "focal"): - msg(pretty, color="green") - else: - msg(pretty, color="red") - print("\nSorry! Cross-compilation currently requires Ubuntu 20.04 focal") - sys.exit(1) - - missing = collections.OrderedDict() - if not cfg.check_clang("clang++"): - missing["clang"] = "clang" - - with cfg.step("checking for mingw") as msg: - if os.path.exists("/usr/x86_64-w64-mingw32/include/windows.h"): - msg("ok", color="green") - else: - msg("missing", color="red") - missing["mingw"] = "mingw-w64" - - if missing: - print("\nmissing dependencies: %s" % " ".join(missing.keys())) - if len(missing) == 1: - print("\nYou can install it with:\n") - else: - print("\nYou can install them with:\n") - print(" $ sudo apt-get install %s" % (" ".join(missing.values()))) - sys.exit(1) - - return { - "ninja": "ninja", - "gn": "gn", - } - - if __name__ == "__main__": main() diff --git a/scripts/deps.py b/scripts/deps.py index a74e3af8..dfe907b9 100755 --- a/scripts/deps.py +++ b/scripts/deps.py @@ -8,195 +8,70 @@ import sys sys.path.append(os.path.join(os.path.dirname(__file__), "..", "build", "lib", "scripts")) -try: - import cfg -except ImportError: - pass - -PACKAGE = {} -INSTALL = {} -UPDATE = {} -SOURCES = {} -KEYS = {} - -DEBIAN = "debian" -INSTALL[DEBIAN] = "apt-get install".split() -UPDATE[DEBIAN] = "apt-get update".split() -PACKAGE[DEBIAN] = collections.OrderedDict([ - # Binaries - ("clang", "clang"), - ("clang++", "clang"), - ("gn", "gn"), - ("ninja", "ninja-build"), - ("pkg-config", "pkg-config"), - - # Libraries - ("gl", "libgl1-mesa-dev"), - ("glfw3", "libglfw3-dev"), - ("glu", "libglu1-mesa-dev"), - ("libmodplug", "libmodplug-dev"), - ("libpng", "libpng-dev"), - ("libzip", "libzip-dev"), - ("neon", "libneon27-dev"), - ("openal", "libopenal-dev"), - ("sndfile", "libsndfile1-dev"), - ("x11", "libx11-dev"), - ("xcursor", "libxcursor-dev"), - ("xinerama", "libxinerama-dev"), - ("xrandr", "libxrandr-dev"), - ("xxf86vm", "libxxf86vm-dev"), - ("zlib", "zlib1g-dev"), -]) -SOURCES[DEBIAN] = [ - ("arescentral", "http://apt.arescentral.org", "contrib"), -] -KEYS[DEBIAN] = [ - ("apt-key adv --keyserver keyserver.ubuntu.com --recv" - " 5A4F5210FF46CEE4B799098BAC879AADD5B51AE9").split(), -] - -MAC = "mac" -INSTALL[MAC] = "brew install".split() -PACKAGE[MAC] = collections.OrderedDict([ - ("ninja", "ninja"), - ("gn", "sfiera/gn/gn"), -]) - -WIN = "win" -INSTALL[WIN] = "python scripts/download".split() -PACKAGE[WIN] = collections.OrderedDict([ - ("ninja", - "https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-win.zip:ninja.exe"), - ("gn", "https://chrome-infra-packages.appspot.com/dl/gn/gn/windows-amd64/+/latest:gn.exe"), -]) - - -def main(): - import argparse - - distro, codename = defaults() - - parser = argparse.ArgumentParser(description="Install build deps for Antares") - parser.add_argument("action", choices="check install".split()) - parser.add_argument("--distro", choices=sorted(INSTALL.keys()), default=distro) - parser.add_argument("--codename", type=str, default=codename) - parser.add_argument("--dry-run", action="store_const", const=True, default=False) - args, flags = parser.parse_known_args() - - if args.action == "check": - if not check(distro=args.distro, codename=args.codename): - sys.exit(1) - elif args.action == "install": - install(distro=args.distro, codename=args.codename, dry_run=args.dry_run, flags=flags) - - -def check(*, distro, codename, prefix=""): - checkers = { - "clang": cfg.check_clang, - "clang++": cfg.check_clangxx, - "gn": cfg.check_gn, - "ninja": cfg.check_ninja, - "pkg-config": cfg.check_pkg_config, - } - - pkg_config = None - missing_pkgs = [] - config = {} - for name in PACKAGE[distro]: - if name in checkers: - dep = checkers[name]() - if dep is None: - missing_pkgs.append(name) - else: - config[name] = dep - continue - - pkg_config = config.pop("pkg-config", pkg_config) - if pkg_config is None: - continue - if not cfg.check_pkg(pkg_config, name): - missing_pkgs.append(name) - - if not missing_pkgs: - return config - commands = [] - - for name, url, component in SOURCES.get(distro, []): - path = "/etc/apt/sources.list.d/%s.list" % name - if os.path.exists(path): - continue - commands.append("%s | %s" % ( - _command("", ["echo", "deb", url, codename, component]), - _command(prefix, ["tee", path]), - )) - if commands: - for keys in KEYS.get(distro, []): - commands.append(_command(prefix, keys)) - - if distro in UPDATE: - commands.append(_command(prefix, UPDATE[distro])) - missing_pkgs = sorted(set(PACKAGE[distro][pkg] for pkg in missing_pkgs)) - commands.append(_command(prefix, INSTALL[distro] + missing_pkgs)) - - print() - print("missing dependencies: %s" % " ".join(missing_pkgs)) - if len(missing_pkgs) == 1: - print("On %s, you can install it with:" % codename) - else: - print("On %s, you can install them with:" % codename) - print() - for command in commands: - print(" $ %s" % command) - print() - print("Then, try ./configure again") - return None - - -def _command(prefix, args): - return " ".join(shlex.quote(x) for x in shlex.split(prefix) + args) - - -def install(*, distro, codename, dry_run=False, flags=[]): - for name, url, component in SOURCES.get(distro, []): - path = "/etc/apt/sources.list.d/%s.list" % name - if os.path.exists(path): - continue - line = "deb %s %s %s" % (url, codename, component) - write(dry_run, line, path) - for keys in KEYS.get(distro, []): - run(dry_run, keys) - - if SOURCES.get(distro, []): - run(dry_run, UPDATE[distro]) - run(dry_run, INSTALL[distro] + list(PACKAGE[distro].values()) + flags) - - -def run(dry_run, command): - print(" ".join(shlex.quote(arg) for arg in command)) - if not dry_run: - subprocess.check_call(command) - - -def write(dry_run, content, path): - print("+ tee %s" % shlex.quote(path)) - print(content) - if not dry_run: - with open(path, "w") as f: - f.write(content) - - -def defaults(): - if platform.system() == "Darwin": - return MAC, None - elif platform.system() == "Linux": - _, distro, codename = cfg.dist_proto() - return distro, codename - elif platform.system() == "Windows": - return WIN, None - else: - sys.stderr.write("This script is Mac- and Linux-only, sorry.\n") - sys.exit(1) - +import cfg + +DEBIAN = cfg.Distro( + name="debian", + packages={ + # Binaries + "clang": "clang", + "clang++": "clang", + "gn": "gn", + "ninja": "ninja-build", + "pkg-config": "pkg-config", + + # Libraries + "gl": "libgl1-mesa-dev", + "glfw3": "libglfw3-dev", + "glu": "libglu1-mesa-dev", + "libmodplug": "libmodplug-dev", + "libpng": "libpng-dev", + "libzip": "libzip-dev", + "neon": "libneon27-dev", + "openal": "libopenal-dev", + "sndfile": "libsndfile1-dev", + "x11": "libx11-dev", + "xcursor": "libxcursor-dev", + "xinerama": "libxinerama-dev", + "xrandr": "libxrandr-dev", + "xxf86vm": "libxxf86vm-dev", + "zlib": "zlib1g-dev", + }, + sources=[ + ("arescentral", "http://apt.arescentral.org", "contrib", + "5A4F5210FF46CEE4B799098BAC879AADD5B51AE9"), + ], + install="apt-get install".split(), + update="apt-get update".split(), + add_key="apt-key adv --keyserver keyserver.ubuntu.com --recv".split(), +) + +MAC = cfg.Distro( + name="mac", + packages={ + "ninja": "ninja", + "gn": "sfiera/gn/gn", + }, + sources=[], + install="brew install".split(), + update=None, + add_key=None, +) + +WIN = cfg.Distro( + name="win", + packages={ + "ninja": + "https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-win.zip:ninja.exe", + "gn": "https://chrome-infra-packages.appspot.com/dl/gn/gn/windows-amd64/+/latest:gn.exe", + }, + sources=[], + install="python scripts/download".split(), + update=None, + add_key=None, +) + +DISTROS = {d.name: d for d in [DEBIAN, MAC, WIN]} if __name__ == "__main__": - main() + cfg.install_or_check(DISTROS)