1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
--!A cross-platform build utility based on Lua
--
-- Licensed 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-present, Xmake Open Source Community.
--
-- @author ruki
-- @file checker.lua
--
-- imports
import("core.base.option")
import("core.cache.memcache")
-- get all checkers
function checkers()
local checkers = _g._CHECKERS
if not checkers then
checkers = {
-- package api checkers
["api.package.kind"] = {description = "Check kind configuration in package.", load = true},
["api.package.versionfiles"] = {description = "Check versionfiles configuration in package.", download_failure = true},
-- target api checkers
["api.target.version"] = {description = "Check version configuration in target."},
["api.target.kind"] = {description = "Check kind configuration in target.", build = true},
["api.target.strip"] = {description = "Check strip configuration in target.", build = true},
["api.target.optimize"] = {description = "Check optimize configuration in target.", build = true},
["api.target.symbols"] = {description = "Check symbols configuration in target.", build = true},
["api.target.fpmodels"] = {description = "Check fpmodels configuration in target.", build = true},
["api.target.warnings"] = {description = "Check warnings configuration in target.", build = true},
["api.target.languages"] = {description = "Check languages configuration in target.", build = true},
["api.target.vectorexts"] = {description = "Check vectorexts configuration in target.", build = true},
["api.target.exceptions"] = {description = "Check exceptions configuration in target.", build = true},
["api.target.encodings"] = {description = "Check encodings configuration in target.", build = true},
["api.target.packages"] = {description = "Check packages configuration in target."},
["api.target.files"] = {description = "Check files configuration in target."},
["api.target.headerfiles"] = {description = "Check header files configuration in target."},
["api.target.installfiles"] = {description = "Check install files configuration in target."},
["api.target.configfiles"] = {description = "Check config files configuration in target."},
["api.target.linkdirs"] = {description = "Check linkdirs configuration in target.", build = true},
["api.target.includedirs"] = {description = "Check includedirs configuration in target.", build = true},
["api.target.frameworkdirs"] = {description = "Check frameworkdirs configuration in target.", build = true},
["api.target.cflags"] = {description = "Check c compiler flags configuration in target."},
["api.target.cxflags"] = {description = "Check c/c++ compiler flags configuration in target."},
["api.target.cxxflags"] = {description = "Check c++ compiler flags configuration in target."},
["api.target.asflags"] = {description = "Check assembler flags configuration in target."},
["api.target.ldflags"] = {description = "Check binary linker flags configuration in target."},
["api.target.shflags"] = {description = "Check shared library linker flags configuration in target."},
["api.target.license"] = {description = "Check license in target and packages.", build = true},
["api.target.toolset"] = {description = "Check toolset configuration in target."},
-- cuda checkers
["cuda.devlink"] = {description = "Check devlink for targets.", build_failure = true},
-- clang tidy checker
["clang.tidy"] = {description = "Check project code using clang-tidy.", showstats = false},
-- syntax checker
["syntax"] = {description = "Check the project sourcecode syntax without linking.", showstats = false}
}
_g._CHECKERS = checkers
end
return checkers
end
-- complete checkers
function complete(complete, opt)
return try
{
function ()
local list = {}
local groupstats = {}
for name, _ in table.orderpairs(checkers()) do
local groupname = name:split(".", {plain = true})[1]
groupstats[groupname] = (groupstats[groupname] or 0) + 1
if not complete then
local limit = 16
if groupstats[groupname] < limit then
table.insert(list, name)
elseif groupstats[groupname] == limit then
table.insert(list, "...")
end
elseif name:startswith(complete) then
table.insert(list, name)
end
end
return list
end
}
end
-- update stats
function update_stats(level, count)
local stats = _g.stats
if not stats then
stats = {}
_g.stats = stats
end
count = count or 1
stats[level] = (stats[level] or 0) + count
end
-- mark a checker as running (called internally by checker implementations)
function start(name)
memcache.set("__checker_running", name, true)
end
-- mark a checker as stopped (called internally by checker implementations)
function stop(name)
memcache.set("__checker_running", name, false)
end
-- show stats
function show_stats()
local stats = _g.stats or {}
cprint("${bright}%d${clear} notes, ${color.warning}%d${clear} warnings, ${color.error}%d${clear} errors", stats.note or 0, stats.warning or 0, stats.error or 0)
end
|