From 484e50aa7cc0b064d6569c5c75e20cf846d207b1 Mon Sep 17 00:00:00 2001 From: Chris Parsons Date: Thu, 13 May 2021 15:13:04 -0400 Subject: [PATCH] bp2build: support generated sources and hdrs There are two pieces to make this work: 1. Local include paths must include $(BINDIR)-relative paths, to support generated headers in those directories. 2. The srcs that bp2build outputs for BUILD targets must include labels for targets given in generated_hdrs and generated_srcs. Support for exported_generated_hdrs intentionally deferred. This allows us to remove several targets from the bp2build denylist. Some are moved to the mixed build denylist, because genreated headers are still unsupported in mixed builds. Test: bp2build.sh CI script Change-Id: Ib4f9dac20f6445487b8dad53b91eac01f437a590 --- android/bazel.go | 14 +- bazel/properties.go | 8 + bp2build/cc_library_conversion_test.go | 45 +++- .../cc_library_headers_conversion_test.go | 75 ++++-- bp2build/cc_library_static_conversion_test.go | 243 ++++++++++++++++-- bp2build/cc_object_conversion_test.go | 9 + cc/bp2build.go | 53 +++- 7 files changed, 379 insertions(+), 68 deletions(-) diff --git a/android/bazel.go b/android/bazel.go index ba29f6d0f..4f8392d1f 100644 --- a/android/bazel.go +++ b/android/bazel.go @@ -160,13 +160,7 @@ var ( // Per-module denylist to always opt modules out of both bp2build and mixed builds. bp2buildModuleDoNotConvertList = []string{ // Things that transitively depend on unconverted libc_* modules. - "libc_nopthread", // http://b/186821550, cc_library_static, depends on //bionic/libc:libc_bionic_ndk (http://b/186822256) - // also depends on //bionic/libc:libc_tzcode (http://b/186822591) - // also depends on //bionic/libc:libstdc++ (http://b/186822597) - "libc_common", // http://b/186821517, cc_library_static, depends on //bionic/libc:libc_nopthread (http://b/186821550) - "libc_common_static", // http://b/186824119, cc_library_static, depends on //bionic/libc:libc_common (http://b/186821517) - "libc_common_shared", // http://b/186824118, cc_library_static, depends on //bionic/libc:libc_common (http://b/186821517) - "libc_nomalloc", // http://b/186825031, cc_library_static, depends on //bionic/libc:libc_common (http://b/186821517) + "libc_nomalloc", // http://b/186825031, cc_library_static, depends on //bionic/libc:libc_common (http://b/186821517) "libbionic_spawn_benchmark", // http://b/186824595, cc_library_static, depends on //external/google-benchmark (http://b/186822740) // also depends on //system/logging/liblog:liblog (http://b/186822772) @@ -189,7 +183,6 @@ var ( "libc_jemalloc_wrapper", // http://b/187012490, cc_library_static, depends on //external/jemalloc_new:libjemalloc5 (http://b/186828626) "libc_ndk", // http://b/187013218, cc_library_static, depends on //bionic/libm:libm (http://b/183064661) "libc", // http://b/183064430, cc_library, depends on //external/jemalloc_new:libjemalloc5 (http://b/186828626) - "libc_bionic_ndk", // http://b/186822256, cc_library_static, fatal error: 'generated_android_ids.h' file not found "libc_malloc_hooks", // http://b/187016307, cc_library, ld.lld: error: undefined symbol: __malloc_hook "libm", // http://b/183064661, cc_library, math.h:25:16: error: unexpected token in argument list @@ -230,7 +223,12 @@ var ( // Per-module denylist to opt modules out of mixed builds. Such modules will // still be generated via bp2build. mixedBuildsDisabledList = []string{ + "libc_bionic_ndk", // cparsons@, http://b/183213331, Handle generated headers in mixed builds. + "libc_common", // cparsons@ cc_library_static, depends on //bionic/libc:libc_nopthread + "libc_common_static", // cparsons@ cc_library_static, depends on //bionic/libc:libc_common + "libc_common_shared", // cparsons@ cc_library_static, depends on //bionic/libc:libc_common "libc_netbsd", // lberki@, cc_library_static, version script assignment of 'LIBC_PRIVATE' to symbol 'SHA1Final' failed: symbol not defined + "libc_nopthread", // cparsons@ cc_library_static, depends on //bionic/libc:libc_bionic_ndk "libc_openbsd", // ruperts@, cc_library_static, OK for bp2build but error: duplicate symbol: strcpy for mixed builds "libsystemproperties", // cparsons@, cc_library_static, wrong include paths "libpropertyinfoparser", // cparsons@, cc_library_static, wrong include paths diff --git a/bazel/properties.go b/bazel/properties.go index a71b12bfd..3e778bb69 100644 --- a/bazel/properties.go +++ b/bazel/properties.go @@ -160,6 +160,14 @@ func SubtractBazelLabels(haystack []Label, needle []Label) []Label { return labels } +// Appends two LabelLists, returning the combined list. +func AppendBazelLabelLists(a LabelList, b LabelList) LabelList { + var result LabelList + result.Includes = append(a.Includes, b.Includes...) + result.Excludes = append(a.Excludes, b.Excludes...) + return result +} + // Subtract needle from haystack func SubtractBazelLabelList(haystack LabelList, needle LabelList) LabelList { var result LabelList diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index 8afc82bb7..da5444cf9 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -113,6 +113,7 @@ cc_library { copts = [ "-Wall", "-I.", + "-I$(BINDIR)/.", ], deps = [":some-headers"], includes = ["foo-dir"], @@ -183,6 +184,7 @@ cc_library { "-Wunused", "-Werror", "-I.", + "-I$(BINDIR)/.", ], deps = [":libc_headers"], linkopts = [ @@ -242,7 +244,10 @@ cc_library { bp: soongCcLibraryPreamble, expectedBazelTargets: []string{`cc_library( name = "fake-libarm-optimized-routines-math", - copts = ["-Iexternal"] + select({ + copts = [ + "-Iexternal", + "-I$(BINDIR)/external", + ] + select({ "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"], "//conditions:default": [], }), @@ -310,6 +315,7 @@ cc_library { name: "shared_dep_for_both" } copts = [ "bothflag", "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", ], deps = [":static_dep_for_both"], dynamic_deps = [":shared_dep_for_both"], @@ -347,7 +353,10 @@ cc_library { bp: soongCcLibraryPreamble, expectedBazelTargets: []string{`cc_library( name = "a", - copts = ["-Ifoo/bar"], + copts = [ + "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", + ], srcs = ["a.cpp"], version_script = "v.map", )`}, @@ -380,7 +389,10 @@ cc_library { bp: soongCcLibraryPreamble, expectedBazelTargets: []string{`cc_library( name = "a", - copts = ["-Ifoo/bar"], + copts = [ + "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", + ], srcs = ["a.cpp"], version_script = select({ "//build/bazel/platforms/arch:arm": "arm.map", @@ -413,11 +425,17 @@ cc_library { bp: soongCcLibraryPreamble, expectedBazelTargets: []string{`cc_library( name = "a", - copts = ["-Ifoo/bar"], + copts = [ + "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", + ], dynamic_deps = [":mylib"], )`, `cc_library( name = "mylib", - copts = ["-Ifoo/bar"], + copts = [ + "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", + ], )`}, }, { @@ -461,12 +479,18 @@ cc_library { bp: soongCcLibraryPreamble, expectedBazelTargets: []string{`cc_library( name = "a", - copts = ["-Ifoo/bar"], + copts = [ + "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", + ], linkopts = ["-Wl,--pack-dyn-relocs=none"], srcs = ["a.cpp"], )`, `cc_library( name = "b", - copts = ["-Ifoo/bar"], + copts = [ + "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", + ], linkopts = select({ "//build/bazel/platforms/arch:x86_64": ["-Wl,--pack-dyn-relocs=none"], "//conditions:default": [], @@ -474,7 +498,10 @@ cc_library { srcs = ["b.cpp"], )`, `cc_library( name = "c", - copts = ["-Ifoo/bar"], + copts = [ + "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", + ], linkopts = select({ "//build/bazel/platforms/os:darwin": ["-Wl,--pack-dyn-relocs=none"], "//conditions:default": [], @@ -505,6 +532,7 @@ cc_library { "-include", "header.h", "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", ], )`}, }, @@ -548,6 +576,7 @@ cc_library { "-fsigned-char", "-pedantic", "-Ifoo/bar", + "-I$(BINDIR)/foo/bar", ] + select({ "//build/bazel/platforms/arch:arm64": ["-DARM64=1"], "//conditions:default": [], diff --git a/bp2build/cc_library_headers_conversion_test.go b/bp2build/cc_library_headers_conversion_test.go index 0905aba1f..1202da64c 100644 --- a/bp2build/cc_library_headers_conversion_test.go +++ b/bp2build/cc_library_headers_conversion_test.go @@ -131,7 +131,10 @@ cc_library_headers { }`, expectedBazelTargets: []string{`cc_library_headers( name = "foo_headers", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], deps = [ ":lib-1", ":lib-2", @@ -147,11 +150,17 @@ cc_library_headers { }), )`, `cc_library_headers( name = "lib-1", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], includes = ["lib-1"], )`, `cc_library_headers( name = "lib-2", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], includes = ["lib-2"], )`}, }, @@ -185,16 +194,28 @@ cc_library_headers { }`, expectedBazelTargets: []string{`cc_library_headers( name = "android-lib", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], )`, `cc_library_headers( name = "base-lib", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], )`, `cc_library_headers( name = "darwin-lib", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], )`, `cc_library_headers( name = "foo_headers", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], deps = [":base-lib"] + select({ "//build/bazel/platforms/os:android": [":android-lib"], "//build/bazel/platforms/os:darwin": [":darwin-lib"], @@ -206,16 +227,28 @@ cc_library_headers { }), )`, `cc_library_headers( name = "fuchsia-lib", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], )`, `cc_library_headers( name = "linux-lib", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], )`, `cc_library_headers( name = "linux_bionic-lib", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], )`, `cc_library_headers( name = "windows-lib", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], )`}, }, { @@ -236,13 +269,22 @@ cc_library_headers { }`, expectedBazelTargets: []string{`cc_library_headers( name = "android-lib", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], )`, `cc_library_headers( name = "exported-lib", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], )`, `cc_library_headers( name = "foo_headers", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], deps = select({ "//build/bazel/platforms/os:android": [ ":android-lib", @@ -296,7 +338,10 @@ cc_library_headers { }`, expectedBazelTargets: []string{`cc_library_headers( name = "foo_headers", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], includes = ["shared_include_dir"] + select({ "//build/bazel/platforms/arch:arm": ["arm_include_dir"], "//build/bazel/platforms/arch:x86_64": ["x86_64_include_dir"], diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go index d082db1bd..bb1246210 100644 --- a/bp2build/cc_library_static_conversion_test.go +++ b/bp2build/cc_library_static_conversion_test.go @@ -17,6 +17,8 @@ package bp2build import ( "android/soong/android" "android/soong/cc" + "android/soong/genrule" + "strings" "testing" ) @@ -179,10 +181,15 @@ cc_library_static { "-Dflag1", "-Dflag2", "-Iinclude_dir_1", + "-I$(BINDIR)/include_dir_1", "-Iinclude_dir_2", + "-I$(BINDIR)/include_dir_2", "-Ilocal_include_dir_1", + "-I$(BINDIR)/local_include_dir_1", "-Ilocal_include_dir_2", + "-I$(BINDIR)/local_include_dir_2", "-I.", + "-I$(BINDIR)/.", ], deps = [ ":header_lib_1", @@ -205,22 +212,34 @@ cc_library_static { ], )`, `cc_library_static( name = "static_lib_1", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["static_lib_1.cc"], )`, `cc_library_static( name = "static_lib_2", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["static_lib_2.cc"], )`, `cc_library_static( name = "whole_static_lib_1", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["whole_static_lib_1.cc"], )`, `cc_library_static( name = "whole_static_lib_2", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["whole_static_lib_2.cc"], )`}, @@ -257,7 +276,9 @@ cc_library_static { name = "foo_static", copts = [ "-Isubpackage", + "-I$(BINDIR)/subpackage", "-I.", + "-I$(BINDIR)/.", ], linkstatic = True, )`}, @@ -280,7 +301,10 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], includes = ["subpackage"], linkstatic = True, )`}, @@ -303,7 +327,10 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], includes = ["subpackage"], linkstatic = True, )`}, @@ -341,10 +368,15 @@ cc_library_static { name = "foo_static", copts = [ "-Isubpackage/subsubpackage", + "-I$(BINDIR)/subpackage/subsubpackage", "-Isubpackage2", + "-I$(BINDIR)/subpackage2", "-Isubpackage3/subsubpackage", + "-I$(BINDIR)/subpackage3/subsubpackage", "-Isubpackage/subsubpackage2", + "-I$(BINDIR)/subpackage/subsubpackage2", "-Isubpackage", + "-I$(BINDIR)/subpackage", ], includes = ["./exported_subsubpackage"], linkstatic = True, @@ -372,7 +404,9 @@ cc_library_static { name = "foo_static", copts = [ "-Isubpackage", + "-I$(BINDIR)/subpackage", "-Isubpackage2", + "-I$(BINDIR)/subpackage2", ], linkstatic = True, )`}, @@ -401,8 +435,11 @@ cc_library_static { name = "foo_static", copts = [ "-Isubpackage", + "-I$(BINDIR)/subpackage", "-Isubpackage2", + "-I$(BINDIR)/subpackage2", "-I.", + "-I$(BINDIR)/.", ], linkstatic = True, )`}, @@ -423,7 +460,10 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], deps = select({ "//build/bazel/platforms/arch:arm64": [":static_dep"], "//conditions:default": [], @@ -435,11 +475,17 @@ cc_library_static { }), )`, `cc_library_static( name = "static_dep", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, )`, `cc_library_static( name = "static_dep2", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, )`}, }, @@ -459,7 +505,10 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], deps = select({ "//build/bazel/platforms/os:android": [":static_dep"], "//conditions:default": [], @@ -471,11 +520,17 @@ cc_library_static { }), )`, `cc_library_static( name = "static_dep", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, )`, `cc_library_static( name = "static_dep2", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, )`}, }, @@ -500,7 +555,10 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], deps = [":static_dep"] + select({ "//build/bazel/platforms/arch:arm64": [":static_dep4"], "//conditions:default": [], @@ -512,19 +570,31 @@ cc_library_static { whole_archive_deps = [":static_dep2"], )`, `cc_library_static( name = "static_dep", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, )`, `cc_library_static( name = "static_dep2", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, )`, `cc_library_static( name = "static_dep3", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, )`, `cc_library_static( name = "static_dep4", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, )`}, }, @@ -547,7 +617,10 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = [ "common.c", @@ -573,7 +646,10 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["common.c"] + select({ "//build/bazel/platforms/arch:arm": ["foo-arm.c"], @@ -604,7 +680,10 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["common.c"] + select({ "//build/bazel/platforms/arch:arm": ["for-arm.c"], @@ -637,7 +716,10 @@ cc_library_static { } `, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["common.c"] + select({ "//build/bazel/platforms/arch:arm": [ @@ -687,7 +769,10 @@ cc_library_static { } `, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["common.c"] + select({ "//build/bazel/platforms/arch:arm": [ @@ -738,12 +823,18 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], deps = [":static_dep"], linkstatic = True, )`, `cc_library_static( name = "static_dep", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, )`}, }, @@ -768,7 +859,10 @@ cc_library_static { } `, expectedBazelTargets: []string{`cc_library_static( name = "foo_static", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["common.c"] + select({ "//build/bazel/platforms/arch:arm": ["for-lib32.c"], @@ -801,7 +895,10 @@ cc_library_static { } `, expectedBazelTargets: []string{`cc_library_static( name = "foo_static2", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["common.c"] + select({ "//build/bazel/platforms/arch:arm": [ @@ -867,7 +964,10 @@ cc_library_static { }`, expectedBazelTargets: []string{`cc_library_static( name = "foo_static3", - copts = ["-I."], + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], linkstatic = True, srcs = ["common.c"] + select({ "//build/bazel/platforms/arch:arm": [ @@ -911,6 +1011,94 @@ cc_library_static { "not-for-x86_64.c", ], }), +)`}, + }, + { + description: "cc_library_static arch srcs/exclude_srcs with generated files", + moduleTypeUnderTest: "cc_library_static", + moduleTypeUnderTestFactory: cc.LibraryStaticFactory, + moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build, + depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build}, + filesystem: map[string]string{ + "common.c": "", + "for-x86.c": "", + "not-for-x86.c": "", + "not-for-everything.c": "", + "dep/Android.bp": ` +genrule { + name: "generated_src_other_pkg", + out: ["generated_src_other_pkg.cpp"], + cmd: "nothing to see here", +} + +genrule { + name: "generated_hdr_other_pkg", + out: ["generated_hdr_other_pkg.cpp"], + cmd: "nothing to see here", +} + +genrule { + name: "generated_hdr_other_pkg_x86", + out: ["generated_hdr_other_pkg_x86.cpp"], + cmd: "nothing to see here", +}`, + }, + bp: soongCcLibraryStaticPreamble + ` +genrule { + name: "generated_src", + out: ["generated_src.cpp"], + cmd: "nothing to see here", +} + +genrule { + name: "generated_src_x86", + out: ["generated_src_x86.cpp"], + cmd: "nothing to see here", +} + +genrule { + name: "generated_hdr", + out: ["generated_hdr.h"], + cmd: "nothing to see here", +} + +cc_library_static { + name: "foo_static3", + srcs: ["common.c", "not-for-*.c"], + exclude_srcs: ["not-for-everything.c"], + generated_sources: ["generated_src", "generated_src_other_pkg"], + generated_headers: ["generated_hdr", "generated_hdr_other_pkg"], + arch: { + x86: { + srcs: ["for-x86.c"], + exclude_srcs: ["not-for-x86.c"], + generated_sources: ["generated_src_x86"], + generated_headers: ["generated_hdr_other_pkg_x86"], + }, + }, +} +`, + expectedBazelTargets: []string{`cc_library_static( + name = "foo_static3", + copts = [ + "-I.", + "-I$(BINDIR)/.", + ], + linkstatic = True, + srcs = [ + "//dep:generated_hdr_other_pkg", + "//dep:generated_src_other_pkg", + ":generated_hdr", + ":generated_src", + "common.c", + ] + select({ + "//build/bazel/platforms/arch:x86": [ + "//dep:generated_hdr_other_pkg_x86", + ":generated_src_x86", + "for-x86.c", + ], + "//conditions:default": ["not-for-x86.c"], + }), )`}, }, } @@ -933,6 +1121,7 @@ cc_library_static { cc.RegisterCCBuildComponents(ctx) ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory) ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory) + ctx.RegisterModuleType("genrule", genrule.GenRuleFactory) ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory) for _, m := range testCase.depsMutators { diff --git a/bp2build/cc_object_conversion_test.go b/bp2build/cc_object_conversion_test.go index 9efdb53de..ea8b9f158 100644 --- a/bp2build/cc_object_conversion_test.go +++ b/bp2build/cc_object_conversion_test.go @@ -65,7 +65,9 @@ func TestCcObjectBp2Build(t *testing.T) { "-Wall", "-Werror", "-Iinclude", + "-I$(BINDIR)/include", "-I.", + "-I$(BINDIR)/.", ], srcs = ["a/b/c.c"], )`, @@ -109,7 +111,9 @@ cc_defaults { "-Werror", "-fno-addrsig", "-Iinclude", + "-I$(BINDIR)/include", "-I.", + "-I$(BINDIR)/.", ], srcs = ["a/b/c.c"], )`, @@ -140,6 +144,7 @@ cc_object { copts = [ "-fno-addrsig", "-I.", + "-I$(BINDIR)/.", ], srcs = ["x/y/z.c"], )`, `cc_object( @@ -147,6 +152,7 @@ cc_object { copts = [ "-fno-addrsig", "-I.", + "-I$(BINDIR)/.", ], deps = [":bar"], srcs = ["a/b/c.c"], @@ -284,6 +290,7 @@ func TestCcObjectConfigurableAttributesBp2Build(t *testing.T) { copts = [ "-fno-addrsig", "-I.", + "-I$(BINDIR)/.", ] + select({ "//build/bazel/platforms/arch:x86": ["-fPIC"], "//conditions:default": [], @@ -329,6 +336,7 @@ func TestCcObjectConfigurableAttributesBp2Build(t *testing.T) { copts = [ "-fno-addrsig", "-I.", + "-I$(BINDIR)/.", ] + select({ "//build/bazel/platforms/arch:arm": ["-Wall"], "//build/bazel/platforms/arch:arm64": ["-Wall"], @@ -373,6 +381,7 @@ func TestCcObjectConfigurableAttributesBp2Build(t *testing.T) { copts = [ "-fno-addrsig", "-I.", + "-I$(BINDIR)/.", ] + select({ "//build/bazel/platforms/os:android": ["-fPIC"], "//build/bazel/platforms/os:darwin": ["-Wall"], diff --git a/cc/bp2build.go b/cc/bp2build.go index 33bb2699c..02d6428c4 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -14,10 +14,11 @@ package cc import ( - "android/soong/android" - "android/soong/bazel" "path/filepath" "strings" + + "android/soong/android" + "android/soong/bazel" ) // bp2build functions and helpers for converting cc_* modules to Bazel. @@ -49,6 +50,22 @@ func depsBp2BuildMutator(ctx android.BottomUpMutatorContext) { var allDeps []string + for _, p := range module.GetTargetProperties(ctx, &BaseCompilerProperties{}) { + // base compiler props + if baseCompilerProps, ok := p.(*BaseCompilerProperties); ok { + allDeps = append(allDeps, baseCompilerProps.Generated_headers...) + allDeps = append(allDeps, baseCompilerProps.Generated_sources...) + } + } + + for _, p := range module.GetArchProperties(ctx, &BaseCompilerProperties{}) { + // arch specific compiler props + if baseCompilerProps, ok := p.(*BaseCompilerProperties); ok { + allDeps = append(allDeps, baseCompilerProps.Generated_headers...) + allDeps = append(allDeps, baseCompilerProps.Generated_sources...) + } + } + for _, p := range module.GetTargetProperties(ctx, &BaseLinkerProperties{}) { // arch specific linker props if baseLinkerProps, ok := p.(*BaseLinkerProperties); ok { @@ -173,11 +190,19 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul var srcs bazel.LabelListAttribute var copts bazel.StringListAttribute - // Creates the -I flag for a directory, while making the directory relative + // Creates the -I flags for a directory, while making the directory relative // to the exec root for Bazel to work. - includeFlag := func(dir string) string { + includeFlags := func(dir string) []string { // filepath.Join canonicalizes the path, i.e. it takes care of . or .. elements. - return "-I" + filepath.Join(ctx.ModuleDir(), dir) + moduleDirRootedPath := filepath.Join(ctx.ModuleDir(), dir) + return []string{ + "-I" + moduleDirRootedPath, + // Include the bindir-rooted path (using make variable substitution). This most + // closely matches Bazel's native include path handling, which allows for dependency + // on generated headers in these directories. + // TODO(b/188084383): Handle local include directories in Bazel. + "-I$(BINDIR)/" + moduleDirRootedPath, + } } // Parse the list of module-relative include directories (-I). @@ -197,7 +222,7 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul copts = append(copts, strings.Split(flag, " ")...) } for _, dir := range parseLocalIncludeDirs(baseCompilerProps) { - copts = append(copts, includeFlag(dir)) + copts = append(copts, includeFlags(dir)...) } return copts } @@ -215,9 +240,17 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul parseSrcs := func(baseCompilerProps *BaseCompilerProperties) bazel.LabelList { // Combine the base srcs and arch-specific srcs allSrcs := append(baseSrcs, baseCompilerProps.Srcs...) + // Add srcs-like dependencies such as generated files. + // First create a LabelList containing these dependencies, then merge the values with srcs. + generatedHdrsAndSrcs := baseCompilerProps.Generated_headers + generatedHdrsAndSrcs = append(generatedHdrsAndSrcs, baseCompilerProps.Generated_sources...) + + generatedHdrsAndSrcsLabelList := android.BazelLabelForModuleDeps(ctx, generatedHdrsAndSrcs) + // Combine the base exclude_srcs and configuration-specific exclude_srcs allExcludeSrcs := append(baseExcludeSrcs, baseCompilerProps.Exclude_srcs...) - return android.BazelLabelForModuleSrcExcludes(ctx, allSrcs, allExcludeSrcs) + allSrcsLabelList := android.BazelLabelForModuleSrcExcludes(ctx, allSrcs, allExcludeSrcs) + return bazel.AppendBazelLabelLists(allSrcsLabelList, generatedHdrsAndSrcsLabelList) } for _, props := range module.compiler.compilerProps() { @@ -227,8 +260,8 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul // Used for arch-specific srcs later. baseSrcs = baseCompilerProps.Srcs - baseExcludeSrcs = baseCompilerProps.Exclude_srcs baseSrcsLabelList = parseSrcs(baseCompilerProps) + baseExcludeSrcs = baseCompilerProps.Exclude_srcs break } } @@ -237,9 +270,9 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul // target has access to all headers recursively in the package, and has // "-I" in its copts. if c, ok := module.compiler.(*baseCompiler); ok && c.includeBuildDirectory() { - copts.Value = append(copts.Value, includeFlag(".")) + copts.Value = append(copts.Value, includeFlags(".")...) } else if c, ok := module.compiler.(*libraryDecorator); ok && c.includeBuildDirectory() { - copts.Value = append(copts.Value, includeFlag(".")) + copts.Value = append(copts.Value, includeFlags(".")...) } for arch, props := range module.GetArchProperties(ctx, &BaseCompilerProperties{}) {