diff options
| author | ruki <[email protected]> | 2016-05-05 10:13:12 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2016-05-05 10:13:12 +0800 |
| commit | c0adb9ffb3e004a5d488c77ef1529fd97ad0e2dc (patch) | |
| tree | b6fde452bf245bc5eaa23f13f677d6d9167466cb /xmake/plugins | |
| parent | a8a90d7a973e5185a0e5af6d8e86dab1ce4aa862 (diff) | |
add makefile plugin
Diffstat (limited to 'xmake/plugins')
| -rwxr-xr-x | xmake/plugins/makefile/main.lua | 54 | ||||
| -rwxr-xr-x | xmake/plugins/makefile/makefile.lua | 241 | ||||
| -rwxr-xr-x | xmake/plugins/makefile/xmake.lua | 48 |
3 files changed, 343 insertions, 0 deletions
diff --git a/xmake/plugins/makefile/main.lua b/xmake/plugins/makefile/main.lua new file mode 100755 index 000000000..7f0d330f8 --- /dev/null +++ b/xmake/plugins/makefile/main.lua @@ -0,0 +1,54 @@ +--!The Automatic Cross-platform Build Tool +-- +-- XMake is free software; you can redistribute it and/or modify +-- it under the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- +-- XMake is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public License +-- along with XMake; +-- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> +-- +-- Copyright (C) 2015 - 2016, ruki All rights reserved. +-- +-- @author ruki +-- @file main.lua +-- + +-- imports +import("core.base.option") +import("core.project.config") +import("core.project.global") +import("core.project.project") +import("core.platform.platform") +import("makefile") + +-- main +function main() + + -- check xmake.lua + if not os.isfile(project.file()) then + raise("xmake.lua not found!") + end + + -- load project configure + config.load() + + -- load platform + platform.load(config.plat()) + + -- load project + project.load() + + -- make makefile + makefile.make(option.get("output")) + + -- trace + print("create ok!") + +end diff --git a/xmake/plugins/makefile/makefile.lua b/xmake/plugins/makefile/makefile.lua new file mode 100755 index 000000000..6079ae3a0 --- /dev/null +++ b/xmake/plugins/makefile/makefile.lua @@ -0,0 +1,241 @@ +--!The Automatic Cross-platform Build Tool +-- +-- XMake is free software; you can redistribute it and/or modify +-- it under the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- +-- XMake is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public License +-- along with XMake; +-- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> +-- +-- Copyright (C) 2015 - 2016, ruki All rights reserved. +-- +-- @author ruki +-- @file makefile.lua +-- + +-- imports +import("core.tool.tool") +import("core.project.project") + +-- get log makefile +function _logfile() + + -- get it + return vformat("$(buildir)/.build.log") +end + +-- make the object for the *.[o|obj] source file +function _make_object_for_object(makefile, target, srcfile, objfile) + + -- make command + local cmd = format("xmake l cp %s %s", srcfile, objfile) + + -- make head + makefile:printf("%s:", objfile) + + -- make dependence + makefile:print(" %s", srcfile) + + -- make body + makefile:print("\t@echo inserting.$(mode) %s", srcfile) + makefile:print("\t@xmake l %$(VERBOSE) verbose \"%s\"", cmd:encode()) + makefile:print("\t@%s", cmd) + + -- make tail + makefile:print("") + +end + +-- make the object for the *.[a|lib] source file +function _make_object_for_static(makefile, target, srcfile, objfile) + + -- make command + local cmd = format("xmake l -P %s -f %s dispatcher ex extract %s %s > %s 2>&1", xmake._PROJECT_DIR, xmake._PROJECT_FILE, srcmakefile:encode(), objmakefile:encode(), makefile._LOGFILE) + + -- make head + makefile:printf("%s:", objfile) + + -- make dependence + makefile:print(" %s", srcfile) + + -- make body + makefile:print("\t@echo inserting.$(mode) %s", srcfile) + makefile:print("\t@xmake l %$(VERBOSE) verbose \"%s\"", cmd:encode()) + makefile:print("\t@xmake l rmdir %s\n", path.directory(objfile)) + makefile:print("\t@%s", cmd) + + -- make tail + makefile:print("") + +end + +-- make the object +function _make_object(makefile, target, srcfile, objfile) + + -- get the source file type + local filetype = path.extension(srcfile):lower() + + -- make the object for the *.o/obj source makefile + if filetype == ".o" or filetype == ".obj" then + return _make_object_for_object(makefile, target, srcfile, objfile) + -- make the object for the *.[a|lib] source file + elseif filetype == ".a" or filetype == ".lib" then + return _make_object_for_static(makefile, target, srcfile, objfile) + end + + -- make command + local ccache = tool.shellname("ccache") + local compiler = target:compiler(srcfile) + local cmd = compiler:command(target, srcfile, objfile, _logfile()) + if ccache then + cmd = ccache:append(cmd, " ") + end + + -- make head + makefile:printf("%s:", objfile) + + -- make dependence + makefile:print(" %s", srcfile) + + -- make body + makefile:print("\t@echo %scompiling.$(mode) %s", ifelse(ccache, "ccache ", ""), srcfile) + makefile:print("\t@xmake l %$(VERBOSE) verbose \"%s\"", cmd:encode()) + makefile:print("\t@xmake l mkdir %s", path.directory(objfile)) + makefile:print("\t@%s", cmd) + + -- make tail + makefile:print("") + +end + +-- make all objects of the given target +function _make_objects(makefile, target, srcfiles, objfiles) + + -- make all objects + local i = 1 + for _, objfile in ipairs(objfiles) do + + -- make object + _make_object(makefile, target, srcfiles[i], objfile) + + -- next + i = i + 1 + end + +end + +-- make target +function _make_target(makefile, target) + + -- make head + local targetfile = target:targetfile() + makefile:print("%s: %s", target:name(), targetfile) + makefile:printf("%s:", targetfile) + + -- make dependence for the dependent targets + for _, dep in ipairs(target:get("deps")) do + + -- add dependence + makefile:write(" " .. project.target(dep):targetfile()) + end + + -- make dependence for objects + local objfiles = target:objectfiles() + for _, objfile in ipairs(objfiles) do + makefile:write(" " .. objfile) + end + + -- make dependence end + makefile:print("") + + -- make the command + local linker = target:linker() + local cmd = linker:command(target, objfiles, targetfile, _logfile()) + + -- make the verbose info + local verbose = cmd:encode() + if verbose and #verbose > 256 then + verbose = linker:command(target, target.filename("*", "object"), targetfile) + verbose = verbose:encode() + end + + -- make body + makefile:print("\t@echo linking.$(mode) %s", path.filename(targetfile)) + makefile:print("\t@xmake l %$(VERBOSE) verbose \"%s\"", verbose) + makefile:print("\t@xmake l mkdir %s", path.directory(targetfile)) + makefile:print("\t@%s", cmd) + + -- make headers + local srcheaders, dstheaders = target:headerfiles() + if srcheaders and dstheaders then + local i = 1 + for _, srcheader in ipairs(srcheaders) do + local dstheader = dstheaders[i] + if dstheader then + makefile:print("\t@xmake l cp %s %s", srcheader, dstheader) + end + i = i + 1 + end + end + + -- make tail + makefile:print("") + + -- make objects for this target + _make_objects(makefile, target, target:sourcefiles(), objfiles) + +end + +-- make all +function _make_all(makefile) + + -- make all first + local all = "" + for targetname, _ in pairs(project.targets()) do + -- append the target name to all + all = all .. " " .. targetname + end + makefile:printf("all: %s\n\n", all) + makefile:printf(".PHONY: all %s\n\n", all) + + -- make it for all targets + for _, target in pairs(project.targets()) do + + -- make target + _make_target(makefile, target) + + -- append the target name to all + all = all .. " " .. target:name() + end + +end + +-- make +function make(outputfile) + + -- enter project directory + os.cd(project.directory()) + + -- remove the log makefile first + os.rm(_logfile()) + + -- open the makefile + local makefile = io.open(outputfile, "w") + + -- make all + _make_all(makefile) + + -- close the makefile + makefile:close() + + -- leave project directory + os.cd("-") + +end diff --git a/xmake/plugins/makefile/xmake.lua b/xmake/plugins/makefile/xmake.lua new file mode 100755 index 000000000..9fd0c43bb --- /dev/null +++ b/xmake/plugins/makefile/xmake.lua @@ -0,0 +1,48 @@ +--!The Automatic Cross-platform Build Tool +-- +-- XMake is free software; you can redistribute it and/or modify +-- it under the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- +-- XMake is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public License +-- along with XMake; +-- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> +-- +-- Copyright (C) 2015 - 2016, ruki All rights reserved. +-- +-- @author ruki +-- @file xmake.lua +-- + +-- define task +task("makefile") + + -- set category + set_task_category("plugin") + + -- on run + on_task_run("main") + + -- set menu + set_task_menu({ + -- usage + usage = "xmake makefile [options] [target]" + + -- description + , description = "Create the project makefile." + + -- options + , options = + { + {'o', "output", "kv", "makefile", "Set the output file." } + } + }) + + + |
