summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-09-24 00:41:18 +0800
committerruki <[email protected]>2020-09-24 00:41:18 +0800
commitffc281eaa133f146b0f269c4a173d63265df111e (patch)
treebc93e7f682b8a683b8b99fb5c81a9873d06e19a0
parent87119fd4fa17d754c8cc867caa9b60e4a8836c82 (diff)
install package/dlls for windows
-rw-r--r--xmake/actions/install/install/windows.lua71
1 files changed, 71 insertions, 0 deletions
diff --git a/xmake/actions/install/install/windows.lua b/xmake/actions/install/install/windows.lua
index ab215bb1b..0ff219141 100644
--- a/xmake/actions/install/install/windows.lua
+++ b/xmake/actions/install/install/windows.lua
@@ -18,6 +18,9 @@
-- @file windows.lua
--
+-- imports
+import("lib.detect.find_file")
+
-- install headers
function _install_headers(target)
local includedir = path.join(target:installdir(), "include")
@@ -35,6 +38,68 @@ 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
+ 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
+ end
+end
+
+-- install shared libraries for packages
+function _install_shared_for_packages(target, outputdir)
+ _g.installed_packages = _g.installed_packages or {}
+ for _, pkg in ipairs(target:orderpkgs()) do
+ 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
+ _install_shared_for_package(target, pkg, outputdir)
+ end
+ _g.installed_packages[pkg:name()] = true
+ end
+ end
+end
+
-- install binary
function install_binary(target)
@@ -53,6 +118,9 @@ function install_binary(target)
end
end
end
+
+ -- install shared libraries for all packages
+ _install_shared_for_packages(target, binarydir)
end
-- install shared library
@@ -73,6 +141,9 @@ function install_shared(target)
os.vcp(targetfile_lib, librarydir)
end
+ -- install shared libraries for all packages
+ _install_shared_for_packages(target, binarydir)
+
-- install headers
_install_headers(target)
end