diff options
| author | ruki <[email protected]> | 2020-09-24 00:41:18 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-09-24 00:41:18 +0800 |
| commit | ffc281eaa133f146b0f269c4a173d63265df111e (patch) | |
| tree | bc93e7f682b8a683b8b99fb5c81a9873d06e19a0 | |
| parent | 87119fd4fa17d754c8cc867caa9b60e4a8836c82 (diff) | |
install package/dlls for windows
| -rw-r--r-- | xmake/actions/install/install/windows.lua | 71 |
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 |
