diff options
Diffstat (limited to 'xmake/scripts')
| -rw-r--r-- | xmake/scripts/base/makefile.lua | 25 | ||||
| -rw-r--r-- | xmake/scripts/base/rule.lua | 7 | ||||
| -rw-r--r-- | xmake/scripts/platform/android/android.lua | 1 | ||||
| -rw-r--r-- | xmake/scripts/platform/iphoneos/iphoneos.lua | 1 | ||||
| -rw-r--r-- | xmake/scripts/platform/iphonesimulator/iphonesimulator.lua | 1 | ||||
| -rw-r--r-- | xmake/scripts/platform/linux/linux.lua | 1 | ||||
| -rw-r--r-- | xmake/scripts/platform/macosx/macosx.lua | 1 | ||||
| -rw-r--r-- | xmake/scripts/platform/mingw/mingw.lua | 1 | ||||
| -rw-r--r-- | xmake/scripts/platform/windows/tools/cl.lua | 4 | ||||
| -rw-r--r-- | xmake/scripts/platform/windows/tools/link.lua | 6 | ||||
| -rw-r--r-- | xmake/scripts/platform/windows/tools/ml.lua | 4 | ||||
| -rw-r--r-- | xmake/scripts/platform/windows/tools/nmake.lua | 6 | ||||
| -rw-r--r-- | xmake/scripts/tools/ar.lua | 4 | ||||
| -rw-r--r-- | xmake/scripts/tools/extract.lua | 95 | ||||
| -rw-r--r-- | xmake/scripts/tools/gcc.lua | 8 |
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 |
