summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2015-12-04 11:49:37 +0800
committerruki <[email protected]>2015-12-04 11:49:37 +0800
commit6ece8be70e5141a69720f28e4f18b20664142ae3 (patch)
tree9ae6301f68ecec013c6023a2b6d74bd702685f7a
parent7624723775b58c1811287465e6d7c27cede81b31 (diff)
support add_files *.a using ar
-rw-r--r--xmake/scripts/base/makefile.lua25
-rw-r--r--xmake/scripts/base/rule.lua7
-rw-r--r--xmake/scripts/platform/android/android.lua1
-rw-r--r--xmake/scripts/platform/iphoneos/iphoneos.lua1
-rw-r--r--xmake/scripts/platform/iphonesimulator/iphonesimulator.lua1
-rw-r--r--xmake/scripts/platform/linux/linux.lua1
-rw-r--r--xmake/scripts/platform/macosx/macosx.lua1
-rw-r--r--xmake/scripts/platform/mingw/mingw.lua1
-rw-r--r--xmake/scripts/platform/windows/tools/cl.lua4
-rw-r--r--xmake/scripts/platform/windows/tools/link.lua6
-rw-r--r--xmake/scripts/platform/windows/tools/ml.lua4
-rw-r--r--xmake/scripts/platform/windows/tools/nmake.lua6
-rw-r--r--xmake/scripts/tools/ar.lua4
-rw-r--r--xmake/scripts/tools/extract.lua95
-rw-r--r--xmake/scripts/tools/gcc.lua8
15 files changed, 142 insertions, 23 deletions
diff --git a/xmake/scripts/base/makefile.lua b/xmake/scripts/base/makefile.lua
index a7c7a7301..48550809a 100644
--- a/xmake/scripts/base/makefile.lua
+++ b/xmake/scripts/base/makefile.lua
@@ -36,7 +36,7 @@ local compiler = require("base/compiler")
local tools = require("tools/tools")
local platform = require("platform/platform")
--- make object for the *.o/obj source file
+-- make object for the *.[o|obj] source file
function makefile._make_object_for_object(file, target, srcfile, objfile)
-- get the source file type
@@ -66,7 +66,7 @@ function makefile._make_object_for_object(file, target, srcfile, objfile)
file:write(string.format(" %s\n", srcfile))
-- make body
- file:write(string.format("\t@echo adding%s %s\n", mode, srcfile))
+ file:write(string.format("\t@echo inserting%s %s\n", mode, srcfile))
file:write(string.format("\t@xmake l $(VERBOSE) verbose \"%s\"\n", cmd:gsub("[%s=\"]", function (w) return string.format("%%%x", w:byte()) end)))
file:write(string.format("\t@%s\n", cmd))
@@ -77,7 +77,7 @@ function makefile._make_object_for_object(file, target, srcfile, objfile)
return true
end
--- make object for the *.a/lib source file
+-- make object for the *.[a|lib] source file
function makefile._make_object_for_static(file, target, srcfile, objfile)
-- get the source file type
@@ -97,8 +97,21 @@ function makefile._make_object_for_static(file, target, srcfile, objfile)
elseif mode == "profile" then mode = ".p"
else mode = "" end
+ -- get extractor name
+ local toolname = nil
+ local extractor, errors = tools.get("ex")
+ if not extractor then
+ utils.error(errors)
+ return false
+ end
+ toolname = extractor.name
+ if not toolname then
+ utils.error("cannot get the extractor name!")
+ return false
+ end
+
-- make command
- local cmd = string.format("xmake l cp %s %s", srcfile, objfile)
+ local cmd = string.format("xmake l extract \"%s\" %s %s > %s 2>&1", toolname, srcfile, objfile, makefile._LOGFILE)
-- make head
file:write(string.format("%s:", objfile))
@@ -107,8 +120,9 @@ function makefile._make_object_for_static(file, target, srcfile, objfile)
file:write(string.format(" %s\n", srcfile))
-- make body
- file:write(string.format("\t@echo adding%s %s\n", mode, srcfile))
+ file:write(string.format("\t@echo inserting%s %s\n", mode, srcfile))
file:write(string.format("\t@xmake l $(VERBOSE) verbose \"%s\"\n", cmd:gsub("[%s=\"]", function (w) return string.format("%%%x", w:byte()) end)))
+ file:write(string.format("\t@xmake l rmdir %s\n", path.directory(objfile)))
file:write(string.format("\t@%s\n", cmd))
-- make tail
@@ -320,6 +334,7 @@ function makefile._make_targets(file)
all = all .. " " .. name
end
file:write(string.format("all: %s\n\n", all))
+ file:write(string.format(".PHONY: all %s\n\n", all))
-- make it for all targets
for name, target in pairs(targets) do
diff --git a/xmake/scripts/base/rule.lua b/xmake/scripts/base/rule.lua
index 97baf2b24..d4f15a456 100644
--- a/xmake/scripts/base/rule.lua
+++ b/xmake/scripts/base/rule.lua
@@ -145,6 +145,9 @@ function rule.objectfiles(target_name, target, sourcefiles, buildir)
local objectfiles = {}
for _, sourcefile in ipairs(sourcefiles) do
+ -- translate: [lib]xxx*.[a|lib] => xxx/*.[o|obj] object file
+ sourcefile = sourcefile:gsub(rule.filename("(%w+)", "static"):gsub("%.", "%%.") .. "$", "%1/*")
+
-- make object file
local objectfile = string.format("%s/%s/%s/%s", objectdir, target_name, path.directory(sourcefile), rule.filename(path.basename(sourcefile), "object"))
@@ -191,13 +194,13 @@ function rule.sourcefiles(target)
local sourcefiles = {}
for _, targetfile in ipairs(targetfiles) do
- -- normalize *.o/obj filename
+ -- normalize *.[o|obj] filename
targetfile = targetfile:gsub("([%w%*]+)%.obj|", rule.filename("%1|", "object"))
targetfile = targetfile:gsub("([%w%*]+)%.obj$", rule.filename("%1", "object"))
targetfile = targetfile:gsub("([%w%*]+)%.o|", rule.filename("%1|", "object"))
targetfile = targetfile:gsub("([%w%*]+)%.o$", rule.filename("%1", "object"))
- -- normalize lib*.a/*.lib filename
+ -- normalize [lib]*.[a|lib] filename
targetfile = targetfile:gsub("([%w%*]+)%.lib|", rule.filename("%1|", "static"))
targetfile = targetfile:gsub("([%w%*]+)%.lib$", rule.filename("%1", "static"))
targetfile = targetfile:gsub("lib([%w%*]+)%.a|", rule.filename("%1|", "static"))
diff --git a/xmake/scripts/platform/android/android.lua b/xmake/scripts/platform/android/android.lua
index 5226495b0..456aceaca 100644
--- a/xmake/scripts/platform/android/android.lua
+++ b/xmake/scripts/platform/android/android.lua
@@ -54,6 +54,7 @@ function android.make(configs)
configs.tools.ld = config.get("ld")
configs.tools.ar = config.get("ar")
configs.tools.sh = config.get("sh")
+ configs.tools.ex = config.get("ar")
-- init flags
local arch = config.get("arch")
diff --git a/xmake/scripts/platform/iphoneos/iphoneos.lua b/xmake/scripts/platform/iphoneos/iphoneos.lua
index dad9c8252..ff9ddfdc0 100644
--- a/xmake/scripts/platform/iphoneos/iphoneos.lua
+++ b/xmake/scripts/platform/iphoneos/iphoneos.lua
@@ -56,6 +56,7 @@ function iphoneos.make(configs)
configs.tools.ld = config.get("ld")
configs.tools.ar = config.get("ar")
configs.tools.sh = config.get("sh")
+ configs.tools.ex = config.get("ar")
configs.tools.lipo = config.get("lipo")
-- init flags for architecture
diff --git a/xmake/scripts/platform/iphonesimulator/iphonesimulator.lua b/xmake/scripts/platform/iphonesimulator/iphonesimulator.lua
index 87c3970b9..3765fbe85 100644
--- a/xmake/scripts/platform/iphonesimulator/iphonesimulator.lua
+++ b/xmake/scripts/platform/iphonesimulator/iphonesimulator.lua
@@ -55,6 +55,7 @@ function iphonesimulator.make(configs)
configs.tools.ld = config.get("ld")
configs.tools.ar = config.get("ar")
configs.tools.sh = config.get("sh")
+ configs.tools.ex = config.get("ar")
-- init flags for architecture
local archflags = nil
diff --git a/xmake/scripts/platform/linux/linux.lua b/xmake/scripts/platform/linux/linux.lua
index 62ff0d04c..dc8c9cb27 100644
--- a/xmake/scripts/platform/linux/linux.lua
+++ b/xmake/scripts/platform/linux/linux.lua
@@ -55,6 +55,7 @@ function linux.make(configs)
configs.tools.ld = config.get("ld")
configs.tools.ar = config.get("ar")
configs.tools.sh = config.get("sh")
+ configs.tools.ex = config.get("ar")
-- init flags for architecture
local archflags = nil
diff --git a/xmake/scripts/platform/macosx/macosx.lua b/xmake/scripts/platform/macosx/macosx.lua
index 9168d9ae3..c7f4eb2c4 100644
--- a/xmake/scripts/platform/macosx/macosx.lua
+++ b/xmake/scripts/platform/macosx/macosx.lua
@@ -55,6 +55,7 @@ function macosx.make(configs)
configs.tools.ld = config.get("ld")
configs.tools.ar = config.get("ar")
configs.tools.sh = config.get("sh")
+ configs.tools.ex = config.get("ar")
-- init flags for architecture
local archflags = nil
diff --git a/xmake/scripts/platform/mingw/mingw.lua b/xmake/scripts/platform/mingw/mingw.lua
index 430d3519a..f40e76480 100644
--- a/xmake/scripts/platform/mingw/mingw.lua
+++ b/xmake/scripts/platform/mingw/mingw.lua
@@ -53,6 +53,7 @@ function mingw.make(configs)
configs.tools.ld = config.get("ld")
configs.tools.ar = config.get("ar")
configs.tools.sh = config.get("sh")
+ configs.tools.ex = config.get("ar")
-- init flags for architecture
local archflags = nil
diff --git a/xmake/scripts/platform/windows/tools/cl.lua b/xmake/scripts/platform/windows/tools/cl.lua
index fa961273b..ac91273b1 100644
--- a/xmake/scripts/platform/windows/tools/cl.lua
+++ b/xmake/scripts/platform/windows/tools/cl.lua
@@ -33,7 +33,7 @@ local platform = require("platform/platform")
function cl.init(self, name)
-- save name
- self._NAME = name or "cl.exe"
+ self.name = name or "cl.exe"
-- init cxflags
self.cxflags = { "-nologo", "-Gd", "-MP4", "-D_MBCS", "-D_CRT_SECURE_NO_WARNINGS"}
@@ -90,7 +90,7 @@ function cl.command_compile(self, srcfile, objfile, flags, logfile)
if logfile then redirect = string.format(" > %s 2>&1", logfile) end
-- make it
- return string.format("%s -c %s -Fo%s %s%s", self._NAME, flags, objfile, srcfile, redirect)
+ return string.format("%s -c %s -Fo%s %s%s", self.name, flags, objfile, srcfile, redirect)
end
-- make the define flag
diff --git a/xmake/scripts/platform/windows/tools/link.lua b/xmake/scripts/platform/windows/tools/link.lua
index 84df08694..b1fda427a 100644
--- a/xmake/scripts/platform/windows/tools/link.lua
+++ b/xmake/scripts/platform/windows/tools/link.lua
@@ -33,7 +33,7 @@ local platform = require("platform/platform")
function link.init(self, name)
-- save name
- self._NAME = name or "link.exe"
+ self.name = name or "link.exe"
-- the architecture
local arch = config.get("arch")
@@ -79,11 +79,11 @@ function link.command_link(self, objfiles, targetfile, flags, logfile)
if logfile then redirect = string.format(" > %s 2>&1", logfile) end
-- make it
- local cmd = string.format("%s %s -out:%s %s%s", self._NAME, flags, targetfile, objfiles, redirect)
+ local cmd = string.format("%s %s -out:%s %s%s", self.name, flags, targetfile, objfiles, redirect)
-- too long?
if #cmd > 256 then
- cmd = string.format("%s%s @<<\n%s -out:%s %s\n<<", self._NAME, redirect, flags, targetfile, objfiles)
+ cmd = string.format("%s%s @<<\n%s -out:%s %s\n<<", self.name, redirect, flags, targetfile, objfiles)
end
-- ok?
diff --git a/xmake/scripts/platform/windows/tools/ml.lua b/xmake/scripts/platform/windows/tools/ml.lua
index c2ea9b9ab..5a6034320 100644
--- a/xmake/scripts/platform/windows/tools/ml.lua
+++ b/xmake/scripts/platform/windows/tools/ml.lua
@@ -33,7 +33,7 @@ local platform = require("platform/platform")
function ml.init(self, name)
-- save name
- self._NAME = name or "ml.exe"
+ self.name = name or "ml.exe"
-- init asflags
self.asflags = { "-nologo", "-Gd", "-MP4", "-D_MBCS", "-D_CRT_SECURE_NO_WARNINGS"}
@@ -84,7 +84,7 @@ function ml.command_compile(self, srcfile, objfile, flags, logfile)
if logfile then redirect = string.format(" > %s 2>&1", logfile) end
-- make it
- return string.format("%s -c %s -Fo%s %s%s", self._NAME, flags, objfile, srcfile, redirect)
+ return string.format("%s -c %s -Fo%s %s%s", self.name, flags, objfile, srcfile, redirect)
end
-- make the define flag
diff --git a/xmake/scripts/platform/windows/tools/nmake.lua b/xmake/scripts/platform/windows/tools/nmake.lua
index 0ba2e32e3..3dddc7cf2 100644
--- a/xmake/scripts/platform/windows/tools/nmake.lua
+++ b/xmake/scripts/platform/windows/tools/nmake.lua
@@ -35,7 +35,7 @@ local nmake = nmake or {}
function nmake.init(self, name)
-- save name
- self._NAME = name or "nmake.exe"
+ self.name = name or "nmake.exe"
-- is verbose?
self._VERBOSE = utils.ifelse(xmake._OPTIONS.verbose, "-v", "")
@@ -55,9 +55,9 @@ function nmake.main(self, mkfile, target)
-- make command
local cmd = nil
if mkfile and os.isfile(mkfile) then
- cmd = string.format("%s /nologo /f %s %s VERBOSE=%s", self._NAME, mkfile, target or "", self._VERBOSE)
+ cmd = string.format("%s /nologo /f %s %s VERBOSE=%s", self.name, mkfile, target or "", self._VERBOSE)
else
- cmd = string.format("%s /nologo %s VERBOSE=%s", self._NAME, target or "", self._VERBOSE)
+ cmd = string.format("%s /nologo %s VERBOSE=%s", self.name, target or "", self._VERBOSE)
end
-- done
diff --git a/xmake/scripts/tools/ar.lua b/xmake/scripts/tools/ar.lua
index b80dc4ddf..66a29c4c3 100644
--- a/xmake/scripts/tools/ar.lua
+++ b/xmake/scripts/tools/ar.lua
@@ -32,7 +32,7 @@ local config = require("base/config")
function ar.init(self, name)
-- save name
- self._NAME = name or "ar"
+ self.name = name or "ar"
-- init arflags
self.arflags = { "-crs" }
@@ -47,7 +47,7 @@ function ar.command_link(self, objfiles, targetfile, flags, logfile)
if logfile then redirect = string.format(" > %s 2>&1", logfile) end
-- make it
- return string.format("%s %s %s %s%s", self._NAME, flags, targetfile, objfiles, redirect)
+ return string.format("%s %s %s %s%s", self.name, flags, targetfile, objfiles, redirect)
end
-- the main function
diff --git a/xmake/scripts/tools/extract.lua b/xmake/scripts/tools/extract.lua
new file mode 100644
index 000000000..635eb8d73
--- /dev/null
+++ b/xmake/scripts/tools/extract.lua
@@ -0,0 +1,95 @@
+--!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 extract.lua
+--
+
+-- define module: extract
+local extract = extract or {}
+
+-- load modules
+local os = require("base/os")
+local path = require("base/path")
+local utils = require("base/utils")
+local string = require("base/string")
+
+-- the main function
+--
+-- extract /home/[lib]xxx.[a|lib] /home/xxx/*.[o|obj]
+-- only support: ar -x library
+function extract.main(self, ...)
+
+ -- check
+ local args = ...
+ assert(#args == 3)
+
+ -- get toolname
+ local toolname = args[1]
+ assert(toolname)
+
+ -- be not ar?
+ if not toolname:find("ar", 1, true) then
+ utils.error("%s is not ar!", toolname)
+ return false
+ end
+
+ -- get library and object file path
+ local libfile = args[2]
+ local objfile = args[3]
+ assert(libfile and objfile)
+
+ -- get object directory
+ local objdir = path.directory(objfile)
+ if not os.isdir(objdir) then os.mkdir(objdir) end
+ if not os.isdir(objdir) then
+ utils.error("%s not found!", objdir)
+ return false
+ end
+
+ -- absolute the library path
+ libfile = path.absolute(libfile)
+ assert(libfile)
+
+ -- enter the object directory
+ ok, errors = os.cd(objdir)
+ if not ok then
+ utils.error(errors)
+ return false
+ end
+
+ -- extract it
+ local ok = os.execute(string.format("%s -x %s", toolname, libfile))
+ if ok ~= 0 then
+ utils.error("extract %s to %s failed!", libfile, objdir)
+ return false
+ end
+
+ -- leave the object directory
+ ok, errors = os.cd("-")
+ if not ok then
+ utils.error(errors)
+ return false
+ end
+
+ -- ok
+ return true
+end
+
+-- return module: extract
+return extract
diff --git a/xmake/scripts/tools/gcc.lua b/xmake/scripts/tools/gcc.lua
index ee492e134..f1b2f4d55 100644
--- a/xmake/scripts/tools/gcc.lua
+++ b/xmake/scripts/tools/gcc.lua
@@ -41,7 +41,7 @@ function gcc._check(self, flag)
-- check it
local result = flag
- if 0 ~= os.execute(string.format("%s %s -S -o %s -xc %s > %s 2>&1", self._NAME, flag, xmake._NULDEV, xmake._NULDEV, xmake._NULDEV)) then
+ if 0 ~= os.execute(string.format("%s %s -S -o %s -xc %s > %s 2>&1", self.name, flag, xmake._NULDEV, xmake._NULDEV, xmake._NULDEV)) then
result = ""
end
@@ -59,7 +59,7 @@ end
function gcc.init(self, name)
-- save name
- self._NAME = name or "gcc"
+ self.name = name or "gcc"
-- init mxflags
self.mxflags = { "-fmessage-length=0"
@@ -125,7 +125,7 @@ function gcc.command_compile(self, srcfile, objfile, flags, logfile)
if logfile then redirect = string.format(" > %s 2>&1", logfile) end
-- make it
- return string.format("%s -c %s -o %s %s%s", self._NAME, flags, objfile, srcfile, redirect)
+ return string.format("%s -c %s -o %s %s%s", self.name, flags, objfile, srcfile, redirect)
end
-- make the link command
@@ -136,7 +136,7 @@ function gcc.command_link(self, objfiles, targetfile, flags, logfile)
if logfile then redirect = string.format(" > %s 2>&1", logfile) end
-- make it
- return string.format("%s -o %s %s %s%s", self._NAME, targetfile, objfiles, flags, redirect)
+ return string.format("%s -o %s %s %s%s", self.name, targetfile, objfiles, flags, redirect)
end
-- make the define flag