summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2017-08-18 22:33:24 +0800
committerruki <[email protected]>2017-08-18 22:33:32 +0800
commit24ef8913953a7c49fb1216ac086dbe7ca955155f (patch)
treef7c853c8f1829d77a60b9cbb820fc5a1c2b11039
parentc049bcb7fc2e2e032ebc69897e5170c214bf8df2 (diff)
support @loader_path and ORIGIN
-rw-r--r--CHANGELOG.md2
-rw-r--r--docs/manual.md13
-rw-r--r--docs/zh/manual.md13
-rw-r--r--xmake/modules/core/tools/gcc.lua7
4 files changed, 30 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aa3067dd4..624d6509c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
### Changes
* Support 24bits truecolors for `cprint()`
+* Support `@loader_path` and `$ORIGIN` for `add_rpathdirs()`
## v2.1.6
@@ -345,6 +346,7 @@
### 改进
* 改进`cprint()`,支持24位真彩色输出
+* 对`add_rpathdirs()`增加对`@loader_path`和`$ORIGIN`的内置变量支持,提供可迁移动态库加载
## v2.1.6
diff --git a/docs/manual.md b/docs/manual.md
index 5eb1a20df..9d0cf5b46 100644
--- a/docs/manual.md
+++ b/docs/manual.md
@@ -1608,6 +1608,19 @@ target("test")
而在为dlang程序进行动态库链接时,xmake会自动处理成`-L-rpath=xxx`来传入dlang的链接器,这样就避免了直接使用`add_ldflags`需要自己判断和处理不同平台和编译器问题。
+2.1.7版本对这个接口进行了改进,支持:`@loader_path`, `@executable_path` 和 `$ORIGIN`的内置变量,来指定程序的加载目录,它们的效果基本上是一样的,主要是为了同时兼容macho, elf。
+
+例如:
+
+```lua
+target("test")
+ set_kind("binary")
+ add_linkdirs("$(buildir)/lib")
+ add_rpathdirs("@loader_path/lib")
+```
+
+指定test程序加载当前执行目录下`lib/*.[so|dylib]`的动态库文件,这将有助于提升程序的可移植性,不用写死绝对路径和相对路径,导致程序和目录切换引起程序加载动态库失败。
+
##### target:add_includedirs
###### 添加头文件搜索目录
diff --git a/docs/zh/manual.md b/docs/zh/manual.md
index 0008c546e..fc9bad30e 100644
--- a/docs/zh/manual.md
+++ b/docs/zh/manual.md
@@ -1625,6 +1625,19 @@ target("test")
而在为dlang程序进行动态库链接时,xmake会自动处理成`-L-rpath=xxx`来传入dlang的链接器,这样就避免了直接使用`add_ldflags`需要自己判断和处理不同平台和编译器问题。
+2.1.7版本对这个接口进行了改进,支持:`@loader_path`, `@executable_path` 和 `$ORIGIN`的内置变量,来指定程序的加载目录,它们的效果基本上是一样的,主要是为了同时兼容macho, elf。
+
+例如:
+
+```lua
+target("test")
+ set_kind("binary")
+ add_linkdirs("$(buildir)/lib")
+ add_rpathdirs("@loader_path/lib")
+```
+
+指定test程序加载当前执行目录下`lib/*.[so|dylib]`的动态库文件,这将有助于提升程序的可移植性,不用写死绝对路径和相对路径,导致程序和目录切换引起程序加载动态库失败。
+
##### target:add_includedirs
###### 添加头文件搜索目录
diff --git a/xmake/modules/core/tools/gcc.lua b/xmake/modules/core/tools/gcc.lua
index 1139bed0b..821cc77ce 100644
--- a/xmake/modules/core/tools/gcc.lua
+++ b/xmake/modules/core/tools/gcc.lua
@@ -234,16 +234,13 @@ end
-- make the rpathdir flag
function nf_rpathdir(self, dir)
- if self:has_flags(flag_elf) then
+ if self:has_flags("-Wl,-rpath=" .. dir) then
return "-Wl,-rpath=" .. (dir:gsub("@[%w_]+", function (name)
local maps = {["@loader_path"] = "$ORIGIN", ["@executable_path"] = "$ORIGIN"}
return maps[name]
end))
elseif self:has_flags("-Xlinker -rpath -Xlinker " .. dir) then
- return "-Xlinker -rpath -Xlinker " .. (dir:gsub("%$[%w_]+", function (name)
- local maps = {["$ORIGIN"] = "@loader_path"}
- return maps[name]
- end))
+ return "-Xlinker -rpath -Xlinker " .. (dir:gsub("%$ORIGIN", "@loader_path"))
end
end