summaryrefslogtreecommitdiff
path: root/xmake/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'xmake/scripts')
-rw-r--r--xmake/scripts/action/_clean.lua90
-rw-r--r--xmake/scripts/base/makefile.lua101
-rw-r--r--xmake/scripts/base/rule.lua151
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