summaryrefslogtreecommitdiff
path: root/xmake/plugins/project/makefile/makefile.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2016-08-06 13:02:28 +0800
committerruki <[email protected]>2016-08-06 13:02:28 +0800
commitce3b9ada065d09d2d771061b20f07fc1d661c648 (patch)
tree9add68684c5e7383f69db71d1903ee9352dd7537 /xmake/plugins/project/makefile/makefile.lua
parente4cb396b6c4b33932d5f953b9cf20fbf22231ce4 (diff)
add vs2005 and vs2008 empty plugin
Diffstat (limited to 'xmake/plugins/project/makefile/makefile.lua')
-rwxr-xr-xxmake/plugins/project/makefile/makefile.lua239
1 files changed, 239 insertions, 0 deletions
diff --git a/xmake/plugins/project/makefile/makefile.lua b/xmake/plugins/project/makefile/makefile.lua
new file mode 100755
index 000000000..38837490c
--- /dev/null
+++ b/xmake/plugins/project/makefile/makefile.lua
@@ -0,0 +1,239 @@
+--!The Make-like Build Utility based on Lua
+--
+-- 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.tool.linker")
+import("core.tool.archiver")
+import("core.tool.compiler")
+import("core.project.config")
+import("core.project.project")
+
+-- get log makefile
+function _logfile()
+
+ -- get it
+ return vformat("$(buildir)/.build.log")
+end
+
+-- mkdir directory
+function _mkdir(makefile, dir)
+
+ if config.get("plat") == "windows" then
+ makefile:print("\t-@mkdir %s > /null 2>&1", dir)
+ else
+ makefile:print("\t@mkdir -p %s", dir)
+ end
+end
+
+-- copy file
+function _cp(makefile, srcfile, dstfile)
+
+ -- ensure the destinate directory
+ _mkdir(makefile, path.directory(dstfile))
+
+ -- copy file
+ if config.get("plat") == "windows" then
+ makefile:print("\t@copy /Y %s %s > /null 2>&1", srcfile, dstfile)
+ else
+ makefile:print("\t@cp %s %s", srcfile, dstfile)
+ end
+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@%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 command = compiler.compcmd(srcfile, objfile, target)
+
+ -- make head
+ makefile:printf("%s:", objfile)
+
+ -- make dependence
+ makefile:print(" %s", srcfile)
+
+ -- make body
+ makefile:print("\t@echo %scompiling.$(mode) %s", ifelse(config.get("ccache"), "ccache ", ""), srcfile)
+ _mkdir(makefile, 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 = nil
+ if target:get("kind") == "static" then
+ command = archiver.archivecmd(target:objectfiles(), targetfile, target)
+ else
+ command = linker.linkcmd(target:objectfiles(), targetfile, target)
+ end
+
+ -- make body
+ makefile:print("\t@echo linking.$(mode) %s", path.filename(targetfile))
+ _mkdir(makefile, 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
+ _cp(makefile, 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(outputdir)
+
+ -- enter project directory
+ local olddir = os.cd(project.directory())
+
+ -- remove the log makefile first
+ os.rm(_logfile())
+
+ -- open the makefile
+ local makefile = io.open(path.join(outputdir, "makefile"), "w")
+
+ -- make all
+ _make_all(makefile)
+
+ -- close the makefile
+ makefile:close()
+
+ -- leave project directory
+ os.cd(olddir)
+end