diff options
Diffstat (limited to 'xmake/scripts/base')
| -rw-r--r-- | xmake/scripts/base/makefile.lua | 101 | ||||
| -rw-r--r-- | xmake/scripts/base/rule.lua | 151 |
2 files changed, 155 insertions, 97 deletions
diff --git a/xmake/scripts/base/makefile.lua b/xmake/scripts/base/makefile.lua index b39da2f86..68ff484e1 100644 --- a/xmake/scripts/base/makefile.lua +++ b/xmake/scripts/base/makefile.lua @@ -26,106 +26,13 @@ local makefile = makefile or {} -- load modules local io = require("base/io") local os = require("base/os") +local rule = require("base/rule") local path = require("base/path") local utils = require("base/utils") local config = require("base/config") local project = require("base/project") local platform = require("platform/platform") --- get the source files from the given target -function makefile._srcfiles(target) - - -- check - assert(target) - - -- no files? - if not target.files then - return {} - end - - -- wrap files first - local target_files = utils.wrap(target.files) - - -- match files - local i = 1 - local srcfiles = {} - for _, target_file in ipairs(target_files) do - - -- match source files - local files = os.match(target_file) - - -- process source files - for _, file in ipairs(files) do - - -- convert to the relative path - if path.is_absolute(file) then - file = path.relative(file, xmake._PROJECT_DIR) - end - - -- save it - srcfiles[i] = file - i = i + 1 - - end - end - - -- remove repeat files - srcfiles = utils.unique(srcfiles) - - -- ok? - return srcfiles -end - --- get object files for the given source files -function makefile._objfiles(target, name, srcfiles) - - -- check - assert(target and name and srcfiles) - - -- the build directory - local buildir = config.get("buildir") - assert(buildir) - - -- the object directory - local objectdir = target.objectdir or buildir .. "/.objs" - assert(objectdir and type(objectdir) == "string") - - -- make object files - local i = 1 - local objfiles = {} - for _, srcfile in ipairs(srcfiles) do - - -- make object file - local objfile = string.format("%s/%s/%s/%s", objectdir, name, path.directory(srcfile), platform.filename(path.basename(srcfile), "object")) - - -- save it - objfiles[i] = path.translate(objfile) - i = i + 1 - - end - - -- ok? - return objfiles -end - --- get target file for the given target name and kind -function makefile._targetfile(name, target) - - -- check - assert(name and target and target.kind) - - -- the target directory - local targetdir = target.targetdir or config.get("buildir") - assert(targetdir and type(targetdir) == "string") - - -- the target file name - local filename = platform.filename(name, target.kind) - assert(filename) - - -- make the target file path - return targetdir .. "/" .. filename -end - -- make the object to the makefile function makefile._make_object(file, target, srcfile, objfile) @@ -188,12 +95,12 @@ function makefile._make_target(file, name, target) assert(file and name and target and target.kind) -- get source and object files - local srcfiles = makefile._srcfiles(target) - local objfiles = makefile._objfiles(target, name, srcfiles) + local srcfiles = rule.sourcefiles(target) + local objfiles = rule.objectfiles(name, target, srcfiles) assert(srcfiles and objfiles) -- get target file - local targetfile = makefile._targetfile(name, target) + local targetfile = rule.targetfile(name, target) assert(targetfile) -- the linker diff --git a/xmake/scripts/base/rule.lua b/xmake/scripts/base/rule.lua new file mode 100644 index 000000000..09d1f6b7f --- /dev/null +++ b/xmake/scripts/base/rule.lua @@ -0,0 +1,151 @@ +--!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 rule.lua +-- + +-- define module: rule +local rule = rule or {} + +-- load modules +local os = require("base/os") +local path = require("base/path") +local utils = require("base/utils") +local config = require("base/config") +local project = require("base/project") +local platform = require("platform/platform") + +-- get target file for the given target +function rule.targetfile(target_name, target, buildir) + + -- check + assert(target_name and target and target.kind) + + -- the target directory + local targetdir = target.targetdir or buildir or config.get("buildir") + assert(targetdir and type(targetdir) == "string") + + -- the target file name + local filename = platform.filename(target_name, target.kind) + assert(filename) + + -- make the target file path + return targetdir .. "/" .. filename +end + +-- get object files for the given source files +function rule.objectdir(target_name, target, buildir) + + -- check + assert(target_name and target) + + -- the object directory + local objectdir = target.objectdir + if not objectdir then + + -- the build directory + if not buildir then + buildir = config.get("buildir") + end + assert(buildir) + + -- make the default object directory + objectdir = buildir .. "/.objs" + end + + -- ok? + return objectdir +end + +-- get object files for the given source files +function rule.objectfiles(target_name, target, sourcefiles, buildir) + + -- check + assert(target_name and target and sourcefiles) + + -- the object directory + local objectdir = rule.objectdir(target_name, target, buildir) + assert(objectdir and type(objectdir) == "string") + + -- make object files + local i = 1 + local objectfiles = {} + for _, sourcefile in ipairs(sourcefiles) do + + -- make object file + local objectfile = string.format("%s/%s/%s/%s", objectdir, target_name, path.directory(sourcefile), platform.filename(path.basename(sourcefile), "object")) + + -- save it + objectfiles[i] = path.translate(objectfile) + i = i + 1 + + end + + -- ok? + return objectfiles +end + +-- get the source files from the given target +function rule.sourcefiles(target) + + -- check + assert(target) + + -- no files? + if not target.files then + return {} + end + + -- wrap files first + local targetfiles = utils.wrap(target.files) + + -- match files + local i = 1 + local sourcefiles = {} + for _, targetfile in ipairs(targetfiles) do + + -- match source files + local files = os.match(targetfile) + + -- process source files + for _, file in ipairs(files) do + + -- convert to the relative path + if path.is_absolute(file) then + file = path.relative(file, xmake._PROJECT_DIR) + end + + -- save it + sourcefiles[i] = file + i = i + 1 + + end + end + + -- remove repeat files + sourcefiles = utils.unique(sourcefiles) + + -- ok? + return sourcefiles +end + + + +-- return module: rule +return rule |
