bp2build: export some cc toolchain flags into Starlark.
This CL exports common/global/device/host clang/ld/ldd flags
from their Ninja variable initialization locations in
cc/config/global.go and cc/config/clang.go to make Bazel's cc_toolchain
and Soong's cc actions more consistent with each other.
This does not handle env-dependent or arch-specific toolchain flags
yet (logic in compiler.go and linker.go).
Test: TH
Bug: 187086342
Bug: 187084737
Bug: 186628704
Bug: 187857770
Change-Id: Ie403d7cd23f35160897b9dd902c799cbf1bd7f0c
diff --git a/bp2build/Android.bp b/bp2build/Android.bp
index abd79f5..3abbc4c 100644
--- a/bp2build/Android.bp
+++ b/bp2build/Android.bp
@@ -20,6 +20,7 @@
"soong-android",
"soong-bazel",
"soong-cc",
+ "soong-cc-config",
"soong-genrule",
"soong-python",
"soong-sh",
diff --git a/bp2build/bp2build.go b/bp2build/bp2build.go
index cf6994f..59c5acd 100644
--- a/bp2build/bp2build.go
+++ b/bp2build/bp2build.go
@@ -24,22 +24,16 @@
// writing .bzl files that are equivalent to Android.bp files that are capable
// of being built with Bazel.
func Codegen(ctx *CodegenContext) CodegenMetrics {
- outputDir := android.PathForOutput(ctx, "bp2build")
- android.RemoveAllOutputDir(outputDir)
+ // This directory stores BUILD files that could be eventually checked-in.
+ bp2buildDir := android.PathForOutput(ctx, "bp2build")
+ android.RemoveAllOutputDir(bp2buildDir)
buildToTargets, metrics := GenerateBazelTargets(ctx, true)
+ bp2buildFiles := CreateBazelFiles(nil, buildToTargets, ctx.mode)
+ writeFiles(ctx, bp2buildDir, bp2buildFiles)
- filesToWrite := CreateBazelFiles(nil, buildToTargets, ctx.mode)
-
- generatedBuildFiles := []string{}
- for _, f := range filesToWrite {
- p := getOrCreateOutputDir(outputDir, ctx, f.Dir).Join(ctx, f.Basename)
- if err := writeFile(ctx, p, f.Contents); err != nil {
- panic(fmt.Errorf("Failed to write %q (dir %q) due to %q", f.Basename, f.Dir, err))
- }
- // if these generated files are modified, regenerate on next run.
- generatedBuildFiles = append(generatedBuildFiles, p.String())
- }
+ soongInjectionDir := android.PathForOutput(ctx, "soong_injection")
+ writeFiles(ctx, soongInjectionDir, CreateSoongInjectionFiles())
return metrics
}
@@ -51,6 +45,16 @@
return dirPath
}
+// writeFiles materializes a list of BazelFile rooted at outputDir.
+func writeFiles(ctx android.PathContext, outputDir android.OutputPath, files []BazelFile) {
+ for _, f := range files {
+ p := getOrCreateOutputDir(outputDir, ctx, f.Dir).Join(ctx, f.Basename)
+ if err := writeFile(ctx, p, f.Contents); err != nil {
+ panic(fmt.Errorf("Failed to write %q (dir %q) due to %q", f.Basename, f.Dir, err))
+ }
+ }
+}
+
func writeFile(ctx android.PathContext, pathToFile android.OutputPath, content string) error {
// These files are made editable to allow users to modify and iterate on them
// in the source tree.
diff --git a/bp2build/conversion.go b/bp2build/conversion.go
index d67ab3d..eb83b38 100644
--- a/bp2build/conversion.go
+++ b/bp2build/conversion.go
@@ -2,6 +2,7 @@
import (
"android/soong/android"
+ "android/soong/cc/config"
"fmt"
"reflect"
"sort"
@@ -16,6 +17,15 @@
Contents string
}
+func CreateSoongInjectionFiles() []BazelFile {
+ var files []BazelFile
+
+ files = append(files, newFile("cc_toolchain", "BUILD", "")) // Creates a //cc_toolchain package.
+ files = append(files, newFile("cc_toolchain", "constants.bzl", config.BazelCcToolchainVars()))
+
+ return files
+}
+
func CreateBazelFiles(
ruleShims map[string]RuleShim,
buildToTargets map[string]BazelTargets,
diff --git a/bp2build/conversion_test.go b/bp2build/conversion_test.go
index 262a488..a08c03d 100644
--- a/bp2build/conversion_test.go
+++ b/bp2build/conversion_test.go
@@ -79,9 +79,33 @@
}
}
-func TestCreateBazelFiles_Bp2Build_CreatesNoFilesWithNoTargets(t *testing.T) {
- files := CreateBazelFiles(map[string]RuleShim{}, map[string]BazelTargets{}, Bp2Build)
- if len(files) != 0 {
- t.Errorf("Expected no files, got %d", len(files))
+func TestCreateBazelFiles_Bp2Build_CreatesDefaultFiles(t *testing.T) {
+ files := CreateSoongInjectionFiles()
+
+ expectedFilePaths := []bazelFilepath{
+ {
+ dir: "cc_toolchain",
+ basename: "BUILD",
+ },
+ {
+ dir: "cc_toolchain",
+ basename: "constants.bzl",
+ },
+ }
+
+ if len(files) != len(expectedFilePaths) {
+ t.Errorf("Expected %d file, got %d", len(expectedFilePaths), len(files))
+ }
+
+ for i := range files {
+ actualFile, expectedFile := files[i], expectedFilePaths[i]
+
+ if actualFile.Dir != expectedFile.dir || actualFile.Basename != expectedFile.basename {
+ t.Errorf("Did not find expected file %s/%s", actualFile.Dir, actualFile.Basename)
+ }
+
+ if expectedFile.basename != "BUILD" && actualFile.Contents == "" {
+ t.Errorf("Contents of %s unexpected empty.", actualFile)
+ }
}
}