From 5b2e0333389158094a2a8bb796e13f99fac422e7 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 31 May 2016 20:45:24 +0800 Subject: add project plugin --- xmake/plugins/makefile/main.lua | 54 --------- xmake/plugins/makefile/makefile.lua | 216 ------------------------------------ xmake/plugins/makefile/xmake.lua | 48 -------- xmake/plugins/project/main.lua | 75 +++++++++++++ xmake/plugins/project/makefile.lua | 216 ++++++++++++++++++++++++++++++++++++ xmake/plugins/project/xmake.lua | 50 +++++++++ 6 files changed, 341 insertions(+), 318 deletions(-) delete mode 100755 xmake/plugins/makefile/main.lua delete mode 100755 xmake/plugins/makefile/makefile.lua delete mode 100755 xmake/plugins/makefile/xmake.lua create mode 100755 xmake/plugins/project/main.lua create mode 100755 xmake/plugins/project/makefile.lua create mode 100755 xmake/plugins/project/xmake.lua diff --git a/xmake/plugins/makefile/main.lua b/xmake/plugins/makefile/main.lua deleted file mode 100755 index 7f0d330f8..000000000 --- a/xmake/plugins/makefile/main.lua +++ /dev/null @@ -1,54 +0,0 @@ ---!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 http://www.gnu.org/licenses/ --- --- 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 deleted file mode 100755 index 2fe7ffd93..000000000 --- a/xmake/plugins/makefile/makefile.lua +++ /dev/null @@ -1,216 +0,0 @@ ---!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 http://www.gnu.org/licenses/ --- --- Copyright (C) 2015 - 2016, ruki All rights reserved. --- --- @author ruki --- @file makefile.lua --- - --- imports -import("core.tool.tool") -import("core.tool.linker") -import("core.tool.compiler") -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) - - -- not supported - raise("source file: %s not supported!", srcfile) -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 command = compiler.command(target, srcfile, objfile) - if ccache then - command = ccache:append(command, " ") - 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\"", command:encode()) - makefile:print("\t@xmake l mkdir %s", path.directory(objfile)) - makefile:print("\t@%s > %s 2>&1", command, _logfile()) - - -- 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 command = linker.command(target) - - -- make body - makefile:print("\t@echo linking.$(mode) %s", path.filename(targetfile)) - makefile:print("\t@xmake l %$(VERBOSE) verbose \"%s\"", command:encode()) - makefile:print("\t@xmake l mkdir %s", path.directory(targetfile)) - makefile:print("\t@%s > %s 2>&1", command, _logfile()) - - -- 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 deleted file mode 100755 index a447057e6..000000000 --- a/xmake/plugins/makefile/xmake.lua +++ /dev/null @@ -1,48 +0,0 @@ ---!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 http://www.gnu.org/licenses/ --- --- Copyright (C) 2015 - 2016, ruki All rights reserved. --- --- @author ruki --- @file xmake.lua --- - --- define task -task("makefile") - - -- set category - set_category("plugin") - - -- on run - on_run("main") - - -- set menu - set_menu({ - -- usage - usage = "xmake makefile [options] [target]" - - -- description - , description = "Create the project makefile." - - -- options - , options = - { - {'o', "output", "kv", "makefile", "Set the output file." } - } - }) - - - diff --git a/xmake/plugins/project/main.lua b/xmake/plugins/project/main.lua new file mode 100755 index 000000000..7d5362c9f --- /dev/null +++ b/xmake/plugins/project/main.lua @@ -0,0 +1,75 @@ +--!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 http://www.gnu.org/licenses/ +-- +-- 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") + +-- make makefile +function _make_makefile(outputdir) + + -- make makefile + makefile.make(path.join(outputdir, "makefile")) +end + +-- make project +function _make(kind) + + -- the maps + local maps = + { + makefile = _make_makefile + } + assert(maps[kind], "the project kind(%s) is not supported!", kind) + + -- make it + maps[kind](option.get("outputdir")) +end + +-- 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 project + _make(option.get("kind")) + + -- trace + print("create ok!") + +end diff --git a/xmake/plugins/project/makefile.lua b/xmake/plugins/project/makefile.lua new file mode 100755 index 000000000..2fe7ffd93 --- /dev/null +++ b/xmake/plugins/project/makefile.lua @@ -0,0 +1,216 @@ +--!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 http://www.gnu.org/licenses/ +-- +-- Copyright (C) 2015 - 2016, ruki All rights reserved. +-- +-- @author ruki +-- @file makefile.lua +-- + +-- imports +import("core.tool.tool") +import("core.tool.linker") +import("core.tool.compiler") +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) + + -- not supported + raise("source file: %s not supported!", srcfile) +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 command = compiler.command(target, srcfile, objfile) + if ccache then + command = ccache:append(command, " ") + 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\"", command:encode()) + makefile:print("\t@xmake l mkdir %s", path.directory(objfile)) + makefile:print("\t@%s > %s 2>&1", command, _logfile()) + + -- 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 command = linker.command(target) + + -- make body + makefile:print("\t@echo linking.$(mode) %s", path.filename(targetfile)) + makefile:print("\t@xmake l %$(VERBOSE) verbose \"%s\"", command:encode()) + makefile:print("\t@xmake l mkdir %s", path.directory(targetfile)) + makefile:print("\t@%s > %s 2>&1", command, _logfile()) + + -- 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/project/xmake.lua b/xmake/plugins/project/xmake.lua new file mode 100755 index 000000000..e489bce21 --- /dev/null +++ b/xmake/plugins/project/xmake.lua @@ -0,0 +1,50 @@ +--!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 http://www.gnu.org/licenses/ +-- +-- Copyright (C) 2015 - 2016, ruki All rights reserved. +-- +-- @author ruki +-- @file xmake.lua +-- + +-- define task +task("project") + + -- set category + set_category("plugin") + + -- on run + on_run("main") + + -- set menu + set_menu({ + -- usage + usage = "xmake project [options] [target]" + + -- description + , description = "Create the project file." + + -- options + , options = + { + {'k', "kind", "kv", "makefile", "Set the project kind." + , " - makefile" } + , {nil, "outputdir", "v", ".", "Set the output directory." } + } + }) + + + -- cgit v1.3.1