diff --git a/android/config.go b/android/config.go index 222b142e2..a07cb6cd0 100644 --- a/android/config.go +++ b/android/config.go @@ -1619,6 +1619,10 @@ func (c *deviceConfig) ShippingApiLevel() ApiLevel { return uncheckedFinalApiLevel(apiLevel) } +func (c *deviceConfig) BuildBrokenClangProperty() bool { + return c.config.productVariables.BuildBrokenClangProperty +} + func (c *deviceConfig) BuildBrokenEnforceSyspropOwner() bool { return c.config.productVariables.BuildBrokenEnforceSyspropOwner } diff --git a/android/variable.go b/android/variable.go index 2d7b0bf8e..7a080fef7 100644 --- a/android/variable.go +++ b/android/variable.go @@ -430,6 +430,7 @@ type productVariables struct { ShippingApiLevel *string `json:",omitempty"` + BuildBrokenClangProperty bool `json:",omitempty"` BuildBrokenDepfile *bool `json:",omitempty"` BuildBrokenEnforceSyspropOwner bool `json:",omitempty"` BuildBrokenTrebleSyspropNeverallow bool `json:",omitempty"` diff --git a/cc/cc.go b/cc/cc.go index 336771a83..f1e9bf621 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -1900,6 +1900,8 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { if c.Properties.Clang != nil && *c.Properties.Clang == false { ctx.PropertyErrorf("clang", "false (GCC) is no longer supported") + } else if c.Properties.Clang != nil && !ctx.DeviceConfig().BuildBrokenClangProperty() { + ctx.PropertyErrorf("clang", "property is deprecated, see Changes.md file") } flags := Flags{ diff --git a/cc/cc_test.go b/cc/cc_test.go index f02570020..36174d639 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -4336,3 +4336,53 @@ func TestIncludeDirectoryOrdering(t *testing.T) { } } + +func TestCcBuildBrokenClangProperty(t *testing.T) { + tests := []struct { + name string + clang bool + BuildBrokenClangProperty bool + err string + }{ + { + name: "error when clang is set to false", + clang: false, + err: "is no longer supported", + }, + { + name: "error when clang is set to true", + clang: true, + err: "property is deprecated, see Changes.md", + }, + { + name: "no error when BuildBrokenClangProperty is explicitly set to true", + clang: true, + BuildBrokenClangProperty: true, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + bp := fmt.Sprintf(` + cc_library { + name: "foo", + clang: %t, + }`, test.clang) + + if test.err == "" { + android.GroupFixturePreparers( + prepareForCcTest, + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + if test.BuildBrokenClangProperty { + variables.BuildBrokenClangProperty = test.BuildBrokenClangProperty + } + }), + ).RunTestWithBp(t, bp) + } else { + prepareForCcTest. + ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(test.err)). + RunTestWithBp(t, bp) + } + }) + } +}