func main() { flag.Parse() if triple == "" { log.Fatal("No default triple set") } if clang == "" { clang = "clang" } var err error buildctx, err = llgobuild.Context(triple) if err != nil { log.Fatal(err) } // pkgroot = $GOPATH/pkg/llgo/<triple> gopath := os.Getenv("GOPATH") if gopath == "" { gopath = runtime.GOROOT() } else { gopath = filepath.SplitList(gopath)[0] } pkgroot = filepath.Join(gopath, "pkg", "llgo", triple) // Create a temporary work dir. workdir, err = ioutil.TempDir("", "llgo") if err != nil { log.Fatal(err) } if work { log.Println("Working directory:", workdir) } args := flag.Args() if test { if len(args) > 1 { err = fmt.Errorf("Multiple files/packages can not be specified when building a test binary") } else { err = buildPackageTests(args[0]) } } else { err = buildPackages(args) } if !work { os.RemoveAll(workdir) } if err != nil { log.Fatal(err) } }
func main() { flag.Parse() if triple == "" { log.Fatal("No default triple set") } if clang == "" { clang = "clang" } var err error buildctx, err = llgobuild.Context(triple) if err != nil { log.Fatal(err) } // pkgroot = $GOPATH/pkg/llgo/<triple> gopath := os.Getenv("GOPATH") if gopath == "" { gopath = runtime.GOROOT() } else { gopath = filepath.SplitList(gopath)[0] } pkgroot = filepath.Join(gopath, "pkg", "llgo", triple) // Create a temporary work dir. workdir, err = ioutil.TempDir("", "llgo") if err != nil { log.Fatal(err) } err = buildPackages(flag.Args()) os.RemoveAll(workdir) if err != nil { log.Fatal(err) } }
func buildLlgo() error { log.Println("Building llgo") cmd := command("go", "get", "-d", gollvmpkgpath) output, err := cmd.CombinedOutput() if err != nil { fmt.Fprintf(os.Stderr, "%s\n", string(output)) return err } pkg, err := gobuild.Import(gollvmpkgpath, "", gobuild.FindOnly) if err != nil { return err } if alwaysbuild { if _, err := os.Stat(pkg.PkgObj); err == nil { log.Println("- Rebuilding gollvm") os.Remove(pkg.PkgObj) } } cgoCflags := fmt.Sprintf("%s -I %s/../include", llvmcflags, pkg.Dir) cgoLdflags := fmt.Sprintf("-Wl,-L%s", llvmlibdir) ldflags := fmt.Sprintf("-r %q", llvmlibdir) if sharedllvm { cgoLdflags += fmt.Sprintf(" -lLLVM-%s ", llvmversion) } else { cgoLdflags += " " + llvmlibs + " -lstdc++ -lm " } cgoLdflags += " " + llvmldflags args := []string{"get", "-ldflags", ldflags} llvmtag := "llvm" + llvmversion if strings.HasSuffix(llvmversion, "svn") { llvmtag = "llvmsvn" } args = append(args, []string{"-tags", llvmtag}...) args = append(args, llgopkgpath) cmd = command("go", args...) cmd.Env = os.Environ() cmd.Env = append(cmd.Env, "CGO_CFLAGS="+cgoCflags) cmd.Env = append(cmd.Env, "CGO_LDFLAGS="+cgoLdflags) output, err = cmd.CombinedOutput() if err != nil { fmt.Fprintf(os.Stderr, "%s\n", string(output)) return err } pkg, err = gobuild.Import(llgopkgpath, "", gobuild.FindOnly) if err != nil { return err } llgobin = path.Join(pkg.BinDir, "llgo") // If the user did not specify -triple on the command // line, ask llgo for it now. if triple == "" { output, err = command(llgobin, "-print-triple").CombinedOutput() if err != nil { fmt.Fprintf(os.Stderr, "%s\n", string(output)) return err } triple = strings.TrimSpace(string(output)) } buildctx, err = build.Context(triple) if err != nil { return err } log.Printf("GOARCH = %s, GOOS = %s", buildctx.GOARCH, buildctx.GOOS) log.Printf("Built %s", llgobin) if install_name_tool && sharedllvm { // TODO: this was with the LLVM shipped with the pnacl sdk and might not be true of *all* libLLVM-xxx.dylibs. // Is there a link time commandline option that has the same effect? cmd = command("install_name_tool", "-change", fmt.Sprintf("@executable_path/../lib/libLLVM-%s.dylib", llvmversion), fmt.Sprintf("%s/libLLVM-%s.dylib", llvmlibdir, llvmversion), llgobin) output, err = cmd.CombinedOutput() if err != nil { fmt.Fprintf(os.Stderr, "%s\n", string(output)) return err } log.Printf("Successfully changed shared libLLVM path") } return nil }
func buildLlgo() error { log.Println("Building llgo") cmd := exec.Command("go", "get", "-d", gollvmpkgpath) output, err := cmd.CombinedOutput() if err != nil { fmt.Fprintf(os.Stderr, "%s\n", string(output)) return err } pkg, err := gobuild.Import(gollvmpkgpath, "", gobuild.FindOnly) if err != nil { return err } if alwaysbuild { if _, err := os.Stat(pkg.PkgObj); err == nil { log.Println("- Rebuilding gollvm") os.Remove(pkg.PkgObj) } } cgoCflags := fmt.Sprintf("%s -I %s/../include", llvmcflags, pkg.Dir) cgoLdflags := fmt.Sprintf("-Wl,-L%s", llvmlibdir) ldflags := fmt.Sprintf("-r %q", llvmlibdir) if sharedllvm { cgoLdflags += fmt.Sprintf(" -lLLVM-%s ", llvmversion) } else { cgoLdflags += " " + llvmlibs + " -lstdc++ " } cgoLdflags += " " + llvmldflags args := []string{"get", "-ldflags", ldflags} llvmtag := "llvm" + llvmversion if strings.HasSuffix(llvmversion, "svn") { llvmtag = "llvmsvn" } args = append(args, []string{"-tags", llvmtag}...) args = append(args, llgopkgpath) cmd = exec.Command("go", args...) cmd.Env = os.Environ() cmd.Env = append(cmd.Env, "CGO_CFLAGS="+cgoCflags) cmd.Env = append(cmd.Env, "CGO_LDFLAGS="+cgoLdflags) output, err = cmd.CombinedOutput() if err != nil { fmt.Fprintf(os.Stderr, "%s\n", string(output)) return err } pkg, err = gobuild.Import(llgopkgpath, "", gobuild.FindOnly) if err != nil { return err } llgobin = path.Join(pkg.BinDir, "llgo") // If the user did not specify -triple on the command // line, ask llgo for it now. if triple == "" { output, err = exec.Command(llgobin, "-print-triple").CombinedOutput() if err != nil { fmt.Fprintf(os.Stderr, "%s\n", string(output)) return err } triple = strings.TrimSpace(string(output)) } buildctx, err = build.Context(triple) if err != nil { return err } log.Printf("GOARCH = %s, GOOS = %s", buildctx.GOARCH, buildctx.GOOS) log.Printf("Built %s", llgobin) return nil }