summaryrefslogtreecommitdiff
path: root/xmake/scripts
diff options
context:
space:
mode:
authorruki <[email protected]>2015-06-02 15:39:44 +0800
committerruki <[email protected]>2015-06-02 15:39:44 +0800
commitf639faef588a95b28ec02c781dee2a581f7a7992 (patch)
treefb50924f053cf26b9ad53c46c440aceeb82f8e45 /xmake/scripts
parent6ed13d09ec37896b0176e90ddaa99c90ecaccd1d (diff)
impl rebuild and update
Diffstat (limited to 'xmake/scripts')
-rw-r--r--xmake/scripts/action/_build.lua19
-rw-r--r--xmake/scripts/action/_clean.lua105
-rw-r--r--xmake/scripts/base/clean.lua138
-rw-r--r--xmake/scripts/base/config.lua2
-rw-r--r--xmake/scripts/platform/iphoneos/_iphoneos.lua13
-rw-r--r--xmake/scripts/platform/iphonesimulator/_iphonesimulator.lua15
6 files changed, 185 insertions, 107 deletions
diff --git a/xmake/scripts/action/_build.lua b/xmake/scripts/action/_build.lua
index cd80616f1..1a821e406 100644
--- a/xmake/scripts/action/_build.lua
+++ b/xmake/scripts/action/_build.lua
@@ -25,19 +25,28 @@ local _build = _build or {}
-- load modules
local utils = require("base/utils")
+local clean = require("base/clean")
local config = require("base/config")
local makefile = require("base/makefile")
-
+
-- done the given config
function _build.done()
- -- TODO
- -- rebuild, update
+ -- the target name
+ local target_name = config.get("target")
+
+ -- rebuild it?
+ if config.get("rebuild") then
+ clean.remove(target_name)
+ -- update it?
+ elseif config.get("update") then
+ clean.remove(target_name, true)
+ end
-- build target for makefile
- if not makefile.build(config.get("target")) then
+ if not makefile.build(target_name) then
-- error
- utils.error("build target: %s failed!", config.get("target"))
+ utils.error("build target: %s failed!", target_name)
return false
end
diff --git a/xmake/scripts/action/_clean.lua b/xmake/scripts/action/_clean.lua
index 8c00e7b88..8f026c057 100644
--- a/xmake/scripts/action/_clean.lua
+++ b/xmake/scripts/action/_clean.lua
@@ -24,112 +24,15 @@
local _clean = _clean or {}
-- load modules
-local os = require("base/os")
-local rule = require("base/rule")
-local utils = require("base/utils")
+local clean = require("base/clean")
local config = require("base/config")
-local project = require("base/project")
-
--- remove the given files or directories
-function _clean._remove(filedirs)
-
- -- check
- assert(filedirs)
-
- -- 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, 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
-
- -- ok
- return true
-end
-
--- remove the given target and all dependent targets
-function _clean._remove_target_and_deps(target_name, 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, 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, buildir) then return false end
- end
- end
-
- -- ok
- return true
-end
-- done the given config
function _clean.done()
- -- the options
- local options = xmake._OPTIONS
- assert(options)
-
- -- the build directory
- local buildir = config.get("buildir")
- assert(buildir)
-
- -- 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)
-
- -- remove targets
- for target_name, target in pairs(targets) do
- if not _clean._remove_target(target_name, target, buildir) then return false end
- end
+ -- clean the current target
+ if not clean.remove(config.get("target")) then
+ return false
end
-- trace
diff --git a/xmake/scripts/base/clean.lua b/xmake/scripts/base/clean.lua
new file mode 100644
index 000000000..3426dc41e
--- /dev/null
+++ b/xmake/scripts/base/clean.lua
@@ -0,0 +1,138 @@
+--!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)
+
+ -- check
+ assert(filedirs)
+
+ -- 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, target_only, 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 not target_only then
+ -- 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._remove_target_and_deps(target_name, target_only, 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, target_only, 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, target_only, buildir) then return false end
+ end
+ end
+
+ -- ok
+ return true
+end
+
+-- remove the target and object files for the given target
+function clean.remove(target_name, target_only)
+
+ -- the build directory
+ local buildir = config.get("buildir")
+ assert(buildir)
+
+ -- the target name
+ if target_name and target_name ~= "all" then
+ -- remove target
+ if not clean._remove_target_and_deps(target_name, target_only, 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, target_only, buildir) then return false end
+ end
+ end
+
+ -- ok
+ return true
+end
+
+-- return module: clean
+return clean
diff --git a/xmake/scripts/base/config.lua b/xmake/scripts/base/config.lua
index 6eb0b242c..877f7d026 100644
--- a/xmake/scripts/base/config.lua
+++ b/xmake/scripts/base/config.lua
@@ -300,11 +300,13 @@ function config.loadxconf()
-- clear configs if the host has been changed
local target = config._target()
if target and target.host ~= xmake._HOST then
+ -- clear configs
config._CONFIGS = {}
end
-- clear configs if the plat has been changed
if target and target.plat and options.plat and target.plat ~= options.plat then
+ -- clear configs
config._CONFIGS = {}
end
end
diff --git a/xmake/scripts/platform/iphoneos/_iphoneos.lua b/xmake/scripts/platform/iphoneos/_iphoneos.lua
index 9242da6da..e35d17bc9 100644
--- a/xmake/scripts/platform/iphoneos/_iphoneos.lua
+++ b/xmake/scripts/platform/iphoneos/_iphoneos.lua
@@ -44,6 +44,19 @@ function _iphoneos.make(configs)
configs.format.object = {"", ".o"}
configs.format.shared = {"lib", ".dylib"}
+ -- init the compiler
+ configs.compiler = {}
+ configs.compiler.cc = config.get("cc") or "xcrun -sdk iphoneos clang"
+ configs.compiler.cxx = config.get("cxx") or "xcrun -sdk iphoneos clang++"
+ configs.compiler.mm = config.get("mm") or configs.compiler.cc
+ configs.compiler.mxx = config.get("mxx") or configs.compiler.cxx
+
+ -- init the linker
+ configs.linker = {}
+ configs.linker.binary = config.get("ld") or "xcrun -sdk iphoneos clang++"
+ configs.linker.static = config.get("ar") or "xcrun -sdk iphoneos ar"
+ configs.linker.shared = config.get("sh") or "xcrun -sdk iphoneos clang++"
+
-- init xcode sdk directory
configs.xcode_sdkdir = config.get("xcode_dir") .. "/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS" .. config.get("xcode_sdkver") .. ".sdk"
diff --git a/xmake/scripts/platform/iphonesimulator/_iphonesimulator.lua b/xmake/scripts/platform/iphonesimulator/_iphonesimulator.lua
index f2d01244a..84805e3ea 100644
--- a/xmake/scripts/platform/iphonesimulator/_iphonesimulator.lua
+++ b/xmake/scripts/platform/iphonesimulator/_iphonesimulator.lua
@@ -43,7 +43,20 @@ function _iphonesimulator.make(configs)
configs.format.static = {"lib", ".a"}
configs.format.object = {"", ".o"}
configs.format.shared = {"lib", ".dylib"}
-
+
+ -- init the compiler
+ configs.compiler = {}
+ configs.compiler.cc = config.get("cc") or "xcrun -sdk iphonesimulator clang"
+ configs.compiler.cxx = config.get("cxx") or "xcrun -sdk iphonesimulator clang++"
+ configs.compiler.mm = config.get("mm") or configs.compiler.cc
+ configs.compiler.mxx = config.get("mxx") or configs.compiler.cxx
+
+ -- init the linker
+ configs.linker = {}
+ configs.linker.binary = config.get("ld") or "xcrun -sdk iphonesimulator clang++"
+ configs.linker.static = config.get("ar") or "xcrun -sdk iphonesimulator ar"
+ configs.linker.shared = config.get("sh") or "xcrun -sdk iphonesimulator clang++"
+
-- init xcode sdk directory
configs.xcode_sdkdir = config.get("xcode_dir") .. "/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator" .. config.get("xcode_sdkver") .. ".sdk"