aboutsummaryrefslogtreecommitdiffstats
path: root/genrule
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2015-03-18 13:28:46 -0700
committerColin Cross <ccross@android.com>2015-03-19 10:51:41 -0700
commit5049f02e6040f38aff9722579fc7cc8c05ff9885 (patch)
tree5b2a99cc229bfdf5d598536b5b4402979fd3529c /genrule
parent70a255f3c9f9f549740befff8f3ec1974102df5e (diff)
downloadbuild_soong-5049f02e6040f38aff9722579fc7cc8c05ff9885.tar.gz
build_soong-5049f02e6040f38aff9722579fc7cc8c05ff9885.tar.bz2
build_soong-5049f02e6040f38aff9722579fc7cc8c05ff9885.zip
Add gensrcs module type
gensrcs allows sources to be generated by a specified command. Change-Id: I725086fcdcd72bfe6c07fb8903e7b520678a247f
Diffstat (limited to 'genrule')
-rw-r--r--genrule/genrule.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/genrule/genrule.go b/genrule/genrule.go
new file mode 100644
index 00000000..6c8d75b4
--- /dev/null
+++ b/genrule/genrule.go
@@ -0,0 +1,97 @@
+// 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 genrule
+
+import (
+ "path/filepath"
+
+ "blueprint"
+ "blueprint/pathtools"
+
+ "android/soong/common"
+)
+
+type Config interface {
+ SrcDir() string
+}
+
+var (
+ pctx = blueprint.NewPackageContext("android/soong/genrule")
+)
+
+func init() {
+ pctx.VariableConfigMethod("srcDir", Config.SrcDir)
+}
+
+type SourceFileGenerator interface {
+ GeneratedSourceFiles() []string
+}
+
+type genSrcsProperties struct {
+ // cmd: command to run on each input file. Available variables for substitution:
+ // $in: an input file
+ // $out: the corresponding output file
+ // $srcDir: the root directory of the source tree
+ Cmd string
+
+ // srcs: list of input files
+ Srcs []string
+
+ // output_extension: extension that will be substituted for each output file
+ Output_extension string
+}
+
+func NewGenSrcs() (blueprint.Module, []interface{}) {
+ module := &genSrcs{}
+
+ return common.InitAndroidModule(module, &module.properties)
+}
+
+type genSrcs struct {
+ common.AndroidModuleBase
+
+ properties genSrcsProperties
+ outputFiles []string
+}
+
+func (g *genSrcs) GenerateAndroidBuildActions(ctx common.AndroidModuleContext) {
+ rule := ctx.Rule(pctx, "genSrcs", blueprint.RuleParams{
+ Command: g.properties.Cmd,
+ })
+
+ srcFiles := g.properties.Srcs
+ srcFiles = pathtools.PrefixPaths(srcFiles, common.ModuleSrcDir(ctx))
+ srcFiles = common.ExpandGlobs(ctx, srcFiles)
+
+ g.outputFiles = make([]string, 0, len(srcFiles))
+
+ for _, in := range srcFiles {
+ out := pathtools.ReplaceExtension(in, g.properties.Output_extension)
+ out = filepath.Join(common.ModuleGenDir(ctx), out)
+ g.outputFiles = append(g.outputFiles, out)
+ ctx.Build(pctx, blueprint.BuildParams{
+ Rule: rule,
+ Inputs: []string{in},
+ Outputs: []string{out},
+ // TODO: visit dependencies to add implicit dependencies on required tools
+ })
+ }
+}
+
+var _ SourceFileGenerator = (*genSrcs)(nil)
+
+func (g *genSrcs) GeneratedSourceFiles() []string {
+ return g.outputFiles
+}