diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2018-07-26 20:15:55 -0400 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-07-29 00:24:16 -0400 |
commit | db65c723ae9c4e765e30a05ed6c96f04754dc3f1 (patch) | |
tree | 4043f0f7cfc0d4bb51bbc38f6f6c9316282f3602 /tools | |
parent | 604a8a640cf1f825218fdb5b23351cd46fc56747 (diff) |
Rename run_hooks.py to setup.py
Moves 'gn gen' into setup.py
Make tools/build.py more ergonomic.
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/build.py | 79 | ||||
-rwxr-xr-x | tools/run_hooks.py | 7 | ||||
-rwxr-xr-x | tools/setup.py | 53 | ||||
-rw-r--r-- | tools/third_party.py | 2 | ||||
-rw-r--r-- | tools/util.py | 24 |
5 files changed, 107 insertions, 58 deletions
diff --git a/tools/build.py b/tools/build.py index 8b33cef89..2df98bdcb 100755 --- a/tools/build.py +++ b/tools/build.py @@ -1,64 +1,41 @@ #!/usr/bin/env python # Copyright 2018 the Deno authors. All rights reserved. MIT license. -import argparse import os import sys from os.path import join -from third_party import depot_tools_path, third_party_path, fix_symlinks, google_env -from util import root_path, run -import distutils.spawn +import third_party +from util import root_path, run, run_output, build_path -parser = argparse.ArgumentParser(description='') -parser.add_argument( - '--build_path', default='', help='Directory to build into.') -parser.add_argument( - '--args', default='', help='Specifies build arguments overrides.') -parser.add_argument( - '--mode', default='debug', help='Build configuration: debug, release.') -options, targets = parser.parse_known_args() +third_party.fix_symlinks() -fix_symlinks() - -os.chdir(root_path) - -gn_path = join(depot_tools_path, "gn") -ninja_path = join(depot_tools_path, "ninja") - -if options.build_path: - build_path = options.build_path -else: - build_path = join(root_path, "out", options.mode) - -gn_args = [] -if options.args: - gn_args += options.args.split() - -if options.mode == "release": - gn_args += ["is_official_build=true"] -elif options.mode == "debug": - pass -else: - print "Bad mode {}. Use 'release' or 'debug' (default)" % options.mode +print "DENO_BUILD_PATH:", build_path() +if not os.path.isdir(build_path()): + print "DENO_BUILD_PATH does not exist. Run tools/setup.py" sys.exit(1) +os.chdir(build_path()) + -# Check if ccache is in the path, and if so we cc_wrapper. -ccache_path = distutils.spawn.find_executable("ccache") -if ccache_path: - gn_args += [r'cc_wrapper="%s"' % ccache_path] +def maybe_add_default_target(args): + lines = run_output( + [third_party.ninja_path, "-t", "targets"], + env=third_party.google_env(), + quiet=True).split("\n") + targets = [l.rsplit(":", 1)[0] for l in lines] + deno_targets = [target for target in targets if target.startswith(":")] + deno_targets += [target.lstrip(":") for target in deno_targets] -# mkdir $build_path. We do this so we can write args.gn before running gn gen. -if not os.path.isdir(build_path): - os.makedirs(build_path) + target_specified = False + for a in args: + if a in deno_targets: + target_specified = True + break + if not target_specified: + args += [":all"] + return args -# Rather than using gn gen --args we manually write the args.gn override file. -# This is to avoid quoting/escaping complications when passing overrides as -# command-line arguments. -args_filename = join(build_path, "args.gn") -if not os.path.exists(args_filename) or options.args: - with open(args_filename, "w+") as f: - f.write("\n".join(gn_args) + "\n") -run([gn_path, "gen", build_path], env=google_env()) +ninja_args = maybe_add_default_target(sys.argv[1:]) -target = " ".join(targets) if targets else ":all" -run([ninja_path, "-C", build_path, target], env=google_env()) +run([third_party.ninja_path] + ninja_args, + env=third_party.google_env(), + quiet=True) diff --git a/tools/run_hooks.py b/tools/run_hooks.py deleted file mode 100755 index 59161f5f2..000000000 --- a/tools/run_hooks.py +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env python -import third_party - -third_party.fix_symlinks() - -third_party.download_gn() -third_party.download_clang() diff --git a/tools/setup.py b/tools/setup.py new file mode 100755 index 000000000..84bd0aba4 --- /dev/null +++ b/tools/setup.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +import third_party +from util import run, build_path, build_mode +import os +import distutils.spawn + +third_party.fix_symlinks() +third_party.download_gn() +third_party.download_clang() + + +def get_gn_args(): + out = [] + if build_mode() == "release": + out += ["is_official_build=true"] + elif build_mode() == "debug": + pass + else: + print "Bad mode {}. Use 'release' or 'debug' (default)" % build_mode() + sys.exit(1) + if "DENO_BUILD_ARGS" in os.environ: + out += os.environ["DENO_BUILD_ARGS"].split() + + # Check if ccache is in the path, and if so we cc_wrapper. + ccache_path = distutils.spawn.find_executable("ccache") + if ccache_path: + out += [r'cc_wrapper="%s"' % ccache_path] + + print "DENO_BUILD_ARGS:", out + + return out + + +# gn gen. +for mode in ["release", "debug"]: + os.environ["DENO_BUILD_MODE"] = mode + + gn_args = get_gn_args() + + # mkdir $build_path(). We do this so we can write args.gn before running gn gen. + if not os.path.isdir(build_path()): + os.makedirs(build_path()) + + # Rather than using gn gen --args we manually write the args.gn override file. + # This is to avoid quoting/escaping complications when passing overrides as + # command-line arguments. + args_filename = os.path.join(build_path(), "args.gn") + if not os.path.exists(args_filename) or gn_args: + with open(args_filename, "w+") as f: + f.write("\n".join(gn_args) + "\n") + + run([third_party.gn_path, "gen", build_path()], + env=third_party.google_env()) diff --git a/tools/third_party.py b/tools/third_party.py index ef8ed466f..b756e1fa3 100644 --- a/tools/third_party.py +++ b/tools/third_party.py @@ -20,6 +20,8 @@ def tp(*subpath_parts): third_party_path = tp() depot_tools_path = tp("depot_tools") rust_crates_path = tp("rust_crates") +gn_path = tp(depot_tools_path, "gn") +ninja_path = tp(depot_tools_path, "ninja") # This function creates or modifies an environment so that it matches the diff --git a/tools/util.py b/tools/util.py index 904b6ed70..6a2da8033 100644 --- a/tools/util.py +++ b/tools/util.py @@ -30,6 +30,15 @@ def run(args, quiet=False, cwd=None, env=None, merge_env={}): sys.exit(rc) +def run_output(args, quiet=False, cwd=None, env=None, merge_env={}): + args[0] = os.path.normpath(args[0]) + if not quiet: + print " ".join(args) + env = make_env(env=env, merge_env=merge_env) + shell = os.name == "nt" # Run through shell to make .bat/.cmd files work. + return subprocess.check_output(args, cwd=cwd, env=env, shell=shell) + + def remove_and_symlink(target, name, target_is_dir=False): try: # On Windows, directory symlink can only be removed with rmdir(). @@ -92,3 +101,18 @@ def rmtree(directory): func(path) shutil.rmtree(directory, onerror=rm_readonly) + + +def build_mode(): + if "DENO_BUILD_MODE" in os.environ: + return os.environ["DENO_BUILD_MODE"] + else: + return "debug" + + +# E.G. "out/debug" +def build_path(): + if "DENO_BUILD_PATH" in os.environ: + return os.environ["DENO_BUILD_PATH"] + else: + return os.path.join(root_path, "out", build_mode()) |