123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- /*++
- Copyright (c) 2017 Minoca Corp.
- This file is licensed under the terms of the GNU General Public License
- version 3. Alternative licensing terms are available. Contact
- info@minocacorp.com for details. See the LICENSE file at the root of this
- project for complete licensing information.
- Module Name:
- build.ck
- Abstract:
- This module implements the build command, which will build a package based
- on an input recipe.
- Author:
- Evan Green 3-Jul-2017
- Environment:
- Chalk
- --*/
- //
- // ------------------------------------------------------------------- Includes
- //
- from getopt import gnuGetopt;
- import os;
- from santa.config import config;
- from santa.lib.build import Build;
- //
- // --------------------------------------------------------------------- Macros
- //
- //
- // ---------------------------------------------------------------- Definitions
- //
- //
- // ------------------------------------------------------ Data Type Definitions
- //
- //
- // ----------------------------------------------- Internal Function Prototypes
- //
- //
- // -------------------------------------------------------------------- Globals
- //
- var description = "Build a package from its sources";
- var shortOptions = "c:his:o:r:v";
- var longOptions = [
- "cross=",
- "help",
- "ignore-missing-deps",
- "output="
- "solo-step=",
- "run=",
- "verbose"
- ];
- var usage =
- "usage: santa build [options] <recipe.ck|build_number...>\n"
- "This command builds a package from source. The input parameter is either\n"
- "a path to a recipe file or a previously incomplete build number.\n"
- "Options are:\n"
- " -c, --cross=[arch-]os -- Cross compile (eg \"Minoca\" or "
- "\"x86_64-Minoca\"\n"
- " -i, --ignore-missing-deps -- Ignore missing dependencies\n"
- " -o, --output=dir -- Output packages to the specified directory\n"
- " -r, --run=step -- Run to the specified step and stop.\n"
- " -s, --solo-step=step -- Run only the specified step and stop.\n"
- " -v, --verbose -- Print out more information about what's going on.\n"
- " -h, --help -- Print this help text.\n";
- //
- // ------------------------------------------------------------------ Functions
- //
- function
- command (
- args
- )
- /*++
- Routine Description:
- This routine implements the build command.
- Arguments:
- args - Supplies the arguments to the function.
- Return Value:
- Returns an exit code.
- --*/
- {
- var argc;
- var build;
- var crossArch;
- var crossOs;
- var inputPath;
- var ignoreMissingDeps = false;
- var mode = "r";
- var name;
- var options = gnuGetopt(args[1...-1], shortOptions, longOptions);
- var output;
- var runTo;
- var soloStep;
- var startDirectory = (os.getcwd)();
- var status;
- var value;
- var verbose = config.getKey("core.verbose");
- args = options[1];
- argc = args.length();
- options = options[0];
- for (option in options) {
- name = option[0];
- value = option[1];
- if ((name == "-c") || (name == "--cross")) {
- crossOs = value.split("-", 1);
- if (crossOs.length() == 1) {
- crossOs = crossOs[0];
- } else {
- crossArch = crossOs[0];
- crossOs = crossOs[1];
- }
- } else if ((name == "-h") || (name == "--help")) {
- Core.print(usage);
- return 1;
- } else if ((name == "-i") || (name == "--ignore-missing-deps")) {
- ignoreMissingDeps = true;
- } else if ((name == "-o") || (name == "--output")) {
- output = value;
- } else if ((name == "-s") || (name == "--solo-step")) {
- soloStep = value;
- } else if ((name == "-r") || (name == "--run")) {
- runTo = value;
- } else if ((name == "-v") || (name == "--verbose")) {
- verbose = true;
- } else {
- Core.raise(ValueError("Invalid option '%s'" % name));
- }
- }
- if (args.length() < 1) {
- Core.raise(ValueError("Expected an input recipe path."));
- }
- //
- // Build each recipe.
- //
- for (arg in args) {
- try {
- arg = Int.fromString(arg);
- if (verbose) {
- Core.print("Resuming build: %d" % arg);
- }
- } except ValueError {
- if (verbose) {
- Core.print("Building recipe: %s" % arg);
- }
- }
- build = Build(arg);
- if (crossOs) {
- build.vars.os = crossOs;
- }
- if (crossArch) {
- build.vars.arch = crossArch;
- }
- if (output) {
- build.outdir = output;
- }
- build.ignoreMissingDeps = ignoreMissingDeps;
- Core.print("%s build %d" % [(arg is String) ? "starting" : "resuming",
- build.number]);
- if (verbose) {
- build.vars.verbose = verbose;
- }
- //
- // Run a single step directly if requested.
- //
- if (soloStep) {
- build.runStep(soloStep);
- //
- // Run up to a certain point if requested.
- //
- } else if (runTo) {
- while (build.step != runTo) {
- build.runStep(build.step);
- }
- //
- // Run to completion.
- //
- } else {
- build.run();
- }
- //
- // Return back to the original working directory in case the next
- // argument is a relative path.
- //
- (os.chdir)(startDirectory);
- }
- return 0;
- }
- //
- // --------------------------------------------------------- Internal Functions
- //
|