|
|
|
package builder
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"runtime"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Commands lists command alternatives for various operating systems. These
|
|
|
|
// commands may have a slightly different name across operating systems and
|
|
|
|
// distributions or may not even exist in $PATH, in which case absolute paths
|
|
|
|
// may be used.
|
|
|
|
var commands = map[string][]string{
|
|
|
|
"clang": {"clang-9"},
|
|
|
|
"ld.lld": {"ld.lld-9", "ld.lld"},
|
|
|
|
"wasm-ld": {"wasm-ld-9", "wasm-ld"},
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
// Add the path to a Homebrew-installed LLVM 9 for ease of use (no need to
|
|
|
|
// manually set $PATH).
|
|
|
|
if runtime.GOOS == "darwin" {
|
|
|
|
commands["clang"] = append(commands["clang"], "/usr/local/opt/llvm@9/bin/clang-9")
|
|
|
|
commands["ld.lld"] = append(commands["ld.lld"], "/usr/local/opt/llvm@9/bin/ld.lld")
|
|
|
|
commands["wasm-ld"] = append(commands["wasm-ld"], "/usr/local/opt/llvm@9/bin/wasm-ld")
|
|
|
|
}
|
|
|
|
// Add the path for when LLVM was installed with the installer from
|
|
|
|
// llvm.org, which by default doesn't add LLVM to the $PATH environment
|
|
|
|
// variable.
|
|
|
|
if runtime.GOOS == "windows" {
|
|
|
|
commands["clang"] = append(commands["clang"], "clang", "C:\\Program Files\\LLVM\\bin\\clang.exe")
|
|
|
|
commands["ld.lld"] = append(commands["ld.lld"], "lld", "C:\\Program Files\\LLVM\\bin\\lld.exe")
|
|
|
|
commands["wasm-ld"] = append(commands["wasm-ld"], "C:\\Program Files\\LLVM\\bin\\wasm-ld.exe")
|
|
|
|
}
|
|
|
|
// Add the path to the llvm90 installed from ports
|
|
|
|
if runtime.GOOS == "freebsd" {
|
|
|
|
commands["clang"] = append(commands["clang"], "/usr/local/llvm90/bin/clang-9")
|
|
|
|
commands["ld.lld"] = append(commands["ld.lld"], "/usr/local/llvm90/bin/ld.lld")
|
|
|
|
commands["wasm-ld"] = append(commands["wasm-ld"], "/usr/local/llvm90/bin/wasm-ld")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func execCommand(cmdNames []string, args ...string) error {
|
|
|
|
for _, cmdName := range cmdNames {
|
|
|
|
cmd := exec.Command(cmdName, args...)
|
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
if err, ok := err.(*exec.Error); ok && (err.Err == exec.ErrNotFound || err.Err.Error() == "file does not exist") {
|
|
|
|
// this command was not found, try the next
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return errors.New("none of these commands were found in your $PATH: " + strings.Join(cmdNames, " "))
|
|
|
|
}
|