Merge "Move monolithic stub flags generation to platform_bootclasspath"
diff --git a/android/test_asserts.go b/android/test_asserts.go
index bfb88ab..edeb408 100644
--- a/android/test_asserts.go
+++ b/android/test_asserts.go
@@ -126,13 +126,44 @@
}
}
+// AssertStringContainsEquals checks if the string contains or does not contain the substring, given
+// the value of the expected bool. If the expectation does not hold it reports an error prefixed with
+// the supplied message and including a reason for why it failed.
+func AssertStringContainsEquals(t *testing.T, message string, s string, substring string, expected bool) {
+ if expected {
+ AssertStringDoesContain(t, message, s, substring)
+ } else {
+ AssertStringDoesNotContain(t, message, s, substring)
+ }
+}
+
// AssertStringListContains checks if the list of strings contains the expected string. If it does
// not then it reports an error prefixed with the supplied message and including a reason for why it
// failed.
-func AssertStringListContains(t *testing.T, message string, list []string, expected string) {
+func AssertStringListContains(t *testing.T, message string, list []string, s string) {
t.Helper()
- if !InList(expected, list) {
- t.Errorf("%s: could not find %q within %q", message, expected, list)
+ if !InList(s, list) {
+ t.Errorf("%s: could not find %q within %q", message, s, list)
+ }
+}
+
+// AssertStringListDoesNotContain checks if the list of strings contains the expected string. If it does
+// then it reports an error prefixed with the supplied message and including a reason for why it failed.
+func AssertStringListDoesNotContain(t *testing.T, message string, list []string, s string) {
+ t.Helper()
+ if InList(s, list) {
+ t.Errorf("%s: unexpectedly found %q within %q", message, s, list)
+ }
+}
+
+// AssertStringContainsEquals checks if the string contains or does not contain the substring, given
+// the value of the expected bool. If the expectation does not hold it reports an error prefixed with
+// the supplied message and including a reason for why it failed.
+func AssertStringListContainsEquals(t *testing.T, message string, list []string, s string, expected bool) {
+ if expected {
+ AssertStringListContains(t, message, list, s)
+ } else {
+ AssertStringListDoesNotContain(t, message, list, s)
}
}
diff --git a/apex/apex.go b/apex/apex.go
index 6f02c47..efeb0e2 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -1924,7 +1924,7 @@
// Rlib is statically linked, but it might have shared lib
// dependencies. Track them.
return true
- } else if java.IsbootImageContentDepTag(depTag) {
+ } else if java.IsBootclasspathFragmentContentDepTag(depTag) {
// Add the contents of the bootclasspath fragment to the apex.
switch child.(type) {
case *java.Library, *java.SdkLibrary:
diff --git a/apex/boot_image_test.go b/apex/boot_image_test.go
index e18c2ea..dab72f7 100644
--- a/apex/boot_image_test.go
+++ b/apex/boot_image_test.go
@@ -216,6 +216,22 @@
],
}
+ java_import {
+ name: "foo",
+ jars: ["foo.jar"],
+ apex_available: [
+ "com.android.art",
+ ],
+ }
+
+ java_import {
+ name: "bar",
+ jars: ["bar.jar"],
+ apex_available: [
+ "com.android.art",
+ ],
+ }
+
// Make sure that a preferred prebuilt doesn't affect the apex.
prebuilt_boot_image {
name: "mybootclasspathfragment",
diff --git a/bazel/properties.go b/bazel/properties.go
index 5d3299b..48d9589 100644
--- a/bazel/properties.go
+++ b/bazel/properties.go
@@ -125,7 +125,9 @@
}
}
-func UniqueBazelLabels(originalLabels []Label) []Label {
+// UniqueSortedBazelLabels takes a []Label and deduplicates the labels, and returns
+// the slice in a sorted order.
+func UniqueSortedBazelLabels(originalLabels []Label) []Label {
uniqueLabelsSet := make(map[Label]bool)
for _, l := range originalLabels {
uniqueLabelsSet[l] = true
@@ -142,8 +144,8 @@
func UniqueBazelLabelList(originalLabelList LabelList) LabelList {
var uniqueLabelList LabelList
- uniqueLabelList.Includes = UniqueBazelLabels(originalLabelList.Includes)
- uniqueLabelList.Excludes = UniqueBazelLabels(originalLabelList.Excludes)
+ uniqueLabelList.Includes = UniqueSortedBazelLabels(originalLabelList.Includes)
+ uniqueLabelList.Excludes = UniqueSortedBazelLabels(originalLabelList.Excludes)
return uniqueLabelList
}
@@ -292,7 +294,7 @@
return LabelListAttribute{Value: UniqueBazelLabelList(value)}
}
-// Append appends all values, including os and arch specific ones, from another
+// Append all values, including os and arch specific ones, from another
// LabelListAttribute to this LabelListAttribute.
func (attrs *LabelListAttribute) Append(other LabelListAttribute) {
for arch := range PlatformArchMap {
@@ -500,6 +502,26 @@
*v = value
}
+// Append appends all values, including os and arch specific ones, from another
+// StringListAttribute to this StringListAttribute
+func (attrs *StringListAttribute) Append(other StringListAttribute) {
+ for arch := range PlatformArchMap {
+ this := attrs.GetValueForArch(arch)
+ that := other.GetValueForArch(arch)
+ this = append(this, that...)
+ attrs.SetValueForArch(arch, this)
+ }
+
+ for os := range PlatformOsMap {
+ this := attrs.GetValueForOS(os)
+ that := other.GetValueForOS(os)
+ this = append(this, that...)
+ attrs.SetValueForOS(os, this)
+ }
+
+ attrs.Value = append(attrs.Value, other.Value...)
+}
+
// TryVariableSubstitution, replace string substitution formatting within each string in slice with
// Starlark string.format compatible tag for productVariable.
func TryVariableSubstitutions(slice []string, productVariable string) ([]string, bool) {
diff --git a/bazel/properties_test.go b/bazel/properties_test.go
index 56840ef..229a4aa 100644
--- a/bazel/properties_test.go
+++ b/bazel/properties_test.go
@@ -39,7 +39,7 @@
},
}
for _, tc := range testCases {
- actualUniqueLabels := UniqueBazelLabels(tc.originalLabels)
+ actualUniqueLabels := UniqueSortedBazelLabels(tc.originalLabels)
if !reflect.DeepEqual(tc.expectedUniqueLabels, actualUniqueLabels) {
t.Fatalf("Expected %v, got %v", tc.expectedUniqueLabels, actualUniqueLabels)
}
diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go
index 783af2e..4b6e888 100644
--- a/bp2build/cc_library_conversion_test.go
+++ b/bp2build/cc_library_conversion_test.go
@@ -109,10 +109,22 @@
`,
expectedBazelTargets: []string{`cc_library(
name = "foo-lib",
- copts = ["-Wall"],
+ copts = [
+ "-Wall",
+ "-I.",
+ ],
deps = [":some-headers"],
- hdrs = [
+ hdrs = ["foo-dir/a.h"],
+ includes = ["foo-dir"],
+ linkopts = ["-Wl,--exclude-libs=bar.a"] + select({
+ "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"],
+ "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"],
+ "//conditions:default": [],
+ }),
+ srcs = [
+ "impl.cpp",
"header.h",
+ "foo-dir/a.h",
"header.hh",
"header.hpp",
"header.hxx",
@@ -121,15 +133,7 @@
"header.inc",
"header.ipp",
"header.h.generic",
- "foo-dir/a.h",
- ],
- includes = ["foo-dir"],
- linkopts = ["-Wl,--exclude-libs=bar.a"] + select({
- "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"],
- "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"],
- "//conditions:default": [],
- }),
- srcs = ["impl.cpp"] + select({
+ ] + select({
"//build/bazel/platforms/arch:x86": ["x86.cpp"],
"//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
"//conditions:default": [],
@@ -190,14 +194,9 @@
"-Wextra",
"-Wunused",
"-Werror",
+ "-I.",
],
deps = [":libc_headers"],
- hdrs = [
- "linked_list.h",
- "linker.h",
- "linker_block_allocator.h",
- "linker_cfi.h",
- ],
linkopts = [
"-Wl,--exclude-libs=libgcc.a",
"-Wl,--exclude-libs=libgcc_stripped.a",
@@ -210,7 +209,13 @@
"//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"],
"//conditions:default": [],
}),
- srcs = ["ld_android.cpp"],
+ srcs = [
+ "ld_android.cpp",
+ "linked_list.h",
+ "linker.h",
+ "linker_block_allocator.h",
+ "linker_cfi.h",
+ ],
)`},
},
}
diff --git a/bp2build/cc_library_headers_conversion_test.go b/bp2build/cc_library_headers_conversion_test.go
index c59241f..3180267 100644
--- a/bp2build/cc_library_headers_conversion_test.go
+++ b/bp2build/cc_library_headers_conversion_test.go
@@ -131,6 +131,7 @@
}`,
expectedBazelTargets: []string{`cc_library_headers(
name = "foo_headers",
+ copts = ["-I."],
deps = [
":lib-1",
":lib-2",
@@ -157,6 +158,7 @@
}),
)`, `cc_library_headers(
name = "lib-1",
+ copts = ["-I."],
hdrs = [
"lib-1/lib1a.h",
"lib-1/lib1b.h",
@@ -164,6 +166,7 @@
includes = ["lib-1"],
)`, `cc_library_headers(
name = "lib-2",
+ copts = ["-I."],
hdrs = [
"lib-2/lib2a.h",
"lib-2/lib2b.h",
@@ -201,12 +204,16 @@
}`,
expectedBazelTargets: []string{`cc_library_headers(
name = "android-lib",
+ copts = ["-I."],
)`, `cc_library_headers(
name = "base-lib",
+ copts = ["-I."],
)`, `cc_library_headers(
name = "darwin-lib",
+ copts = ["-I."],
)`, `cc_library_headers(
name = "foo_headers",
+ copts = ["-I."],
deps = [":base-lib"] + select({
"//build/bazel/platforms/os:android": [":android-lib"],
"//build/bazel/platforms/os:darwin": [":darwin-lib"],
@@ -218,12 +225,16 @@
}),
)`, `cc_library_headers(
name = "fuchsia-lib",
+ copts = ["-I."],
)`, `cc_library_headers(
name = "linux-lib",
+ copts = ["-I."],
)`, `cc_library_headers(
name = "linux_bionic-lib",
+ copts = ["-I."],
)`, `cc_library_headers(
name = "windows-lib",
+ copts = ["-I."],
)`},
},
{
@@ -244,10 +255,13 @@
}`,
expectedBazelTargets: []string{`cc_library_headers(
name = "android-lib",
+ copts = ["-I."],
)`, `cc_library_headers(
name = "exported-lib",
+ copts = ["-I."],
)`, `cc_library_headers(
name = "foo_headers",
+ copts = ["-I."],
deps = select({
"//build/bazel/platforms/os:android": [
":android-lib",
diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go
index 7e72a8b..00325fb 100644
--- a/bp2build/cc_library_static_conversion_test.go
+++ b/bp2build/cc_library_static_conversion_test.go
@@ -119,71 +119,70 @@
cc_library_static {
name: "static_lib_1",
srcs: ["static_lib_1.cc"],
- bazel_module: { bp2build_available: true },
}
cc_library_static {
name: "static_lib_2",
srcs: ["static_lib_2.cc"],
- bazel_module: { bp2build_available: true },
}
cc_library_static {
name: "whole_static_lib_1",
srcs: ["whole_static_lib_1.cc"],
- bazel_module: { bp2build_available: true },
}
cc_library_static {
name: "whole_static_lib_2",
srcs: ["whole_static_lib_2.cc"],
- bazel_module: { bp2build_available: true },
}
cc_library_static {
name: "foo_static",
srcs: [
"foo_static1.cc",
- "foo_static2.cc",
+ "foo_static2.cc",
],
cflags: [
"-Dflag1",
- "-Dflag2"
+ "-Dflag2"
],
static_libs: [
"static_lib_1",
- "static_lib_2"
+ "static_lib_2"
],
whole_static_libs: [
"whole_static_lib_1",
- "whole_static_lib_2"
+ "whole_static_lib_2"
],
include_dirs: [
- "include_dir_1",
- "include_dir_2",
+ "include_dir_1",
+ "include_dir_2",
],
local_include_dirs: [
"local_include_dir_1",
- "local_include_dir_2",
+ "local_include_dir_2",
],
export_include_dirs: [
- "export_include_dir_1",
- "export_include_dir_2"
+ "export_include_dir_1",
+ "export_include_dir_2"
],
header_libs: [
"header_lib_1",
- "header_lib_2"
+ "header_lib_2"
],
// TODO: Also support export_header_lib_headers
-
- bazel_module: { bp2build_available: true },
}`,
expectedBazelTargets: []string{`cc_library_static(
name = "foo_static",
copts = [
"-Dflag1",
"-Dflag2",
+ "-Iinclude_dir_1",
+ "-Iinclude_dir_2",
+ "-Ilocal_include_dir_1",
+ "-Ilocal_include_dir_2",
+ "-I.",
],
deps = [
":header_lib_1",
@@ -194,8 +193,6 @@
":whole_static_lib_2",
],
hdrs = [
- "implicit_include_1.h",
- "implicit_include_2.h",
"export_include_dir_1/export_include_dir_1_a.h",
"export_include_dir_1/export_include_dir_1_b.h",
"export_include_dir_2/export_include_dir_2_a.h",
@@ -204,16 +201,17 @@
includes = [
"export_include_dir_1",
"export_include_dir_2",
- "include_dir_1",
- "include_dir_2",
- "local_include_dir_1",
- "local_include_dir_2",
- ".",
],
linkstatic = True,
srcs = [
"foo_static1.cc",
"foo_static2.cc",
+ "implicit_include_1.h",
+ "implicit_include_2.h",
+ "export_include_dir_1/export_include_dir_1_a.h",
+ "export_include_dir_1/export_include_dir_1_b.h",
+ "export_include_dir_2/export_include_dir_2_a.h",
+ "export_include_dir_2/export_include_dir_2_b.h",
"include_dir_1/include_dir_1_a.h",
"include_dir_1/include_dir_1_b.h",
"include_dir_2/include_dir_2_a.h",
@@ -222,60 +220,90 @@
"local_include_dir_1/local_include_dir_1_b.h",
"local_include_dir_2/local_include_dir_2_a.h",
"local_include_dir_2/local_include_dir_2_b.h",
- "implicit_include_1.h",
- "implicit_include_2.h",
],
)`, `cc_library_static(
name = "static_lib_1",
- hdrs = [
- "implicit_include_1.h",
- "implicit_include_2.h",
- ],
- includes = ["."],
+ copts = ["-I."],
linkstatic = True,
srcs = [
"static_lib_1.cc",
"implicit_include_1.h",
"implicit_include_2.h",
+ "export_include_dir_1/export_include_dir_1_a.h",
+ "export_include_dir_1/export_include_dir_1_b.h",
+ "export_include_dir_2/export_include_dir_2_a.h",
+ "export_include_dir_2/export_include_dir_2_b.h",
+ "include_dir_1/include_dir_1_a.h",
+ "include_dir_1/include_dir_1_b.h",
+ "include_dir_2/include_dir_2_a.h",
+ "include_dir_2/include_dir_2_b.h",
+ "local_include_dir_1/local_include_dir_1_a.h",
+ "local_include_dir_1/local_include_dir_1_b.h",
+ "local_include_dir_2/local_include_dir_2_a.h",
+ "local_include_dir_2/local_include_dir_2_b.h",
],
)`, `cc_library_static(
name = "static_lib_2",
- hdrs = [
- "implicit_include_1.h",
- "implicit_include_2.h",
- ],
- includes = ["."],
+ copts = ["-I."],
linkstatic = True,
srcs = [
"static_lib_2.cc",
"implicit_include_1.h",
"implicit_include_2.h",
+ "export_include_dir_1/export_include_dir_1_a.h",
+ "export_include_dir_1/export_include_dir_1_b.h",
+ "export_include_dir_2/export_include_dir_2_a.h",
+ "export_include_dir_2/export_include_dir_2_b.h",
+ "include_dir_1/include_dir_1_a.h",
+ "include_dir_1/include_dir_1_b.h",
+ "include_dir_2/include_dir_2_a.h",
+ "include_dir_2/include_dir_2_b.h",
+ "local_include_dir_1/local_include_dir_1_a.h",
+ "local_include_dir_1/local_include_dir_1_b.h",
+ "local_include_dir_2/local_include_dir_2_a.h",
+ "local_include_dir_2/local_include_dir_2_b.h",
],
)`, `cc_library_static(
name = "whole_static_lib_1",
- hdrs = [
- "implicit_include_1.h",
- "implicit_include_2.h",
- ],
- includes = ["."],
+ copts = ["-I."],
linkstatic = True,
srcs = [
"whole_static_lib_1.cc",
"implicit_include_1.h",
"implicit_include_2.h",
+ "export_include_dir_1/export_include_dir_1_a.h",
+ "export_include_dir_1/export_include_dir_1_b.h",
+ "export_include_dir_2/export_include_dir_2_a.h",
+ "export_include_dir_2/export_include_dir_2_b.h",
+ "include_dir_1/include_dir_1_a.h",
+ "include_dir_1/include_dir_1_b.h",
+ "include_dir_2/include_dir_2_a.h",
+ "include_dir_2/include_dir_2_b.h",
+ "local_include_dir_1/local_include_dir_1_a.h",
+ "local_include_dir_1/local_include_dir_1_b.h",
+ "local_include_dir_2/local_include_dir_2_a.h",
+ "local_include_dir_2/local_include_dir_2_b.h",
],
)`, `cc_library_static(
name = "whole_static_lib_2",
- hdrs = [
- "implicit_include_1.h",
- "implicit_include_2.h",
- ],
- includes = ["."],
+ copts = ["-I."],
linkstatic = True,
srcs = [
"whole_static_lib_2.cc",
"implicit_include_1.h",
"implicit_include_2.h",
+ "export_include_dir_1/export_include_dir_1_a.h",
+ "export_include_dir_1/export_include_dir_1_b.h",
+ "export_include_dir_2/export_include_dir_2_a.h",
+ "export_include_dir_2/export_include_dir_2_b.h",
+ "include_dir_1/include_dir_1_a.h",
+ "include_dir_1/include_dir_1_b.h",
+ "include_dir_2/include_dir_2_a.h",
+ "include_dir_2/include_dir_2_b.h",
+ "local_include_dir_1/local_include_dir_1_a.h",
+ "local_include_dir_1/local_include_dir_1_b.h",
+ "local_include_dir_2/local_include_dir_2_a.h",
+ "local_include_dir_2/local_include_dir_2_b.h",
],
)`},
},
@@ -306,14 +334,12 @@
include_dirs: [
"subpackage",
],
-
- bazel_module: { bp2build_available: true },
}`,
expectedBazelTargets: []string{`cc_library_static(
name = "foo_static",
- includes = [
- "subpackage",
- ".",
+ copts = [
+ "-Isubpackage",
+ "-I.",
],
linkstatic = True,
srcs = [
@@ -326,6 +352,299 @@
],
)`},
},
+ {
+ description: "cc_library_static export include dir",
+ moduleTypeUnderTest: "cc_library_static",
+ moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
+ moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
+ filesystem: map[string]string{
+ // subpackage with subdirectory
+ "subpackage/Android.bp": "",
+ "subpackage/subpackage_header.h": "",
+ "subpackage/subdirectory/subdirectory_header.h": "",
+ },
+ bp: soongCcLibraryStaticPreamble + `
+cc_library_static {
+ name: "foo_static",
+ export_include_dirs: ["subpackage"],
+}`,
+ expectedBazelTargets: []string{`cc_library_static(
+ name = "foo_static",
+ copts = ["-I."],
+ hdrs = [
+ "//subpackage:subdirectory/subdirectory_header.h",
+ "//subpackage:subpackage_header.h",
+ ],
+ includes = ["subpackage"],
+ linkstatic = True,
+ srcs = [
+ "//subpackage:subpackage_header.h",
+ "//subpackage:subdirectory/subdirectory_header.h",
+ ],
+)`},
+ },
+ {
+ description: "cc_library_static export system include dir",
+ moduleTypeUnderTest: "cc_library_static",
+ moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
+ moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
+ filesystem: map[string]string{
+ // subpackage with subdirectory
+ "subpackage/Android.bp": "",
+ "subpackage/subpackage_header.h": "",
+ "subpackage/subdirectory/subdirectory_header.h": "",
+ },
+ bp: soongCcLibraryStaticPreamble + `
+cc_library_static {
+ name: "foo_static",
+ export_system_include_dirs: ["subpackage"],
+}`,
+ expectedBazelTargets: []string{`cc_library_static(
+ name = "foo_static",
+ copts = ["-I."],
+ hdrs = [
+ "//subpackage:subdirectory/subdirectory_header.h",
+ "//subpackage:subpackage_header.h",
+ ],
+ includes = ["subpackage"],
+ linkstatic = True,
+ srcs = [
+ "//subpackage:subpackage_header.h",
+ "//subpackage:subdirectory/subdirectory_header.h",
+ ],
+)`},
+ },
+ {
+ description: "cc_library_static include_dirs, local_include_dirs, export_include_dirs (b/183742505)",
+ moduleTypeUnderTest: "cc_library_static",
+ moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
+ moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
+ dir: "subpackage",
+ filesystem: map[string]string{
+ // subpackage with subdirectory
+ "subpackage/Android.bp": `
+cc_library_static {
+ name: "foo_static",
+ // include_dirs are workspace/root relative
+ include_dirs: [
+ "subpackage/subsubpackage",
+ "subpackage2",
+ "subpackage3/subsubpackage"
+ ],
+ local_include_dirs: ["subsubpackage2"], // module dir relative
+ export_include_dirs: ["./exported_subsubpackage"], // module dir relative
+ include_build_directory: true,
+ bazel_module: { bp2build_available: true },
+}`,
+ "subpackage/subsubpackage/header.h": "",
+ "subpackage/subsubpackage2/header.h": "",
+ "subpackage/exported_subsubpackage/header.h": "",
+ "subpackage2/header.h": "",
+ "subpackage3/subsubpackage/header.h": "",
+ },
+ bp: soongCcLibraryStaticPreamble,
+ expectedBazelTargets: []string{`cc_library_static(
+ name = "foo_static",
+ copts = [
+ "-Isubpackage/subsubpackage",
+ "-Isubpackage2",
+ "-Isubpackage3/subsubpackage",
+ "-Isubpackage/subsubpackage2",
+ "-Isubpackage",
+ ],
+ hdrs = ["exported_subsubpackage/header.h"],
+ includes = ["./exported_subsubpackage"],
+ linkstatic = True,
+ srcs = [
+ "exported_subsubpackage/header.h",
+ "subsubpackage/header.h",
+ "subsubpackage2/header.h",
+ ],
+)`},
+ },
+ {
+ description: "cc_library_static include_build_directory disabled",
+ moduleTypeUnderTest: "cc_library_static",
+ moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
+ moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
+ filesystem: map[string]string{
+ // subpackage with subdirectory
+ "subpackage/Android.bp": "",
+ "subpackage/subpackage_header.h": "",
+ "subpackage/subdirectory/subdirectory_header.h": "",
+ },
+ bp: soongCcLibraryStaticPreamble + `
+cc_library_static {
+ name: "foo_static",
+ include_dirs: ["subpackage"], // still used, but local_include_dirs is recommended
+ local_include_dirs: ["subpackage2"],
+ include_build_directory: false,
+}`,
+ expectedBazelTargets: []string{`cc_library_static(
+ name = "foo_static",
+ copts = [
+ "-Isubpackage",
+ "-Isubpackage2",
+ ],
+ linkstatic = True,
+)`},
+ },
+ {
+ description: "cc_library_static include_build_directory enabled",
+ moduleTypeUnderTest: "cc_library_static",
+ moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
+ moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
+ filesystem: map[string]string{
+ // subpackage with subdirectory
+ "subpackage/Android.bp": "",
+ "subpackage/subpackage_header.h": "",
+ "subpackage2/Android.bp": "",
+ "subpackage2/subpackage2_header.h": "",
+ "subpackage/subdirectory/subdirectory_header.h": "",
+ },
+ bp: soongCcLibraryStaticPreamble + `
+cc_library_static {
+ name: "foo_static",
+ include_dirs: ["subpackage"], // still used, but local_include_dirs is recommended
+ local_include_dirs: ["subpackage2"],
+ include_build_directory: true,
+}`,
+ expectedBazelTargets: []string{`cc_library_static(
+ name = "foo_static",
+ copts = [
+ "-Isubpackage",
+ "-Isubpackage2",
+ "-I.",
+ ],
+ linkstatic = True,
+ srcs = [
+ "//subpackage:subpackage_header.h",
+ "//subpackage:subdirectory/subdirectory_header.h",
+ "//subpackage2:subpackage2_header.h",
+ ],
+)`},
+ },
+ {
+ description: "cc_library_static arch-specific static_libs",
+ moduleTypeUnderTest: "cc_library_static",
+ moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
+ moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
+ depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
+ filesystem: map[string]string{},
+ bp: soongCcLibraryStaticPreamble + `
+cc_library_static { name: "static_dep" }
+cc_library_static { name: "static_dep2" }
+cc_library_static {
+ name: "foo_static",
+ arch: { arm64: { static_libs: ["static_dep"], whole_static_libs: ["static_dep2"] } },
+}`,
+ expectedBazelTargets: []string{`cc_library_static(
+ name = "foo_static",
+ copts = ["-I."],
+ deps = select({
+ "//build/bazel/platforms/arch:arm64": [
+ ":static_dep",
+ ":static_dep2",
+ ],
+ "//conditions:default": [],
+ }),
+ linkstatic = True,
+)`, `cc_library_static(
+ name = "static_dep",
+ copts = ["-I."],
+ linkstatic = True,
+)`, `cc_library_static(
+ name = "static_dep2",
+ copts = ["-I."],
+ linkstatic = True,
+)`},
+ },
+ {
+ description: "cc_library_static os-specific static_libs",
+ moduleTypeUnderTest: "cc_library_static",
+ moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
+ moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
+ depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
+ filesystem: map[string]string{},
+ bp: soongCcLibraryStaticPreamble + `
+cc_library_static { name: "static_dep" }
+cc_library_static { name: "static_dep2" }
+cc_library_static {
+ name: "foo_static",
+ target: { android: { static_libs: ["static_dep"], whole_static_libs: ["static_dep2"] } },
+}`,
+ expectedBazelTargets: []string{`cc_library_static(
+ name = "foo_static",
+ copts = ["-I."],
+ deps = select({
+ "//build/bazel/platforms/os:android": [
+ ":static_dep",
+ ":static_dep2",
+ ],
+ "//conditions:default": [],
+ }),
+ linkstatic = True,
+)`, `cc_library_static(
+ name = "static_dep",
+ copts = ["-I."],
+ linkstatic = True,
+)`, `cc_library_static(
+ name = "static_dep2",
+ copts = ["-I."],
+ linkstatic = True,
+)`},
+ },
+ {
+ description: "cc_library_static base, arch and os-specific static_libs",
+ moduleTypeUnderTest: "cc_library_static",
+ moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
+ moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
+ depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
+ filesystem: map[string]string{},
+ bp: soongCcLibraryStaticPreamble + `
+cc_library_static { name: "static_dep" }
+cc_library_static { name: "static_dep2" }
+cc_library_static { name: "static_dep3" }
+cc_library_static { name: "static_dep4" }
+cc_library_static {
+ name: "foo_static",
+ static_libs: ["static_dep"],
+ whole_static_libs: ["static_dep2"],
+ target: { android: { static_libs: ["static_dep3"] } },
+ arch: { arm64: { static_libs: ["static_dep4"] } },
+}`,
+ expectedBazelTargets: []string{`cc_library_static(
+ name = "foo_static",
+ copts = ["-I."],
+ deps = [
+ ":static_dep",
+ ":static_dep2",
+ ] + select({
+ "//build/bazel/platforms/arch:arm64": [":static_dep4"],
+ "//conditions:default": [],
+ }) + select({
+ "//build/bazel/platforms/os:android": [":static_dep3"],
+ "//conditions:default": [],
+ }),
+ linkstatic = True,
+)`, `cc_library_static(
+ name = "static_dep",
+ copts = ["-I."],
+ linkstatic = True,
+)`, `cc_library_static(
+ name = "static_dep2",
+ copts = ["-I."],
+ linkstatic = True,
+)`, `cc_library_static(
+ name = "static_dep3",
+ copts = ["-I."],
+ linkstatic = True,
+)`, `cc_library_static(
+ name = "static_dep4",
+ copts = ["-I."],
+ linkstatic = True,
+)`},
+ },
}
dir := "."
@@ -352,6 +671,7 @@
ctx.DepsBp2BuildMutators(m)
}
ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator)
+ ctx.RegisterBp2BuildConfig(bp2buildConfig)
ctx.RegisterForBazelConversion()
_, errs := ctx.ParseFileList(dir, toParse)
diff --git a/bp2build/cc_object_conversion_test.go b/bp2build/cc_object_conversion_test.go
index a9d24ac..d00a1cb 100644
--- a/bp2build/cc_object_conversion_test.go
+++ b/bp2build/cc_object_conversion_test.go
@@ -55,8 +55,6 @@
"a/b/*.c"
],
exclude_srcs: ["a/b/exclude.c"],
-
- bazel_module: { bp2build_available: true },
}
`,
expectedBazelTargets: []string{`cc_object(
@@ -66,16 +64,14 @@
"-Wno-gcc-compat",
"-Wall",
"-Werror",
+ "-Iinclude",
+ "-I.",
],
- hdrs = [
+ srcs = [
+ "a/b/c.c",
"a/b/bar.h",
"a/b/foo.h",
],
- local_include_dirs = [
- "include",
- ".",
- ],
- srcs = ["a/b/c.c"],
)`,
},
},
@@ -93,7 +89,6 @@
],
defaults: ["foo_defaults"],
- bazel_module: { bp2build_available: true },
}
cc_defaults {
@@ -117,10 +112,8 @@
"-Wall",
"-Werror",
"-fno-addrsig",
- ],
- local_include_dirs = [
- "include",
- ".",
+ "-Iinclude",
+ "-I.",
],
srcs = ["a/b/c.c"],
)`,
@@ -139,27 +132,27 @@
name: "foo",
srcs: ["a/b/c.c"],
objs: ["bar"],
-
- bazel_module: { bp2build_available: true },
}
cc_object {
name: "bar",
srcs: ["x/y/z.c"],
-
- bazel_module: { bp2build_available: true },
}
`,
expectedBazelTargets: []string{`cc_object(
name = "bar",
- copts = ["-fno-addrsig"],
- local_include_dirs = ["."],
+ copts = [
+ "-fno-addrsig",
+ "-I.",
+ ],
srcs = ["x/y/z.c"],
)`, `cc_object(
name = "foo",
- copts = ["-fno-addrsig"],
+ copts = [
+ "-fno-addrsig",
+ "-I.",
+ ],
deps = [":bar"],
- local_include_dirs = ["."],
srcs = ["a/b/c.c"],
)`,
},
@@ -177,8 +170,6 @@
name: "foo",
srcs: ["a/b/c.c"],
include_build_directory: false,
-
- bazel_module: { bp2build_available: true },
}
`,
expectedBazelTargets: []string{`cc_object(
@@ -201,8 +192,6 @@
asflags: ["-DPLATFORM_SDK_VERSION=%d"],
},
},
-
- bazel_module: { bp2build_available: true },
}
`,
expectedBazelTargets: []string{`cc_object(
@@ -233,6 +222,7 @@
ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory)
ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator)
+ ctx.RegisterBp2BuildConfig(bp2buildConfig)
ctx.RegisterForBazelConversion()
_, errs := ctx.ParseFileList(dir, toParse)
@@ -290,17 +280,18 @@
srcs: ["arch/arm/file.S"], // label list
},
},
- bazel_module: { bp2build_available: true },
}
`,
expectedBazelTargets: []string{
`cc_object(
name = "foo",
- copts = ["-fno-addrsig"] + select({
+ copts = [
+ "-fno-addrsig",
+ "-I.",
+ ] + select({
"//build/bazel/platforms/arch:x86": ["-fPIC"],
"//conditions:default": [],
}),
- local_include_dirs = ["."],
srcs = ["a.cpp"] + select({
"//build/bazel/platforms/arch:arm": ["arch/arm/file.S"],
"//conditions:default": [],
@@ -334,20 +325,21 @@
cflags: ["-Wall"],
},
},
- bazel_module: { bp2build_available: true },
}
`,
expectedBazelTargets: []string{
`cc_object(
name = "foo",
- copts = ["-fno-addrsig"] + select({
+ copts = [
+ "-fno-addrsig",
+ "-I.",
+ ] + select({
"//build/bazel/platforms/arch:arm": ["-Wall"],
"//build/bazel/platforms/arch:arm64": ["-Wall"],
"//build/bazel/platforms/arch:x86": ["-fPIC"],
"//build/bazel/platforms/arch:x86_64": ["-fPIC"],
"//conditions:default": [],
}),
- local_include_dirs = ["."],
srcs = ["base.cpp"] + select({
"//build/bazel/platforms/arch:arm": ["arm.cpp"],
"//build/bazel/platforms/arch:arm64": ["arm64.cpp"],
@@ -377,19 +369,20 @@
cflags: ["-Wall"],
},
},
- bazel_module: { bp2build_available: true },
}
`,
expectedBazelTargets: []string{
`cc_object(
name = "foo",
- copts = ["-fno-addrsig"] + select({
+ copts = [
+ "-fno-addrsig",
+ "-I.",
+ ] + select({
"//build/bazel/platforms/os:android": ["-fPIC"],
"//build/bazel/platforms/os:darwin": ["-Wall"],
"//build/bazel/platforms/os:windows": ["-fPIC"],
"//conditions:default": [],
}),
- local_include_dirs = ["."],
srcs = ["base.cpp"],
)`,
},
@@ -409,6 +402,7 @@
ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory)
ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator)
+ ctx.RegisterBp2BuildConfig(bp2buildConfig)
ctx.RegisterForBazelConversion()
_, errs := ctx.ParseFileList(dir, toParse)
diff --git a/bp2build/configurability.go b/bp2build/configurability.go
index 97729df..b9ffc04 100644
--- a/bp2build/configurability.go
+++ b/bp2build/configurability.go
@@ -110,7 +110,11 @@
if err != nil {
return "", err
}
- selects += s + ",\n"
+ // s could still be an empty string, e.g. unset slices of structs with
+ // length of 0.
+ if s != "" {
+ selects += s + ",\n"
+ }
}
if len(selects) == 0 {
@@ -137,6 +141,9 @@
if err != nil {
return "", err
}
+ if v == "" {
+ return "", nil
+ }
s += fmt.Sprintf("\"%s\": %s", key, v)
return s, nil
}
diff --git a/cc/bp2build.go b/cc/bp2build.go
index 0bca30a..79304a5 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -16,7 +16,7 @@
import (
"android/soong/android"
"android/soong/bazel"
- "strings"
+ "path/filepath"
)
// bp2build functions and helpers for converting cc_* modules to Bazel.
@@ -53,6 +53,18 @@
if baseLinkerProps, ok := p.(*BaseLinkerProperties); ok {
allDeps = append(allDeps, baseLinkerProps.Header_libs...)
allDeps = append(allDeps, baseLinkerProps.Export_header_lib_headers...)
+ allDeps = append(allDeps, baseLinkerProps.Static_libs...)
+ allDeps = append(allDeps, baseLinkerProps.Whole_static_libs...)
+ }
+ }
+
+ for _, p := range module.GetArchProperties(&BaseLinkerProperties{}) {
+ // arch specific linker props
+ if baseLinkerProps, ok := p.(*BaseLinkerProperties); ok {
+ allDeps = append(allDeps, baseLinkerProps.Header_libs...)
+ allDeps = append(allDeps, baseLinkerProps.Export_header_lib_headers...)
+ allDeps = append(allDeps, baseLinkerProps.Static_libs...)
+ allDeps = append(allDeps, baseLinkerProps.Whole_static_libs...)
}
}
@@ -61,51 +73,80 @@
// Convenience struct to hold all attributes parsed from compiler properties.
type compilerAttributes struct {
- copts bazel.StringListAttribute
- srcs bazel.LabelListAttribute
- hdrs bazel.LabelListAttribute
+ copts bazel.StringListAttribute
+ srcs bazel.LabelListAttribute
+ includes bazel.StringListAttribute
}
// bp2BuildParseCompilerProps returns copts, srcs and hdrs and other attributes.
func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Module) compilerAttributes {
- var hdrs, srcs bazel.LabelListAttribute
+ var localHdrs, srcs bazel.LabelListAttribute
var copts bazel.StringListAttribute
- hdrsAndSrcs := func(baseCompilerProps *BaseCompilerProperties) (bazel.LabelList, bazel.LabelList) {
- srcsList := android.BazelLabelForModuleSrcExcludes(
- ctx, baseCompilerProps.Srcs, baseCompilerProps.Exclude_srcs)
- hdrsList := android.BazelLabelForModuleSrc(ctx, srcsList.LooseHdrsGlobs(headerExts))
- return hdrsList, srcsList
+ // Creates the -I flag for a directory, while making the directory relative
+ // to the exec root for Bazel to work.
+ includeFlag := func(dir string) string {
+ // filepath.Join canonicalizes the path, i.e. it takes care of . or .. elements.
+ return "-I" + filepath.Join(ctx.ModuleDir(), dir)
+ }
+
+ // Parse the list of srcs, excluding files from exclude_srcs.
+ parseSrcs := func(baseCompilerProps *BaseCompilerProperties) bazel.LabelList {
+ return android.BazelLabelForModuleSrcExcludes(ctx, baseCompilerProps.Srcs, baseCompilerProps.Exclude_srcs)
+ }
+
+ // Parse the list of module-relative include directories (-I).
+ parseLocalIncludeDirs := func(baseCompilerProps *BaseCompilerProperties) []string {
+ // include_dirs are root-relative, not module-relative.
+ includeDirs := bp2BuildMakePathsRelativeToModule(ctx, baseCompilerProps.Include_dirs)
+ return append(includeDirs, baseCompilerProps.Local_include_dirs...)
+ }
+
+ // Parse the list of copts.
+ parseCopts := func(baseCompilerProps *BaseCompilerProperties) []string {
+ copts := append([]string{}, baseCompilerProps.Cflags...)
+ for _, dir := range parseLocalIncludeDirs(baseCompilerProps) {
+ copts = append(copts, includeFlag(dir))
+ }
+ return copts
}
for _, props := range module.compiler.compilerProps() {
if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
- hdrs.Value, srcs.Value = hdrsAndSrcs(baseCompilerProps)
- copts.Value = baseCompilerProps.Cflags
+ srcs.Value = parseSrcs(baseCompilerProps)
+ copts.Value = parseCopts(baseCompilerProps)
break
}
}
+ if c, ok := module.compiler.(*baseCompiler); ok && c.includeBuildDirectory() {
+ copts.Value = append(copts.Value, includeFlag("."))
+ localHdrs.Value = bp2BuildListHeadersInDir(ctx, ".")
+ } else if c, ok := module.compiler.(*libraryDecorator); ok && c.includeBuildDirectory() {
+ copts.Value = append(copts.Value, includeFlag("."))
+ localHdrs.Value = bp2BuildListHeadersInDir(ctx, ".")
+ }
+
for arch, props := range module.GetArchProperties(&BaseCompilerProperties{}) {
if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
- hdrsList, srcsList := hdrsAndSrcs(baseCompilerProps)
- hdrs.SetValueForArch(arch.Name, bazel.SubtractBazelLabelList(hdrsList, hdrs.Value))
- srcs.SetValueForArch(arch.Name, srcsList)
- copts.SetValueForArch(arch.Name, baseCompilerProps.Cflags)
+ srcsList := parseSrcs(baseCompilerProps)
+ srcs.SetValueForArch(arch.Name, bazel.SubtractBazelLabelList(srcsList, srcs.Value))
+ copts.SetValueForArch(arch.Name, parseCopts(baseCompilerProps))
}
}
for os, props := range module.GetTargetProperties(&BaseCompilerProperties{}) {
if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
- hdrsList, srcsList := hdrsAndSrcs(baseCompilerProps)
- hdrs.SetValueForOS(os.Name, bazel.SubtractBazelLabelList(hdrsList, hdrs.Value))
- srcs.SetValueForOS(os.Name, srcsList)
- copts.SetValueForOS(os.Name, baseCompilerProps.Cflags)
+ srcsList := parseSrcs(baseCompilerProps)
+ srcs.SetValueForOS(os.Name, bazel.SubtractBazelLabelList(srcsList, srcs.Value))
+ copts.SetValueForOS(os.Name, parseCopts(baseCompilerProps))
}
}
+ // Combine local, non-exported hdrs into srcs
+ srcs.Append(localHdrs)
+
return compilerAttributes{
- hdrs: hdrs,
srcs: srcs,
copts: copts,
}
@@ -120,7 +161,6 @@
// bp2BuildParseLinkerProps creates a label list attribute containing the header library deps of a module, including
// configurable attribute values.
func bp2BuildParseLinkerProps(ctx android.TopDownMutatorContext, module *Module) linkerAttributes {
-
var deps bazel.LabelListAttribute
var linkopts bazel.StringListAttribute
@@ -128,8 +168,10 @@
if baseLinkerProps, ok := linkerProps.(*BaseLinkerProperties); ok {
libs := baseLinkerProps.Header_libs
libs = append(libs, baseLinkerProps.Export_header_lib_headers...)
- deps = bazel.MakeLabelListAttribute(
- android.BazelLabelForModuleDeps(ctx, android.SortedUniqueStrings(libs)))
+ libs = append(libs, baseLinkerProps.Static_libs...)
+ libs = append(libs, baseLinkerProps.Whole_static_libs...)
+ libs = android.SortedUniqueStrings(libs)
+ deps = bazel.MakeLabelListAttribute(android.BazelLabelForModuleDeps(ctx, libs))
linkopts.Value = baseLinkerProps.Ldflags
break
}
@@ -139,6 +181,8 @@
if baseLinkerProps, ok := p.(*BaseLinkerProperties); ok {
libs := baseLinkerProps.Header_libs
libs = append(libs, baseLinkerProps.Export_header_lib_headers...)
+ libs = append(libs, baseLinkerProps.Static_libs...)
+ libs = append(libs, baseLinkerProps.Whole_static_libs...)
libs = android.SortedUniqueStrings(libs)
deps.SetValueForArch(arch.Name, android.BazelLabelForModuleDeps(ctx, libs))
linkopts.SetValueForArch(arch.Name, baseLinkerProps.Ldflags)
@@ -149,6 +193,8 @@
if baseLinkerProps, ok := p.(*BaseLinkerProperties); ok {
libs := baseLinkerProps.Header_libs
libs = append(libs, baseLinkerProps.Export_header_lib_headers...)
+ libs = append(libs, baseLinkerProps.Static_libs...)
+ libs = append(libs, baseLinkerProps.Whole_static_libs...)
libs = android.SortedUniqueStrings(libs)
deps.SetValueForOS(os.Name, android.BazelLabelForModuleDeps(ctx, libs))
linkopts.SetValueForOS(os.Name, baseLinkerProps.Ldflags)
@@ -162,28 +208,44 @@
}
func bp2BuildListHeadersInDir(ctx android.TopDownMutatorContext, includeDir string) bazel.LabelList {
- globs := bazel.GlobsInDir(includeDir, includeDir != ".", headerExts)
+ globs := bazel.GlobsInDir(includeDir, true, headerExts)
return android.BazelLabelForModuleSrc(ctx, globs)
}
-// Bazel wants include paths to be relative to the module
-func bp2BuildMakePathsRelativeToModule(ctx android.TopDownMutatorContext, paths []string) []string {
+// Relativize a list of root-relative paths with respect to the module's
+// directory.
+//
+// include_dirs Soong prop are root-relative (b/183742505), but
+// local_include_dirs, export_include_dirs and export_system_include_dirs are
+// module dir relative. This function makes a list of paths entirely module dir
+// relative.
+//
+// For the `include` attribute, Bazel wants the paths to be relative to the
+// module.
+func bp2BuildMakePathsRelativeToModule(ctx android.BazelConversionPathContext, paths []string) []string {
var relativePaths []string
for _, path := range paths {
- relativePath := strings.TrimPrefix(path, ctx.ModuleDir()+"/")
+ // Semantics of filepath.Rel: join(ModuleDir, rel(ModuleDir, path)) == path
+ relativePath, err := filepath.Rel(ctx.ModuleDir(), path)
+ if err != nil {
+ panic(err)
+ }
relativePaths = append(relativePaths, relativePath)
}
return relativePaths
}
-// bp2BuildParseExportedIncludes creates a label list attribute contains the
-// exported included directories of a module.
+// bp2BuildParseExportedIncludes creates a string list attribute contains the
+// exported included directories of a module, and a label list attribute
+// containing the exported headers of a module.
func bp2BuildParseExportedIncludes(ctx android.TopDownMutatorContext, module *Module) (bazel.StringListAttribute, bazel.LabelListAttribute) {
libraryDecorator := module.linker.(*libraryDecorator)
+ // Export_system_include_dirs and export_include_dirs are already module dir
+ // relative, so they don't need to be relativized like include_dirs, which
+ // are root-relative.
includeDirs := libraryDecorator.flagExporter.Properties.Export_system_include_dirs
includeDirs = append(includeDirs, libraryDecorator.flagExporter.Properties.Export_include_dirs...)
- includeDirs = bp2BuildMakePathsRelativeToModule(ctx, includeDirs)
includeDirsAttribute := bazel.MakeStringListAttribute(includeDirs)
var headersAttribute bazel.LabelListAttribute
@@ -198,7 +260,6 @@
if flagExporterProperties, ok := props.(*FlagExporterProperties); ok {
archIncludeDirs := flagExporterProperties.Export_system_include_dirs
archIncludeDirs = append(archIncludeDirs, flagExporterProperties.Export_include_dirs...)
- archIncludeDirs = bp2BuildMakePathsRelativeToModule(ctx, archIncludeDirs)
// To avoid duplicate includes when base includes + arch includes are combined
archIncludeDirs = bazel.SubtractStrings(archIncludeDirs, includeDirs)
diff --git a/cc/library.go b/cc/library.go
index 2b0ee46..9a2b02e 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -260,11 +260,10 @@
compilerAttrs := bp2BuildParseCompilerProps(ctx, m)
linkerAttrs := bp2BuildParseLinkerProps(ctx, m)
exportedIncludes, exportedIncludesHeaders := bp2BuildParseExportedIncludes(ctx, m)
- compilerAttrs.hdrs.Append(exportedIncludesHeaders)
attrs := &bazelCcLibraryAttributes{
Srcs: compilerAttrs.srcs,
- Hdrs: compilerAttrs.hdrs,
+ Hdrs: exportedIncludesHeaders,
Copts: compilerAttrs.copts,
Linkopts: linkerAttrs.linkopts,
Deps: linkerAttrs.deps,
@@ -2163,69 +2162,16 @@
}
compilerAttrs := bp2BuildParseCompilerProps(ctx, module)
-
- var includeDirs []string
- var localIncludeDirs []string
- for _, props := range module.compiler.compilerProps() {
- if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
- // TODO: these should be arch and os specific.
- includeDirs = bp2BuildMakePathsRelativeToModule(ctx, baseCompilerProps.Include_dirs)
- localIncludeDirs = bp2BuildMakePathsRelativeToModule(ctx, baseCompilerProps.Local_include_dirs)
- break
- }
- }
-
- // Soong implicitly includes headers from the module's directory.
- // For Bazel builds to work we have to make these header includes explicit.
- if module.compiler.(*libraryDecorator).includeBuildDirectory() {
- localIncludeDirs = append(localIncludeDirs, ".")
- }
-
- // For Bazel, be more explicit about headers - list all header files in include dirs as srcs
- for _, includeDir := range includeDirs {
- compilerAttrs.srcs.Value.Append(bp2BuildListHeadersInDir(ctx, includeDir))
- }
- for _, localIncludeDir := range localIncludeDirs {
- compilerAttrs.srcs.Value.Append(bp2BuildListHeadersInDir(ctx, localIncludeDir))
- }
-
- var staticLibs []string
- var wholeStaticLibs []string
- for _, props := range module.linker.linkerProps() {
- // TODO: move this into bp2buildParseLinkerProps
- if baseLinkerProperties, ok := props.(*BaseLinkerProperties); ok {
- staticLibs = baseLinkerProperties.Static_libs
- wholeStaticLibs = baseLinkerProperties.Whole_static_libs
- break
- }
- }
-
- // FIXME: Treat Static_libs and Whole_static_libs differently?
- allDeps := staticLibs
- allDeps = append(allDeps, wholeStaticLibs...)
-
- depsLabels := android.BazelLabelForModuleDeps(ctx, allDeps)
-
- exportedIncludes, exportedIncludesHeaders := bp2BuildParseExportedIncludes(ctx, module)
-
- // FIXME: Unify absolute vs relative paths
- // FIXME: Use -I copts instead of setting includes= ?
- allIncludes := exportedIncludes
- allIncludes.Value = append(allIncludes.Value, includeDirs...)
- allIncludes.Value = append(allIncludes.Value, localIncludeDirs...)
-
- compilerAttrs.hdrs.Append(exportedIncludesHeaders)
-
linkerAttrs := bp2BuildParseLinkerProps(ctx, module)
- depsLabels.Append(linkerAttrs.deps.Value)
+ exportedIncludes, exportedIncludesHeaders := bp2BuildParseExportedIncludes(ctx, module)
attrs := &bazelCcLibraryStaticAttributes{
Copts: compilerAttrs.copts,
Srcs: compilerAttrs.srcs,
- Deps: bazel.MakeLabelListAttribute(depsLabels),
+ Deps: linkerAttrs.deps,
Linkstatic: true,
- Includes: allIncludes,
- Hdrs: compilerAttrs.hdrs,
+ Includes: exportedIncludes,
+ Hdrs: exportedIncludesHeaders,
}
props := bazel.BazelTargetModuleProperties{
diff --git a/cc/library_headers.go b/cc/library_headers.go
index 076ce80..078242f 100644
--- a/cc/library_headers.go
+++ b/cc/library_headers.go
@@ -95,14 +95,14 @@
return
}
- exportedIncludes, exportedIncludesHeaders := bp2BuildParseExportedIncludes(ctx, module)
+ exportedIncludes, exportedHdrs := bp2BuildParseExportedIncludes(ctx, module)
compilerAttrs := bp2BuildParseCompilerProps(ctx, module)
linkerAttrs := bp2BuildParseLinkerProps(ctx, module)
attrs := &bazelCcLibraryHeadersAttributes{
Copts: compilerAttrs.copts,
Includes: exportedIncludes,
- Hdrs: exportedIncludesHeaders,
+ Hdrs: exportedHdrs,
Deps: linkerAttrs.deps,
}
diff --git a/cc/object.go b/cc/object.go
index 9bb279a..d8f1aba 100644
--- a/cc/object.go
+++ b/cc/object.go
@@ -112,12 +112,11 @@
// For bp2build conversion.
type bazelObjectAttributes struct {
- Srcs bazel.LabelListAttribute
- Hdrs bazel.LabelListAttribute
- Deps bazel.LabelListAttribute
- Copts bazel.StringListAttribute
- Asflags []string
- Local_include_dirs []string
+ Srcs bazel.LabelListAttribute
+ Hdrs bazel.LabelListAttribute
+ Deps bazel.LabelListAttribute
+ Copts bazel.StringListAttribute
+ Asflags []string
}
type bazelObject struct {
@@ -158,18 +157,7 @@
// Set arch-specific configurable attributes
compilerAttrs := bp2BuildParseCompilerProps(ctx, m)
- var localIncludeDirs []string
var asFlags []string
- for _, props := range m.compiler.compilerProps() {
- if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
- localIncludeDirs = baseCompilerProps.Local_include_dirs
- break
- }
- }
-
- if c, ok := m.compiler.(*baseCompiler); ok && c.includeBuildDirectory() {
- localIncludeDirs = append(localIncludeDirs, ".")
- }
var deps bazel.LabelListAttribute
for _, props := range m.linker.linkerProps() {
@@ -197,12 +185,10 @@
// TODO(b/183595872) warn/error if we're not handling product variables
attrs := &bazelObjectAttributes{
- Srcs: compilerAttrs.srcs,
- Hdrs: compilerAttrs.hdrs,
- Deps: deps,
- Copts: compilerAttrs.copts,
- Asflags: asFlags,
- Local_include_dirs: localIncludeDirs,
+ Srcs: compilerAttrs.srcs,
+ Deps: deps,
+ Copts: compilerAttrs.copts,
+ Asflags: asFlags,
}
props := bazel.BazelTargetModuleProperties{
diff --git a/java/boot_image.go b/java/boot_image.go
index 78215f0..192b16b 100644
--- a/java/boot_image.go
+++ b/java/boot_image.go
@@ -53,7 +53,7 @@
ctx.RegisterModuleType("prebuilt_bootclasspath_fragment", prebuiltBootImageFactory)
}
-type bootImageContentDependencyTag struct {
+type bootclasspathFragmentContentDependencyTag struct {
blueprint.BaseDependencyTag
}
@@ -62,16 +62,22 @@
// This is a temporary workaround to make it easier to migrate to boot image modules with proper
// dependencies.
// TODO(b/177892522): Remove this and add needed visibility.
-func (b bootImageContentDependencyTag) ExcludeFromVisibilityEnforcement() {
+func (b bootclasspathFragmentContentDependencyTag) ExcludeFromVisibilityEnforcement() {
+}
+
+// The bootclasspath_fragment contents must never depend on prebuilts.
+func (b bootclasspathFragmentContentDependencyTag) ReplaceSourceWithPrebuilt() bool {
+ return false
}
// The tag used for the dependency between the boot image module and its contents.
-var bootImageContentDepTag = bootImageContentDependencyTag{}
+var bootclasspathFragmentContentDepTag = bootclasspathFragmentContentDependencyTag{}
-var _ android.ExcludeFromVisibilityEnforcementTag = bootImageContentDepTag
+var _ android.ExcludeFromVisibilityEnforcementTag = bootclasspathFragmentContentDepTag
+var _ android.ReplaceSourceWithPrebuilt = bootclasspathFragmentContentDepTag
-func IsbootImageContentDepTag(tag blueprint.DependencyTag) bool {
- return tag == bootImageContentDepTag
+func IsBootclasspathFragmentContentDepTag(tag blueprint.DependencyTag) bool {
+ return tag == bootclasspathFragmentContentDepTag
}
type bootImageProperties struct {
@@ -187,7 +193,7 @@
func (b *BootImageModule) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
tag := ctx.OtherModuleDependencyTag(dep)
- if tag == bootImageContentDepTag {
+ if IsBootclasspathFragmentContentDepTag(tag) {
// Boot image contents are automatically added to apex.
return true
}
@@ -202,8 +208,26 @@
return nil
}
+// ComponentDepsMutator adds dependencies onto modules before any prebuilt modules without a
+// corresponding source module are renamed. This means that adding a dependency using a name without
+// a prebuilt_ prefix will always resolve to a source module and when using a name with that prefix
+// it will always resolve to a prebuilt module.
+func (b *BootImageModule) ComponentDepsMutator(ctx android.BottomUpMutatorContext) {
+ module := ctx.Module()
+ _, isSourceModule := module.(*BootImageModule)
+
+ for _, name := range b.properties.Contents {
+ // A bootclasspath_fragment must depend only on other source modules, while the
+ // prebuilt_bootclasspath_fragment must only depend on other prebuilt modules.
+ if !isSourceModule {
+ name = android.PrebuiltNameFromSource(name)
+ }
+ ctx.AddDependency(module, bootclasspathFragmentContentDepTag, name)
+ }
+
+}
+
func (b *BootImageModule) DepsMutator(ctx android.BottomUpMutatorContext) {
- ctx.AddDependency(ctx.Module(), bootImageContentDepTag, b.properties.Contents...)
if SkipDexpreoptBootJars(ctx) {
return
diff --git a/java/java_test.go b/java/java_test.go
index e7ea4ef..ed70b70 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -1647,31 +1647,51 @@
java_sdk_library {
name: "sdklib",
srcs: ["a.java"],
- impl_only_libs: ["foo"],
- stub_only_libs: ["bar"],
+ libs: ["lib"],
+ static_libs: ["static-lib"],
+ impl_only_libs: ["impl-only-lib"],
+ stub_only_libs: ["stub-only-lib"],
+ stub_only_static_libs: ["stub-only-static-lib"],
}
- java_library {
- name: "foo",
+ java_defaults {
+ name: "defaults",
srcs: ["a.java"],
sdk_version: "current",
}
- java_library {
- name: "bar",
- srcs: ["a.java"],
- sdk_version: "current",
- }
+ java_library { name: "lib", defaults: ["defaults"] }
+ java_library { name: "static-lib", defaults: ["defaults"] }
+ java_library { name: "impl-only-lib", defaults: ["defaults"] }
+ java_library { name: "stub-only-lib", defaults: ["defaults"] }
+ java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
`)
-
- for _, implName := range []string{"sdklib", "sdklib.impl"} {
- implJavacCp := result.ModuleForTests(implName, "android_common").Rule("javac").Args["classpath"]
- if !strings.Contains(implJavacCp, "/foo.jar") || strings.Contains(implJavacCp, "/bar.jar") {
- t.Errorf("%v javac classpath %v does not contain foo and not bar", implName, implJavacCp)
- }
+ var expectations = []struct {
+ lib string
+ on_impl_classpath bool
+ on_stub_classpath bool
+ in_impl_combined bool
+ in_stub_combined bool
+ }{
+ {lib: "lib", on_impl_classpath: true},
+ {lib: "static-lib", in_impl_combined: true},
+ {lib: "impl-only-lib", on_impl_classpath: true},
+ {lib: "stub-only-lib", on_stub_classpath: true},
+ {lib: "stub-only-static-lib", in_stub_combined: true},
}
- stubName := apiScopePublic.stubsLibraryModuleName("sdklib")
- stubsJavacCp := result.ModuleForTests(stubName, "android_common").Rule("javac").Args["classpath"]
- if strings.Contains(stubsJavacCp, "/foo.jar") || !strings.Contains(stubsJavacCp, "/bar.jar") {
- t.Errorf("stubs javac classpath %v does not contain bar and not foo", stubsJavacCp)
+ verify := func(sdklib, dep string, cp, combined bool) {
+ sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
+ expected := cp || combined // Every combined jar is also on the classpath.
+ android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
+
+ combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
+ depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
+ android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
+ }
+ for _, expectation := range expectations {
+ verify("sdklib", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
+ verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
+
+ stubName := apiScopePublic.stubsLibraryModuleName("sdklib")
+ verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
}
}
diff --git a/java/sdk_library.go b/java/sdk_library.go
index 223be5c..05ce97a 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -399,6 +399,9 @@
// List of Java libraries that will be in the classpath when building stubs
Stub_only_libs []string `android:"arch_variant"`
+ // List of Java libraries that will included in stub libraries
+ Stub_only_static_libs []string `android:"arch_variant"`
+
// list of package names that will be documented and publicized as API.
// This allows the API to be restricted to a subset of the source files provided.
// If this is unspecified then all the source files will be treated as being part
@@ -1275,6 +1278,7 @@
System_modules *string
Patch_module *string
Libs []string
+ Static_libs []string
Compile_dex *bool
Java_version *string
Openjdk9 struct {
@@ -1299,6 +1303,7 @@
props.Patch_module = module.properties.Patch_module
props.Installable = proptools.BoolPtr(false)
props.Libs = module.sdkLibraryProperties.Stub_only_libs
+ props.Static_libs = module.sdkLibraryProperties.Stub_only_static_libs
// The stub-annotations library contains special versions of the annotations
// with CLASS retention policy, so that they're kept.
if proptools.Bool(module.sdkLibraryProperties.Annotations_enabled) {
diff --git a/scripts/hiddenapi/generate_hiddenapi_lists.py b/scripts/hiddenapi/generate_hiddenapi_lists.py
index 6816475..5ab93d1 100755
--- a/scripts/hiddenapi/generate_hiddenapi_lists.py
+++ b/scripts/hiddenapi/generate_hiddenapi_lists.py
@@ -332,7 +332,7 @@
def main(argv):
# Parse arguments.
args = vars(get_args())
- flagfiles = parse_ordered_flags(args['ordered_flags'])
+ flagfiles = parse_ordered_flags(args['ordered_flags'] or [])
# Initialize API->flags dictionary.
flags = FlagsDict()
diff --git a/sdk/Android.bp b/sdk/Android.bp
index 7b034e6..09a7286 100644
--- a/sdk/Android.bp
+++ b/sdk/Android.bp
@@ -20,7 +20,7 @@
"update.go",
],
testSrcs: [
- "boot_image_sdk_test.go",
+ "bootclasspath_fragment_sdk_test.go",
"bp_test.go",
"cc_sdk_test.go",
"compat_config_sdk_test.go",
diff --git a/sdk/boot_image_sdk_test.go b/sdk/bootclasspath_fragment_sdk_test.go
similarity index 67%
rename from sdk/boot_image_sdk_test.go
rename to sdk/bootclasspath_fragment_sdk_test.go
index 5a03e34..10f86e8 100644
--- a/sdk/boot_image_sdk_test.go
+++ b/sdk/bootclasspath_fragment_sdk_test.go
@@ -20,17 +20,17 @@
"android/soong/android"
)
-func TestSnapshotWithBootImage(t *testing.T) {
+func TestSnapshotWithBootclasspathFragment(t *testing.T) {
result := android.GroupFixturePreparers(
prepareForSdkTestWithJava,
android.FixtureWithRootAndroidBp(`
sdk {
name: "mysdk",
- boot_images: ["mybootimage"],
+ bootclasspath_fragments: ["mybootclasspathfragment"],
}
- boot_image {
- name: "mybootimage",
+ bootclasspath_fragment {
+ name: "mybootclasspathfragment",
image_name: "art",
}
`),
@@ -40,8 +40,8 @@
checkUnversionedAndroidBpContents(`
// This is auto-generated. DO NOT EDIT.
-prebuilt_boot_image {
- name: "mybootimage",
+prebuilt_bootclasspath_fragment {
+ name: "mybootclasspathfragment",
prefer: false,
visibility: ["//visibility:public"],
apex_available: ["//apex_available:platform"],
@@ -51,9 +51,9 @@
checkVersionedAndroidBpContents(`
// This is auto-generated. DO NOT EDIT.
-prebuilt_boot_image {
- name: "mysdk_mybootimage@current",
- sdk_member_name: "mybootimage",
+prebuilt_bootclasspath_fragment {
+ name: "mysdk_mybootclasspathfragment@current",
+ sdk_member_name: "mybootclasspathfragment",
visibility: ["//visibility:public"],
apex_available: ["//apex_available:platform"],
image_name: "art",
@@ -62,37 +62,37 @@
sdk_snapshot {
name: "mysdk@current",
visibility: ["//visibility:public"],
- boot_images: ["mysdk_mybootimage@current"],
+ bootclasspath_fragments: ["mysdk_mybootclasspathfragment@current"],
}
`),
checkAllCopyRules(""))
}
-// Test that boot_image works with sdk.
-func TestBasicSdkWithBootImage(t *testing.T) {
+// Test that bootclasspath_fragment works with sdk.
+func TestBasicSdkWithBootclasspathFragment(t *testing.T) {
android.GroupFixturePreparers(
prepareForSdkTestWithApex,
prepareForSdkTestWithJava,
android.FixtureWithRootAndroidBp(`
sdk {
name: "mysdk",
- boot_images: ["mybootimage"],
+ bootclasspath_fragments: ["mybootclasspathfragment"],
}
- boot_image {
- name: "mybootimage",
+ bootclasspath_fragment {
+ name: "mybootclasspathfragment",
image_name: "art",
apex_available: ["myapex"],
}
sdk_snapshot {
name: "mysdk@1",
- boot_images: ["mybootimage_mysdk_1"],
+ bootclasspath_fragments: ["mybootclasspathfragment_mysdk_1"],
}
- prebuilt_boot_image {
- name: "mybootimage_mysdk_1",
- sdk_member_name: "mybootimage",
+ prebuilt_bootclasspath_fragment {
+ name: "mybootclasspathfragment_mysdk_1",
+ sdk_member_name: "mybootclasspathfragment",
prefer: false,
visibility: ["//visibility:public"],
apex_available: [