use init functions to register module types, etc.

Instead of putting all the blueprint registrations in soong_build,
put them all in init() functions.  This puts the registration next
to the implementation.

Change-Id: Ide1a749518f5e9d1367a18ab3bb1d91da3310c76
diff --git a/Android.bp b/Android.bp
index 501e4d5..f001246 100644
--- a/Android.bp
+++ b/Android.bp
@@ -15,6 +15,7 @@
     deps: [
         "blueprint",
         "blueprint-bootstrap",
+        "soong",
         "soong-art",
         "soong-cc",
         "soong-common",
@@ -70,11 +71,24 @@
 }
 
 bootstrap_go_package {
+    name: "soong",
+    pkgPath: "android/soong",
+    deps: [
+        "blueprint",
+    ],
+    srcs: [
+        "doc.go",
+        "register.go",
+    ],
+}
+
+bootstrap_go_package {
     name: "soong-common",
     pkgPath: "android/soong/common",
     deps: [
         "blueprint",
         "blueprint-bootstrap",
+        "soong",
         "soong-env",
         "soong-glob",
     ],
@@ -96,6 +110,7 @@
     deps: [
         "blueprint",
         "blueprint-pathtools",
+        "soong",
         "soong-common",
         "soong-genrule",
     ],
@@ -124,6 +139,7 @@
     deps: [
         "blueprint",
         "blueprint-pathtools",
+        "soong",
         "soong-common",
     ],
     srcs: [
@@ -144,6 +160,7 @@
     deps: [
         "blueprint",
         "blueprint-pathtools",
+        "soong",
         "soong-common",
         "soong-genrule",
     ],
diff --git a/build.ninja.in b/build.ninja.in
index 2e62364..3bb9559 100644
--- a/build.ninja.in
+++ b/build.ninja.in
@@ -63,7 +63,7 @@
 # Variant:
 # Type:    bootstrap_go_binary
 # Factory: github.com/google/blueprint/bootstrap.func·003
-# Defined: build/soong/Android.bp:191:1
+# Defined: build/soong/Android.bp:208:1
 
 build .bootstrap/androidbp/test/androidbp.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/androidbp/cmd/androidbp.go $
@@ -130,7 +130,7 @@
 # Variant:
 # Type:    bootstrap_go_binary
 # Factory: github.com/google/blueprint/bootstrap.func·003
-# Defined: build/soong/Android.bp:164:1
+# Defined: build/soong/Android.bp:181:1
 
 build .bootstrap/androidmk/obj/androidmk.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/androidmk/cmd/androidmk/android.go $
@@ -156,7 +156,7 @@
 # Variant:
 # Type:    bootstrap_go_package
 # Factory: github.com/google/blueprint/bootstrap.func·002
-# Defined: build/soong/Android.bp:177:1
+# Defined: build/soong/Android.bp:194:1
 
 build .bootstrap/androidmk-parser/test/android/soong/androidmk/parser.a: $
         g.bootstrap.gc $
@@ -564,6 +564,24 @@
 default .bootstrap/bin/minibp
 
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# Module:  soong
+# Variant:
+# Type:    bootstrap_go_package
+# Factory: github.com/google/blueprint/bootstrap.func·002
+# Defined: build/soong/Android.bp:73:1
+
+build .bootstrap/soong/pkg/android/soong.a: g.bootstrap.gc $
+        ${g.bootstrap.srcDir}/build/soong/doc.go $
+        ${g.bootstrap.srcDir}/build/soong/register.go | ${g.bootstrap.gcCmd} $
+        .bootstrap/blueprint-parser/pkg/github.com/google/blueprint/parser.a $
+        .bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
+        .bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
+        .bootstrap/blueprint/pkg/github.com/google/blueprint.a
+    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg
+    pkgPath = android/soong
+default .bootstrap/soong/pkg/android/soong.a
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 # Module:  soong-art
 # Variant:
 # Type:    bootstrap_go_package
@@ -576,6 +594,7 @@
         .bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
         .bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
         .bootstrap/blueprint/pkg/github.com/google/blueprint.a $
+        .bootstrap/soong/pkg/android/soong.a $
         .bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
         .bootstrap/blueprint-bootstrap-bpdoc/pkg/github.com/google/blueprint/bootstrap/bpdoc.a $
         .bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a $
@@ -584,7 +603,7 @@
         .bootstrap/soong-common/pkg/android/soong/common.a $
         .bootstrap/soong-genrule/pkg/android/soong/genrule.a $
         .bootstrap/soong-cc/pkg/android/soong/cc.a
-    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg -I .bootstrap/soong-cc/pkg
+    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/soong/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg -I .bootstrap/soong-cc/pkg
     pkgPath = android/soong/art
 default .bootstrap/soong-art/pkg/android/soong/art.a
 
@@ -593,7 +612,7 @@
 # Variant:
 # Type:    bootstrap_go_package
 # Factory: github.com/google/blueprint/bootstrap.func·002
-# Defined: build/soong/Android.bp:93:1
+# Defined: build/soong/Android.bp:107:1
 
 build .bootstrap/soong-cc/test/android/soong/cc.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/cc/builder.go $
@@ -611,6 +630,7 @@
         .bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
         .bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
         .bootstrap/blueprint/pkg/github.com/google/blueprint.a $
+        .bootstrap/soong/pkg/android/soong.a $
         .bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
         .bootstrap/blueprint-bootstrap-bpdoc/pkg/github.com/google/blueprint/bootstrap/bpdoc.a $
         .bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a $
@@ -618,7 +638,7 @@
         .bootstrap/soong-glob/pkg/android/soong/glob.a $
         .bootstrap/soong-common/pkg/android/soong/common.a $
         .bootstrap/soong-genrule/pkg/android/soong/genrule.a
-    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg
+    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/soong/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg
     pkgPath = android/soong/cc
 default .bootstrap/soong-cc/test/android/soong/cc.a
 
@@ -637,7 +657,7 @@
 
 build .bootstrap/soong-cc/test/test: g.bootstrap.link $
         .bootstrap/soong-cc/test/test.a | ${g.bootstrap.linkCmd}
-    libDirFlags = -L .bootstrap/soong-cc/test -L .bootstrap/blueprint-parser/pkg -L .bootstrap/blueprint-pathtools/pkg -L .bootstrap/blueprint-proptools/pkg -L .bootstrap/blueprint/pkg -L .bootstrap/blueprint-deptools/pkg -L .bootstrap/blueprint-bootstrap-bpdoc/pkg -L .bootstrap/blueprint-bootstrap/pkg -L .bootstrap/soong-env/pkg -L .bootstrap/soong-glob/pkg -L .bootstrap/soong-common/pkg -L .bootstrap/soong-genrule/pkg
+    libDirFlags = -L .bootstrap/soong-cc/test -L .bootstrap/blueprint-parser/pkg -L .bootstrap/blueprint-pathtools/pkg -L .bootstrap/blueprint-proptools/pkg -L .bootstrap/blueprint/pkg -L .bootstrap/soong/pkg -L .bootstrap/blueprint-deptools/pkg -L .bootstrap/blueprint-bootstrap-bpdoc/pkg -L .bootstrap/blueprint-bootstrap/pkg -L .bootstrap/soong-env/pkg -L .bootstrap/soong-glob/pkg -L .bootstrap/soong-common/pkg -L .bootstrap/soong-genrule/pkg
 default .bootstrap/soong-cc/test/test
 
 build .bootstrap/soong-cc/test/test.passed: g.bootstrap.test $
@@ -662,6 +682,7 @@
         .bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
         .bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
         .bootstrap/blueprint/pkg/github.com/google/blueprint.a $
+        .bootstrap/soong/pkg/android/soong.a $
         .bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
         .bootstrap/blueprint-bootstrap-bpdoc/pkg/github.com/google/blueprint/bootstrap/bpdoc.a $
         .bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a $
@@ -670,7 +691,7 @@
         .bootstrap/soong-common/pkg/android/soong/common.a $
         .bootstrap/soong-genrule/pkg/android/soong/genrule.a || $
         .bootstrap/soong-cc/test/test.passed
-    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg
+    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/soong/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg
     pkgPath = android/soong/cc
 default .bootstrap/soong-cc/pkg/android/soong/cc.a
 
@@ -679,7 +700,7 @@
 # Variant:
 # Type:    bootstrap_go_package
 # Factory: github.com/google/blueprint/bootstrap.func·002
-# Defined: build/soong/Android.bp:72:1
+# Defined: build/soong/Android.bp:85:1
 
 build .bootstrap/soong-common/pkg/android/soong/common.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/common/arch.go $
@@ -698,9 +719,10 @@
         .bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
         .bootstrap/blueprint-bootstrap-bpdoc/pkg/github.com/google/blueprint/bootstrap/bpdoc.a $
         .bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a $
+        .bootstrap/soong/pkg/android/soong.a $
         .bootstrap/soong-env/pkg/android/soong/env.a $
         .bootstrap/soong-glob/pkg/android/soong/glob.a
-    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg
+    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg
     pkgPath = android/soong/common
 default .bootstrap/soong-common/pkg/android/soong/common.a
 
@@ -709,7 +731,7 @@
 # Variant:
 # Type:    bootstrap_go_package
 # Factory: github.com/google/blueprint/bootstrap.func·002
-# Defined: build/soong/Android.bp:41:1
+# Defined: build/soong/Android.bp:42:1
 
 build .bootstrap/soong-env/pkg/android/soong/env.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/env/env.go | ${g.bootstrap.gcCmd}
@@ -721,7 +743,7 @@
 # Variant:
 # Type:    bootstrap_go_package
 # Factory: github.com/google/blueprint/bootstrap.func·002
-# Defined: build/soong/Android.bp:121:1
+# Defined: build/soong/Android.bp:136:1
 
 build .bootstrap/soong-genrule/pkg/android/soong/genrule.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/genrule/genrule.go | $
@@ -730,13 +752,14 @@
         .bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
         .bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
         .bootstrap/blueprint/pkg/github.com/google/blueprint.a $
+        .bootstrap/soong/pkg/android/soong.a $
         .bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
         .bootstrap/blueprint-bootstrap-bpdoc/pkg/github.com/google/blueprint/bootstrap/bpdoc.a $
         .bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a $
         .bootstrap/soong-env/pkg/android/soong/env.a $
         .bootstrap/soong-glob/pkg/android/soong/glob.a $
         .bootstrap/soong-common/pkg/android/soong/common.a
-    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg
+    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/soong/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg
     pkgPath = android/soong/genrule
 default .bootstrap/soong-genrule/pkg/android/soong/genrule.a
 
@@ -745,7 +768,7 @@
 # Variant:
 # Type:    bootstrap_go_package
 # Factory: github.com/google/blueprint/bootstrap.func·002
-# Defined: build/soong/Android.bp:60:1
+# Defined: build/soong/Android.bp:61:1
 
 build .bootstrap/soong-glob/pkg/android/soong/glob.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/glob/glob.go | ${g.bootstrap.gcCmd} $
@@ -760,7 +783,7 @@
 # Variant:
 # Type:    bootstrap_go_package
 # Factory: github.com/google/blueprint/bootstrap.func·002
-# Defined: build/soong/Android.bp:141:1
+# Defined: build/soong/Android.bp:157:1
 
 build .bootstrap/soong-java/pkg/android/soong/java.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/java/app_builder.go $
@@ -774,6 +797,7 @@
         .bootstrap/blueprint-pathtools/pkg/github.com/google/blueprint/pathtools.a $
         .bootstrap/blueprint-proptools/pkg/github.com/google/blueprint/proptools.a $
         .bootstrap/blueprint/pkg/github.com/google/blueprint.a $
+        .bootstrap/soong/pkg/android/soong.a $
         .bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
         .bootstrap/blueprint-bootstrap-bpdoc/pkg/github.com/google/blueprint/bootstrap/bpdoc.a $
         .bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a $
@@ -781,7 +805,7 @@
         .bootstrap/soong-glob/pkg/android/soong/glob.a $
         .bootstrap/soong-common/pkg/android/soong/common.a $
         .bootstrap/soong-genrule/pkg/android/soong/genrule.a
-    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg
+    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/soong/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg
     pkgPath = android/soong/java
 default .bootstrap/soong-java/pkg/android/soong/java.a
 
@@ -802,6 +826,7 @@
         .bootstrap/blueprint-deptools/pkg/github.com/google/blueprint/deptools.a $
         .bootstrap/blueprint-bootstrap-bpdoc/pkg/github.com/google/blueprint/bootstrap/bpdoc.a $
         .bootstrap/blueprint-bootstrap/pkg/github.com/google/blueprint/bootstrap.a $
+        .bootstrap/soong/pkg/android/soong.a $
         .bootstrap/soong-env/pkg/android/soong/env.a $
         .bootstrap/soong-glob/pkg/android/soong/glob.a $
         .bootstrap/soong-common/pkg/android/soong/common.a $
@@ -809,13 +834,13 @@
         .bootstrap/soong-cc/pkg/android/soong/cc.a $
         .bootstrap/soong-art/pkg/android/soong/art.a $
         .bootstrap/soong-java/pkg/android/soong/java.a
-    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg -I .bootstrap/soong-cc/pkg -I .bootstrap/soong-art/pkg -I .bootstrap/soong-java/pkg
+    incFlags = -I .bootstrap/blueprint-parser/pkg -I .bootstrap/blueprint-pathtools/pkg -I .bootstrap/blueprint-proptools/pkg -I .bootstrap/blueprint/pkg -I .bootstrap/blueprint-deptools/pkg -I .bootstrap/blueprint-bootstrap-bpdoc/pkg -I .bootstrap/blueprint-bootstrap/pkg -I .bootstrap/soong/pkg -I .bootstrap/soong-env/pkg -I .bootstrap/soong-glob/pkg -I .bootstrap/soong-common/pkg -I .bootstrap/soong-genrule/pkg -I .bootstrap/soong-cc/pkg -I .bootstrap/soong-art/pkg -I .bootstrap/soong-java/pkg
     pkgPath = soong_build
 default .bootstrap/soong_build/obj/soong_build.a
 
 build .bootstrap/soong_build/obj/a.out: g.bootstrap.link $
         .bootstrap/soong_build/obj/soong_build.a | ${g.bootstrap.linkCmd}
-    libDirFlags = -L .bootstrap/blueprint-parser/pkg -L .bootstrap/blueprint-pathtools/pkg -L .bootstrap/blueprint-proptools/pkg -L .bootstrap/blueprint/pkg -L .bootstrap/blueprint-deptools/pkg -L .bootstrap/blueprint-bootstrap-bpdoc/pkg -L .bootstrap/blueprint-bootstrap/pkg -L .bootstrap/soong-env/pkg -L .bootstrap/soong-glob/pkg -L .bootstrap/soong-common/pkg -L .bootstrap/soong-genrule/pkg -L .bootstrap/soong-cc/pkg -L .bootstrap/soong-art/pkg -L .bootstrap/soong-java/pkg
+    libDirFlags = -L .bootstrap/blueprint-parser/pkg -L .bootstrap/blueprint-pathtools/pkg -L .bootstrap/blueprint-proptools/pkg -L .bootstrap/blueprint/pkg -L .bootstrap/blueprint-deptools/pkg -L .bootstrap/blueprint-bootstrap-bpdoc/pkg -L .bootstrap/blueprint-bootstrap/pkg -L .bootstrap/soong/pkg -L .bootstrap/soong-env/pkg -L .bootstrap/soong-glob/pkg -L .bootstrap/soong-common/pkg -L .bootstrap/soong-genrule/pkg -L .bootstrap/soong-cc/pkg -L .bootstrap/soong-art/pkg -L .bootstrap/soong-java/pkg
 default .bootstrap/soong_build/obj/a.out
 
 build .bootstrap/bin/soong_build: g.bootstrap.cp $
@@ -827,7 +852,7 @@
 # Variant:
 # Type:    bootstrap_go_binary
 # Factory: github.com/google/blueprint/bootstrap.func·003
-# Defined: build/soong/Android.bp:31:1
+# Defined: build/soong/Android.bp:32:1
 
 build .bootstrap/soong_env/obj/soong_env.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/cmd/soong_env/soong_env.go | $
@@ -849,7 +874,7 @@
 # Variant:
 # Type:    bootstrap_go_binary
 # Factory: github.com/google/blueprint/bootstrap.func·003
-# Defined: build/soong/Android.bp:50:1
+# Defined: build/soong/Android.bp:51:1
 
 build .bootstrap/soong_glob/obj/soong_glob.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/cmd/soong_glob/soong_glob.go | $
@@ -875,7 +900,7 @@
 # Variant:
 # Type:    bootstrap_go_binary
 # Factory: github.com/google/blueprint/bootstrap.func·003
-# Defined: build/soong/Android.bp:134:1
+# Defined: build/soong/Android.bp:150:1
 
 build .bootstrap/soong_jar/obj/soong_jar.a: g.bootstrap.gc $
         ${g.bootstrap.srcDir}/build/soong/cmd/soong_jar/soong_jar.go | $
diff --git a/cc/cc.go b/cc/cc.go
index 4b78479..e9d3884 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -27,10 +27,39 @@
 	"github.com/google/blueprint"
 	"github.com/google/blueprint/pathtools"
 
+	"android/soong"
 	"android/soong/common"
 	"android/soong/genrule"
 )
 
+func init() {
+	soong.RegisterModuleType("cc_library_static", CCLibraryStaticFactory)
+	soong.RegisterModuleType("cc_library_shared", CCLibrarySharedFactory)
+	soong.RegisterModuleType("cc_library", CCLibraryFactory)
+	soong.RegisterModuleType("cc_object", CCObjectFactory)
+	soong.RegisterModuleType("cc_binary", CCBinaryFactory)
+	soong.RegisterModuleType("cc_test", CCTestFactory)
+	soong.RegisterModuleType("cc_benchmark", CCBenchmarkFactory)
+
+	soong.RegisterModuleType("toolchain_library", ToolchainLibraryFactory)
+	soong.RegisterModuleType("ndk_prebuilt_library", NdkPrebuiltLibraryFactory)
+	soong.RegisterModuleType("ndk_prebuilt_object", NdkPrebuiltObjectFactory)
+	soong.RegisterModuleType("ndk_prebuilt_static_stl", NdkPrebuiltStaticStlFactory)
+	soong.RegisterModuleType("ndk_prebuilt_shared_stl", NdkPrebuiltSharedStlFactory)
+
+	soong.RegisterModuleType("cc_library_host_static", CCLibraryHostStaticFactory)
+	soong.RegisterModuleType("cc_library_host_shared", CCLibraryHostSharedFactory)
+	soong.RegisterModuleType("cc_binary_host", CCBinaryHostFactory)
+	soong.RegisterModuleType("cc_test_host", CCTestHostFactory)
+	soong.RegisterModuleType("cc_benchmark_host", CCBenchmarkHostFactory)
+
+	// LinkageMutator must be registered after common.ArchMutator, but that is guaranteed by
+	// the Go initialization order because this package depends on common, so common's init
+	// functions will run first.
+	soong.RegisterEarlyMutator("link", LinkageMutator)
+	soong.RegisterEarlyMutator("test_per_src", TestPerSrcMutator)
+}
+
 var (
 	HostPrebuiltTag = pctx.VariableConfigMethod("HostPrebuiltTag", common.Config.PrebuiltOS)
 	SrcDir          = pctx.VariableConfigMethod("SrcDir", common.Config.SrcDir)
diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go
index 9ef0d06..94fb6e7 100644
--- a/cmd/soong_build/main.go
+++ b/cmd/soong_build/main.go
@@ -20,14 +20,16 @@
 	"os"
 	"path/filepath"
 
-	"github.com/google/blueprint"
 	"github.com/google/blueprint/bootstrap"
 
-	"android/soong/art"
-	"android/soong/cc"
+	"android/soong"
+
+	// These imports cause the modules to register their ModuleTypes, etc. with the soong package
+	_ "android/soong/art"
+	_ "android/soong/cc"
 	"android/soong/common"
-	"android/soong/genrule"
-	"android/soong/java"
+	_ "android/soong/genrule"
+	_ "android/soong/java"
 )
 
 func main() {
@@ -36,54 +38,7 @@
 	// The top-level Blueprints file is passed as the first argument.
 	srcDir := filepath.Dir(flag.Arg(0))
 
-	ctx := blueprint.NewContext()
-
-	// Module types
-	ctx.RegisterModuleType("cc_library_static", cc.CCLibraryStaticFactory)
-	ctx.RegisterModuleType("cc_library_shared", cc.CCLibrarySharedFactory)
-	ctx.RegisterModuleType("cc_library", cc.CCLibraryFactory)
-	ctx.RegisterModuleType("cc_object", cc.CCObjectFactory)
-	ctx.RegisterModuleType("cc_binary", cc.CCBinaryFactory)
-	ctx.RegisterModuleType("cc_test", cc.CCTestFactory)
-	ctx.RegisterModuleType("cc_benchmark", cc.CCBenchmarkFactory)
-
-	ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
-	ctx.RegisterModuleType("ndk_prebuilt_library", cc.NdkPrebuiltLibraryFactory)
-	ctx.RegisterModuleType("ndk_prebuilt_object", cc.NdkPrebuiltObjectFactory)
-	ctx.RegisterModuleType("ndk_prebuilt_static_stl", cc.NdkPrebuiltStaticStlFactory)
-	ctx.RegisterModuleType("ndk_prebuilt_shared_stl", cc.NdkPrebuiltSharedStlFactory)
-
-	ctx.RegisterModuleType("cc_library_host_static", cc.CCLibraryHostStaticFactory)
-	ctx.RegisterModuleType("cc_library_host_shared", cc.CCLibraryHostSharedFactory)
-	ctx.RegisterModuleType("cc_binary_host", cc.CCBinaryHostFactory)
-	ctx.RegisterModuleType("cc_test_host", cc.CCTestHostFactory)
-	ctx.RegisterModuleType("cc_benchmark_host", cc.CCBenchmarkHostFactory)
-
-	ctx.RegisterModuleType("gensrcs", genrule.GenSrcsFactory)
-	ctx.RegisterModuleType("genrule", genrule.GenRuleFactory)
-
-	ctx.RegisterModuleType("art_cc_library", art.ArtCCLibraryFactory)
-	ctx.RegisterModuleType("art_cc_binary", art.ArtCCBinaryFactory)
-
-	ctx.RegisterModuleType("java_library", java.JavaLibraryFactory)
-	ctx.RegisterModuleType("java_library_static", java.JavaLibraryFactory)
-	ctx.RegisterModuleType("java_library_host", java.JavaLibraryHostFactory)
-	ctx.RegisterModuleType("java_binary", java.JavaBinaryFactory)
-	ctx.RegisterModuleType("java_binary_host", java.JavaBinaryHostFactory)
-	ctx.RegisterModuleType("prebuilt_java_library", java.JavaPrebuiltFactory)
-	ctx.RegisterModuleType("prebuilt_sdk", java.SdkPrebuiltFactory)
-	ctx.RegisterModuleType("android_app", java.AndroidAppFactory)
-
-	// Mutators
-	ctx.RegisterEarlyMutator("host_or_device", common.HostOrDeviceMutator)
-	ctx.RegisterEarlyMutator("arch", common.ArchMutator)
-	ctx.RegisterEarlyMutator("link", cc.LinkageMutator)
-	ctx.RegisterEarlyMutator("test_per_src", cc.TestPerSrcMutator)
-
-	// Singletons
-	ctx.RegisterSingletonType("buildtarget", common.BuildTargetSingleton)
-	ctx.RegisterSingletonType("env", common.EnvSingleton)
-	ctx.RegisterSingletonType("logtags", java.LogtagsSingleton)
+	ctx := soong.NewContext()
 
 	configuration, err := common.NewConfig(srcDir)
 	if err != nil {
diff --git a/common/arch.go b/common/arch.go
index 6865904..c0e63eb 100644
--- a/common/arch.go
+++ b/common/arch.go
@@ -20,10 +20,17 @@
 	"runtime"
 	"strings"
 
+	"android/soong"
+
 	"github.com/google/blueprint"
 	"github.com/google/blueprint/proptools"
 )
 
+func init() {
+	soong.RegisterEarlyMutator("host_or_device", HostOrDeviceMutator)
+	soong.RegisterEarlyMutator("arch", ArchMutator)
+}
+
 var (
 	Arm    = newArch("arm", "lib32")
 	Arm64  = newArch("arm64", "lib64")
diff --git a/common/env.go b/common/env.go
index e33a025..3214baa 100644
--- a/common/env.go
+++ b/common/env.go
@@ -15,6 +15,7 @@
 package common
 
 import (
+	"android/soong"
 	"android/soong/env"
 
 	"github.com/google/blueprint"
@@ -27,6 +28,10 @@
 // compare the contents of the environment variables, rewriting the file if necessary to cause
 // a manifest regeneration.
 
+func init() {
+	soong.RegisterSingletonType("env", EnvSingleton)
+}
+
 func EnvSingleton() blueprint.Singleton {
 	return &envSingleton{}
 }
diff --git a/common/module.go b/common/module.go
index 1d17de1..b19b6d1 100644
--- a/common/module.go
+++ b/common/module.go
@@ -15,6 +15,7 @@
 package common
 
 import (
+	"android/soong"
 	"path/filepath"
 	"runtime"
 	"sort"
@@ -520,6 +521,10 @@
 	return ret
 }
 
+func init() {
+	soong.RegisterSingletonType("buildtarget", BuildTargetSingleton)
+}
+
 func BuildTargetSingleton() blueprint.Singleton {
 	return &buildTargetSingleton{}
 }
diff --git a/genrule/genrule.go b/genrule/genrule.go
index 2052dfd..a5a4c71 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -20,9 +20,15 @@
 	"github.com/google/blueprint"
 	"github.com/google/blueprint/pathtools"
 
+	"android/soong"
 	"android/soong/common"
 )
 
+func init() {
+	soong.RegisterModuleType("gensrcs", GenSrcsFactory)
+	soong.RegisterModuleType("genrule", GenRuleFactory)
+}
+
 var (
 	pctx = blueprint.NewPackageContext("android/soong/genrule")
 )
diff --git a/java/java.go b/java/java.go
index 94f6914..8b50eff 100644
--- a/java/java.go
+++ b/java/java.go
@@ -26,10 +26,24 @@
 	"github.com/google/blueprint"
 	"github.com/google/blueprint/pathtools"
 
+	"android/soong"
 	"android/soong/common"
 	"android/soong/genrule"
 )
 
+func init() {
+	soong.RegisterModuleType("java_library", JavaLibraryFactory)
+	soong.RegisterModuleType("java_library_static", JavaLibraryFactory)
+	soong.RegisterModuleType("java_library_host", JavaLibraryHostFactory)
+	soong.RegisterModuleType("java_binary", JavaBinaryFactory)
+	soong.RegisterModuleType("java_binary_host", JavaBinaryHostFactory)
+	soong.RegisterModuleType("prebuilt_java_library", JavaPrebuiltFactory)
+	soong.RegisterModuleType("prebuilt_sdk", SdkPrebuiltFactory)
+	soong.RegisterModuleType("android_app", AndroidAppFactory)
+
+	soong.RegisterSingletonType("logtags", LogtagsSingleton)
+}
+
 // TODO:
 // Autogenerated files:
 //  Proto
diff --git a/register.go b/register.go
new file mode 100644
index 0000000..c35beae
--- /dev/null
+++ b/register.go
@@ -0,0 +1,68 @@
+// Copyright 2015 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package soong
+
+import "github.com/google/blueprint"
+
+type moduleType struct {
+	name    string
+	factory blueprint.ModuleFactory
+}
+
+var moduleTypes []moduleType
+
+type singleton struct {
+	name    string
+	factory blueprint.SingletonFactory
+}
+
+var singletons []singleton
+
+type earlyMutator struct {
+	name    string
+	mutator blueprint.EarlyMutator
+}
+
+var earlyMutators []earlyMutator
+
+func RegisterModuleType(name string, factory blueprint.ModuleFactory) {
+	moduleTypes = append(moduleTypes, moduleType{name, factory})
+}
+
+func RegisterSingletonType(name string, factory blueprint.SingletonFactory) {
+	singletons = append(singletons, singleton{name, factory})
+}
+
+func RegisterEarlyMutator(name string, mutator blueprint.EarlyMutator) {
+	earlyMutators = append(earlyMutators, earlyMutator{name, mutator})
+}
+
+func NewContext() *blueprint.Context {
+	ctx := blueprint.NewContext()
+
+	for _, t := range moduleTypes {
+		ctx.RegisterModuleType(t.name, t.factory)
+	}
+
+	for _, t := range singletons {
+		ctx.RegisterSingletonType(t.name, t.factory)
+	}
+
+	for _, t := range earlyMutators {
+		ctx.RegisterEarlyMutator(t.name, t.mutator)
+	}
+
+	return ctx
+}