diff options
| author | ruki <[email protected]> | 2015-06-04 15:23:45 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2015-06-04 15:23:45 +0800 |
| commit | 83295bd3a1b27f844759aeadbbdc23f51e2f2d89 (patch) | |
| tree | e4d371b95497d791b07af5f0224aea40dfe647dd /xmake/scripts/base | |
| parent | 740fa0e8d4948a7261bcbb19fe7c3ac16f1df041 (diff) | |
move clang compiler and linker to tools
Diffstat (limited to 'xmake/scripts/base')
| -rw-r--r-- | xmake/scripts/base/compiler.lua | 197 | ||||
| -rw-r--r-- | xmake/scripts/base/linker.lua | 141 | ||||
| -rw-r--r-- | xmake/scripts/base/makefile.lua | 15 |
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))) |
