diff options
| author | ruki <[email protected]> | 2024-11-08 22:48:05 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2024-11-08 22:48:05 +0800 |
| commit | 0e8dbee986b542012984b5cccb453d5f06e684b5 (patch) | |
| tree | 27c341dd07a32b7c1f2964850dacbe6c47efb48c | |
| parent | c2b956073bfd299974e42cdf708c436ffa7775d3 (diff) | |
improve to package target #5796
| -rw-r--r-- | xmake/actions/package/local/main.lua | 154 | ||||
| -rw-r--r-- | xmake/modules/target/action/install/main.lua | 12 | ||||
| -rw-r--r-- | xmake/modules/target/action/uninstall/main.lua | 12 |
3 files changed, 31 insertions, 147 deletions
diff --git a/xmake/actions/package/local/main.lua b/xmake/actions/package/local/main.lua index f27cbd091..d0f6e4a3e 100644 --- a/xmake/actions/package/local/main.lua +++ b/xmake/actions/package/local/main.lua @@ -24,9 +24,7 @@ import("core.base.task") import("core.project.rule") import("core.project.config") import("core.project.project") -import("core.base.bit") -import("rules.c++.modules.modules_support.compiler_support", {alias = "module_compiler_support", rootdir = os.programdir()}) -import("rules.c++.modules.modules_support.builder", {alias = "module_builder", rootdir = os.programdir()}) +import("target.action.install") -- get library deps function _get_librarydeps(target) @@ -40,19 +38,9 @@ function _get_librarydeps(target) return librarydeps end --- package binary function _package_binary(target) - - -- get the output directory local packagedir = target:packagedir() local packagename = target:name():lower() - local binarydir = path.join(packagedir, target:plat(), target:arch(), config.mode(), "bin") - - -- copy the binary file to the output directory - local targetfile = target:targetfile() - os.mkdir(binarydir) - os.vcp(targetfile, binarydir) - os.trycp(target:symbolfile(), binarydir) -- generate xmake.lua local file = io.open(path.join(packagedir, "xmake.lua"), "w") @@ -80,7 +68,7 @@ function _package_binary(target) on_fetch(function (package) return {program = path.join(package:installdir("bin"), "%s")} end)]], #deps > 0 and ("add_deps(\"" .. table.concat(deps, "\", \"") .. "\")") or "", - path.filename(targetfile)) + path.filename(target:targetfile())) file:close() end @@ -88,86 +76,9 @@ function _package_binary(target) print("package(%s): %s generated", packagename, packagedir) end --- package library function _package_library(target) - - -- get the output directory local packagedir = target:packagedir() local packagename = target:name():lower() - local binarydir = path.join(packagedir, target:plat(), target:arch(), config.mode(), "bin") - local librarydir = path.join(packagedir, target:plat(), target:arch(), config.mode(), "lib") - local headerdir = path.join(packagedir, target:plat(), target:arch(), config.mode(), "include") - local modulesdir = path.join(packagedir, target:plat(), target:arch(), config.mode(), "modules") - - -- copy the library file to the output directory - local targetfile = target:targetfile() - if target:is_shared() and target:is_plat("windows", "mingw") then - os.mkdir(binarydir) - os.vcp(targetfile, binarydir) - os.trycp(target:symbolfile(), binarydir) - local targetfile_lib = path.join(path.directory(targetfile), path.basename(targetfile) .. ".lib") - if os.isfile(targetfile_lib) then - os.mkdir(librarydir) - os.vcp(targetfile_lib, librarydir) - end - else - os.mkdir(librarydir) - if os.islink(targetfile) then - local targetfile_with_soname = os.readlink(targetfile) - if not path.is_absolute(targetfile_with_soname) then - targetfile_with_soname = path.join(target:targetdir(), targetfile_with_soname) - end - if os.islink(targetfile_with_soname) then - local targetfile_with_version = os.readlink(targetfile_with_soname) - if not path.is_absolute(targetfile_with_version) then - targetfile_with_version = path.join(target:targetdir(), targetfile_with_version) - end - os.vcp(targetfile_with_version, librarydir, {symlink = true, force = true}) - end - os.vcp(targetfile_with_soname, librarydir, {symlink = true, force = true}) - os.vcp(targetfile, librarydir, {symlink = true, force = true}) - else - os.vcp(targetfile, librarydir) - end - os.trycp(target:symbolfile(), librarydir) - end - - -- copy headers - local srcheaders, dstheaders = target:headerfiles(headerdir) - if srcheaders and dstheaders then - local i = 1 - for _, srcheader in ipairs(srcheaders) do - local dstheader = dstheaders[i] - if dstheader then - os.vcp(srcheader, dstheader) - end - i = i + 1 - end - end - - -- copy modules - if target:data("cxx.has_modules") then - - local modules = module_compiler_support.localcache():get2(target:name(), "c++.modules") - module_builder.generate_metadata(target, modules) - - local sourcebatch = target:sourcebatches()["c++.build.modules.install"] - if sourcebatch and sourcebatch.sourcefiles then - for _, sourcefile in ipairs(sourcebatch.sourcefiles) do - local fileconfig = target:fileconfig(sourcefile) - local install = fileconfig and fileconfig.public or false - if install then - local modulehash = module_compiler_support.get_modulehash(target, sourcefile) - local prefixdir = path.join(modulesdir, modulehash) - os.vcp(sourcefile, path.join(prefixdir, path.filename(sourcefile))) - local metafile = module_compiler_support.get_metafile(target, sourcefile) - if os.exists(metafile) then - os.vcp(metafile, path.join(prefixdir, path.filename(metafile))) - end - end - end - end - end -- generate xmake.lua local file = io.open(path.join(packagedir, "xmake.lua"), "w") @@ -224,7 +135,7 @@ function _package_library(target) return result end)]], target:is_shared() and "true" or "false", target:linkname(), - path.filename(targetfile)) + path.filename(target:targetfile())) file:close() end @@ -232,26 +143,9 @@ function _package_library(target) print("package(%s): %s generated", packagename, packagedir) end --- package headeronly library function _package_headeronly(target) - - -- get the output directory local packagedir = target:packagedir() local packagename = target:name():lower() - local headerdir = path.join(packagedir, target:plat(), target:arch(), config.mode(), "include") - - -- copy headers - local srcheaders, dstheaders = target:headerfiles(headerdir) - if srcheaders and dstheaders then - local i = 1 - for _, srcheader in ipairs(srcheaders) do - local dstheader = dstheaders[i] - if dstheader then - os.vcp(srcheader, dstheader) - end - i = i + 1 - end - end -- generate xmake.lua local file = io.open(path.join(packagedir, "xmake.lua"), "w") @@ -289,42 +183,8 @@ function _package_headeronly(target) end function _package_moduleonly(target) - - -- get the output directory local packagedir = target:packagedir() local packagename = target:name():lower() - local headerdir = path.join(packagedir, target:plat(), target:arch(), config.mode(), "include") - local modulesdir = path.join(packagedir, target:plat(), target:arch(), config.mode(), "modules") - - local modules = module_compiler_support.localcache():get2(target:name(), "c++.modules") - module_builder.generate_metadata(target, modules) - - -- copy headers - local srcheaders, dstheaders = target:headerfiles(headerdir) - if srcheaders and dstheaders then - local i = 1 - for _, srcheader in ipairs(srcheaders) do - local dstheader = dstheaders[i] - if dstheader then - os.vcp(srcheader, dstheader) - end - i = i + 1 - end - end - - -- copy modules - local sourcebatch = target:sourcebatches()["c++.build.modules.install"] - if sourcebatch and sourcebatch.sourcefiles then - for _, sourcefile in ipairs(sourcebatch.sourcefiles) do - local modulehash = module_compiler_support.get_modulehash(target, sourcefile) - local prefixdir = path.join(modulesdir, modulehash) - os.vcp(sourcefile, path.join(prefixdir, path.filename(sourcefile))) - local metafile = module_compiler_support.get_metafile(target, sourcefile) - if os.exists(metafile) then - os.vcp(metafile, path.join(prefixdir, path.filename(metafile))) - end - end - end -- generate xmake.lua local file = io.open(path.join(packagedir, "xmake.lua"), "w") @@ -360,8 +220,16 @@ function _package_moduleonly(target) -- show tips print("package(%s): %s generated", packagename, packagedir) end + -- do package target function _do_package_target(target) + + -- do install + local packagedir = target:packagedir() + local installdir = path.join(packagedir, target:plat(), target:arch(), config.mode()) + install(target, {installdir = installdir, libdir = "lib", bindir = "bin", includedir = "include"}) + + -- package script if not target:is_phony() then local scripts = { diff --git a/xmake/modules/target/action/install/main.lua b/xmake/modules/target/action/install/main.lua index 5ac99278c..48e97e4cc 100644 --- a/xmake/modules/target/action/install/main.lua +++ b/xmake/modules/target/action/install/main.lua @@ -41,6 +41,14 @@ function _get_target_bindir(target, opt) return path.join(opt.installdir, opt.bindir) end +function _get_target_includedir(target, opt) + if not opt.installdir then + return target:includedir() + end + assert(opt.includedir, "opt.includedir is missing") + return path.join(opt.installdir, opt.includedir) +end + -- we need to get all deplibs, e.g. app -> libfoo.so -> libbar.so ... -- @see https://github.com/xmake-io/xmake/issues/5325#issuecomment-2242597732 function _get_target_package_deplibs(binaryfile, depends, libfiles, opt) @@ -147,14 +155,14 @@ end -- install headers function _install_headers(target, opt) - local srcheaders, dstheaders = target:headerfiles(target:includedir(), {installonly = true}) + local srcheaders, dstheaders = target:headerfiles(_get_target_includedir(target, opt), {installonly = true}) if srcheaders and dstheaders then for idx, srcheader in ipairs(srcheaders) do os.vcp(srcheader, dstheaders[idx]) end end for _, dep in ipairs(target:orderdeps()) do - local srcfiles, dstfiles = dep:headerfiles(dep:includedir(), {installonly = true, interface = true}) + local srcfiles, dstfiles = dep:headerfiles(_get_target_includedir(dep, opt), {installonly = true, interface = true}) if srcfiles and dstfiles then for idx, srcfile in ipairs(srcfiles) do os.vcp(srcfile, dstfiles[idx]) diff --git a/xmake/modules/target/action/uninstall/main.lua b/xmake/modules/target/action/uninstall/main.lua index c4228f23c..d095f0aee 100644 --- a/xmake/modules/target/action/uninstall/main.lua +++ b/xmake/modules/target/action/uninstall/main.lua @@ -41,6 +41,14 @@ function _get_target_bindir(target, opt) return path.join(opt.installdir, opt.bindir) end +function _get_target_includedir(target, opt) + if not opt.installdir then + return target:includedir() + end + assert(opt.includedir, "opt.includedir is missing") + return path.join(opt.installdir, opt.includedir) +end + -- we need to get all deplibs, e.g. app -> libfoo.so -> libbar.so ... -- @see https://github.com/xmake-io/xmake/issues/5325#issuecomment-2242597732 function _get_target_package_deplibs(binaryfile, depends, libfiles, opt) @@ -141,12 +149,12 @@ end -- uninstall headers function _uninstall_headers(target, opt) - local _, dstheaders = target:headerfiles(target:includedir(), {installonly = true}) + local _, dstheaders = target:headerfiles(_get_target_includedir(target, opt), {installonly = true}) for _, dstheader in ipairs(dstheaders) do remove_files(dstheader, {emptydir = true}) end for _, dep in ipairs(target:orderdeps()) do - local _, dstfiles = dep:headerfiles(dep:includedir(), {installonly = true, interface = true}) + local _, dstfiles = dep:headerfiles(_get_target_includedir(dep, opt), {installonly = true, interface = true}) for _, dstfile in ipairs(dstfiles) do remove_files(dstfile, {emptydir = true}) end |
