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{}) {