Home | History | Annotate | Download | only in cc
      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/common"
     25 )
     26 
     27 func init() {
     28 	pctx.SourcePathVariable("lexCmd", "prebuilts/misc/${HostPrebuiltTag}/flex/flex-2.5.39")
     29 	pctx.SourcePathVariable("yaccCmd", "prebuilts/misc/${HostPrebuiltTag}/bison/bison")
     30 	pctx.SourcePathVariable("yaccDataDir", "external/bison/data")
     31 }
     32 
     33 var (
     34 	yacc = pctx.StaticRule("yacc",
     35 		blueprint.RuleParams{
     36 			Command:     "BISON_PKGDATADIR=$yaccDataDir $yaccCmd -d $yaccFlags --defines=$hFile -o $cFile $in",
     37 			CommandDeps: []string{"$yaccCmd"},
     38 			Description: "yacc $out",
     39 		},
     40 		"yaccFlags", "cFile", "hFile")
     41 
     42 	lex = pctx.StaticRule("lex",
     43 		blueprint.RuleParams{
     44 			Command:     "$lexCmd -o$out $in",
     45 			CommandDeps: []string{"$lexCmd"},
     46 			Description: "lex $out",
     47 		})
     48 )
     49 
     50 func genYacc(ctx common.AndroidModuleContext, yaccFile common.Path, outFile common.ModuleGenPath, yaccFlags string) (headerFile common.ModuleGenPath) {
     51 	headerFile = common.GenPathWithExt(ctx, yaccFile, "h")
     52 
     53 	ctx.ModuleBuild(pctx, common.ModuleBuildParams{
     54 		Rule:    yacc,
     55 		Outputs: common.WritablePaths{outFile, headerFile},
     56 		Input:   yaccFile,
     57 		Args: map[string]string{
     58 			"yaccFlags": yaccFlags,
     59 			"cFile":     outFile.String(),
     60 			"hFile":     headerFile.String(),
     61 		},
     62 	})
     63 
     64 	return headerFile
     65 }
     66 
     67 func genLex(ctx common.AndroidModuleContext, lexFile common.Path, outFile common.ModuleGenPath) {
     68 	ctx.ModuleBuild(pctx, common.ModuleBuildParams{
     69 		Rule:   lex,
     70 		Output: outFile,
     71 		Input:  lexFile,
     72 	})
     73 }
     74 
     75 func genSources(ctx common.AndroidModuleContext, srcFiles common.Paths,
     76 	buildFlags builderFlags) (common.Paths, common.Paths) {
     77 
     78 	var deps common.Paths
     79 
     80 	for i, srcFile := range srcFiles {
     81 		switch srcFile.Ext() {
     82 		case ".y":
     83 			cFile := common.GenPathWithExt(ctx, srcFile, "c")
     84 			srcFiles[i] = cFile
     85 			deps = append(deps, genYacc(ctx, srcFile, cFile, buildFlags.yaccFlags))
     86 		case ".yy":
     87 			cppFile := common.GenPathWithExt(ctx, srcFile, "cpp")
     88 			srcFiles[i] = cppFile
     89 			deps = append(deps, genYacc(ctx, srcFile, cppFile, buildFlags.yaccFlags))
     90 		case ".l":
     91 			cFile := common.GenPathWithExt(ctx, srcFile, "c")
     92 			srcFiles[i] = cFile
     93 			genLex(ctx, srcFile, cFile)
     94 		case ".ll":
     95 			cppFile := common.GenPathWithExt(ctx, srcFile, "cpp")
     96 			srcFiles[i] = cppFile
     97 			genLex(ctx, srcFile, cppFile)
     98 		}
     99 	}
    100 
    101 	return srcFiles, deps
    102 }
    103