diff options
| author | ruki <[email protected]> | 2015-06-02 13:13:04 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2015-06-02 13:13:04 +0800 |
| commit | 22b67ea8ae2ce6cc7ae67fb5f7aa66df950eaec5 (patch) | |
| tree | 899834402483f3498a74e0d0376c97fee2ebd99c | |
| parent | 1c87d48b17adb5a43076b2a7725582703a49701a (diff) | |
add rule and reimpl clean
| -rw-r--r-- | xmake/scripts/action/_clean.lua | 90 | ||||
| -rw-r--r-- | xmake/scripts/base/makefile.lua | 101 | ||||
| -rw-r--r-- | xmake/scripts/base/rule.lua | 151 |
3 files changed, 216 insertions, 126 deletions
diff --git a/xmake/scripts/action/_clean.lua b/xmake/scripts/action/_clean.lua index e67d1ccd3..8c00e7b88 100644 --- a/xmake/scripts/action/_clean.lua +++ b/xmake/scripts/action/_clean.lua @@ -25,53 +25,83 @@ local _clean = _clean or {} -- load modules local os = require("base/os") +local rule = require("base/rule") local utils = require("base/utils") local config = require("base/config") local project = require("base/project") --- remove the given target -function _clean._rm_target(buildir, target) +-- remove the given files or directories +function _clean._remove(filedirs) -- check - assert(buildir and target) + assert(filedirs) + + -- wrap it first + filedirs = utils.wrap(filedirs) + for _, filedir in ipairs(filedirs) do - -- the file - local file = string.format("%s/%s", buildir, target) - if not os.exists(file) then - return true + -- exists? remove it + if os.exists(filedir) then + -- remove it + local ok, errors = os.rm(filedir) + if not ok then + -- error + utils.error(errors) + return false + end + end end - -- clean target - local ok, errors = os.rm(file) - if not ok then - -- error - utils.error(errors) + -- ok + return true +end + +-- remove the given target_name +function _clean._remove_target(target_name, target, buildir) + + -- check + assert(target_name and target) + + -- remove the target file + if not _clean._remove(rule.targetfile(target_name, target, buildir)) then + return false + end + + -- remove the object files + if not _clean._remove(rule.objectfiles(target_name, target, rule.sourcefiles(target), buildir)) then return false - end + end -- ok return true end -- remove the given target and all dependent targets -function _clean._rm_target_and_deps(buildir, target) +function _clean._remove_target_and_deps(target_name, buildir) - -- remove the target - if not _clean._rm_target(buildir, target) then - return false - end - -- the targets local targets = project.targets() assert(targets) + -- the target + local target = targets[target_name] + assert(target) + + -- remove the target + if not _clean._remove_target(target_name, target, buildir) then + return false + end + -- exists the dependent targets? - if targets[target] and targets[target].deps then - local deps = utils.wrap(targets[target].deps) + if target.deps then + local deps = utils.wrap(target.deps) for _, dep in ipairs(deps) do - if not _clean._rm_target_and_deps(buildir, dep) then return false end + if not _clean._remove_target_and_deps(dep, buildir) then return false end end end + + -- ok + return true end -- done the given config @@ -85,18 +115,20 @@ function _clean.done() local buildir = config.get("buildir") assert(buildir) - -- the target - local target = options.target - if target and target ~= "all" then - if not _clean._rm_target_and_deps(buildir, target) then return false end + -- the target name + local target_name = options.target + if target_name and target_name ~= "all" then + -- remove target + if not _clean._remove_target_and_deps(target_name, buildir) then return false end else + -- the targets local targets = project.targets() assert(targets) - -- clean targets - for target, _ in pairs(targets) do - if not _clean._rm_target(buildir, target) then return false end + -- remove targets + for target_name, target in pairs(targets) do + if not _clean._remove_target(target_name, target, buildir) then return false end end end 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 |
