compileopts: fix CGo when cross compiling

Use the cross compiling toolchains for compiling/linking. This fixes CGo
support, and therefore allows CGo to be used when cross compiling to
Linux on a different architecture.
This commit also removes some redundant testing code.
Этот коммит содержится в:
Ayke van Laethem 2020-01-14 13:46:54 +01:00 коммит произвёл Ron Evans
родитель d5e11fa19b
коммит 8f8232aada
3 изменённых файлов: 14 добавлений и 11 удалений

Просмотреть файл

@ -23,9 +23,7 @@ commands:
libclang<<parameters.llvm>>-dev \ libclang<<parameters.llvm>>-dev \
lld<<parameters.llvm>> \ lld<<parameters.llvm>> \
gcc-arm-linux-gnueabihf \ gcc-arm-linux-gnueabihf \
libc6-dev-armel-cross \
gcc-aarch64-linux-gnu \ gcc-aarch64-linux-gnu \
libc6-dev-arm64-cross \
qemu-system-arm \ qemu-system-arm \
qemu-user \ qemu-user \
gcc-avr \ gcc-avr \

Просмотреть файл

@ -229,6 +229,14 @@ func LoadTarget(target string) (*TargetSpec, error) {
if len(tripleSplit) < 3 { if len(tripleSplit) < 3 {
return nil, errors.New("expected a full LLVM target or a custom target in -target flag") return nil, errors.New("expected a full LLVM target or a custom target in -target flag")
} }
if tripleSplit[0] == "arm" {
// LLVM and Clang have a different idea of what "arm" means, so
// upgrade to a slightly more modern ARM. In fact, when you pass
// --target=arm--linux-gnueabihf to Clang, it will convert that
// internally to armv7-unknown-linux-gnueabihf. Changing the
// architecture to armv7 will keep things consistent.
tripleSplit[0] = "armv7"
}
goos := tripleSplit[2] goos := tripleSplit[2]
if strings.HasPrefix(goos, "darwin") { if strings.HasPrefix(goos, "darwin") {
goos = "darwin" goos = "darwin"
@ -237,11 +245,12 @@ func LoadTarget(target string) (*TargetSpec, error) {
"i386": "386", "i386": "386",
"x86_64": "amd64", "x86_64": "amd64",
"aarch64": "arm64", "aarch64": "arm64",
"armv7": "arm",
}[tripleSplit[0]] }[tripleSplit[0]]
if goarch == "" { if goarch == "" {
goarch = tripleSplit[0] goarch = tripleSplit[0]
} }
return defaultTarget(goos, goarch, target) return defaultTarget(goos, goarch, strings.Join(tripleSplit, "-"))
} }
} }
@ -255,6 +264,7 @@ func defaultTarget(goos, goarch, triple string) (*TargetSpec, error) {
BuildTags: []string{goos, goarch}, BuildTags: []string{goos, goarch},
Compiler: "clang", Compiler: "clang",
Linker: "cc", Linker: "cc",
CFlags: []string{"--target=" + triple},
GDB: "gdb", GDB: "gdb",
PortReset: "false", PortReset: "false",
FlashMethod: "native", FlashMethod: "native",
@ -267,11 +277,13 @@ func defaultTarget(goos, goarch, triple string) (*TargetSpec, error) {
if goarch != runtime.GOARCH { if goarch != runtime.GOARCH {
// Some educated guesses as to how to invoke helper programs. // Some educated guesses as to how to invoke helper programs.
if goarch == "arm" && goos == "linux" { if goarch == "arm" && goos == "linux" {
spec.CFlags = append(spec.CFlags, "--sysroot=/usr/arm-linux-gnueabihf")
spec.Linker = "arm-linux-gnueabihf-gcc" spec.Linker = "arm-linux-gnueabihf-gcc"
spec.GDB = "arm-linux-gnueabihf-gdb" spec.GDB = "arm-linux-gnueabihf-gdb"
spec.Emulator = []string{"qemu-arm", "-L", "/usr/arm-linux-gnueabihf"} spec.Emulator = []string{"qemu-arm", "-L", "/usr/arm-linux-gnueabihf"}
} }
if goarch == "arm64" && goos == "linux" { if goarch == "arm64" && goos == "linux" {
spec.CFlags = append(spec.CFlags, "--sysroot=/usr/aarch64-linux-gnu")
spec.Linker = "aarch64-linux-gnu-gcc" spec.Linker = "aarch64-linux-gnu-gcc"
spec.GDB = "aarch64-linux-gnu-gdb" spec.GDB = "aarch64-linux-gnu-gdb"
spec.Emulator = []string{"qemu-aarch64", "-L", "/usr/aarch64-linux-gnu"} spec.Emulator = []string{"qemu-aarch64", "-L", "/usr/aarch64-linux-gnu"}

Просмотреть файл

@ -80,15 +80,8 @@ func runPlatTests(target string, matches []string, t *testing.T) {
if path == filepath.Join("testdata", "gc.go") { if path == filepath.Join("testdata", "gc.go") {
continue continue
} }
case target == "":
// run all tests on host
case target == "cortex-m-qemu":
// all tests are supported
default: default:
// cross-compilation of cgo is not yet supported // all tests are supported
if path == filepath.Join("testdata", "cgo")+string(filepath.Separator) {
continue
}
} }
t.Run(filepath.Base(path), func(t *testing.T) { t.Run(filepath.Base(path), func(t *testing.T) {