summaryrefslogtreecommitdiff
path: root/xmake/scripts/base
diff options
context:
space:
mode:
authorruki <[email protected]>2015-06-04 15:23:45 +0800
committerruki <[email protected]>2015-06-04 15:23:45 +0800
commit83295bd3a1b27f844759aeadbbdc23f51e2f2d89 (patch)
treee4d371b95497d791b07af5f0224aea40dfe647dd /xmake/scripts/base
parent740fa0e8d4948a7261bcbb19fe7c3ac16f1df041 (diff)
move clang compiler and linker to tools
Diffstat (limited to 'xmake/scripts/base')
-rw-r--r--xmake/scripts/base/compiler.lua197
-rw-r--r--xmake/scripts/base/linker.lua141
-rw-r--r--xmake/scripts/base/makefile.lua15
3 files changed, 346 insertions, 7 deletions
diff --git a/xmake/scripts/base/compiler.lua b/xmake/scripts/base/compiler.lua
new file mode 100644
index 000000000..101347c19
--- /dev/null
+++ b/xmake/scripts/base/compiler.lua
@@ -0,0 +1,197 @@
+--!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) 2009 - 2015, ruki All rights reserved.
+--
+-- @author ruki
+-- @file compiler.lua
+--
+
+-- define module: compiler
+local compiler = compiler or {}
+
+-- load modules
+local path = require("base/path")
+local utils = require("base/utils")
+local string = require("base/string")
+local config = require("base/config")
+local tools = require("tools/tools")
+
+-- map gcc flags to the given compiler flags
+function compiler._mapflags(module, flags)
+
+ -- check
+ assert(module and flags)
+
+ -- need not map flags? return it directly
+ if not module.mapflag then
+ return flags
+ end
+
+ -- map flags
+ local flags_mapped = {}
+ for _, flag in pairs(flags) do
+ -- map it
+ local flag_mapped = module.flag_map(flag)
+ if flag_mapped then
+ table.insert(flags_mapped, flag_mapped)
+ end
+ end
+
+ -- ok?
+ return flag_mapped
+end
+
+-- get the compiler name from the source file type
+function compiler._name(srcfile)
+
+ -- get the source file type
+ local filetype = path.extension(srcfile)
+ if not filetype then
+ return nil
+ end
+
+ -- get the lower file type
+ filetype = filetype:lower()
+
+ -- get the compiler name
+ local name = nil
+ if filetype == ".c" then name = "cc"
+ elseif filetype == ".cpp" or filetype == ".cc" then name = "cxx"
+ elseif filetype == ".m" then name = "mm"
+ elseif filetype == ".mm" then name = "mxx"
+ elseif filetype == ".s" or filetype == ".asm" then name = "as"
+ end
+
+ -- ok
+ return name
+end
+
+-- get the compiler from the given source file
+function compiler.get(srcfile)
+
+ -- get the compiler name
+ local name = compiler._name(srcfile)
+ if not name then
+ return
+ end
+
+ -- get compiler from the source file type
+ local module = tools.get(name)
+ if module then
+
+ -- invalid compiler
+ if not module.command_compile then
+ return
+ end
+
+ -- save name
+ module._NAME = name
+ end
+
+ -- ok?
+ return module
+end
+
+-- make the compile command
+function compiler.make(module, target, srcfile, objfile)
+
+ -- check
+ assert(module and target)
+
+ -- the compiler name
+ local name = module._NAME
+ assert(name)
+
+ -- the flag names
+ local flag_names = nil
+ if name == "cc" then flag_names = { "cxflags", "cflags" }
+ elseif name == "cxx" then flag_names = { "cxflags", "cxxflags" }
+ elseif name == "mm" then flag_names = { "mxflags", "mflags" }
+ elseif name == "mxx" then flag_names = { "mxflags", "mxxflags" }
+ elseif name == "as" then flag_names = { "asflags" }
+ -- error
+ utils.error("unknown compiler: %s", name)
+ return
+ end
+
+ -- get the common flags from the current compiler
+ local flags_common = ""
+ for _, flag_name in ipairs(flag_names) do
+ flags_common = flags_common:append(module[flag_name], " ")
+ end
+
+ -- get the target flags from the current project
+ local flags_target = ""
+ for _, flag_name in ipairs(flag_names) do
+
+ -- get flags
+ local flags = table.concat(compiler._mapflags(module, utils.wrap(target[flag_name])), " ")
+
+ -- trim the spaces
+ flags = flags:trim()
+
+ -- append flags
+ if flags and #flags ~= 0 then
+ flags_target = flags_target:append(flags, " ")
+ end
+ end
+
+ -- get the includedirs flags from the current project
+ if module._make_includedir then
+ local includedirs = utils.wrap(target.includedirs)
+ for _, includedir in ipairs(includedirs) do
+ flags_target = flags_target:append(module.flag_includedir(includedir), " ")
+ end
+ end
+
+ -- get the defines flags from the current project
+ if module._make_define then
+ local defines = utils.wrap(target.defines)
+ for _, define in ipairs(defines) do
+ flags_target = flags_target:append(module.flag_define(define), " ")
+ end
+ end
+
+ -- get the config flags
+ local flags_config = ""
+ for _, flag_name in ipairs(flag_names) do
+
+ -- get flags
+ local flags = table.concat(compiler._mapflags(module, utils.wrap(config.get(flag_name))), " ")
+
+ -- trim the spaces
+ flags = flags:trim()
+
+ -- append flags
+ if flags and #flags ~= 0 then
+ flags_config = flags_config:append(flags, " ")
+ end
+ end
+
+ -- make the flags string
+ local flags = ""
+ flags = flags:append(flags_common, " ")
+ flags = flags:append(flags_target, " ")
+ flags = flags:append(flags_config, " ")
+ flags = flags:trim()
+
+ -- make the compile command
+ return module.command_compile(srcfile, objfile, flags)
+end
+
+-- return module: compiler
+return compiler
diff --git a/xmake/scripts/base/linker.lua b/xmake/scripts/base/linker.lua
new file mode 100644
index 000000000..2516bbd29
--- /dev/null
+++ b/xmake/scripts/base/linker.lua
@@ -0,0 +1,141 @@
+--!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) 2009 - 2015, ruki All rights reserved.
+--
+-- @author ruki
+-- @file linker.lua
+--
+
+-- define module: linker
+local linker = linker or {}
+
+-- load modules
+local utils = require("base/utils")
+local string = require("base/string")
+local config = require("base/config")
+local tools = require("tools/tools")
+
+-- map gcc flags to the given linker flags
+function linker._mapflags(module, flags)
+
+ -- check
+ assert(module and flags);
+
+ -- need not map flags? return it directly
+ if not module.mapflag then
+ return flags
+ end
+
+ -- map flags
+ local flags_mapped = {}
+ for _, flag in pairs(flags) do
+ -- map it
+ local flag_mapped = module.flag_map(flag)
+ if flag_mapped then
+ table.insert(flags_mapped, flag_mapped)
+ end
+ end
+
+ -- ok?
+ return flags_mapped
+end
+
+-- make the link command
+function linker.make(module, target, objfiles, targetfile)
+
+ -- check
+ assert(module and target)
+
+ -- the target kind
+ local kind = target.kind or ""
+
+ -- the flag name
+ local flag_name = nil
+ if kind == "binary" then flag_name = "ldflags"
+ elseif kind == "static" then flag_name = "arflags"
+ elseif kind == "shared" then flag_name = "shflags"
+ else
+ -- error
+ utils.error("unknown type for linker: %s", kind)
+ return
+ end
+
+ -- get the common flags from the current linker
+ local flags_common = module[flag_name] or ""
+
+ -- get the target flags from the current project
+ local flags_target = table.concat(linker._mapflags(module, utils.wrap(target[flag_name])), " ")
+ assert(flags_target)
+
+ -- get the linkdirs flags from the current project
+ if module._make_linkdir then
+ local linkdirs = utils.wrap(target.linkdirs)
+ for _, linkdir in ipairs(linkdirs) do
+ flags_target = flags_target:append(module.flag_linkdir(linkdir), " ")
+ end
+ end
+
+ -- get the links flags from the current project
+ if module._make_link then
+ local links = utils.wrap(target.links)
+ for _, link in ipairs(links) do
+ flags_target = flags_target:append(module.flag_link(link), " ")
+ end
+ end
+
+ -- get the config flags
+ local flags_config = table.concat(linker._mapflags(module, utils.wrap(config.get(flag_name))), " ")
+ assert(flags_config)
+
+ -- make the flags string
+ local flags = ""
+ flags = flags:append(flags_common, " ")
+ flags = flags:append(flags_target, " ")
+ flags = flags:append(flags_config, " ")
+ flags = flags:trim()
+
+ -- make the link command
+ return module.command_link(table.concat(objfiles, " "), targetfile, flags)
+end
+
+-- get the linker from the given kind
+function linker.get(kind)
+
+ -- check
+ assert(kind)
+
+ -- get the linker name from the kind
+ local name = nil
+ if kind == "binary" then name = "ld"
+ elseif kind == "static" then name = "ar"
+ elseif kind == "shared" then name = "sh"
+ else return end
+
+ -- get it
+ local module = tools.get(name)
+
+ -- invalid linker?
+ if module and not module.command_link then
+ return
+ end
+
+ -- ok?
+ return module
+end
+
+-- return module: linker
+return linker
diff --git a/xmake/scripts/base/makefile.lua b/xmake/scripts/base/makefile.lua
index 17ec4aeda..c3af02d05 100644
--- a/xmake/scripts/base/makefile.lua
+++ b/xmake/scripts/base/makefile.lua
@@ -31,8 +31,9 @@ local path = require("base/path")
local utils = require("base/utils")
local config = require("base/config")
local project = require("base/project")
+local linker = require("base/linker")
+local compiler = require("base/compiler")
local tools = require("tools/tools")
-local platform = require("platform/platform")
-- make the object to the makefile
function makefile._make_object(file, target, srcfile, objfile)
@@ -40,8 +41,8 @@ function makefile._make_object(file, target, srcfile, objfile)
-- check
assert(file and target and srcfile and objfile)
- -- get the compiler and filetype
- local c, filetype = platform.compiler(srcfile);
+ -- get the compiler
+ local c = compiler.get(srcfile);
if not c then
-- error
utils.error("unknown source file: %s", srcfile)
@@ -55,7 +56,7 @@ function makefile._make_object(file, target, srcfile, objfile)
file:write(string.format(" %s\n", srcfile))
-- make body
- local cmd = c:make(target, filetype, srcfile, objfile)
+ local cmd = compiler.make(c, target, srcfile, objfile)
file:write(string.format("\t@echo [%s]: compiling %s\n", config.get("mode"), srcfile))
file:write(string.format("\t@xmake l $(VERBOSE) verbose \"%s\"\n", cmd:gsub("%s", "%%20")))
file:write(string.format("\t@xmake l mkdir %s\n", path.directory(objfile)))
@@ -106,8 +107,8 @@ function makefile._make_target(file, name, target)
local targetfile = rule.targetfile(name, target)
assert(targetfile)
- -- the linker
- local l = platform.linker(target.kind)
+ -- get the linker from the given kind
+ local l = linker.get(target.kind)
assert(l)
-- make head
@@ -130,7 +131,7 @@ function makefile._make_target(file, name, target)
file:write("\n")
-- make body
- local cmd = l:make(target, objfiles, targetfile)
+ local cmd = linker.make(l, target, objfiles, targetfile)
file:write(string.format("\t@echo [%s]: linking %s\n", config.get("mode"), path.filename(targetfile)))
file:write(string.format("\t@xmake l $(VERBOSE) verbose \"%s\"\n", cmd:gsub("%s", "%%20")))
file:write(string.format("\t@xmake l mkdir %s\n", path.directory(targetfile)))