Home | History | Annotate | Download | only in blueprint
      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
     69