summaryrefslogtreecommitdiff
path: root/xmake/scripts/base/rule.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2015-06-02 13:13:04 +0800
committerruki <[email protected]>2015-06-02 13:13:04 +0800
commit22b67ea8ae2ce6cc7ae67fb5f7aa66df950eaec5 (patch)
tree899834402483f3498a74e0d0376c97fee2ebd99c /xmake/scripts/base/rule.lua
parent1c87d48b17adb5a43076b2a7725582703a49701a (diff)
add rule and reimpl clean
Diffstat (limited to 'xmake/scripts/base/rule.lua')
-rw-r--r--xmake/scripts/base/rule.lua151
1 files changed, 151 insertions, 0 deletions
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