OSDN Git Service

[llvm-go] parameterize $GOPATH construction
authorAndrew Wilkins <axwalk@gmail.com>
Wed, 27 Jul 2016 03:21:51 +0000 (03:21 +0000)
committerAndrew Wilkins <axwalk@gmail.com>
Wed, 27 Jul 2016 03:21:51 +0000 (03:21 +0000)
Summary:
To build llgo, you must currently ensure that llgo
is in the tools/llgo directory, due to a hard-coded
path in llvm-go.

To support the use of LLVM_EXTERNAL_LLGO_SOURCE_DIR,
we introduce a flag to llvm-go that enables the
caller to specify the paths to symlink in the
temporary $GOPATH.

Reviewers: pcc

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D21634

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276829 91177308-0d34-0410-b5e6-96231b3b80d8

cmake/modules/AddLLVM.cmake
tools/llvm-go/llvm-go.go

index 9cd46eb..9590a1b 100644 (file)
@@ -997,7 +997,7 @@ function(llvm_add_go_executable binary pkgpath)
     endforeach(d)
     set(ldflags "${CMAKE_EXE_LINKER_FLAGS}")
     add_custom_command(OUTPUT ${binpath}
-      COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}" "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}"
+      COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}" "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" "packages=${LLVM_GO_PACKAGES}"
               ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath}
       DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX}
               ${llvmlibs} ${ARG_DEPENDS}
index 12f0d73..604509f 100644 (file)
@@ -35,7 +35,6 @@ type pkg struct {
 
 var packages = []pkg{
        {"bindings/go/llvm", "llvm.org/llvm/bindings/go/llvm"},
-       {"tools/llgo", "llvm.org/llgo"},
 }
 
 type compilerFlags struct {
@@ -145,7 +144,7 @@ type (run_build_sh int)
 `, flags.cpp, flags.cxx, flags.ld)
 }
 
-func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags string) {
+func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags string, packages []pkg) {
        args = addTag(args, "byollvm")
 
        srcdir := llvmConfig("--src-root")
@@ -162,7 +161,12 @@ func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, l
                        panic(err.Error())
                }
 
-               err = os.Symlink(filepath.Join(srcdir, p.llvmpath), path)
+               abspath := p.llvmpath
+               if !filepath.IsAbs(abspath) {
+                       abspath = filepath.Join(srcdir, abspath)
+               }
+
+               err = os.Symlink(abspath, path)
                if err != nil {
                        panic(err.Error())
                }
@@ -242,6 +246,7 @@ func main() {
        ldflags := os.Getenv("CGO_LDFLAGS")
        gocmd := "go"
        llgo := ""
+       packagesString := ""
 
        flags := []struct {
                name string
@@ -253,6 +258,7 @@ func main() {
                {"llgo", &llgo},
                {"cppflags", &cppflags},
                {"ldflags", &ldflags},
+               {"packages", &packagesString},
        }
 
        args := os.Args[1:]
@@ -271,9 +277,24 @@ LOOP:
                break
        }
 
+       packages := packages
+       if packagesString != "" {
+               for _, field := range strings.Fields(packagesString) {
+                       pos := strings.IndexRune(field, '=')
+                       if pos == -1 {
+                               fmt.Fprintf(os.Stderr, "invalid packages value %q, expected 'pkgpath=llvmpath [pkgpath=llvmpath ...]'\n", packagesString)
+                               os.Exit(1)
+                       }
+                       packages = append(packages, pkg{
+                               pkgpath:  field[:pos],
+                               llvmpath: field[pos+1:],
+                       })
+               }
+       }
+
        switch args[0] {
        case "build", "get", "install", "run", "test":
-               runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags)
+               runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, packages)
        case "print-components":
                printComponents()
        case "print-config":