<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 22, 2014 at 7:33 PM, Peter Collingbourne <span dir="ltr"><<a href="mailto:peter@pcc.me.uk" target="_blank">peter@pcc.me.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: pcc<br>
Date: Wed Oct 22 21:33:23 2014<br>
New Revision: 220462<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=220462&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=220462&view=rev</a><br>
Log:<br>
Add llvm-go tool.<br>
<br>
This tool lets us build LLVM components within the tree by setting up a<br>
$GOPATH that resembles a tree fetched in the normal way with "go get".<br>
<br>
It is intended that components such as the Go frontend will be built in-tree<br>
using this tool.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D5902" target="_blank">http://reviews.llvm.org/D5902</a><br>
<br>
Added:<br>
    llvm/trunk/tools/llvm-go/<br>
    llvm/trunk/tools/llvm-go/CMakeLists.txt<br>
    llvm/trunk/tools/llvm-go/Makefile<br>
    llvm/trunk/tools/llvm-go/llvm-go.go<br>
Modified:<br>
    llvm/trunk/bindings/go/build.sh<br>
    llvm/trunk/cmake/config-ix.cmake<br>
    llvm/trunk/test/Bindings/Go/go.test<br></blockquote><div><br>Anyone else seeing a failure with this test?<br><br><pre style="color:rgb(0,0,0)">******************** TEST 'LLVM :: Bindings/Go/go.test' FAILED ********************
Script:
--
.../llvm/build/clang/debug/split/notypes/nostandalone/./bin/llvm-go test <a href="http://llvm.org/llvm/bindings/go/llvm">llvm.org/llvm/bindings/go/llvm</a>
--
Exit Code: 1

Command Output (stdout):
--
llvm.test: .../llvm/src/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp:279: void llvm::RuntimeDyldELF::resolveX86_64Relocati
on(const llvm::SectionEntry &, uint64_t, uint64_t, uint32_t, int64_t, uint64_t): Assertion `(Type == ELF::R_X86_64_32 && (Value <= (4294967295U))) || (Type == 
ELF::R_X86_64_32S && ((int64_t)Value <= (2147483647) && (int64_t)Value >= (-2147483647-1)))' failed.
SIGABRT: abort
PC=0x7f1d88da3bb9
...</pre> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
    llvm/trunk/test/CMakeLists.txt<br>
    llvm/trunk/test/lit.cfg<br>
    llvm/trunk/tools/CMakeLists.txt<br>
    llvm/trunk/tools/Makefile<br>
<br>
Modified: llvm/trunk/bindings/go/build.sh<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/go/build.sh?rev=220462&r1=220461&r2=220462&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/go/build.sh?rev=220462&r1=220461&r2=220462&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/bindings/go/build.sh (original)<br>
+++ llvm/trunk/bindings/go/build.sh Wed Oct 22 21:33:23 2014<br>
@@ -1,36 +1,5 @@<br>
 #!/bin/sh -xe<br>
<br>
-llvm_components="\<br>
-all-targets \<br>
-analysis \<br>
-asmparser \<br>
-asmprinter \<br>
-bitreader \<br>
-bitwriter \<br>
-codegen \<br>
-core \<br>
-debuginfo \<br>
-executionengine \<br>
-instrumentation \<br>
-interpreter \<br>
-ipo \<br>
-irreader \<br>
-linker \<br>
-mc \<br>
-mcjit \<br>
-objcarcopts \<br>
-option \<br>
-profiledata \<br>
-scalaropts \<br>
-support \<br>
-target \<br>
-"<br>
-<br>
-if [ "$1" = "--print-components" ] ; then<br>
-  echo $llvm_components<br>
-  exit 0<br>
-fi<br>
-<br>
 gollvmdir=$(dirname "$0")/llvm<br>
<br>
 workdir=$gollvmdir/workdir<br>
@@ -41,12 +10,14 @@ mkdir -p $llvm_builddir<br>
<br>
 cmake_flags="../../../../.. $@"<br>
 llvm_config="$llvm_builddir/bin/llvm-config"<br>
+llvm_go="$llvm_builddir/bin/llvm-go"<br>
<br>
 if test -n "`which ninja`" ; then<br>
   # If Ninja is available, we can speed up the build by building only the<br>
   # required subset of LLVM.<br>
   (cd $llvm_builddir && cmake -G Ninja $cmake_flags)<br>
-  ninja -C $llvm_builddir llvm-config<br>
+  ninja -C $llvm_builddir llvm-config llvm-go<br>
+  llvm_components="$($llvm_go print-components)"<br>
   llvm_buildtargets="$($llvm_config --libs $llvm_components | sed -e 's/-l//g')"<br>
   ninja -C $llvm_builddir $llvm_buildtargets FileCheck<br>
 else<br>
@@ -54,14 +25,7 @@ else<br>
   make -C $llvm_builddir -j4<br>
 fi<br>
<br>
+$llvm_go print-config > $gollvmdir/llvm_config.go<br>
+<br>
 llvm_version="$($llvm_config --version)"<br>
-llvm_cflags="$($llvm_config --cppflags)"<br>
-llvm_ldflags="$($llvm_config --ldflags) $($llvm_config --libs $llvm_components) $($llvm_config --system-libs)"<br>
-if [ $(uname) != "Darwin" ]; then<br>
-  # OS X doesn't like -rpath with cgo. See:<br>
-  # <a href="https://code.google.com/p/go/issues/detail?id=7293" target="_blank">https://code.google.com/p/go/issues/detail?id=7293</a><br>
-  llvm_ldflags="-Wl,-rpath,$($llvm_config --libdir) $llvm_ldflags"<br>
-fi<br>
-sed -e "s#@LLVM_CFLAGS@#$llvm_cflags#g; s#@LLVM_LDFLAGS@#$llvm_ldflags#g" $gollvmdir/<a href="http://llvm_config.go.in" target="_blank">llvm_config.go.in</a> > \<br>
-  $gollvmdir/llvm_config.go<br>
 printf "package llvm\n\nconst Version = \"%s\"\n" "$llvm_version" > $gollvmdir/version.go<br>
<br>
Modified: llvm/trunk/cmake/config-ix.cmake<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/config-ix.cmake?rev=220462&r1=220461&r2=220462&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/config-ix.cmake?rev=220462&r1=220461&r2=220462&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/cmake/config-ix.cmake (original)<br>
+++ llvm/trunk/cmake/config-ix.cmake Wed Oct 22 21:33:23 2014<br>
@@ -493,16 +493,20 @@ else()<br>
 endif()<br>
<br>
 set(LLVM_BINDINGS "")<br>
-find_program(GO_EXECUTABLE NAMES go DOC "go executable")<br>
-if(GO_EXECUTABLE STREQUAL "GO_EXECUTABLE-NOTFOUND")<br>
+if(WIN32)<br>
   message(STATUS "Go bindings disabled.")<br>
 else()<br>
-  execute_process(COMMAND ${GO_EXECUTABLE} run ${CMAKE_SOURCE_DIR}/bindings/go/conftest.go<br>
-                  RESULT_VARIABLE GO_CONFTEST)<br>
-  if(GO_CONFTEST STREQUAL "0")<br>
-    set(LLVM_BINDINGS "${LLVM_BINDINGS} go")<br>
-    message(STATUS "Go bindings enabled.")<br>
+  find_program(GO_EXECUTABLE NAMES go DOC "go executable")<br>
+  if(GO_EXECUTABLE STREQUAL "GO_EXECUTABLE-NOTFOUND")<br>
+    message(STATUS "Go bindings disabled.")<br>
   else()<br>
-    message(STATUS "Go bindings disabled, need at least Go 1.2.")<br>
+    execute_process(COMMAND ${GO_EXECUTABLE} run ${CMAKE_SOURCE_DIR}/bindings/go/conftest.go<br>
+                    RESULT_VARIABLE GO_CONFTEST)<br>
+    if(GO_CONFTEST STREQUAL "0")<br>
+      set(LLVM_BINDINGS "${LLVM_BINDINGS} go")<br>
+      message(STATUS "Go bindings enabled.")<br>
+    else()<br>
+      message(STATUS "Go bindings disabled, need at least Go 1.2.")<br>
+    endif()<br>
   endif()<br>
 endif()<br>
<br>
Modified: llvm/trunk/test/Bindings/Go/go.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bindings/Go/go.test?rev=220462&r1=220461&r2=220462&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bindings/Go/go.test?rev=220462&r1=220461&r2=220462&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Bindings/Go/go.test (original)<br>
+++ llvm/trunk/test/Bindings/Go/go.test Wed Oct 22 21:33:23 2014<br>
@@ -1,8 +1,3 @@<br>
-; RUN: cd %S/../../../bindings/go/llvm && \<br>
-; RUN: env CGO_CPPFLAGS="$(llvm-config --cppflags)" \<br>
-; RUN:     CGO_CXXFLAGS=-std=c++11 \<br>
-; RUN:     CGO_LDFLAGS="$(llvm-config --ldflags --libs --system-libs \<br>
-; RUN:                                $(../build.sh --print-components)) $CGO_LDFLAGS" \<br>
-; RUN:     %go test -tags byollvm .<br>
+; RUN: llvm-go test <a href="http://llvm.org/llvm/bindings/go/llvm" target="_blank">llvm.org/llvm/bindings/go/llvm</a><br>
<br>
 ; REQUIRES: shell<br>
<br>
Modified: llvm/trunk/test/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CMakeLists.txt?rev=220462&r1=220461&r2=220462&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CMakeLists.txt?rev=220462&r1=220461&r2=220462&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CMakeLists.txt (original)<br>
+++ llvm/trunk/test/CMakeLists.txt Wed Oct 22 21:33:23 2014<br>
@@ -30,8 +30,9 @@ set(LLVM_TEST_DEPENDS<br>
           llvm-cov<br>
           llvm-diff<br>
           llvm-dis<br>
-          llvm-extract<br>
           llvm-dwarfdump<br>
+          llvm-extract<br>
+          llvm-go<br>
           llvm-link<br>
           llvm-lto<br>
           llvm-mc<br>
<br>
Modified: llvm/trunk/test/lit.cfg<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/lit.cfg?rev=220462&r1=220461&r2=220462&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/lit.cfg?rev=220462&r1=220461&r2=220462&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/lit.cfg (original)<br>
+++ llvm/trunk/test/lit.cfg Wed Oct 22 21:33:23 2014<br>
@@ -200,6 +200,7 @@ for pattern in [r"\bbugpoint\b(?!-)",<br>
                 r"\bllvm-dis\b",<br>
                 r"\bllvm-dwarfdump\b",<br>
                 r"\bllvm-extract\b",<br>
+                r"\bllvm-go\b",<br>
                 r"\bllvm-link\b",<br>
                 r"\bllvm-lto\b",<br>
                 r"\bllvm-mc\b",<br>
<br>
Modified: llvm/trunk/tools/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/CMakeLists.txt?rev=220462&r1=220461&r2=220462&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/CMakeLists.txt?rev=220462&r1=220461&r2=220462&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/CMakeLists.txt (original)<br>
+++ llvm/trunk/tools/CMakeLists.txt Wed Oct 22 21:33:23 2014<br>
@@ -52,6 +52,8 @@ add_llvm_tool_subdirectory(llvm-c-test)<br>
 add_llvm_tool_subdirectory(obj2yaml)<br>
 add_llvm_tool_subdirectory(yaml2obj)<br>
<br>
+add_llvm_tool_subdirectory(llvm-go)<br>
+<br>
 if(NOT CYGWIN AND LLVM_ENABLE_PIC)<br>
   add_llvm_tool_subdirectory(lto)<br>
   add_llvm_tool_subdirectory(llvm-lto)<br>
<br>
Modified: llvm/trunk/tools/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/Makefile?rev=220462&r1=220461&r2=220462&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/Makefile?rev=220462&r1=220461&r2=220462&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/Makefile (original)<br>
+++ llvm/trunk/tools/Makefile Wed Oct 22 21:33:23 2014<br>
@@ -74,4 +74,8 @@ ifneq ($(ENABLE_SHARED),1)<br>
   endif<br>
 endif<br>
<br>
+ifneq (,$(filter go,$(BINDINGS_TO_BUILD)))<br>
+  PARALLEL_DIRS += llvm-go<br>
+endif<br>
+<br>
 include $(LEVEL)/Makefile.common<br>
<br>
Added: llvm/trunk/tools/llvm-go/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/CMakeLists.txt?rev=220462&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/CMakeLists.txt?rev=220462&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-go/CMakeLists.txt (added)<br>
+++ llvm/trunk/tools/llvm-go/CMakeLists.txt Wed Oct 22 21:33:23 2014<br>
@@ -0,0 +1,9 @@<br>
+if(LLVM_BINDINGS MATCHES "go")<br>
+  set(binpath ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX})<br>
+  add_custom_command(OUTPUT ${binpath}<br>
+    COMMAND ${GO_EXECUTABLE} build -o ${binpath} llvm-go.go<br>
+    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/llvm-go.go<br>
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}<br>
+    COMMENT "Building Go executable llvm-go")<br>
+  add_custom_target(llvm-go ALL DEPENDS ${binpath})<br>
+endif()<br>
<br>
Added: llvm/trunk/tools/llvm-go/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/Makefile?rev=220462&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/Makefile?rev=220462&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-go/Makefile (added)<br>
+++ llvm/trunk/tools/llvm-go/Makefile Wed Oct 22 21:33:23 2014<br>
@@ -0,0 +1,16 @@<br>
+##===- tools/llvm-go/Makefile ------------------------------*- Makefile -*-===##<br>
+#<br>
+#                     The LLVM Compiler Infrastructure<br>
+#<br>
+# This file is distributed under the University of Illinois Open Source<br>
+# License. See LICENSE.TXT for details.<br>
+#<br>
+##===----------------------------------------------------------------------===##<br>
+<br>
+LEVEL := ../..<br>
+include $(LEVEL)/Makefile.common<br>
+<br>
+all:: $(ToolDir)/llvm-go$(EXEEXT)<br>
+<br>
+$(ToolDir)/llvm-go$(EXEEXT): $(PROJ_SRC_DIR)/llvm-go.go<br>
+       $(GO) build -o $@ $<<br>
<br>
Added: llvm/trunk/tools/llvm-go/llvm-go.go<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/llvm-go.go?rev=220462&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/llvm-go.go?rev=220462&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-go/llvm-go.go (added)<br>
+++ llvm/trunk/tools/llvm-go/llvm-go.go Wed Oct 22 21:33:23 2014<br>
@@ -0,0 +1,261 @@<br>
+//===-- llvm-go.go - go tool wrapper for LLVM -----------------------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// This tool lets us build LLVM components within the tree by setting up a<br>
+// $GOPATH that resembles a tree fetched in the normal way with "go get".<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+package main<br>
+<br>
+import (<br>
+       "fmt"<br>
+       "io/ioutil"<br>
+       "os"<br>
+       "os/exec"<br>
+       "path/filepath"<br>
+       "runtime"<br>
+       "strings"<br>
+)<br>
+<br>
+type pkg struct {<br>
+       llvmpath, pkgpath string<br>
+}<br>
+<br>
+var packages = []pkg{<br>
+       {"bindings/go/llvm", "<a href="http://llvm.org/llvm/bindings/go/llvm" target="_blank">llvm.org/llvm/bindings/go/llvm</a>"},<br>
+}<br>
+<br>
+type compilerFlags struct {<br>
+       cpp, cxx, ld string<br>
+}<br>
+<br>
+var components = []string{<br>
+       "all-targets",<br>
+       "analysis",<br>
+       "asmparser",<br>
+       "asmprinter",<br>
+       "bitreader",<br>
+       "bitwriter",<br>
+       "codegen",<br>
+       "core",<br>
+       "debuginfo",<br>
+       "executionengine",<br>
+       "instrumentation",<br>
+       "interpreter",<br>
+       "ipo",<br>
+       "irreader",<br>
+       "linker",<br>
+       "mc",<br>
+       "mcjit",<br>
+       "objcarcopts",<br>
+       "option",<br>
+       "profiledata",<br>
+       "scalaropts",<br>
+       "support",<br>
+       "target",<br>
+}<br>
+<br>
+func llvmConfig(args ...string) string {<br>
+       configpath := os.Getenv("LLVM_CONFIG")<br>
+       if configpath == "" {<br>
+               // strip llvm-go, add llvm-config<br>
+               configpath = os.Args[0][:len(os.Args[0])-7] + "llvm-config"<br>
+       }<br>
+<br>
+       cmd := exec.Command(configpath, args...)<br>
+       out, err := cmd.Output()<br>
+       if err != nil {<br>
+               panic(err.Error())<br>
+       }<br>
+<br>
+       outstr := string(out)<br>
+       outstr = strings.TrimSuffix(outstr, "\n")<br>
+       return strings.Replace(outstr, "\n", " ", -1)<br>
+}<br>
+<br>
+func llvmFlags() compilerFlags {<br>
+       ldflags := llvmConfig(append([]string{"--ldflags", "--libs", "--system-libs"}, components...)...)<br>
+       if runtime.GOOS != "darwin" {<br>
+               // OS X doesn't like -rpath with cgo. See:<br>
+               // <a href="https://code.google.com/p/go/issues/detail?id=7293" target="_blank">https://code.google.com/p/go/issues/detail?id=7293</a><br>
+               ldflags = "-Wl,-rpath," + llvmConfig("--libdir") + " " + ldflags<br>
+       }<br>
+       return compilerFlags{<br>
+               cpp: llvmConfig("--cppflags"),<br>
+               cxx: "-std=c++11",<br>
+               ld:  ldflags,<br>
+       }<br>
+}<br>
+<br>
+func addTag(args []string, tag string) []string {<br>
+       args = append([]string{}, args...)<br>
+       addedTag := false<br>
+       for i, a := range args {<br>
+               if strings.HasPrefix(a, "-tags=") {<br>
+                       args[i] = a + " " + tag<br>
+                       addedTag = true<br>
+               } else if a == "-tags" && i+1 < len(args) {<br>
+                       args[i+1] = args[i+1] + " " + tag<br>
+                       addedTag = true<br>
+               }<br>
+       }<br>
+       if !addedTag {<br>
+               args = append([]string{args[0], "-tags", tag}, args[1:]...)<br>
+       }<br>
+       return args<br>
+}<br>
+<br>
+func printComponents() {<br>
+       fmt.Println(strings.Join(components, " "))<br>
+}<br>
+<br>
+func printConfig() {<br>
+       flags := llvmFlags()<br>
+<br>
+       fmt.Printf(`// +build !byollvm<br>
+<br>
+// This file is generated by llvm-go, do not edit.<br>
+<br>
+package llvm<br>
+<br>
+/*<br>
+#cgo CPPFLAGS: %s<br>
+#cgo CXXFLAGS: %s<br>
+#cgo LDFLAGS: %s<br>
+*/<br>
+import "C"<br>
+<br>
+type (run_build_sh int)<br>
+`, flags.cpp, flags.cxx, flags.ld)<br>
+}<br>
+<br>
+func runGoWithLLVMEnv(args []string, cc, cxx, cppflags, cxxflags, ldflags string) {<br>
+       args = addTag(args, "byollvm")<br>
+<br>
+       srcdir := llvmConfig("--src-root")<br>
+<br>
+       tmpgopath, err := ioutil.TempDir("", "gopath")<br>
+       if err != nil {<br>
+               panic(err.Error())<br>
+       }<br>
+<br>
+       for _, p := range packages {<br>
+               path := filepath.Join(tmpgopath, "src", p.pkgpath)<br>
+               err := os.MkdirAll(filepath.Dir(path), os.ModePerm)<br>
+               if err != nil {<br>
+                       panic(err.Error())<br>
+               }<br>
+<br>
+               err = os.Symlink(filepath.Join(srcdir, p.llvmpath), path)<br>
+               if err != nil {<br>
+                       panic(err.Error())<br>
+               }<br>
+       }<br>
+<br>
+       newgopathlist := []string{tmpgopath}<br>
+       newgopathlist = append(newgopathlist, filepath.SplitList(os.Getenv("GOPATH"))...)<br>
+       newgopath := strings.Join(newgopathlist, string(filepath.ListSeparator))<br>
+<br>
+       flags := llvmFlags()<br>
+<br>
+       newenv := []string{<br>
+               "CC=" + cc,<br>
+               "CXX=" + cxx,<br>
+               "CGO_CPPFLAGS=" + flags.cpp + " " + cppflags,<br>
+               "CGO_CXXFLAGS=" + flags.cxx + " " + cxxflags,<br>
+               "CGO_LDFLAGS=" + flags.ld + " " + ldflags,<br>
+               "GOPATH=" + newgopath,<br>
+       }<br>
+       for _, v := range os.Environ() {<br>
+               if !strings.HasPrefix(v, "CC=") &&<br>
+                       !strings.HasPrefix(v, "CXX=") &&<br>
+                       !strings.HasPrefix(v, "CGO_CPPFLAGS=") &&<br>
+                       !strings.HasPrefix(v, "CGO_CXXFLAGS=") &&<br>
+                       !strings.HasPrefix(v, "CGO_LDFLAGS=") &&<br>
+                       !strings.HasPrefix(v, "GOPATH=") {<br>
+                       newenv = append(newenv, v)<br>
+               }<br>
+       }<br>
+<br>
+       gocmdpath, err := exec.LookPath("go")<br>
+       if err != nil {<br>
+               panic(err.Error())<br>
+       }<br>
+<br>
+       proc, err := os.StartProcess(gocmdpath, append([]string{"go"}, args...),<br>
+               &os.ProcAttr{<br>
+                       Env:   newenv,<br>
+                       Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},<br>
+               })<br>
+       if err != nil {<br>
+               panic(err.Error())<br>
+       }<br>
+       ps, err := proc.Wait()<br>
+       if err != nil {<br>
+               panic(err.Error())<br>
+       }<br>
+<br>
+       os.RemoveAll(tmpgopath)<br>
+<br>
+       if !ps.Success() {<br>
+               os.Exit(1)<br>
+       }<br>
+}<br>
+<br>
+func usage() {<br>
+       fmt.Println(`Usage: llvm-go subcommand [flags]<br>
+<br>
+Available subcommands: build get install run test print-components print-config`)<br>
+       os.Exit(0)<br>
+}<br>
+<br>
+func main() {<br>
+       cc := os.Getenv("CC")<br>
+       cxx := os.Getenv("CXX")<br>
+       cppflags := os.Getenv("CGO_CPPFLAGS")<br>
+       cxxflags := os.Getenv("CGO_CXXFLAGS")<br>
+       ldflags := os.Getenv("CGO_LDFLAGS")<br>
+<br>
+       args := os.Args[1:]<br>
+       DONE: for {<br>
+               switch {<br>
+               case len(args) == 0:<br>
+                       usage()<br>
+               case strings.HasPrefix(args[0], "cc="):<br>
+                       cc = args[0][3:]<br>
+                       args = args[1:]<br>
+               case strings.HasPrefix(args[0], "cxx="):<br>
+                       cxx = args[0][4:]<br>
+                       args = args[1:]<br>
+               case strings.HasPrefix(args[0], "cppflags="):<br>
+                       cppflags = args[0][9:]<br>
+                       args = args[1:]<br>
+               case strings.HasPrefix(args[0], "cxxflags="):<br>
+                       cxxflags = args[0][9:]<br>
+                       args = args[1:]<br>
+               case strings.HasPrefix(args[0], "ldflags="):<br>
+                       ldflags = args[0][8:]<br>
+                       args = args[1:]<br>
+               default:<br>
+                       break DONE<br>
+               }<br>
+       }<br>
+<br>
+       switch args[0] {<br>
+       case "build", "get", "install", "run", "test":<br>
+               runGoWithLLVMEnv(args, cc, cxx, cppflags, cxxflags, ldflags)<br>
+       case "print-components":<br>
+               printComponents()<br>
+       case "print-config":<br>
+               printConfig()<br>
+       default:<br>
+               usage()<br>
+       }<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>