diff options
| -rw-r--r-- | xmake/modules/target/action/install/unix.lua | 80 |
1 files changed, 69 insertions, 11 deletions
diff --git a/xmake/modules/target/action/install/unix.lua b/xmake/modules/target/action/install/unix.lua index d4311aeea..af3f710a1 100644 --- a/xmake/modules/target/action/install/unix.lua +++ b/xmake/modules/target/action/install/unix.lua @@ -18,15 +18,8 @@ -- @file unix.lua -- --- install library -function _install_library(target, opt) - - -- install libraries - local librarydir = path.join(target:installdir(), opt and opt.libdir or "lib") - os.mkdir(librarydir) - os.vcp(target:targetfile(), librarydir) - - -- install headers +-- install headers +function _install_headers(target, opt) local includedir = path.join(target:installdir(), opt and opt.includedir or "include") os.mkdir(includedir) local srcheaders, dstheaders = target:headerfiles(includedir) @@ -42,19 +35,84 @@ function _install_library(target, opt) end end +-- install shared libraries for package +function _install_shared_for_package(target, pkg, outputdir) + for _, sopath in ipairs(table.wrap(pkg:get("libfiles"))) do + if sopath:endswith(".so") or sopath:endswith(".dylib") then + local soname = path.filename(dllpath) + if os.isfile(path.join(outputdir, soname)) then + wprint("'%s' already exists in install dir, overwriting it from package(%s).", soname, pkg:name()) + end + os.vcp(sopath, outputdir) + end + 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 + if pkg:enabled() and pkg:get("libfiles") then + _install_shared_for_package(target, pkg, outputdir) + end + _g.installed_packages[pkg:name()] = true + end + end +end + -- install binary function install_binary(target, opt) + + -- install binary local binarydir = path.join(target:installdir(), opt and opt.bindir or "bin") os.mkdir(binarydir) os.vcp(target:targetfile(), binarydir) + + -- install libraries + local librarydir = path.join(target:installdir(), opt and opt.libdir or "lib") + os.mkdir(librarydir) + + -- install the dependent shared (*.so) target + -- @see https://github.com/xmake-io/xmake/issues/961 + for _, dep in ipairs(target:orderdeps()) do + if dep:kind() == "shared" then + local depfile = dep:targetfile() + if os.isfile(depfile) then + os.vcp(depfile, librarydir) + end + end + -- install all shared libraries in packages in all deps + _install_shared_for_packages(dep, librarydir) + end + + -- install shared libraries for all packages + _install_shared_for_packages(target, librarydir) end -- install shared library function install_shared(target, opt) - _install_library(target, opt) + + -- install libraries + local librarydir = path.join(target:installdir(), opt and opt.libdir or "lib") + os.mkdir(librarydir) + os.vcp(target:targetfile(), librarydir) + + -- install shared libraries for all packages + _install_shared_for_packages(target, librarydir) + + -- install headers + _install_headers(target, opt) end -- install static library function install_static(target, opt) - _install_library(target, opt) + + -- install libraries + local librarydir = path.join(target:installdir(), opt and opt.libdir or "lib") + os.mkdir(librarydir) + os.vcp(target:targetfile(), librarydir) + + -- install headers + _install_headers(target, opt) end |
