Support building for Fuchsia. am: c32c6b0d79
am: ac2925f410
Change-Id: I29ce80cb8ba76835b97cbdd24c0e3da625dfa83e
This commit is contained in:
commit
b85599e803
|
@ -97,10 +97,12 @@ bootstrap_go_package {
|
||||||
|
|
||||||
"cc/config/arm_device.go",
|
"cc/config/arm_device.go",
|
||||||
"cc/config/arm64_device.go",
|
"cc/config/arm64_device.go",
|
||||||
|
"cc/config/arm64_fuchsia_device.go",
|
||||||
"cc/config/mips_device.go",
|
"cc/config/mips_device.go",
|
||||||
"cc/config/mips64_device.go",
|
"cc/config/mips64_device.go",
|
||||||
"cc/config/x86_device.go",
|
"cc/config/x86_device.go",
|
||||||
"cc/config/x86_64_device.go",
|
"cc/config/x86_64_device.go",
|
||||||
|
"cc/config/x86_64_fuchsia_device.go",
|
||||||
|
|
||||||
"cc/config/x86_darwin_host.go",
|
"cc/config/x86_darwin_host.go",
|
||||||
"cc/config/x86_linux_host.go",
|
"cc/config/x86_linux_host.go",
|
||||||
|
|
|
@ -224,6 +224,22 @@ func TestConfig(buildDir string, env map[string]string) Config {
|
||||||
return Config{config}
|
return Config{config}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestArchConfigFuchsia(buildDir string, env map[string]string) Config {
|
||||||
|
testConfig := TestConfig(buildDir, env)
|
||||||
|
config := testConfig.config
|
||||||
|
|
||||||
|
config.Targets = map[OsType][]Target{
|
||||||
|
Fuchsia: []Target{
|
||||||
|
{Fuchsia, Arch{ArchType: Arm64, ArchVariant: "", Native: true}},
|
||||||
|
},
|
||||||
|
BuildOs: []Target{
|
||||||
|
{BuildOs, Arch{ArchType: X86_64}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return testConfig
|
||||||
|
}
|
||||||
|
|
||||||
// TestConfig returns a Config object suitable for using for tests that need to run the arch mutator
|
// TestConfig returns a Config object suitable for using for tests that need to run the arch mutator
|
||||||
func TestArchConfig(buildDir string, env map[string]string) Config {
|
func TestArchConfig(buildDir string, env map[string]string) Config {
|
||||||
testConfig := TestConfig(buildDir, env)
|
testConfig := TestConfig(buildDir, env)
|
||||||
|
|
|
@ -196,7 +196,7 @@ func (binary *binaryDecorator) linkerInit(ctx BaseModuleContext) {
|
||||||
if binary.Properties.Static_executable == nil && ctx.Config().HostStaticBinaries() {
|
if binary.Properties.Static_executable == nil && ctx.Config().HostStaticBinaries() {
|
||||||
binary.Properties.Static_executable = BoolPtr(true)
|
binary.Properties.Static_executable = BoolPtr(true)
|
||||||
}
|
}
|
||||||
} else {
|
} else if !ctx.Fuchsia() {
|
||||||
// Static executables are not supported on Darwin or Windows
|
// Static executables are not supported on Darwin or Windows
|
||||||
binary.Properties.Static_executable = nil
|
binary.Properties.Static_executable = nil
|
||||||
}
|
}
|
||||||
|
|
7
cc/cc.go
7
cc/cc.go
|
@ -599,7 +599,7 @@ func (ctx *moduleContextImpl) staticBinary() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *moduleContextImpl) useSdk() bool {
|
func (ctx *moduleContextImpl) useSdk() bool {
|
||||||
if ctx.ctx.Device() && !ctx.useVndk() && !ctx.inRecovery() {
|
if ctx.ctx.Device() && !ctx.useVndk() && !ctx.inRecovery() && !ctx.ctx.Fuchsia() {
|
||||||
return String(ctx.mod.Properties.Sdk_version) != ""
|
return String(ctx.mod.Properties.Sdk_version) != ""
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
@ -668,6 +668,11 @@ func (ctx *moduleContextImpl) shouldCreateVndkSourceAbiDump() bool {
|
||||||
if ctx.ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
|
if ctx.ctx.Config().IsEnvTrue("SKIP_ABI_CHECKS") {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ctx.ctx.Fuchsia() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
if sanitize := ctx.mod.sanitize; sanitize != nil {
|
if sanitize := ctx.mod.sanitize; sanitize != nil {
|
||||||
if !sanitize.isVariantOnProductionDevice() {
|
if !sanitize.isVariantOnProductionDevice() {
|
||||||
return false
|
return false
|
||||||
|
|
135
cc/cc_test.go
135
cc/cc_test.go
|
@ -51,29 +51,8 @@ func TestMain(m *testing.M) {
|
||||||
os.Exit(run())
|
os.Exit(run())
|
||||||
}
|
}
|
||||||
|
|
||||||
func createTestContext(t *testing.T, config android.Config, bp string) *android.TestContext {
|
func gatherRequiredDeps(os android.OsType) string {
|
||||||
ctx := android.NewTestArchContext()
|
ret := `
|
||||||
ctx.RegisterModuleType("cc_binary", android.ModuleFactoryAdaptor(BinaryFactory))
|
|
||||||
ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(LibraryFactory))
|
|
||||||
ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(LibrarySharedFactory))
|
|
||||||
ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(LibraryHeaderFactory))
|
|
||||||
ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(ToolchainLibraryFactory))
|
|
||||||
ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(LlndkLibraryFactory))
|
|
||||||
ctx.RegisterModuleType("llndk_headers", android.ModuleFactoryAdaptor(llndkHeadersFactory))
|
|
||||||
ctx.RegisterModuleType("vendor_public_library", android.ModuleFactoryAdaptor(vendorPublicLibraryFactory))
|
|
||||||
ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(ObjectFactory))
|
|
||||||
ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
|
|
||||||
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
|
||||||
ctx.BottomUp("image", ImageMutator).Parallel()
|
|
||||||
ctx.BottomUp("link", LinkageMutator).Parallel()
|
|
||||||
ctx.BottomUp("vndk", VndkMutator).Parallel()
|
|
||||||
ctx.BottomUp("version", VersionMutator).Parallel()
|
|
||||||
ctx.BottomUp("begin", BeginMutator).Parallel()
|
|
||||||
})
|
|
||||||
ctx.Register()
|
|
||||||
|
|
||||||
// add some modules that are required by the compiler and/or linker
|
|
||||||
bp = bp + `
|
|
||||||
toolchain_library {
|
toolchain_library {
|
||||||
name: "libatomic",
|
name: "libatomic",
|
||||||
vendor_available: true,
|
vendor_available: true,
|
||||||
|
@ -215,8 +194,45 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android.
|
||||||
cc_library {
|
cc_library {
|
||||||
name: "libprotobuf-cpp-lite",
|
name: "libprotobuf-cpp-lite",
|
||||||
}
|
}
|
||||||
|
`
|
||||||
|
if os == android.Fuchsia {
|
||||||
|
ret += `
|
||||||
|
cc_library {
|
||||||
|
name: "libbioniccompat",
|
||||||
|
stl: "none",
|
||||||
|
}
|
||||||
|
cc_library {
|
||||||
|
name: "libcompiler_rt",
|
||||||
|
stl: "none",
|
||||||
|
}
|
||||||
|
`
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
`
|
func createTestContext(t *testing.T, config android.Config, bp string, os android.OsType) *android.TestContext {
|
||||||
|
ctx := android.NewTestArchContext()
|
||||||
|
ctx.RegisterModuleType("cc_binary", android.ModuleFactoryAdaptor(BinaryFactory))
|
||||||
|
ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(LibraryFactory))
|
||||||
|
ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(LibrarySharedFactory))
|
||||||
|
ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(LibraryHeaderFactory))
|
||||||
|
ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(ToolchainLibraryFactory))
|
||||||
|
ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(LlndkLibraryFactory))
|
||||||
|
ctx.RegisterModuleType("llndk_headers", android.ModuleFactoryAdaptor(llndkHeadersFactory))
|
||||||
|
ctx.RegisterModuleType("vendor_public_library", android.ModuleFactoryAdaptor(vendorPublicLibraryFactory))
|
||||||
|
ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(ObjectFactory))
|
||||||
|
ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
|
||||||
|
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
||||||
|
ctx.BottomUp("image", ImageMutator).Parallel()
|
||||||
|
ctx.BottomUp("link", LinkageMutator).Parallel()
|
||||||
|
ctx.BottomUp("vndk", VndkMutator).Parallel()
|
||||||
|
ctx.BottomUp("version", VersionMutator).Parallel()
|
||||||
|
ctx.BottomUp("begin", BeginMutator).Parallel()
|
||||||
|
})
|
||||||
|
ctx.Register()
|
||||||
|
|
||||||
|
// add some modules that are required by the compiler and/or linker
|
||||||
|
bp = bp + gatherRequiredDeps(os)
|
||||||
|
|
||||||
ctx.MockFileSystem(map[string][]byte{
|
ctx.MockFileSystem(map[string][]byte{
|
||||||
"Android.bp": []byte(bp),
|
"Android.bp": []byte(bp),
|
||||||
|
@ -232,8 +248,12 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android.
|
||||||
}
|
}
|
||||||
|
|
||||||
func testCcWithConfig(t *testing.T, bp string, config android.Config) *android.TestContext {
|
func testCcWithConfig(t *testing.T, bp string, config android.Config) *android.TestContext {
|
||||||
|
return testCcWithConfigForOs(t, bp, config, android.Android)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testCcWithConfigForOs(t *testing.T, bp string, config android.Config, os android.OsType) *android.TestContext {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
ctx := createTestContext(t, config, bp)
|
ctx := createTestContext(t, config, bp, os)
|
||||||
|
|
||||||
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||||
android.FailIfErrored(t, errs)
|
android.FailIfErrored(t, errs)
|
||||||
|
@ -266,7 +286,7 @@ func testCcError(t *testing.T, pattern string, bp string) {
|
||||||
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||||
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||||
|
|
||||||
ctx := createTestContext(t, config, bp)
|
ctx := createTestContext(t, config, bp, android.Android)
|
||||||
|
|
||||||
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
|
@ -289,6 +309,69 @@ const (
|
||||||
recoveryVariant = "android_arm64_armv8-a_recovery_shared"
|
recoveryVariant = "android_arm64_armv8-a_recovery_shared"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestFuchsiaDeps(t *testing.T) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
bp := `
|
||||||
|
cc_library {
|
||||||
|
name: "libTest",
|
||||||
|
srcs: ["foo.c"],
|
||||||
|
target: {
|
||||||
|
fuchsia: {
|
||||||
|
srcs: ["bar.c"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}`
|
||||||
|
|
||||||
|
config := android.TestArchConfigFuchsia(buildDir, nil)
|
||||||
|
ctx := testCcWithConfigForOs(t, bp, config, android.Fuchsia)
|
||||||
|
|
||||||
|
rt := false
|
||||||
|
fb := false
|
||||||
|
|
||||||
|
ld := ctx.ModuleForTests("libTest", "fuchsia_arm64_shared").Rule("ld")
|
||||||
|
implicits := ld.Implicits
|
||||||
|
for _, lib := range implicits {
|
||||||
|
if strings.Contains(lib.Rel(), "libcompiler_rt") {
|
||||||
|
rt = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.Contains(lib.Rel(), "libbioniccompat") {
|
||||||
|
fb = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !rt || !fb {
|
||||||
|
t.Errorf("fuchsia libs must link libcompiler_rt and libbioniccompat")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFuchsiaTargetDecl(t *testing.T) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
bp := `
|
||||||
|
cc_library {
|
||||||
|
name: "libTest",
|
||||||
|
srcs: ["foo.c"],
|
||||||
|
target: {
|
||||||
|
fuchsia: {
|
||||||
|
srcs: ["bar.c"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}`
|
||||||
|
|
||||||
|
config := android.TestArchConfigFuchsia(buildDir, nil)
|
||||||
|
ctx := testCcWithConfigForOs(t, bp, config, android.Fuchsia)
|
||||||
|
ld := ctx.ModuleForTests("libTest", "fuchsia_arm64_shared").Rule("ld")
|
||||||
|
var objs []string
|
||||||
|
for _, o := range ld.Inputs {
|
||||||
|
objs = append(objs, o.Base())
|
||||||
|
}
|
||||||
|
if len(objs) != 2 || objs[0] != "foo.o" || objs[1] != "bar.o" {
|
||||||
|
t.Errorf("inputs of libTest must be []string{\"foo.o\", \"bar.o\"}, but was %#v.", objs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestVendorSrc(t *testing.T) {
|
func TestVendorSrc(t *testing.T) {
|
||||||
ctx := testCc(t, `
|
ctx := testCc(t, `
|
||||||
cc_library {
|
cc_library {
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
// Copyright 2018 Google Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"android/soong/android"
|
||||||
|
)
|
||||||
|
|
||||||
|
var fuchsiaArm64SysRoot string = "prebuilts/fuchsia_sdk/arch/arm64/sysroot"
|
||||||
|
var fuchsiaArm64PrebuiltLibsRoot string = "fuchsia/prebuilt_libs/"
|
||||||
|
|
||||||
|
type toolchainFuchsiaArm64 struct {
|
||||||
|
toolchain64Bit
|
||||||
|
toolchainFuchsia
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) Name() string {
|
||||||
|
return "arm64"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) GccRoot() string {
|
||||||
|
return "${config.Arm64GccRoot}"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) GccTriple() string {
|
||||||
|
return "aarch64-linux-android"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) GccVersion() string {
|
||||||
|
return arm64GccVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) Cflags() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) Cppflags() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) Ldflags() string {
|
||||||
|
return "-Wl,--fix-cortex-a53-843419"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) IncludeFlags() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) ToolchainCflags() string {
|
||||||
|
return "-mcpu=cortex-a53"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) ClangTriple() string {
|
||||||
|
return "arm64-fuchsia-android"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) ClangCppflags() string {
|
||||||
|
return "-Wno-error=deprecated-declarations"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) ClangLdflags() string {
|
||||||
|
return "--target=arm64-fuchsia --sysroot=" + fuchsiaArm64SysRoot + " -L" + fuchsiaArm64PrebuiltLibsRoot + "/aarch64-fuchsia/lib " + "-Lprebuilts/fuchsia_sdk/arch/arm64/dist/"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) ClangLldflags() string {
|
||||||
|
return "--target=arm64-fuchsia --sysroot=" + fuchsiaArm64SysRoot + " -L" + fuchsiaArm64PrebuiltLibsRoot + "/aarch64-fuchsia/lib " + "-Lprebuilts/fuchsia_sdk/arch/arm64/dist/"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) ClangCflags() string {
|
||||||
|
return "--target=arm64-fuchsia --sysroot=" + fuchsiaArm64SysRoot + " -I" + fuchsiaArm64SysRoot + "/include"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) Bionic() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaArm64) ToolchainClangCflags() string {
|
||||||
|
return "-march=armv8-a"
|
||||||
|
}
|
||||||
|
|
||||||
|
var toolchainArm64FuchsiaSingleton Toolchain = &toolchainFuchsiaArm64{}
|
||||||
|
|
||||||
|
func arm64FuchsiaToolchainFactory(arch android.Arch) Toolchain {
|
||||||
|
return toolchainArm64FuchsiaSingleton
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerToolchainFactory(android.Fuchsia, android.Arm64, arm64FuchsiaToolchainFactory)
|
||||||
|
}
|
|
@ -150,8 +150,13 @@ func init() {
|
||||||
|
|
||||||
pctx.StaticVariable("CommonClangGlobalCflags",
|
pctx.StaticVariable("CommonClangGlobalCflags",
|
||||||
strings.Join(append(ClangFilterUnknownCflags(commonGlobalCflags), "${ClangExtraCflags}"), " "))
|
strings.Join(append(ClangFilterUnknownCflags(commonGlobalCflags), "${ClangExtraCflags}"), " "))
|
||||||
pctx.StaticVariable("DeviceClangGlobalCflags",
|
pctx.VariableFunc("DeviceClangGlobalCflags", func(ctx android.PackageVarContext) string {
|
||||||
strings.Join(append(ClangFilterUnknownCflags(deviceGlobalCflags), "${ClangExtraTargetCflags}"), " "))
|
if ctx.Config().Fuchsia() {
|
||||||
|
return strings.Join(ClangFilterUnknownCflags(deviceGlobalCflags), " ")
|
||||||
|
} else {
|
||||||
|
return strings.Join(append(ClangFilterUnknownCflags(deviceGlobalCflags), "${ClangExtraTargetCflags}"), " ")
|
||||||
|
}
|
||||||
|
})
|
||||||
pctx.StaticVariable("HostClangGlobalCflags",
|
pctx.StaticVariable("HostClangGlobalCflags",
|
||||||
strings.Join(ClangFilterUnknownCflags(hostGlobalCflags), " "))
|
strings.Join(ClangFilterUnknownCflags(hostGlobalCflags), " "))
|
||||||
pctx.StaticVariable("NoOverrideClangGlobalCflags",
|
pctx.StaticVariable("NoOverrideClangGlobalCflags",
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
// Copyright 2018 Google Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"android/soong/android"
|
||||||
|
)
|
||||||
|
|
||||||
|
var fuchsiaSysRoot string = "prebuilts/fuchsia_sdk/arch/x64/sysroot"
|
||||||
|
var fuchsiaPrebuiltLibsRoot string = "fuchsia/prebuilt_libs"
|
||||||
|
|
||||||
|
type toolchainFuchsia struct {
|
||||||
|
cFlags, ldFlags string
|
||||||
|
}
|
||||||
|
|
||||||
|
type toolchainFuchsiaX8664 struct {
|
||||||
|
toolchain64Bit
|
||||||
|
toolchainFuchsia
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) Name() string {
|
||||||
|
return "x86_64"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) GccRoot() string {
|
||||||
|
return "${config.X86_64GccRoot}"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) GccTriple() string {
|
||||||
|
return "x86_64-linux-android"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) GccVersion() string {
|
||||||
|
return x86_64GccVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) Cflags() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) Cppflags() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) Ldflags() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) IncludeFlags() string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) ClangTriple() string {
|
||||||
|
return "x86_64-fuchsia-android"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) ClangCppflags() string {
|
||||||
|
return "-Wno-error=deprecated-declarations"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) ClangLdflags() string {
|
||||||
|
return "--target=x86_64-fuchsia --sysroot=" + fuchsiaSysRoot + " -L" + fuchsiaPrebuiltLibsRoot + "/x86_64-fuchsia/lib " + "-Lprebuilts/fuchsia_sdk/arch/x64/dist/"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) ClangLldflags() string {
|
||||||
|
return "--target=x86_64-fuchsia --sysroot=" + fuchsiaSysRoot + " -L" + fuchsiaPrebuiltLibsRoot + "/x86_64-fuchsia/lib " + "-Lprebuilts/fuchsia_sdk/arch/x64/dist/"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) ClangCflags() string {
|
||||||
|
return "--target=x86_64-fuchsia --sysroot=" + fuchsiaSysRoot + " -I" + fuchsiaSysRoot + "/include"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) Bionic() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) YasmFlags() string {
|
||||||
|
return "-f elf64 -m amd64"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *toolchainFuchsiaX8664) ToolchainClangCflags() string {
|
||||||
|
return "-DUSE_SSSE3 -mssse3"
|
||||||
|
}
|
||||||
|
|
||||||
|
var toolchainFuchsiaSingleton Toolchain = &toolchainFuchsiaX8664{}
|
||||||
|
|
||||||
|
func fuchsiaToolchainFactory(arch android.Arch) Toolchain {
|
||||||
|
return toolchainFuchsiaSingleton
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerToolchainFactory(android.Fuchsia, android.X86_64, fuchsiaToolchainFactory)
|
||||||
|
}
|
18
cc/linker.go
18
cc/linker.go
|
@ -270,6 +270,18 @@ func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps {
|
||||||
deps.LateSharedLibs = append(deps.LateSharedLibs, systemSharedLibs...)
|
deps.LateSharedLibs = append(deps.LateSharedLibs, systemSharedLibs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ctx.Fuchsia() {
|
||||||
|
if ctx.ModuleName() != "libbioniccompat" &&
|
||||||
|
ctx.ModuleName() != "libcompiler_rt-extras" &&
|
||||||
|
ctx.ModuleName() != "libcompiler_rt" {
|
||||||
|
deps.StaticLibs = append(deps.StaticLibs, "libbioniccompat")
|
||||||
|
}
|
||||||
|
if ctx.ModuleName() != "libcompiler_rt" && ctx.ModuleName() != "libcompiler_rt-extras" {
|
||||||
|
deps.LateStaticLibs = append(deps.LateStaticLibs, "libcompiler_rt")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if ctx.Windows() {
|
if ctx.Windows() {
|
||||||
deps.LateStaticLibs = append(deps.LateStaticLibs, "libwinpthread")
|
deps.LateStaticLibs = append(deps.LateStaticLibs, "libwinpthread")
|
||||||
}
|
}
|
||||||
|
@ -360,7 +372,7 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags {
|
||||||
flags.LdFlags = append(flags.LdFlags, toolchain.ClangLdflags())
|
flags.LdFlags = append(flags.LdFlags, toolchain.ClangLdflags())
|
||||||
}
|
}
|
||||||
|
|
||||||
if !ctx.toolchain().Bionic() {
|
if !ctx.toolchain().Bionic() && !ctx.Fuchsia() {
|
||||||
CheckBadHostLdlibs(ctx, "host_ldlibs", linker.Properties.Host_ldlibs)
|
CheckBadHostLdlibs(ctx, "host_ldlibs", linker.Properties.Host_ldlibs)
|
||||||
|
|
||||||
flags.LdFlags = append(flags.LdFlags, linker.Properties.Host_ldlibs...)
|
flags.LdFlags = append(flags.LdFlags, linker.Properties.Host_ldlibs...)
|
||||||
|
@ -379,6 +391,10 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ctx.Fuchsia() {
|
||||||
|
flags.LdFlags = append(flags.LdFlags, "-lfdio", "-lzircon")
|
||||||
|
}
|
||||||
|
|
||||||
CheckBadLinkerFlags(ctx, "ldflags", linker.Properties.Ldflags)
|
CheckBadLinkerFlags(ctx, "ldflags", linker.Properties.Ldflags)
|
||||||
|
|
||||||
flags.LdFlags = append(flags.LdFlags, proptools.NinjaAndShellEscape(linker.Properties.Ldflags)...)
|
flags.LdFlags = append(flags.LdFlags, proptools.NinjaAndShellEscape(linker.Properties.Ldflags)...)
|
||||||
|
|
|
@ -167,6 +167,11 @@ func (sanitize *sanitize) begin(ctx BaseModuleContext) {
|
||||||
s.Never = BoolPtr(true)
|
s.Never = BoolPtr(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sanitizers do not work on Fuchsia yet.
|
||||||
|
if ctx.Fuchsia() {
|
||||||
|
s.Never = BoolPtr(true)
|
||||||
|
}
|
||||||
|
|
||||||
// Never always wins.
|
// Never always wins.
|
||||||
if Bool(s.Never) {
|
if Bool(s.Never) {
|
||||||
return
|
return
|
||||||
|
|
25
cc/stl.go
25
cc/stl.go
|
@ -91,6 +91,26 @@ func (stl *stl) begin(ctx BaseModuleContext) {
|
||||||
ctx.ModuleErrorf("stl: %q is not a supported STL for windows", s)
|
ctx.ModuleErrorf("stl: %q is not a supported STL for windows", s)
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
} else if ctx.Fuchsia() {
|
||||||
|
switch s {
|
||||||
|
case "c++_static":
|
||||||
|
return "libc++_static"
|
||||||
|
case "c++_shared":
|
||||||
|
return "libc++"
|
||||||
|
case "libc++", "libc++_static":
|
||||||
|
return s
|
||||||
|
case "none":
|
||||||
|
return ""
|
||||||
|
case "":
|
||||||
|
if ctx.static() {
|
||||||
|
return "libc++_static"
|
||||||
|
} else {
|
||||||
|
return "libc++"
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
ctx.ModuleErrorf("stl: %q is not a supported STL on Fuchsia", s)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
switch s {
|
switch s {
|
||||||
case "libc++", "libc++_static":
|
case "libc++", "libc++_static":
|
||||||
|
@ -248,8 +268,9 @@ var hostDynamicGccLibs, hostStaticGccLibs map[android.OsType][]string
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
hostDynamicGccLibs = map[android.OsType][]string{
|
hostDynamicGccLibs = map[android.OsType][]string{
|
||||||
android.Linux: []string{"-lgcc_s", "-lgcc", "-lc", "-lgcc_s", "-lgcc"},
|
android.Fuchsia: []string{"-lc", "-lunwind"},
|
||||||
android.Darwin: []string{"-lc", "-lSystem"},
|
android.Linux: []string{"-lgcc_s", "-lgcc", "-lc", "-lgcc_s", "-lgcc"},
|
||||||
|
android.Darwin: []string{"-lc", "-lSystem"},
|
||||||
android.Windows: []string{"-Wl,--start-group", "-lmingw32", "-lgcc", "-lgcc_eh",
|
android.Windows: []string{"-Wl,--start-group", "-lmingw32", "-lgcc", "-lgcc_eh",
|
||||||
"-lmoldname", "-lmingwex", "-lmsvcrt", "-lucrt", "-lpthread",
|
"-lmoldname", "-lmingwex", "-lmsvcrt", "-lucrt", "-lpthread",
|
||||||
"-ladvapi32", "-lshell32", "-luser32", "-lkernel32", "-lpsapi",
|
"-ladvapi32", "-lshell32", "-luser32", "-lkernel32", "-lpsapi",
|
||||||
|
|
Loading…
Reference in New Issue