github.com/colincross/blueprint@v0.0.0-20150626231830-9c067caf2eb5/doc.go (about)

     1  // Copyright 2015 Google Inc. All rights reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  // Blueprint is a meta-build system that reads in Blueprints files that describe
    16  // modules that need to be built, and produces a Ninja
    17  // (http://martine.github.io/ninja/) manifest describing the commands that need
    18  // to be run and their dependencies.  Where most build systems use built-in
    19  // rules or a domain-specific language to describe the logic how modules are
    20  // converted to build rules, Blueprint delegates this to per-project build logic
    21  // written in Go.  For large, heterogenous projects this allows the inherent
    22  // complexity of the build logic to be maintained in a high-level language,
    23  // while still allowing simple changes to individual modules by modifying easy
    24  // to understand Blueprints files.
    25  //
    26  // Blueprint uses a bootstrapping process to allow the code for Blueprint,
    27  // the code for the build logic, and the code for the project being compiled
    28  // to all live in the project.  Dependencies between the layers are fully
    29  // tracked - a change to the logic code will cause the logic to be recompiled,
    30  // regenerate the project build manifest, and run modified project rules.  A
    31  // change to Blueprint itself will cause Blueprint to rebuild, and then rebuild
    32  // the logic, etc.
    33  //
    34  // A Blueprints file is a list of modules in a pseudo-python data format, where
    35  // the module type looks like a function call, and the properties of the module
    36  // look like optional arguments.  For example, a simple module might look like:
    37  //
    38  //   cc_library(
    39  //       name = "cmd",
    40  //       srcs = [
    41  //           "main.c",
    42  //       ],
    43  //       deps = [
    44  //           "libc",
    45  //       ],
    46  //   )
    47  //
    48  //   subdirs = ["subdir1", "subdir2"]
    49  //
    50  // The modules from the top level Blueprints file and recursively through any
    51  // subdirectories listed by the "subdirs" variable are read by Blueprint, and
    52  // their properties are stored into property structs by module type.  Once
    53  // all modules are read, Blueprint calls any registered Mutators, in
    54  // registration order.  Mutators can visit each module top-down or bottom-up,
    55  // and modify them as necessary.  Common modifications include setting
    56  // properties on modules to propagate information down from dependers to
    57  // dependees (for example, telling a module what kinds of parents depend on it),
    58  // or splitting a module into multiple variants (for example, one per
    59  // architecture being compiled).  After all Mutators have run, each module is
    60  // asked to generate build rules based on property values, and then singletons
    61  // can generate any build rules from the output of all modules.
    62  //
    63  // The per-project build logic defines a top level command, referred to in the
    64  // documentation as the "primary builder".  This command is responsible for
    65  // registering the module types needed for the project, as well as any
    66  // singletons or mutators, and then calling into Blueprint with the path of the
    67  // root Blueprint file.
    68  package blueprint