
At the moment, all targets use the Clang compiler to compile C and assembly files. There is no good reason to make this configurable anymore and in fact it will make future changes more complicated (and thus more likely to have bugs). Therefore, I've removed support for setting the compiler. Note that the same is not true for the linker. While it makes sense to standardize on the Clang compiler (because if Clang doesn't support a target, TinyGo is unlikely to support it either), linkers will remain configurable for the foreseeable future. One example is Xtensa, which is supported by the Xtensa LLVM fork but doesn't have support in ld.lld yet. I've also fixed a bug in compileAndCacheCFile: it wasn't using the right CFlags for caching purposes. This could lead to using stale caches. This commit fixes that too.
50 строки
1,3 КиБ
Go
50 строки
1,3 КиБ
Go
package builder
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"os/exec"
|
|
|
|
"github.com/tinygo-org/tinygo/goenv"
|
|
)
|
|
|
|
// runCCompiler invokes a C compiler with the given arguments.
|
|
func runCCompiler(flags ...string) error {
|
|
if hasBuiltinTools {
|
|
// Compile this with the internal Clang compiler.
|
|
headerPath := getClangHeaderPath(goenv.Get("TINYGOROOT"))
|
|
if headerPath == "" {
|
|
return errors.New("could not locate Clang headers")
|
|
}
|
|
flags = append(flags, "-I"+headerPath)
|
|
cmd := exec.Command(os.Args[0], append([]string{"clang"}, flags...)...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
// Compile this with an external invocation of the Clang compiler.
|
|
return execCommand(commands["clang"], flags...)
|
|
}
|
|
|
|
// link invokes a linker with the given name and flags.
|
|
func link(linker string, flags ...string) error {
|
|
if hasBuiltinTools && (linker == "ld.lld" || linker == "wasm-ld") {
|
|
// Run command with internal linker.
|
|
cmd := exec.Command(os.Args[0], append([]string{linker}, flags...)...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
// Fall back to external command.
|
|
if cmdNames, ok := commands[linker]; ok {
|
|
return execCommand(cmdNames, flags...)
|
|
}
|
|
|
|
cmd := exec.Command(linker, flags...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
cmd.Dir = goenv.Get("TINYGOROOT")
|
|
return cmd.Run()
|
|
}
|