diff options
| author | ruki <[email protected]> | 2020-09-24 22:54:54 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-09-24 22:54:54 +0800 |
| commit | e372ce038de7b5bb5e76655399f37bd366326b8e (patch) | |
| tree | 971a942cf1836db18d982d76f2accd49e909c85c | |
| parent | f1642e450812a6128941eeae4bafba523215ec50 (diff) | |
add libpathes for find_package
| -rw-r--r-- | xmake/actions/install/install/windows.lua | 49 | ||||
| -rw-r--r-- | xmake/actions/uninstall/uninstall/windows.lua | 30 | ||||
| -rw-r--r-- | xmake/modules/package/manager/vcpkg/find_package.lua | 4 | ||||
| -rw-r--r-- | xmake/modules/package/manager/xmake/find_package.lua | 16 |
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 |
