-
Notifications
You must be signed in to change notification settings - Fork 17.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
misc/cgo/fortran: convert to Go test
Currently, the entry-point to this test is a Bash script that smoke tests the FORTRAN compiler and then runs a FORTRAN-containing Go test. This CL rearranges things so a pure Go Go test smoke tests the FORTRAN compiler and then runs a non-test FORTRAN-containing Go binary. While we're here, we fix a discrepancy when the host is GOARCH=amd64, but the target is GOARCH=386. Previously, we would pick the wrong libgfortran path because we didn't account for the cross-compilation, causing the link to fail. Except for some reason this was ignored and the test nevertheless "passed". In the new test we're a little more strict, so this build failure will cause the test to fail, so we add a little logic to account for cross-compilation with the host toolchain. For #37486. Change-Id: Ie6f70066885d6fbb4e1b5a2b1e13b85dee5b359b Reviewed-on: https://go-review.googlesource.com/c/go/+/443069 Reviewed-by: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Bryan Mills <bcmills@google.com> Run-TryBot: Austin Clements <austin@google.com>
- Loading branch information
Showing
5 changed files
with
84 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,81 @@ | ||
// Copyright 2016 The Go Authors. All rights reserved. | ||
// Copyright 2022 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package fortran | ||
|
||
import "testing" | ||
import ( | ||
"fmt" | ||
"os" | ||
"os/exec" | ||
"path/filepath" | ||
"runtime" | ||
"strings" | ||
"testing" | ||
) | ||
|
||
func TestFortran(t *testing.T) { | ||
if a := TheAnswer(); a != 42 { | ||
t.Errorf("Unexpected result for The Answer. Got: %d Want: 42", a) | ||
// Find the FORTRAN compiler. | ||
fc := os.Getenv("FC") | ||
if fc == "" { | ||
fc, _ = exec.LookPath("gfortran") | ||
} | ||
if fc == "" { | ||
t.Skip("fortran compiler not found (try setting $FC)") | ||
} | ||
|
||
var fcExtra []string | ||
if strings.Contains(fc, "gfortran") { | ||
// TODO: This duplicates but also diverges from logic from cmd/go | ||
// itself. For example, cmd/go merely adds -lgfortran without the extra | ||
// library path work. If this is what's necessary to run gfortran, we | ||
// should reconcile the logic here and in cmd/go.. Maybe this should | ||
// become a cmd/go script test to share that logic. | ||
|
||
// Add -m32 if we're targeting 386, in case this is a cross-compile. | ||
if runtime.GOARCH == "386" { | ||
fcExtra = append(fcExtra, "-m32") | ||
} | ||
|
||
// Find libgfortran. If the FORTRAN compiler isn't bundled | ||
// with the C linker, this may be in a path the C linker can't | ||
// find on its own. (See #14544) | ||
libExt := "so" | ||
switch runtime.GOOS { | ||
case "darwin": | ||
libExt = "dylib" | ||
case "aix": | ||
libExt = "a" | ||
} | ||
libPath, err := exec.Command(fc, append([]string{"-print-file-name=libgfortran." + libExt}, fcExtra...)...).CombinedOutput() | ||
if err != nil { | ||
t.Errorf("error invoking %s: %s", fc, err) | ||
} | ||
libDir := filepath.Dir(string(libPath)) | ||
cgoLDFlags := os.Getenv("CGO_LDFLAGS") | ||
cgoLDFlags += " -L " + libDir | ||
if runtime.GOOS != "aix" { | ||
cgoLDFlags += " -Wl,-rpath," + libDir | ||
} | ||
t.Logf("CGO_LDFLAGS=%s", cgoLDFlags) | ||
os.Setenv("CGO_LDFLAGS", cgoLDFlags) | ||
|
||
} | ||
|
||
// Do a test build that doesn't involve Go FORTRAN support. | ||
fcArgs := append([]string{"helloworld/helloworld.f90", "-o", "/dev/null"}, fcExtra...) | ||
t.Logf("%s %s", fc, fcArgs) | ||
if err := exec.Command(fc, fcArgs...).Run(); err != nil { | ||
t.Skipf("skipping Fortran test: could not build helloworld.f90 with %s: %s", fc, err) | ||
} | ||
|
||
// Finally, run the actual test. | ||
t.Log("go", "run", "./testdata/testprog") | ||
out, err := exec.Command("go", "run", "./testdata/testprog").CombinedOutput() | ||
if err == nil && string(out) != "ok\n" { | ||
err = fmt.Errorf("expected ok") | ||
} | ||
if err != nil { | ||
t.Errorf("%s\nOutput:\n%s", err, string(out)) | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters