summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2017-10-15 23:43:33 +0800
committerruki <[email protected]>2017-10-15 23:43:33 +0800
commite6b23ffc316822a52b374e1c38dff738c7be6b91 (patch)
tree2747ccf724916cf69a327810904cc808ea728423
parent3c990e889dc116dec50c950f5c1a1a91fb5d6600 (diff)
enable log output
-rw-r--r--CHANGELOG.md8
-rw-r--r--xmake/core/base/colors.lua12
-rw-r--r--xmake/core/base/log.lua109
-rw-r--r--xmake/core/base/os.lua1
-rw-r--r--xmake/core/base/utils.lua41
-rw-r--r--xmake/core/main.lua4
-rw-r--r--xmake/core/sandbox/modules/utils.lua48
-rw-r--r--xmake/modules/core/tools/gcc.lua2
8 files changed, 212 insertions, 13 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9df387572..4b4135c0a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
## master (unreleased)
+### New features
+
+* Add `XMAKE_LOGFILE` environment variable to dump the output info to file
+
## v2.1.7
### New features
@@ -372,6 +376,10 @@
## master (开发中)
+### 新特性
+
+* 添加`XMAKE_LOGFILE`环境变量,启用输出到日志文件
+
## v2.1.7
### 新特性
diff --git a/xmake/core/base/colors.lua b/xmake/core/base/colors.lua
index d44e4da0d..ca2113f74 100644
--- a/xmake/core/base/colors.lua
+++ b/xmake/core/base/colors.lua
@@ -267,5 +267,17 @@ function colors.translate(str, force)
return str
end
+-- ignore all colors
+function colors.ignore(str)
+
+ -- check string
+ if not str then
+ return nil
+ end
+
+ -- ignore it
+ return (string.gsub(str, "(%${(.-)})", ""))
+end
+
-- return module
return colors
diff --git a/xmake/core/base/log.lua b/xmake/core/base/log.lua
new file mode 100644
index 000000000..57f2dc1a2
--- /dev/null
+++ b/xmake/core/base/log.lua
@@ -0,0 +1,109 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015 - 2017, TBOOX Open Source Group.
+--o
+-- @author ruki
+-- @file log.lua
+--
+
+-- define module: log
+local log = log or {}
+
+-- get the log file
+function log.file()
+ if log._FILE == nil then
+ local outputfile = log.outputfile()
+ if outputfile and os.isfile(outputfile) then
+ log._FILE = io.open(outputfile, 'w')
+ end
+ log._FILE = log._FILE or false
+ end
+ return log._FILE
+end
+
+-- get the output file
+function log.outputfile()
+ if log._LOGFILE == nil then
+ log._LOGFILE = os.getenv("XMAKE_LOGFILE") or false
+ end
+ return log._LOGFILE
+end
+
+-- flush log to file
+function log.flush()
+ local file = log.file()
+ if file then
+ file:flush()
+ end
+end
+
+-- close the log file
+function log.close()
+ local file = log.file()
+ if file then
+ file:close()
+ end
+end
+
+-- print log to the log file
+function log.print(...)
+ local file = log.file()
+ if file then
+ file:write(string.format(...) .. "\n")
+ end
+end
+
+-- print variables to the log file
+function log.printv(...)
+ local file = log.file()
+ if file then
+ local values = {...}
+ for i, v in ipairs(values) do
+ -- dump basic type
+ if type(v) == "string" or type(v) == "boolean" or type(v) == "number" then
+ file:write(tostring(v))
+ else
+ file:write("<" .. tostring(v) .. ">")
+ end
+ if i ~= #values then
+ file:write(" ")
+ end
+ end
+ file:write('\n')
+ end
+end
+
+-- printf log to the log file
+function log.printf(...)
+ local file = log.file()
+ if file then
+ file:write(string.format(...))
+ end
+end
+
+-- write log the log file
+function log:write(...)
+ local file = log.file()
+ if file then
+ file:write(...)
+ end
+end
+
+-- return module: log
+return log
diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua
index 03487a65a..fd414b54b 100644
--- a/xmake/core/base/os.lua
+++ b/xmake/core/base/os.lua
@@ -27,6 +27,7 @@ local os = os or {}
-- load modules
local io = require("base/io")
+local log = require("base/log")
local path = require("base/path")
local table = require("base/table")
local utils = require("base/utils")
diff --git a/xmake/core/base/utils.lua b/xmake/core/base/utils.lua
index 772d1f162..49b05ea0a 100644
--- a/xmake/core/base/utils.lua
+++ b/xmake/core/base/utils.lua
@@ -30,6 +30,7 @@ local option = require("base/option")
local colors = require("base/colors")
local string = require("base/string")
local table = require("base/table")
+local log = require("base/log")
-- print string with newline
function utils._print(...)
@@ -70,8 +71,14 @@ function utils.print(format, ...)
-- check
assert(format)
+ -- init message
+ local message = string.tryformat(format, ...)
+
-- trace
- utils._print(string.tryformat(format, ...))
+ utils._print(message)
+
+ -- write to the log file
+ log.printv(message)
end
-- print format string without newline
@@ -80,8 +87,14 @@ function utils.printf(format, ...)
-- check
assert(format)
+ -- init message
+ local message = string.tryformat(format, ...)
+
-- trace
- utils._iowrite(string.tryformat(format, ...))
+ utils._iowrite(message)
+
+ -- write to the log file
+ log.write(message)
end
-- print format string and colors with newline
@@ -90,8 +103,16 @@ function utils.cprint(format, ...)
-- check
assert(format)
+ -- init message
+ local message = string.tryformat(format, ...)
+
-- trace
- utils._print(colors.translate(string.tryformat(format, ...)))
+ utils._print(colors.translate(message))
+
+ -- write to the log file
+ if log.file() then
+ log.printv(colors.ignore(message))
+ end
end
-- print format string and colors without newline
@@ -100,8 +121,16 @@ function utils.cprintf(format, ...)
-- check
assert(format)
+ -- init message
+ local message = string.tryformat(format, ...)
+
-- trace
- utils._iowrite(colors.translate(string.tryformat(format, ...)))
+ utils._iowrite(colors.translate(message))
+
+ -- write to the log file
+ if log.file() then
+ log.write(colors.ignore(message))
+ end
end
-- the verbose function
@@ -109,9 +138,7 @@ function utils.verbose(format, ...)
-- enable verbose?
if option.get("verbose") and format ~= nil then
-
- -- trace
- utils._print(string.tryformat(format, ...))
+ utils.print(format, ...)
end
end
diff --git a/xmake/core/main.lua b/xmake/core/main.lua
index b9e0749ba..cfa66b1b8 100644
--- a/xmake/core/main.lua
+++ b/xmake/core/main.lua
@@ -27,6 +27,7 @@ local main = main or {}
-- load modules
local os = require("base/os")
+local log = require("base/log")
local path = require("base/path")
local utils = require("base/utils")
local option = require("base/option")
@@ -247,6 +248,9 @@ Or you can add `--root` option to allow run as root temporarily.
profiler:stop()
end
+ -- close log
+ log.close()
+
-- ok
return 0
end
diff --git a/xmake/core/sandbox/modules/utils.lua b/xmake/core/sandbox/modules/utils.lua
index 7d553c33f..e86eb2c08 100644
--- a/xmake/core/sandbox/modules/utils.lua
+++ b/xmake/core/sandbox/modules/utils.lua
@@ -27,6 +27,7 @@ local io = require("base/io")
local utils = require("base/utils")
local colors = require("base/colors")
local option = require("base/option")
+local log = require("base/log")
local try = require("sandbox/modules/try")
local catch = require("sandbox/modules/catch")
local vformat = require("sandbox/modules/vformat")
@@ -57,6 +58,9 @@ function sandbox_utils._print(...)
-- print multi-variables with raw lua action
utils._print(unpack(args))
+
+ -- write to the log file
+ log.printv(unpack(args))
end
-- print format string with newline
@@ -72,8 +76,14 @@ function sandbox_utils.print(format, ...)
try
{
function ()
- -- attempt to print format string first
- utils._print(vformat(format, unpack(args)))
+ -- attempt to format message
+ local message = vformat(format, unpack(args))
+
+ -- trace
+ utils._print(message)
+
+ -- write to the log file
+ log.printv(message)
end,
catch
{
@@ -92,17 +102,45 @@ end
-- print format string and the builtin variables without newline
function sandbox_utils.printf(format, ...)
- utils._iowrite(vformat(format, ...))
+
+ -- init message
+ local message = vformat(format, ...)
+
+ -- trace
+ utils._iowrite(message)
+
+ -- write log to the log file
+ log.write(message)
end
-- print format string, the builtin variables and colors with newline
function sandbox_utils.cprint(format, ...)
- utils._print(colors.translate(vformat(format, ...)))
+
+ -- init message
+ local message = vformat(format, ...)
+
+ -- trace
+ utils._print(colors.translate(message))
+
+ -- write log to the log file
+ if log.file() then
+ log.printv(colors.ignore(message))
+ end
end
-- print format string, the builtin variables and colors without newline
function sandbox_utils.cprintf(format, ...)
- utils._iowrite(colors.translate(vformat(format, ...)))
+
+ -- init message
+ local message = vformat(format, ...)
+
+ -- trace
+ utils._iowrite(colors.translate(message))
+
+ -- write log to the log file
+ if log.file() then
+ log.write(colors.ignore(message))
+ end
end
-- print() if enable verbose
diff --git a/xmake/modules/core/tools/gcc.lua b/xmake/modules/core/tools/gcc.lua
index 91ee95eb6..649a2e48f 100644
--- a/xmake/modules/core/tools/gcc.lua
+++ b/xmake/modules/core/tools/gcc.lua
@@ -439,7 +439,7 @@ function _compile1(self, sourcefile, objectfile, depinfo, flags)
end
-- raise compiling errors
- os.raise(errors)
+ raise(errors)
end
},
finally