github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/cc/gen.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  package cc
    16  
    17  // This file generates the final rules for compiling all C/C++.  All properties related to
    18  // compiling should have been translated into builderFlags or another argument to the Transform*
    19  // functions.
    20  
    21  import (
    22  	"github.com/google/blueprint"
    23  
    24  	"android/soong/android"
    25  )
    26  
    27  func init() {
    28  	pctx.SourcePathVariable("lexCmd", "prebuilts/misc/${config.HostPrebuiltTag}/flex/flex-2.5.39")
    29  	pctx.SourcePathVariable("yaccCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/bison")
    30  	pctx.SourcePathVariable("yaccDataDir", "prebuilts/build-tools/common/bison")
    31  
    32  	pctx.HostBinToolVariable("aidlCmd", "aidl-cpp")
    33  }
    34  
    35  var (
    36  	yacc = pctx.AndroidStaticRule("yacc",
    37  		blueprint.RuleParams{
    38  			Command:     "BISON_PKGDATADIR=$yaccDataDir $yaccCmd -d $yaccFlags --defines=$hFile -o $out $in",
    39  			CommandDeps: []string{"$yaccCmd"},
    40  		},
    41  		"yaccFlags", "hFile")
    42  
    43  	lex = pctx.AndroidStaticRule("lex",
    44  		blueprint.RuleParams{
    45  			Command:     "$lexCmd -o$out $in",
    46  			CommandDeps: []string{"$lexCmd"},
    47  		})
    48  
    49  	aidl = pctx.AndroidStaticRule("aidl",
    50  		blueprint.RuleParams{
    51  			Command:     "$aidlCmd -d${out}.d -ninja $aidlFlags $in $outDir $out",
    52  			CommandDeps: []string{"$aidlCmd"},
    53  			Depfile:     "${out}.d",
    54  			Deps:        blueprint.DepsGCC,
    55  		},
    56  		"aidlFlags", "outDir")
    57  
    58  	windmc = pctx.AndroidStaticRule("windmc",
    59  		blueprint.RuleParams{
    60  			Command:     "$windmcCmd -r$$(dirname $out) -h$$(dirname $out) $in",
    61  			CommandDeps: []string{"$windmcCmd"},
    62  		},
    63  		"windmcCmd")
    64  )
    65  
    66  func genYacc(ctx android.ModuleContext, yaccFile android.Path, outFile android.ModuleGenPath, yaccFlags string) (headerFile android.ModuleGenPath) {
    67  	headerFile = android.GenPathWithExt(ctx, "yacc", yaccFile, "h")
    68  
    69  	ctx.Build(pctx, android.BuildParams{
    70  		Rule:           yacc,
    71  		Description:    "yacc " + yaccFile.Rel(),
    72  		Output:         outFile,
    73  		ImplicitOutput: headerFile,
    74  		Input:          yaccFile,
    75  		Args: map[string]string{
    76  			"yaccFlags": yaccFlags,
    77  			"hFile":     headerFile.String(),
    78  		},
    79  	})
    80  
    81  	return headerFile
    82  }
    83  
    84  func genAidl(ctx android.ModuleContext, aidlFile android.Path, outFile android.ModuleGenPath, aidlFlags string) android.Paths {
    85  
    86  	ctx.Build(pctx, android.BuildParams{
    87  		Rule:        aidl,
    88  		Description: "aidl " + aidlFile.Rel(),
    89  		Output:      outFile,
    90  		Input:       aidlFile,
    91  		Args: map[string]string{
    92  			"aidlFlags": aidlFlags,
    93  			"outDir":    android.PathForModuleGen(ctx, "aidl").String(),
    94  		},
    95  	})
    96  
    97  	// TODO: This should return the generated headers, not the source file.
    98  	return android.Paths{outFile}
    99  }
   100  
   101  func genLex(ctx android.ModuleContext, lexFile android.Path, outFile android.ModuleGenPath) {
   102  	ctx.Build(pctx, android.BuildParams{
   103  		Rule:        lex,
   104  		Description: "lex " + lexFile.Rel(),
   105  		Output:      outFile,
   106  		Input:       lexFile,
   107  	})
   108  }
   109  
   110  func genWinMsg(ctx android.ModuleContext, srcFile android.Path, flags builderFlags) (android.Path, android.Path) {
   111  	headerFile := android.GenPathWithExt(ctx, "windmc", srcFile, "h")
   112  	rcFile := android.GenPathWithExt(ctx, "windmc", srcFile, "rc")
   113  
   114  	windmcCmd := gccCmd(flags.toolchain, "windmc")
   115  
   116  	ctx.Build(pctx, android.BuildParams{
   117  		Rule:           windmc,
   118  		Description:    "windmc " + srcFile.Rel(),
   119  		Output:         rcFile,
   120  		ImplicitOutput: headerFile,
   121  		Input:          srcFile,
   122  		Args: map[string]string{
   123  			"windmcCmd": windmcCmd,
   124  		},
   125  	})
   126  
   127  	return rcFile, headerFile
   128  }
   129  
   130  func genSources(ctx android.ModuleContext, srcFiles android.Paths,
   131  	buildFlags builderFlags) (android.Paths, android.Paths) {
   132  
   133  	var deps android.Paths
   134  
   135  	var rsFiles android.Paths
   136  
   137  	for i, srcFile := range srcFiles {
   138  		switch srcFile.Ext() {
   139  		case ".y":
   140  			cFile := android.GenPathWithExt(ctx, "yacc", srcFile, "c")
   141  			srcFiles[i] = cFile
   142  			deps = append(deps, genYacc(ctx, srcFile, cFile, buildFlags.yaccFlags))
   143  		case ".yy":
   144  			cppFile := android.GenPathWithExt(ctx, "yacc", srcFile, "cpp")
   145  			srcFiles[i] = cppFile
   146  			deps = append(deps, genYacc(ctx, srcFile, cppFile, buildFlags.yaccFlags))
   147  		case ".l":
   148  			cFile := android.GenPathWithExt(ctx, "lex", srcFile, "c")
   149  			srcFiles[i] = cFile
   150  			genLex(ctx, srcFile, cFile)
   151  		case ".ll":
   152  			cppFile := android.GenPathWithExt(ctx, "lex", srcFile, "cpp")
   153  			srcFiles[i] = cppFile
   154  			genLex(ctx, srcFile, cppFile)
   155  		case ".proto":
   156  			ccFile, headerFile := genProto(ctx, srcFile, buildFlags.protoFlags,
   157  				buildFlags.protoOutParams, buildFlags.protoRoot)
   158  			srcFiles[i] = ccFile
   159  			deps = append(deps, headerFile)
   160  		case ".aidl":
   161  			cppFile := android.GenPathWithExt(ctx, "aidl", srcFile, "cpp")
   162  			srcFiles[i] = cppFile
   163  			deps = append(deps, genAidl(ctx, srcFile, cppFile, buildFlags.aidlFlags)...)
   164  		case ".rs", ".fs":
   165  			cppFile := rsGeneratedCppFile(ctx, srcFile)
   166  			rsFiles = append(rsFiles, srcFiles[i])
   167  			srcFiles[i] = cppFile
   168  		case ".mc":
   169  			rcFile, headerFile := genWinMsg(ctx, srcFile, buildFlags)
   170  			srcFiles[i] = rcFile
   171  			deps = append(deps, headerFile)
   172  		}
   173  	}
   174  
   175  	if len(rsFiles) > 0 {
   176  		deps = append(deps, rsGenerateCpp(ctx, rsFiles, buildFlags.rsFlags)...)
   177  	}
   178  
   179  	return srcFiles, deps
   180  }