• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2014 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// The Blueprint bootstrapping mechanism is intended to enable building a
16// source tree with minimal prebuilts.  The only prerequisites for performing
17// such a build are:
18//
19//   1. A Ninja binary
20//   2. A script interpreter (e.g. Bash or Python)
21//   3. A Go toolchain
22//
23// The Primary Builder
24//
25// As part of the bootstrapping process, a binary called the "primary builder"
26// is created.  This primary builder is the binary that includes both the core
27// Blueprint library and the build logic specific to the source tree.  It is
28// used to generate the Ninja file that describes how to build the entire source
29// tree.
30//
31// The primary builder must be a pure Go (i.e. no cgo) module built with the
32// module type 'bootstrap_go_binary'.  It should have the 'primaryBuilder'
33// module property set to true in its Blueprints file.  If more than one module
34// sets primaryBuilder to true the build will fail.
35//
36// The primary builder main function should look something like:
37//
38//   package main
39//
40//   import (
41//       "flag"
42//       "github.com/google/blueprint"
43//       "github.com/google/blueprint/bootstrap"
44//       "path/filepath"
45//
46//       "my/custom/build/logic"
47//   )
48//
49//   func main() {
50//       // The primary builder should use the global flag set because the
51//       // bootstrap package registers its own flags there.
52//       flag.Parse()
53//
54//       // The top-level Blueprints file is passed as the first argument.
55//       srcDir := filepath.Dir(flag.Arg(0))
56//
57//       // Create the build context.
58//       ctx := blueprint.NewContext()
59//
60//       // Register custom module types
61//       ctx.RegisterModuleType("foo", logic.FooModule)
62//       ctx.RegisterModuleType("bar", logic.BarModule)
63//
64//       // Register custom singletons
65//       ctx.RegisterSingleton("baz", logic.NewBazSingleton())
66//
67//       // Create and initialize the custom Config object.
68//       config := logic.NewConfig(srcDir)
69//
70//       // This call never returns
71//       bootstrap.Main(ctx, config)
72//   }
73//
74// Required Source Files
75//
76// There are three files that must be included in the source tree to facilitate
77// the build bootstrapping:
78//
79//   1. The top-level Blueprints file
80//   2. The bootstrap script
81//   3. The build wrapper script
82//
83// The top-level Blueprints file describes how the entire source tree should be
84// built.  It must have a 'subdirs' assignment that includes both the core
85// Blueprint library and the custom build logic for the source tree.  It should
86// also include (either directly or through a subdirs entry) describe all the
87// modules to be built in the source tree.
88//
89// The bootstrap script is a small script to setup the build directory, writing
90// a couple configuration files (including the path the source directory,
91// information about the Go build environment, etc), then copying the build
92// wrapper into the build directory.
93//
94// The Bootstrapping Process
95//
96// There are three stages to the bootstrapping process, each with a
97// corresponding Ninja file. The stages are referred to as the "bootstrap",
98// "primary", and "main" stages. Each stage builds the next stage's Ninja file.
99//
100// The bootstrapping process begins with the user running the bootstrap script
101// to initialize a new build directory.  The script is run from the build
102// directory, and creates a ".minibootstrap/build.ninja" file that sets a few
103// variables then includes blueprint's "bootstrap/build.ninja". It also writes
104// out a ".blueprint.bootstrap" file that contains a few variables for later use:
105//
106//   BLUEPRINT_BOOTSTRAP_VERSION - Used to detect when a user needs to run
107//                                 bootstrap.bash again
108//
109//   SRCDIR         - The path to the source directory
110//   BLUEPRINTDIR   - The path to the blueprints directory (includes $SRCDIR)
111//   GOROOT         - The path to the root directory of the Go toolchain
112//   NINJA_BUILDDIR - The path to store .ninja_log, .ninja_deps
113//
114// Once the script completes the build directory is initialized and ready to run
115// a build. A wrapper script (blueprint.bash by default) has been installed in
116// order to run a build. It iterates through the three stages of the build:
117//
118//      - Runs microfactory.bash to build minibp
119//      - Runs the .minibootstrap/build.ninja to build .bootstrap/build.ninja
120//      - Runs .bootstrap/build.ninja to build and run the primary builder
121//      - Runs build.ninja to build your code
122//
123// Microfactory takes care of building an up to date version of `minibp` and
124// `bpglob` under the .minibootstrap/ directory.
125//
126// During <builddir>/.minibootstrap/build.ninja, the following actions are
127// taken, if necessary:
128//
129//      - Run minibp to generate .bootstrap/build.ninja (Primary stage)
130//      - Includes .minibootstrap/build-globs.ninja, which defines rules to
131//        run bpglob during incremental builds. These outputs are listed in
132//        the dependency file output by minibp.
133//
134// During the <builddir>/.bootstrap/build.ninja, the following actions are
135// taken, if necessary:
136//
137//      - Build the primary builder, anything marked `default: true`, and
138//        any dependencies.
139//      - Run the primary builder to generate build.ninja
140//      - Run the primary builder to extract documentation
141//      - Includes .bootstrap/build-globs.ninja, which defines rules to run
142//        bpglob during incremental builds. These outputs are listed in the
143//        dependency file output by the primary builder.
144//
145// Then the main stage is at <builddir>/build.ninja, and will contain all the
146// rules generated by the primary builder. In addition, the bootstrap code
147// adds a phony rule "blueprint_tools" that depends on all blueprint_go_binary
148// rules (bpfmt, bpmodify, etc).
149//
150package bootstrap
151