diff options
Diffstat (limited to 'xmake/core/base/clean.lua')
| -rw-r--r-- | xmake/core/base/clean.lua | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/xmake/core/base/clean.lua b/xmake/core/base/clean.lua new file mode 100644 index 000000000..9fbb3258a --- /dev/null +++ b/xmake/core/base/clean.lua @@ -0,0 +1,192 @@ +--!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 clean.lua +-- + +-- define module: clean +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 files or directories +function clean._remove(filedirs) + + -- empty? + if not filedirs then return true end + + -- wrap it first + filedirs = utils.wrap(filedirs) + for _, filedir in ipairs(filedirs) do + + -- 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 + + -- ok + return true +end + +-- remove the given target name +function clean._remove_target(target_name, target, mode, 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 + + -- not only remove target file? + if mode ~= "targets" then + + -- remove the object files + if not clean._remove(rule.objectfiles(target_name, target, rule.sourcefiles(target), buildir)) then + return false + end + + -- remove the header files + local _, dstheaders = rule.headerfiles(target) + if not clean._remove(dstheaders) then + return false + end + + -- remove the config.h file + if mode == "all" and target.config_h then + + -- translate file path + local config_h = nil + if not path.is_absolute(target.config_h) then + config_h = path.absolute(target.config_h, xmake._PROJECT_DIR) + else + config_h = path.translate(target.config_h) + end + if not clean._remove(config_h) then + return false + end + end + end + + -- ok + return true +end + +-- remove the given target and all dependent targets +function clean._remove_target_and_deps(target_name, mode, buildir) + + -- 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, mode, buildir) then + return false + end + + -- exists the dependent targets? + if target.deps then + local deps = utils.wrap(target.deps) + for _, dep in ipairs(deps) do + if not clean._remove_target_and_deps(dep, mode, buildir) then return false end + end + end + + -- ok + return true +end + +-- remove the target and object files for the given target +-- +-- mode: +-- all +-- build +-- targets +-- +function clean.remove(target_name, mode) + + -- the build directory + local buildir = config.get("buildir") + assert(buildir and mode) + + -- the target name + if target_name and target_name ~= "all" then + -- remove target + if not clean._remove_target_and_deps(target_name, mode, buildir) then return false end + else + + -- the targets + local targets = project.targets() + assert(targets) + + -- remove targets + for target_name, target in pairs(targets) do + if not clean._remove_target(target_name, target, mode, buildir) then return false end + end + end + + -- remove all + if mode == "all" then + + -- remove makefile + if not clean._remove(rule.makefile()) then + return false + end + + -- remove the configure directory + if not clean._remove(config.directory()) then + return false + end + + -- remove the log file + if not clean._remove(rule.logfile()) then + return false + end + + -- remove build directory if be empty + local buildir = config.get("buildir") + if os.isdir(buildir) then + os.rm(buildir, true) + end + + end + + -- ok + return true +end + +-- return module: clean +return clean |
