diff options
| author | ruki <[email protected]> | 2020-12-02 00:54:31 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-12-02 00:54:31 +0800 |
| commit | b0384dc3b81f05d4028f9e06dbb6caaa46f42013 (patch) | |
| tree | 4cbf771e45362e726dabcd2bf9bdb326081a9d76 | |
| parent | 7d1894ff02004c542f44794af00d537bd756c07a (diff) | |
add tools/gn and ninja
| -rw-r--r-- | xmake/modules/detect/tools/find_gn.lua | 54 | ||||
| -rw-r--r-- | xmake/modules/package/tools/cmake.lua | 21 | ||||
| -rw-r--r-- | xmake/modules/package/tools/gn.lua | 98 | ||||
| -rw-r--r-- | xmake/modules/package/tools/meson.lua | 34 | ||||
| -rw-r--r-- | xmake/modules/package/tools/ninja.lua | 59 |
5 files changed, 237 insertions, 29 deletions
diff --git a/xmake/modules/detect/tools/find_gn.lua b/xmake/modules/detect/tools/find_gn.lua new file mode 100644 index 000000000..a42c1ebd1 --- /dev/null +++ b/xmake/modules/detect/tools/find_gn.lua @@ -0,0 +1,54 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-2020, TBOOX Open Source Group. +-- +-- @author ruki +-- @file find_gn.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") + +-- find gn +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local gn = find_gn() +-- local gn, version = find_gn({version = true}) +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + + -- find program + local program = find_program(opt.program or "gn", opt) + + -- find program version + local version = nil + if program and opt and opt.version then + version = find_programver(program, opt) + end + + -- ok? + return program, version +end diff --git a/xmake/modules/package/tools/cmake.lua b/xmake/modules/package/tools/cmake.lua index 6787f6ac4..9878a57c8 100644 --- a/xmake/modules/package/tools/cmake.lua +++ b/xmake/modules/package/tools/cmake.lua @@ -26,6 +26,7 @@ import("core.tool.linker") import("core.tool.compiler") import("lib.detect.find_file") import("lib.detect.find_tool") +import("package.tools.ninja") -- translate windows bin path function _translate_windows_bin_path(bin_path) @@ -432,15 +433,7 @@ end -- do build for ninja function _build_for_ninja(package, configs, opt) opt = opt or {} - local njob = tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) - local ninja = assert(find_tool("ninja"), "ninja not found!") - local argv = {"-C", os.curdir()} - if option.get("verbose") then - table.insert(argv, "-v") - end - table.insert(argv, "-j") - table.insert(argv, njob) - os.vrunv(ninja.program, argv, {envs = opt.envs or buildenvs(package, opt)}) + ninja.build(package, {}, {envs = opt.envs or buildenvs(package, opt)}) end -- do build for cmake/build @@ -512,15 +505,7 @@ end -- do install for ninja function _install_for_ninja(package, configs, opt) opt = opt or {} - local njob = tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) - local ninja = assert(find_tool("ninja"), "ninja not found!") - local argv = {"install", "-C", os.curdir()} - if option.get("verbose") then - table.insert(argv, "-v") - end - table.insert(argv, "-j") - table.insert(argv, njob) - os.vrunv(ninja.program, argv, {envs = opt.envs or buildenvs(package, opt)}) + ninja.install(package, {}, {envs = opt.envs or buildenvs(package, opt)}) _install_files_for_cmake(package, opt) end diff --git a/xmake/modules/package/tools/gn.lua b/xmake/modules/package/tools/gn.lua new file mode 100644 index 000000000..6e3a8dfd7 --- /dev/null +++ b/xmake/modules/package/tools/gn.lua @@ -0,0 +1,98 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-2020, TBOOX Open Source Group. +-- +-- @author ruki +-- @file gn.lua +-- + +-- imports +import("core.base.option") +import("core.tool.toolchain") +import("lib.detect.find_tool") +import("package.tools.ninja") + +-- get build directory +function _get_buildir(opt) + if opt and opt.buildir then + return opt.buildir + else + _g.buildir = _g.buildir or ("build_" .. hash.uuid4():split('%-')[1]) + return _g.buildir + end +end + +-- get configs +function _get_configs(package, configs, opt) + return configs +end + +-- get the build environments +function buildenvs(package, opt) + local envs = {} + if package:is_plat("windows") then + table.join2(envs, toolchain.load("msvc"):runenvs()) + end + return envs +end + +-- generate build files for ninja +function generate(package, configs, opt) + + -- init options + opt = opt or {} + + -- pass configurations + local argv = {} + local args = {} + table.insert(argv, "gen") + table.insert(argv, _get_buildir(opt)) + for name, value in pairs(_get_configs(package, configs, opt)) do + if type(name) == "string" then + table.insert(args, name .. '=\"' .. value .. "\"") + else + table.insert(args, name .. "=" .. tostring(value)) + end + end + table.insert(argv, "--args='" .. table.concat(args, ' ') .. "'") + + -- do configure + local gn = assert(find_tool("gn"), "gn not found!") + os.vrunv(gn.program, argv, {envs = opt.envs or buildenvs(package)}) +end + +-- build package +function build(package, configs, opt) + + -- generate build files + opt = opt or {} + generate(package, configs, opt) + + -- do build + local buildir = _get_buildir(opt) + ninja.build(package, {}, {buildir = buildir, envs = opt.envs or buildenvs(package, opt)}) +end + +-- install package +function install(package, configs, opt) + + -- generate build files + opt = opt or {} + generate(package, configs, opt) + + -- do build and install + local buildir = _get_buildir(opt) + ninja.install(package, {}, {buildir = buildir, envs = opt.envs or buildenvs(package, opt)}) +end diff --git a/xmake/modules/package/tools/meson.lua b/xmake/modules/package/tools/meson.lua index fc4a2a1ae..c0bb5fe78 100644 --- a/xmake/modules/package/tools/meson.lua +++ b/xmake/modules/package/tools/meson.lua @@ -21,11 +21,16 @@ -- imports import("core.base.option") import("core.project.config") +import("package.tools.ninja") -- get build directory -function _get_buildir() - _g.buildir = _g.buildir or ("build_" .. hash.uuid4():split('%-')[1]) - return _g.buildir +function _get_buildir(opt) + if opt and opt.buildir then + return opt.buildir + else + _g.buildir = _g.buildir or ("build_" .. hash.uuid4():split('%-')[1]) + return _g.buildir + end end -- get configs @@ -110,19 +115,26 @@ function generate(package, configs, opt) os.vrunv("meson", argv, {envs = opt.envs or buildenvs(package)}) end +-- build package +function build(package, configs, opt) + + -- generate build files + opt = opt or {} + generate(package, configs, opt) + + -- do build + local buildir = _get_buildir(opt) + ninja.build(package, {}, {buildir = buildir, envs = opt.envs or buildenvs(package, opt)}) +end + -- install package function install(package, configs, opt) -- generate build files + opt = opt or {} generate(package, configs, opt) -- do build and install - local buildir = _get_buildir() - if option.get("verbose") or option.get("diagnosis") then - os.vrunv("ninja", {"-v", "-C", buildir}) - os.vrunv("ninja", {"install", "-v", "-C", buildir}) - else - os.vrunv("ninja", {"-C", buildir}) - os.vrunv("ninja", {"install", "-C", buildir}) - end + local buildir = _get_buildir(opt) + ninja.install(package, {}, {buildir = buildir, envs = opt.envs or buildenvs(package, opt)}) end diff --git a/xmake/modules/package/tools/ninja.lua b/xmake/modules/package/tools/ninja.lua new file mode 100644 index 000000000..f6f0e222f --- /dev/null +++ b/xmake/modules/package/tools/ninja.lua @@ -0,0 +1,59 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-2020, TBOOX Open Source Group. +-- +-- @author ruki +-- @file ninja.lua +-- + +-- imports +import("core.base.option") +import("lib.detect.find_tool") + +-- build package +function build(package, configs, opt) + opt = opt or {} + local buildir = opt.buildir or os.curdir() + local njob = tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) + local ninja = assert(find_tool("ninja"), "ninja not found!") + local argv = {"-C", buildir} + if option.get("verbose") then + table.insert(argv, "-v") + end + table.insert(argv, "-j") + table.insert(argv, njob) + if configs then + table.join2(argv, configs) + end + os.vrunv(ninja.program, argv, {envs = opt.envs}) +end + +-- install package +function install(package, configs, opt) + opt = opt or {} + local buildir = opt.buildir or os.curdir() + local njob = tostring(math.ceil(os.cpuinfo().ncpu * 3 / 2)) + local ninja = assert(find_tool("ninja"), "ninja not found!") + local argv = {"install", "-C", buildir} + if option.get("verbose") then + table.insert(argv, "-v") + end + table.insert(argv, "-j") + table.insert(argv, njob) + if configs then + table.join2(argv, configs) + end + os.vrunv(ninja.program, argv, {envs = opt.envs}) +end |
