From 5bf7d8102d9cdaca8d84a80bcb84fb9c29d08269 Mon Sep 17 00:00:00 2001 From: Andrew Wilkins Date: Wed, 27 Jul 2016 03:21:51 +0000 Subject: [PATCH] [llvm-go] parameterize $GOPATH construction 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 llvm-svn: 276829 --- llvm/cmake/modules/AddLLVM.cmake | 2 +- llvm/tools/llvm-go/llvm-go.go | 29 +++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 9cd46eb..9590a1b 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -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} diff --git a/llvm/tools/llvm-go/llvm-go.go b/llvm/tools/llvm-go/llvm-go.go index 12f0d73..604509f 100644 --- a/llvm/tools/llvm-go/llvm-go.go +++ b/llvm/tools/llvm-go/llvm-go.go @@ -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": -- 2.7.4