diff options
| author | ruki <[email protected]> | 2024-11-08 23:30:20 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2024-11-08 23:30:20 +0800 |
| commit | 345eb696e68cd1040d0120abe2ec7fb4390517ed (patch) | |
| tree | 0fb3e717fa6298cea348b2a4fd2ef6fa73c83498 | |
| parent | 0e8dbee986b542012984b5cccb453d5f06e684b5 (diff) | |
rewrite package
| -rw-r--r-- | xmake/actions/package/local/main.lua | 223 |
1 files changed, 59 insertions, 164 deletions
diff --git a/xmake/actions/package/local/main.lua b/xmake/actions/package/local/main.lua index d0f6e4a3e..ca724140a 100644 --- a/xmake/actions/package/local/main.lua +++ b/xmake/actions/package/local/main.lua @@ -38,53 +38,29 @@ function _get_librarydeps(target) return librarydeps end -function _package_binary(target) - local packagedir = target:packagedir() - local packagename = target:name():lower() - - -- generate xmake.lua - local file = io.open(path.join(packagedir, "xmake.lua"), "w") - if file then - local deps = _get_librarydeps(target) - file:print("package(\"%s\")", packagename) - local homepage = option.get("homepage") - if homepage then - file:print(" set_homepage(\"%s\")", homepage) - end - local description = option.get("description") or ("The " .. packagename .. " package") - file:print(" set_description(\"%s\")", description) - if target:license() then - file:print(" set_license(\"%s\")", target:license()) - end - if #deps > 0 then - file:print(" add_deps(\"%s\")", table.concat(deps, "\", \"")) - end - file:print("") - file:print([[ - on_load(function (package) - package:set("installdir", path.join(os.scriptdir(), package:plat(), package:arch(), package:mode())) - end) - - on_fetch(function (package) - return {program = path.join(package:installdir("bin"), "%s")} - end)]], #deps > 0 and ("add_deps(\"" .. table.concat(deps, "\", \"") .. "\")") or "", - path.filename(target:targetfile())) - file:close() +-- do package target +function _do_package_target(target) + if target:is_phony() then + return end - -- show tips - print("package(%s): %s generated", packagename, packagedir) -end - -function _package_library(target) + -- do install local packagedir = target:packagedir() - local packagename = target:name():lower() + local installdir = path.join(packagedir, target:plat(), target:arch(), config.mode()) + install(target, {installdir = installdir, libdir = "lib", bindir = "bin", includedir = "include"}) -- generate xmake.lua + local packagename = target:name():lower() local file = io.open(path.join(packagedir, "xmake.lua"), "w") if file then - local deps = _get_librarydeps(target) file:print("package(\"%s\")", packagename) + if target:is_binary() then + file:print(" set_kind(\"binary\")") + elseif target:is_headeronly() then + file:print(" set_kind(\"library\", {headeronly = true})") + elseif target:is_moduleonly() then + file:print(" set_kind(\"library\", {moduleonly = true})") + end local homepage = option.get("homepage") if homepage then file:print(" set_homepage(\"%s\")", homepage) @@ -95,158 +71,77 @@ function _package_library(target) file:print(" set_license(\"%s\")", target:license()) end file:print("") + local has_deps = false + local deps = _get_librarydeps(target) if #deps > 0 then file:print(" add_deps(\"%s\")", table.concat(deps, "\", \"")) + has_deps = true end -- export packages as deps, @see https://github.com/xmake-io/xmake/issues/4202 - local interface - if target:is_shared() then - interface = true - end - for _, pkg in ipairs(target:orderpkgs({interface = interface})) do - local requireconf_str - local requireconf = pkg:requireconf() - if requireconf then - local conf = table.clone(requireconf) - conf.alias = nil - requireconf_str = string.serialize(conf, {indent = false, strip = true}) + if target:is_library() then + local interface + if target:is_shared() then + interface = true end - if requireconf_str and requireconf_str ~= "{}" then - file:print(" add_deps(\"%s\", %s)", pkg:requirestr(), requireconf_str) - else - file:print(" add_deps(\"%s\")", pkg:requirestr()) + for _, pkg in ipairs(target:orderpkgs({interface = interface})) do + local requireconf_str + local requireconf = pkg:requireconf() + if requireconf then + local conf = table.clone(requireconf) + conf.alias = nil + requireconf_str = string.serialize(conf, {indent = false, strip = true}) + end + if requireconf_str and requireconf_str ~= "{}" then + file:print(" add_deps(\"%s\", %s)", pkg:requirestr(), requireconf_str) + else + file:print(" add_deps(\"%s\")", pkg:requirestr()) + end + has_deps = true end end - file:print("") - file:print([[ - add_configs("shared", {description = "Build shared library.", default = %s, type = "boolean", readonly = true}) - - on_load(function (package) - package:set("installdir", path.join(os.scriptdir(), package:plat(), package:arch(), package:mode())) - end) - - on_fetch(function (package) - local result = {} - local libfiledir = (package:config("shared") and package:is_plat("windows", "mingw")) and "bin" or "lib" - result.links = "%s" - result.linkdirs = package:installdir("lib") - result.includedirs = package:installdir("include") - result.libfiles = path.join(package:installdir(libfiledir), "%s") - return result - end)]], target:is_shared() and "true" or "false", - target:linkname(), - path.filename(target:targetfile())) - file:close() - end - - -- show tips - print("package(%s): %s generated", packagename, packagedir) -end - -function _package_headeronly(target) - local packagedir = target:packagedir() - local packagename = target:name():lower() - - -- generate xmake.lua - local file = io.open(path.join(packagedir, "xmake.lua"), "w") - if file then - local deps = _get_librarydeps(target) - file:print("package(\"%s\")", packagename) - local homepage = option.get("homepage") - if homepage then - file:print(" set_homepage(\"%s\")", homepage) - end - local description = option.get("description") or ("The " .. packagename .. " package") - file:print(" set_description(\"%s\")", description) - if target:license() then - file:print(" set_license(\"%s\")", target:license()) + if has_deps then + file:print("") end - if #deps > 0 then - file:print(" add_deps(\"%s\")", table.concat(deps, "\", \"")) + + if target:is_library() and not target:is_headeronly() and not target:is_moduleonly() then + file:print([[ add_configs("shared", {description = "Build shared library.", default = %s, type = "boolean", readonly = true}]], target:is_shared() and "true" or "false") + file:print("") end - file:print("") file:print([[ on_load(function (package) package:set("installdir", path.join(os.scriptdir(), package:plat(), package:arch(), package:mode())) end) - + ]]) + if target:is_binary() then + file:print([[ + on_fetch(function (package) + return {program = path.join(package:installdir("bin"), "%s")} + end)]], path.filename(target:targetfile())) + elseif target:is_headeronly() or target:is_moduleonly() then + file:print([[ on_fetch(function (package) local result = {} result.includedirs = package:installdir("include") return result end)]]) - file:close() - end - - -- show tips - print("package(%s): %s generated", packagename, packagedir) -end - -function _package_moduleonly(target) - local packagedir = target:packagedir() - local packagename = target:name():lower() - - -- generate xmake.lua - local file = io.open(path.join(packagedir, "xmake.lua"), "w") - if file then - local deps = _get_librarydeps(target) - file:print("package(\"%s\")", packagename) - local homepage = option.get("homepage") - if homepage then - file:print(" set_homepage(\"%s\")", homepage) - end - local description = option.get("description") or ("The " .. packagename .. " package") - file:print(" set_description(\"%s\")", description) - if target:license() then - file:print(" set_license(\"%s\")", target:license()) - end - if #deps > 0 then - file:print(" add_deps(\"%s\")", table.concat(deps, "\", \"")) - end - file:print("") - file:print([[ - on_load(function (package) - package:set("installdir", path.join(os.scriptdir(), package:plat(), package:arch(), package:mode())) - end) - + elseif target:is_library() then + file:print([[ on_fetch(function (package) local result = {} + local libfiledir = (package:config("shared") and package:is_plat("windows", "mingw")) and "bin" or "lib" + result.links = "%s" + result.linkdirs = package:installdir("lib") result.includedirs = package:installdir("include") + result.libfiles = path.join(package:installdir(libfiledir), "%s") return result - end)]]) + end)]], target:linkname(), path.filename(target:targetfile())) + end + file:close() end - - -- 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 = - { - binary = _package_binary - , static = _package_library - , shared = _package_library - , moduleonly = _package_moduleonly - , headeronly = _package_headeronly - } - local kind = target:kind() - local script = scripts[kind] - if script then - script(target) - end - end -end - -- package target function _on_package_target(target) local done = false |
