Skip to content

Commit

Permalink
[llvm-go] parameterize $GOPATH construction
Browse files Browse the repository at this point in the history
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
  • Loading branch information
axw committed Jul 27, 2016
1 parent 00429d5 commit 064517f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
2 changes: 1 addition & 1 deletion cmake/modules/AddLLVM.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down
29 changes: 25 additions & 4 deletions tools/llvm-go/llvm-go.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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")
Expand All @@ -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())
}
Expand Down Expand Up @@ -242,6 +246,7 @@ func main() {
ldflags := os.Getenv("CGO_LDFLAGS")
gocmd := "go"
llgo := ""
packagesString := ""

flags := []struct {
name string
Expand All @@ -253,6 +258,7 @@ func main() {
{"llgo", &llgo},
{"cppflags", &cppflags},
{"ldflags", &ldflags},
{"packages", &packagesString},
}

args := os.Args[1:]
Expand All @@ -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":
Expand Down

0 comments on commit 064517f

Please sign in to comment.