diff --git a/xtool/env/llvm/llvm.go b/xtool/env/llvm/llvm.go index 06fc35c1..82d0d13e 100644 --- a/xtool/env/llvm/llvm.go +++ b/xtool/env/llvm/llvm.go @@ -23,6 +23,7 @@ import ( "strings" "github.com/goplus/llgo/xtool/clang" + "github.com/goplus/llgo/xtool/llvm/install_name_tool" "github.com/goplus/llgo/xtool/llvm/llvmlink" "github.com/goplus/llgo/xtool/nm" ) @@ -87,4 +88,9 @@ func (e *Env) Nm() *nm.Cmd { return nm.New(bin) } +func (e *Env) InstallNameTool() *install_name_tool.Cmd { + bin := filepath.Join(e.BinDir(), "llvm-install-name-tool") + return install_name_tool.New(bin) +} + // ----------------------------------------------------------------------------- diff --git a/xtool/llvm/install_name_tool/rpath.go b/xtool/llvm/install_name_tool/rpath.go new file mode 100644 index 00000000..c1cdfccb --- /dev/null +++ b/xtool/llvm/install_name_tool/rpath.go @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package install_name_tool + +import ( + "io" + "os/exec" +) + +// Cmd represents a install_name_tool command. +type Cmd struct { + app string + + Stdout io.Writer + Stderr io.Writer +} + +// New creates a new install_name_tool command. +func New(app string) *Cmd { + if app == "" { + app = "install_name_tool" + } + return &Cmd{app: app} +} + +type Change struct { + Old string + New string +} + +// Change changes dependent shared library install name. +func (p *Cmd) Change(dylib string, chgs ...Change) error { + args := make([]string, len(chgs)*3+1) + for _, chg := range chgs { + args = append(args, "-change", chg.Old, chg.New) + } + args = append(args, dylib) + cmd := exec.Command(p.app, args...) + cmd.Stdout = p.Stdout + cmd.Stderr = p.Stderr + return cmd.Run() +}