summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-11-08 22:48:05 +0800
committerruki <[email protected]>2024-11-08 22:48:05 +0800
commit0e8dbee986b542012984b5cccb453d5f06e684b5 (patch)
tree27c341dd07a32b7c1f2964850dacbe6c47efb48c
parentc2b956073bfd299974e42cdf708c436ffa7775d3 (diff)
improve to package target #5796
-rw-r--r--xmake/actions/package/local/main.lua154
-rw-r--r--xmake/modules/target/action/install/main.lua12
-rw-r--r--xmake/modules/target/action/uninstall/main.lua12
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