99 lines
3.2 KiB
Go
99 lines
3.2 KiB
Go
// Copyright 2020 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"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
// This is a host toolchain but flags for device toolchain are required
|
|
// as the flags are actually for Bionic-based builds.
|
|
linuxCrossCflags = ClangFilterUnknownCflags(append(deviceGlobalCflags,
|
|
// clang by default enables PIC when the clang triple is set to *-android.
|
|
// See toolchain/llvm-project/clang/lib/Driver/ToolChains/CommonArgs.cpp#920.
|
|
// However, for this host target, we don't set "-android" to avoid __ANDROID__ macro
|
|
// which stands for "Android device target". Keeping PIC on is required because
|
|
// many modules we have (e.g. Bionic) assume PIC.
|
|
"-fpic",
|
|
|
|
// This is normally in ClangExtraTargetCflags, but that's for device and we need
|
|
// the same for host
|
|
"-nostdlibinc",
|
|
))
|
|
|
|
linuxCrossLdflags = ClangFilterUnknownCflags([]string{
|
|
"-Wl,-z,noexecstack",
|
|
"-Wl,-z,relro",
|
|
"-Wl,-z,now",
|
|
"-Wl,--build-id=md5",
|
|
"-Wl,--warn-shared-textrel",
|
|
"-Wl,--fatal-warnings",
|
|
"-Wl,--hash-style=gnu",
|
|
"-Wl,--no-undefined-version",
|
|
})
|
|
)
|
|
|
|
func init() {
|
|
pctx.StaticVariable("LinuxBionicArm64Cflags", strings.Join(linuxCrossCflags, " "))
|
|
pctx.StaticVariable("LinuxBionicArm64Ldflags", strings.Join(linuxCrossLdflags, " "))
|
|
}
|
|
|
|
// toolchain config for ARM64 Linux CrossHost. Almost everything is the same as the ARM64 Android
|
|
// target. The overridden methods below show the differences.
|
|
type toolchainLinuxArm64 struct {
|
|
toolchainArm64
|
|
}
|
|
|
|
func (toolchainLinuxArm64) ClangTriple() string {
|
|
// Note the absence of "-android" suffix. The compiler won't define __ANDROID__
|
|
return "aarch64-linux"
|
|
}
|
|
|
|
func (toolchainLinuxArm64) ClangCflags() string {
|
|
// The inherited flags + extra flags
|
|
return "${config.Arm64ClangCflags} ${config.LinuxBionicArm64Cflags}"
|
|
}
|
|
|
|
func linuxArm64ToolchainFactory(arch android.Arch) Toolchain {
|
|
archVariant := "armv8-a" // for host, default to armv8-a
|
|
toolchainClangCflags := []string{arm64ClangArchVariantCflagsVar[archVariant]}
|
|
|
|
// We don't specify CPU architecture for host. Conservatively assume
|
|
// the host CPU needs the fix
|
|
extraLdflags := "-Wl,--fix-cortex-a53-843419"
|
|
|
|
ret := toolchainLinuxArm64{}
|
|
|
|
// add the extra ld and lld flags
|
|
ret.toolchainArm64.ldflags = strings.Join([]string{
|
|
"${config.Arm64Ldflags}",
|
|
"${config.LinuxBionicArm64Ldflags}",
|
|
extraLdflags,
|
|
}, " ")
|
|
ret.toolchainArm64.lldflags = strings.Join([]string{
|
|
"${config.Arm64Lldflags}",
|
|
"${config.LinuxBionicArm64Ldflags}",
|
|
extraLdflags,
|
|
}, " ")
|
|
ret.toolchainArm64.toolchainClangCflags = strings.Join(toolchainClangCflags, " ")
|
|
return &ret
|
|
}
|
|
|
|
func init() {
|
|
registerToolchainFactory(android.LinuxBionic, android.Arm64, linuxArm64ToolchainFactory)
|
|
}
|