summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-09-24 22:54:54 +0800
committerruki <[email protected]>2020-09-24 22:54:54 +0800
commite372ce038de7b5bb5e76655399f37bd366326b8e (patch)
tree971a942cf1836db18d982d76f2accd49e909c85c
parentf1642e450812a6128941eeae4bafba523215ec50 (diff)
add libpathes for find_package
-rw-r--r--xmake/actions/install/install/windows.lua49
-rw-r--r--xmake/actions/uninstall/uninstall/windows.lua30
-rw-r--r--xmake/modules/package/manager/vcpkg/find_package.lua4
-rw-r--r--xmake/modules/package/manager/xmake/find_package.lua16
4 files changed, 54 insertions, 45 deletions
diff --git a/xmake/actions/install/install/windows.lua b/xmake/actions/install/install/windows.lua
index 0ff219141..ca34debe4 100644
--- a/xmake/actions/install/install/windows.lua
+++ b/xmake/actions/install/install/windows.lua
@@ -38,50 +38,15 @@ function _install_headers(target)
end
end
--- get dll filename from the given .lib library
-function _get_dll_filename_from_lib(libpath)
- local libdata = io.readfile(libpath, {encoding = "binary"})
- local _, _, dllname = libdata:find("__IMPORT_DESCRIPTOR_([%a%d_%-%.]+)\0", 1, false)
- if dllname then
- dllname = dllname .. ".dll"
- end
- return dllname
-end
-
-- install shared libraries for package
function _install_shared_for_package(target, pkg, outputdir)
- local linkdirs = pkg:get("linkdirs")
- for _, link in ipairs(table.wrap(pkg:get("links"))) do
- repeat
-
- -- first search for dlls with same name as lib
- local dllname = link .. ".dll"
- local dllpath = find_file(dllname, linkdirs)
- if dllpath then
- if os.isfile(path.join(outputdir, dllname)) then
- wprint("'%s' already exists in install dir, overwriting it from package(%s).", dllname, pkg:name())
- end
- os.vcp(dllpath, outputdir)
- break
+ for _, dllpath in ipairs(table.wrap(pkg:get("libpathes"))) do
+ if dllpath:endswith(".dll") then
+ if os.isfile(path.join(outputdir, dllname)) then
+ wprint("'%s' already exists in install dir, overwriting it from package(%s).", dllname, pkg:name())
end
-
- -- dll not the same name as lib, find name from lib and search again
- local libname = link .. ".lib"
- local libpath = find_file(libname, linkdirs)
- if libpath then
- local dllname = _get_dll_filename_from_lib(libpath)
- if dllname then
- local dllpath = find_file(dllname, linkdirs)
- if dllpath then
- if os.isfile(path.join(outputdir, dllname)) then
- wprint("'%s' already exists in install dir, overwriting it from package(%s).", dllname, pkg:name())
- end
- os.vcp(dllpath, outputdir)
- break
- end
- end
- end
- until false
+ os.vcp(dllpath, outputdir)
+ end
end
end
@@ -92,7 +57,7 @@ function _install_shared_for_packages(target, outputdir)
if not _g.installed_packages[pkg:name()] then
local extrainfo = pkg:extrainfo() or {}
local has_shared = extrainfo.configs and extrainfo.configs.shared
- if has_shared and pkg:enabled() and pkg:get("links") and pkg:get("linkdirs") then
+ if has_shared and pkg:enabled() and pkg:get("libpathes") then
_install_shared_for_package(target, pkg, outputdir)
end
_g.installed_packages[pkg:name()] = true
diff --git a/xmake/actions/uninstall/uninstall/windows.lua b/xmake/actions/uninstall/uninstall/windows.lua
index fb726a24a..405cb7f43 100644
--- a/xmake/actions/uninstall/uninstall/windows.lua
+++ b/xmake/actions/uninstall/uninstall/windows.lua
@@ -27,6 +27,30 @@ function _uninstall_headers(target)
end
end
+-- uninstall shared libraries for package
+function _uninstall_shared_for_package(target, pkg, outputdir)
+ for _, dllpath in ipairs(table.wrap(pkg:get("libpathes"))) do
+ if dllpath:endswith(".dll") then
+ os.vrm(path.join(outputdir, dllname))
+ end
+ end
+end
+
+-- uninstall shared libraries for packages
+function _uninstall_shared_for_packages(target, outputdir)
+ _g.uninstalled_packages = _g.uninstalled_packages or {}
+ for _, pkg in ipairs(target:orderpkgs()) do
+ if not _g.uninstalled_packages[pkg:name()] then
+ local extrainfo = pkg:extrainfo() or {}
+ local has_shared = extrainfo.configs and extrainfo.configs.shared
+ if has_shared and pkg:enabled() and pkg:get("libpathes") then
+ _uninstall_shared_for_package(target, pkg, outputdir)
+ end
+ _g.uninstalled_packages[pkg:name()] = true
+ end
+ end
+end
+
-- uninstall binary
function uninstall_binary(target)
@@ -41,6 +65,9 @@ function uninstall_binary(target)
os.vrm(path.join(binarydir, path.filename(dep:targetfile())))
end
end
+
+ -- uninstall shared libraries for packages
+ _uninstall_shared_for_packages(target, binarydir)
end
-- uninstall shared library
@@ -58,6 +85,9 @@ function uninstall_shared(target)
-- remove headers from the include directory
_uninstall_headers(target)
+
+ -- uninstall shared libraries for packages
+ _uninstall_shared_for_packages(target, binarydir)
end
-- uninstall static library
diff --git a/xmake/modules/package/manager/vcpkg/find_package.lua b/xmake/modules/package/manager/vcpkg/find_package.lua
index 711d9b44b..4a22c6c11 100644
--- a/xmake/modules/package/manager/vcpkg/find_package.lua
+++ b/xmake/modules/package/manager/vcpkg/find_package.lua
@@ -88,8 +88,10 @@ function main(name, opt)
result = result or {}
result.links = result.links or {}
result.linkdirs = result.linkdirs or {}
+ result.libpathes = result.libpathes or {}
table.insert(result.linkdirs, path.join(installdir, path.directory(line)))
table.insert(result.links, target.linkname(path.filename(line)))
+ table.insert(result.libpathes, path.join(installdir, path.directory(line), path.filename(line)))
end
end
@@ -98,7 +100,9 @@ function main(name, opt)
if line:find(plat .. (mode == "debug" and "/debug" or "") .. "/bin/", 1, true) then
result = result or {}
result.linkdirs = result.linkdirs or {}
+ result.libpathes = result.libpathes or {}
table.insert(result.linkdirs, path.join(installdir, path.directory(line)))
+ table.insert(result.libpathes, path.join(installdir, path.directory(line), path.filename(line)))
end
end
end
diff --git a/xmake/modules/package/manager/xmake/find_package.lua b/xmake/modules/package/manager/xmake/find_package.lua
index 6466aca40..9cdaa3885 100644
--- a/xmake/modules/package/manager/xmake/find_package.lua
+++ b/xmake/modules/package/manager/xmake/find_package.lua
@@ -70,6 +70,7 @@ function _find_package_from_repo(name, opt)
-- get links and link directories
local links = {}
local linkdirs = {}
+ local libpathes = {}
for _, linkdir in ipairs(vars.linkdirs) do
table.insert(linkdirs, path.join(installdir, linkdir))
end
@@ -102,6 +103,11 @@ function _find_package_from_repo(name, opt)
end
end
end
+ if opt.plat == "windows" then
+ for _, file in ipairs(os.files(path.join(installdir, "bin", "*.dll"))) do
+ table.insert(libpathes, file)
+ end
+ end
-- add root link directories
if #linkdirs == 0 then
@@ -117,14 +123,17 @@ function _find_package_from_repo(name, opt)
for _, link in ipairs(links) do
local libinfo = find_library(link, linkdirs)
if libinfo then
- result.links = table.join(result.links or {}, libinfo.link)
- result.linkdirs = table.join(result.linkdirs or {}, libinfo.linkdir)
+ result.links = table.join(result.links or {}, libinfo.link)
+ result.linkdirs = table.join(result.linkdirs or {}, libinfo.linkdir)
+ result.libpathes = table.join(result.libpathes or {}, path.join(libinfo.linkdir, libinfo.filename))
end
end
- -- make unique links
if result.links then
result.links = table.unique(result.links)
end
+ if result.libpathes then
+ result.libpathes = table.join(result.libpathes, libpathes)
+ end
-- inherit the other prefix variables
for name, values in pairs(vars) do
@@ -227,6 +236,7 @@ function _find_package_from_packagedirs(name, opt)
result = result or {}
result.links = table.join(result.links or {}, libinfo.link)
result.linkdirs = table.join(result.linkdirs or {}, libinfo.linkdir)
+ result.libpathes = table.join(result.libpathes or {}, path.join(libinfo.linkdir, libinfo.filename))
end
end