summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-02-21 09:54:49 +0800
committerGitHub <[email protected]>2023-02-21 09:54:49 +0800
commit8ea58baa753ebcbfce5cd434a92e3dd369da0e0d (patch)
tree70a852b2c674ea283b873732dbbb44969a47d987
parent775cc38c761e02fa3ff4825eabca344b98c75b78 (diff)
parent0fc0959c413b6cb1900f59fee403502f7b8ae2e8 (diff)
Merge pull request #3397 from xmake-io/check
Improve check and add devlink checker
-rw-r--r--xmake/core/project/policy.lua2
-rw-r--r--xmake/core/project/target.lua4
-rw-r--r--xmake/modules/private/check/checker.lua (renamed from xmake/plugins/check/checker.lua)26
-rw-r--r--xmake/modules/private/check/checkers/api/api_checker.lua (renamed from xmake/plugins/check/checkers/api/api_checker.lua)114
-rw-r--r--xmake/modules/private/check/checkers/api/target/asflags.lua (renamed from xmake/plugins/check/checkers/api/target/asflags.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/cflags.lua (renamed from xmake/plugins/check/checkers/api/target/cflags.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/configfiles.lua (renamed from xmake/plugins/check/checkers/api/target/configfiles.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/cxflags.lua (renamed from xmake/plugins/check/checkers/api/target/cxflags.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/cxxflags.lua (renamed from xmake/plugins/check/checkers/api/target/cxxflags.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/exceptions.lua (renamed from xmake/plugins/check/checkers/api/target/exceptions.lua)5
-rw-r--r--xmake/modules/private/check/checkers/api/target/files.lua (renamed from xmake/plugins/check/checkers/api/target/files.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/fpmodels.lua (renamed from xmake/plugins/check/checkers/api/target/fpmodels.lua)5
-rw-r--r--xmake/modules/private/check/checkers/api/target/frameworkdirs.lua (renamed from xmake/plugins/check/checkers/api/target/frameworkdirs.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/headerfiles.lua (renamed from xmake/plugins/check/checkers/api/target/headerfiles.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/includedirs.lua (renamed from xmake/plugins/check/checkers/api/target/includedirs.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/installfiles.lua (renamed from xmake/plugins/check/checkers/api/target/installfiles.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/kind.lua (renamed from xmake/plugins/check/checkers/api/target/kind.lua)5
-rw-r--r--xmake/modules/private/check/checkers/api/target/languages.lua (renamed from xmake/plugins/check/checkers/api/target/languages.lua)5
-rw-r--r--xmake/modules/private/check/checkers/api/target/ldflags.lua (renamed from xmake/plugins/check/checkers/api/target/ldflags.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/linkdirs.lua (renamed from xmake/plugins/check/checkers/api/target/linkdirs.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/optimize.lua (renamed from xmake/plugins/check/checkers/api/target/optimize.lua)5
-rw-r--r--xmake/modules/private/check/checkers/api/target/packages.lua (renamed from xmake/plugins/check/checkers/api/target/packages.lua)5
-rw-r--r--xmake/modules/private/check/checkers/api/target/shflags.lua (renamed from xmake/plugins/check/checkers/api/target/shflags.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/strip.lua (renamed from xmake/plugins/check/checkers/api/target/strip.lua)5
-rw-r--r--xmake/modules/private/check/checkers/api/target/symbols.lua (renamed from xmake/plugins/check/checkers/api/target/symbols.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/vectorexts.lua (renamed from xmake/plugins/check/checkers/api/target/vectorexts.lua)5
-rw-r--r--xmake/modules/private/check/checkers/api/target/version.lua (renamed from xmake/plugins/check/checkers/api/target/version.lua)7
-rw-r--r--xmake/modules/private/check/checkers/api/target/warnings.lua (renamed from xmake/plugins/check/checkers/api/target/warnings.lua)5
-rw-r--r--xmake/modules/private/check/checkers/clang/tidy.lua (renamed from xmake/plugins/check/checkers/clang/tidy.lua)0
-rw-r--r--xmake/modules/private/check/checkers/cuda/devlink.lua54
-rw-r--r--xmake/plugins/check/main.lua4
-rw-r--r--xmake/plugins/check/xmake.lua2
-rw-r--r--xmake/plugins/project/cmake/cmakelists.lua2
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x.lua2
-rw-r--r--xmake/rules/cuda/devlink/xmake.lua5
-rw-r--r--xmake/rules/cuda/env/xmake.lua1
-rw-r--r--xmake/rules/utils/check_targets/check_targets.lua39
-rw-r--r--xmake/rules/utils/check_targets/checker.lua50
-rw-r--r--xmake/rules/utils/check_targets/xmake.lua5
39 files changed, 293 insertions, 167 deletions
diff --git a/xmake/core/project/policy.lua b/xmake/core/project/policy.lua
index 52f13c9b7..56fbc2219 100644
--- a/xmake/core/project/policy.lua
+++ b/xmake/core/project/policy.lua
@@ -60,6 +60,8 @@ function policy.policies()
["build.c++.msvc.fallbackscanner"] = {description = "Force msvc fallback module dependency scanner.", default = false, type = "boolean"},
-- force C++ modules fallback dependency scanner for gcc
["build.c++.gcc.fallbackscanner"] = {description = "Force gcc fallback module dependency scanner.", default = false, type = "boolean"},
+ -- enable cuda device link
+ ["build.cuda.devlink"] = {description = "Enable Cuda devlink.", type = "boolean"},
-- preprocessor configuration for ccache/distcc, we can disable linemarkers to speed up preprocess
["preprocessor.linemarkers"] = {description = "Enable linemarkers for preprocessor.", default = true, type = "boolean"},
-- preprocessor configuration for ccache/distcc, we can disable it to avoid cache object file with __DATE__, __TIME__
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua
index 7e07503c8..79c5f0546 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -1381,7 +1381,7 @@ function _instance:fileconfig(sourcefile)
local results = os.match(filepath)
if #results == 0 and not fileconfig.always_added then
local sourceinfo = self:sourceinfo("files", filepath) or {}
- utils.warning("%s:%d: cannot match add_files(\"%s\") in %s(%s)", sourceinfo.file or "", sourceinfo.line or -1, filepath, self:type(), self:name())
+ utils.warning("%s:%d${clear}: cannot match add_files(\"%s\") in %s(%s)", sourceinfo.file or "", sourceinfo.line or -1, filepath, self:type(), self:name())
end
-- process source files
@@ -1505,7 +1505,7 @@ function _instance:sourcefiles()
end
if #results == 0 then
local sourceinfo = self:sourceinfo("files", file) or {}
- utils.warning("%s:%d: cannot match %s_files(\"%s\") in %s(%s)", sourceinfo.file or "", sourceinfo.line or -1, (removed and "remove" or "add"), file, self:type(), self:name())
+ utils.warning("%s:%d${clear}: cannot match %s_files(\"%s\") in %s(%s)", sourceinfo.file or "", sourceinfo.line or -1, (removed and "remove" or "add"), file, self:type(), self:name())
end
-- process source files
diff --git a/xmake/plugins/check/checker.lua b/xmake/modules/private/check/checker.lua
index a6b8bb995..9396f825f 100644
--- a/xmake/plugins/check/checker.lua
+++ b/xmake/modules/private/check/checker.lua
@@ -28,29 +28,31 @@ function checkers()
checkers = {
-- target api checkers
["api.target.version"] = {description = "Check version configuration in target."},
- ["api.target.kind"] = {description = "Check kind configuration in target."},
- ["api.target.strip"] = {description = "Check strip configuration in target."},
- ["api.target.optimize"] = {description = "Check optimize configuration in target."},
- ["api.target.symbols"] = {description = "Check symbols configuration in target."},
- ["api.target.fpmodels"] = {description = "Check fpmodels configuration in target."},
- ["api.target.warnings"] = {description = "Check warnings configuration in target."},
- ["api.target.languages"] = {description = "Check languages configuration in target."},
- ["api.target.vectorexts"] = {description = "Check vectorexts configuration in target."},
- ["api.target.exceptions"] = {description = "Check exceptions configuration in target."},
+ ["api.target.kind"] = {description = "Check kind configuration in target.", timely = true},
+ ["api.target.strip"] = {description = "Check strip configuration in target.", timely = true},
+ ["api.target.optimize"] = {description = "Check optimize configuration in target.", timely = true},
+ ["api.target.symbols"] = {description = "Check symbols configuration in target.", timely = true},
+ ["api.target.fpmodels"] = {description = "Check fpmodels configuration in target.", timely = true},
+ ["api.target.warnings"] = {description = "Check warnings configuration in target.", timely = true},
+ ["api.target.languages"] = {description = "Check languages configuration in target.", timely = true},
+ ["api.target.vectorexts"] = {description = "Check vectorexts configuration in target.", timely = true},
+ ["api.target.exceptions"] = {description = "Check exceptions configuration in target.", timely = 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."},
- ["api.target.includedirs"] = {description = "Check includedirs configuration in target."},
- ["api.target.frameworkdirs"] = {description = "Check frameworkdirs configuration in target."},
+ ["api.target.linkdirs"] = {description = "Check linkdirs configuration in target.", timely = true},
+ ["api.target.includedirs"] = {description = "Check includedirs configuration in target.", timely = true},
+ ["api.target.frameworkdirs"] = {description = "Check frameworkdirs configuration in target.", timely = 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."},
+ -- cuda checkers
+ ["cuda.devlink"] = {description = "Check devlink for targets."},
-- clang tidy checker
["clang.tidy"] = {description = "Check project code using clang-tidy.", showstats = false}
}
diff --git a/xmake/plugins/check/checkers/api/api_checker.lua b/xmake/modules/private/check/checkers/api/api_checker.lua
index 60bdeac8c..79e4809bd 100644
--- a/xmake/plugins/check/checkers/api/api_checker.lua
+++ b/xmake/modules/private/check/checkers/api/api_checker.lua
@@ -38,6 +38,25 @@ function _get_most_probable_value(value, valueset)
return result
end
+function _do_show(str, opt)
+ _g.showed = _g.showed or {}
+ local showed = _g.showed
+ local infostr
+ if str then
+ infostr = string.format("%s: %s: %s", opt.sourcetips, opt.level_tips, str)
+ else
+ infostr = string.format("%s: %s: unknown %s value '%s'", opt.sourcetips, opt.level_tips, opt.apiname, opt.value)
+ end
+ if opt.probable_value then
+ infostr = string.format("%s, it may be '%s'", infostr, opt.probable_value)
+ end
+ if not showed[infostr] then
+ cprint(infostr)
+ showed[infostr] = true
+ return true
+ end
+end
+
-- show result
function _show(apiname, value, target, opt)
opt = opt or {}
@@ -52,40 +71,70 @@ function _show(apiname, value, target, opt)
local sourceinfo = target:sourceinfo(apiname, value) or {}
local sourcetips = sourceinfo.file or ""
if sourceinfo.line then
- sourcetips = sourcetips .. ":" .. (sourceinfo.line or -1) .. ": "
+ sourcetips = sourcetips .. ":" .. (sourceinfo.line or -1)
end
if #sourcetips == 0 then
sourcetips = string.format("target(%s)", target:name())
end
- -- do show
+ -- get level tips
local level_tips = "note"
if level == "warning" then
level_tips = "${color.warning}${text.warning}${clear}"
elseif level == "error" then
level_tips = "${color.error}${text.error}${clear}"
end
+
+ -- get probable value
+ local probable_value
+ if opt.valueset then
+ probable_value = _get_most_probable_value(value, opt.valueset)
+ end
+
if apiname:endswith("s") then
apiname = apiname:sub(1, #apiname - 1)
end
- _g.showed = _g.showed or {}
- local showed = _g.showed
- local infostr
- if opt.showstr then
- infostr = string.format("%s%s: %s", sourcetips, level_tips, opt.showstr)
- else
- infostr = string.format("%s%s: unknown %s value '%s'", sourcetips, level_tips, apiname, value)
- end
- if opt.valueset then
- local probable_value = _get_most_probable_value(value, opt.valueset)
- if probable_value then
- infostr = string.format("%s, it may be '%s'", infostr, probable_value)
+
+ -- do show
+ return (opt.show or _do_show)(opt.showstr, {
+ apiname = apiname,
+ sourcetips = sourcetips,
+ level_tips = level_tips,
+ value = value,
+ probable_value = probable_value})
+end
+
+-- check target
+function _check_target(target, apiname, valueset, level, opt)
+ local target_valueset = valueset
+ if type(opt.values) == "function" then
+ local target_values = opt.values(target)
+ if target_values then
+ target_valueset = hashset.from(target_values)
end
end
- if not showed[infostr] then
- cprint(infostr)
- showed[infostr] = true
- return true
+ local values = target:get(apiname)
+ for _, value in ipairs(values) do
+ if opt.check then
+ local ok, errors = opt.check(target, value)
+ if not ok then
+ local reported = _show(apiname, value, target, {
+ show = opt.show,
+ showstr = errors,
+ level = level})
+ if reported then
+ checker.update_stats(level)
+ end
+ end
+ elseif not target_valueset:has(value) then
+ local reported = _show(apiname, value, target, {
+ show = opt.show,
+ valueset = target_valueset,
+ level = level})
+ if reported then
+ checker.update_stats(level)
+ end
+ end
end
end
@@ -99,30 +148,11 @@ function check_targets(apiname, opt)
else
valueset = hashset.new()
end
- for _, target in pairs(project.targets()) do
- local target_valueset = valueset
- if type(opt.values) == "function" then
- local target_values = opt.values(target)
- if target_values then
- target_valueset = hashset.from(target_values)
- end
- end
- local values = target:get(apiname)
- for _, value in ipairs(values) do
- if opt.check then
- local ok, errors = opt.check(target, value)
- if not ok then
- local reported = _show(apiname, value, target, {showstr = errors, level = level})
- if reported then
- checker.update_stats(level)
- end
- end
- elseif not target_valueset:has(value) then
- local reported = _show(apiname, value, target, {valueset = target_valueset, level = level})
- if reported then
- checker.update_stats(level)
- end
- end
+ if opt.target then
+ _check_target(opt.target, apiname, valueset, level, opt)
+ else
+ for _, target in pairs(project.targets()) do
+ _check_target(target, apiname, valueset, level, opt)
end
end
end
diff --git a/xmake/plugins/check/checkers/api/target/asflags.lua b/xmake/modules/private/check/checkers/api/target/asflags.lua
index ad98a329b..07de9c4ec 100644
--- a/xmake/plugins/check/checkers/api/target/asflags.lua
+++ b/xmake/modules/private/check/checkers/api/target/asflags.lua
@@ -22,12 +22,13 @@
import("core.tool.compiler")
import(".api_checker")
-function main()
- api_checker.check_targets("asflags", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("asflags", table.join(opt, {check = function(target, value)
local compinst = target:compiler("as")
if not compinst:has_flags(value) then
return false, string.format("%s: unknown assembler flag '%s'", compinst:name(), value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/cflags.lua b/xmake/modules/private/check/checkers/api/target/cflags.lua
index df9a34830..db35a7bcf 100644
--- a/xmake/plugins/check/checkers/api/target/cflags.lua
+++ b/xmake/modules/private/check/checkers/api/target/cflags.lua
@@ -22,12 +22,13 @@
import("core.tool.compiler")
import(".api_checker")
-function main()
- api_checker.check_targets("cflags", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("cflags", table.join(opt, {check = function(target, value)
local compinst = target:compiler("cc")
if not compinst:has_flags(value) then
return false, string.format("%s: unknown c compiler flag '%s'", compinst:name(), value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/configfiles.lua b/xmake/modules/private/check/checkers/api/target/configfiles.lua
index 5819278c0..a8965eebe 100644
--- a/xmake/plugins/check/checkers/api/target/configfiles.lua
+++ b/xmake/modules/private/check/checkers/api/target/configfiles.lua
@@ -21,12 +21,13 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("configfiles", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("configfiles", table.join(opt, {check = function(target, value)
local configfiles = os.files(value)
if not configfiles or #configfiles == 0 then
return false, string.format("configfiles '%s' not found", value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/cxflags.lua b/xmake/modules/private/check/checkers/api/target/cxflags.lua
index 9c8df747a..ba09366e0 100644
--- a/xmake/plugins/check/checkers/api/target/cxflags.lua
+++ b/xmake/modules/private/check/checkers/api/target/cxflags.lua
@@ -22,12 +22,13 @@
import("core.tool.compiler")
import(".api_checker")
-function main()
- api_checker.check_targets("cxflags", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("cxflags", table.join(opt, {check = function(target, value)
local compinst = target:compiler("cxx")
if not compinst:has_flags(value) then
return false, string.format("%s: unknown c/c++ compiler flag '%s'", compinst:name(), value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/cxxflags.lua b/xmake/modules/private/check/checkers/api/target/cxxflags.lua
index 6756b07d4..84660cfa4 100644
--- a/xmake/plugins/check/checkers/api/target/cxxflags.lua
+++ b/xmake/modules/private/check/checkers/api/target/cxxflags.lua
@@ -22,12 +22,13 @@
import("core.tool.compiler")
import(".api_checker")
-function main()
- api_checker.check_targets("cxxflags", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("cxxflags", table.join(opt, {check = function(target, value)
local compinst = target:compiler("cxx")
if not compinst:has_flags(value) then
return false, string.format("%s: unknown c++ compiler flag '%s'", compinst:name(), value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/exceptions.lua b/xmake/modules/private/check/checkers/api/target/exceptions.lua
index 551595e7b..e9570a894 100644
--- a/xmake/plugins/check/checkers/api/target/exceptions.lua
+++ b/xmake/modules/private/check/checkers/api/target/exceptions.lua
@@ -21,6 +21,7 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("exceptions", {values = {"none", "cxx", "objc", "no-cxx", "no-objc"}})
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("exceptions", table.join(opt, {values = {"none", "cxx", "objc", "no-cxx", "no-objc"}}))
end
diff --git a/xmake/plugins/check/checkers/api/target/files.lua b/xmake/modules/private/check/checkers/api/target/files.lua
index dfc4eda89..a523a7413 100644
--- a/xmake/plugins/check/checkers/api/target/files.lua
+++ b/xmake/modules/private/check/checkers/api/target/files.lua
@@ -21,12 +21,13 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("files", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("files", table.join(opt, {check = function(target, value)
local files = os.files(value)
if not files or #files == 0 then
return false, string.format("files '%s' not found", value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/fpmodels.lua b/xmake/modules/private/check/checkers/api/target/fpmodels.lua
index 25c6c239b..61231109e 100644
--- a/xmake/plugins/check/checkers/api/target/fpmodels.lua
+++ b/xmake/modules/private/check/checkers/api/target/fpmodels.lua
@@ -21,6 +21,7 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("fpmodels", {values = {"none", "precise", "fast", "strict", "except", "noexcept"}})
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("fpmodels", table.join(opt, {values = {"none", "precise", "fast", "strict", "except", "noexcept"}}))
end
diff --git a/xmake/plugins/check/checkers/api/target/frameworkdirs.lua b/xmake/modules/private/check/checkers/api/target/frameworkdirs.lua
index f21629fe5..088aa7114 100644
--- a/xmake/plugins/check/checkers/api/target/frameworkdirs.lua
+++ b/xmake/modules/private/check/checkers/api/target/frameworkdirs.lua
@@ -21,11 +21,12 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("frameworkdirs", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("frameworkdirs", table.join(opt, {check = function(target, value)
if not os.isdir(value) then
return false, string.format("frameworkdir '%s' not found", value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/headerfiles.lua b/xmake/modules/private/check/checkers/api/target/headerfiles.lua
index 5777f27f8..af262b91c 100644
--- a/xmake/plugins/check/checkers/api/target/headerfiles.lua
+++ b/xmake/modules/private/check/checkers/api/target/headerfiles.lua
@@ -21,13 +21,14 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("headerfiles", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("headerfiles", table.join(opt, {check = function(target, value)
value = value:gsub("[()]", "")
local headerfiles = os.files(value)
if not headerfiles or #headerfiles == 0 then
return false, string.format("headerfiles '%s' not found", value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/includedirs.lua b/xmake/modules/private/check/checkers/api/target/includedirs.lua
index 5fcafef0f..a78431fef 100644
--- a/xmake/plugins/check/checkers/api/target/includedirs.lua
+++ b/xmake/modules/private/check/checkers/api/target/includedirs.lua
@@ -21,11 +21,12 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("includedirs", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("includedirs", table.join(opt, {check = function(target, value)
if not os.isdir(value) then
return false, string.format("includedir '%s' not found", value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/installfiles.lua b/xmake/modules/private/check/checkers/api/target/installfiles.lua
index cdf0a927e..7a294f60f 100644
--- a/xmake/plugins/check/checkers/api/target/installfiles.lua
+++ b/xmake/modules/private/check/checkers/api/target/installfiles.lua
@@ -21,13 +21,14 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("installfiles", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("installfiles", table.join(opt, {check = function(target, value)
value = value:gsub("[()]", "")
local installfiles = os.files(value)
if not installfiles or #installfiles == 0 then
return false, string.format("installfiles '%s' not found", value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/kind.lua b/xmake/modules/private/check/checkers/api/target/kind.lua
index e84bf890d..127f78ad5 100644
--- a/xmake/plugins/check/checkers/api/target/kind.lua
+++ b/xmake/modules/private/check/checkers/api/target/kind.lua
@@ -21,6 +21,7 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("kind", {values = {"object", "binary", "static", "shared", "headeronly", "phony"}})
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("kind", table.join(opt, {values = {"object", "binary", "static", "shared", "headeronly", "phony"}}))
end
diff --git a/xmake/plugins/check/checkers/api/target/languages.lua b/xmake/modules/private/check/checkers/api/target/languages.lua
index 9831bc2f5..f01499225 100644
--- a/xmake/plugins/check/checkers/api/target/languages.lua
+++ b/xmake/modules/private/check/checkers/api/target/languages.lua
@@ -21,7 +21,8 @@
-- imports
import(".api_checker")
-function main()
+function main(opt)
+ opt = opt or {}
local values = {
"ansi", "c89", "c90", "c99", "c11", "c17", "clatest",
"cxx98", "cxx11", "cxx14", "cxx17", "cxx1z", "cxx20", "cxx2a", "cxx23", "cxx2b", "cxxlatest"
@@ -36,5 +37,5 @@ function main()
table.insert(languages, "gnu" .. value:sub(2))
end
end
- api_checker.check_targets("languages", {values = languages})
+ api_checker.check_targets("languages", table.join(opt, {values = languages}))
end
diff --git a/xmake/plugins/check/checkers/api/target/ldflags.lua b/xmake/modules/private/check/checkers/api/target/ldflags.lua
index efe176aa5..e06d5bb09 100644
--- a/xmake/plugins/check/checkers/api/target/ldflags.lua
+++ b/xmake/modules/private/check/checkers/api/target/ldflags.lua
@@ -22,8 +22,9 @@
import("core.tool.compiler")
import(".api_checker")
-function main()
- api_checker.check_targets("ldflags", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("ldflags", table.join(opt, {check = function(target, value)
if target:is_binary() then
local linker = target:linker()
if not linker:has_flags(value) then
@@ -31,5 +32,5 @@ function main()
end
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/linkdirs.lua b/xmake/modules/private/check/checkers/api/target/linkdirs.lua
index 3980f2eae..3f05bfa16 100644
--- a/xmake/plugins/check/checkers/api/target/linkdirs.lua
+++ b/xmake/modules/private/check/checkers/api/target/linkdirs.lua
@@ -21,11 +21,12 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("linkdirs", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("linkdirs", table.join(opt, {check = function(target, value)
if not os.isdir(value) then
return false, string.format("linkdir '%s' not found", value)
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/optimize.lua b/xmake/modules/private/check/checkers/api/target/optimize.lua
index c8bc6eb60..99731ba19 100644
--- a/xmake/plugins/check/checkers/api/target/optimize.lua
+++ b/xmake/modules/private/check/checkers/api/target/optimize.lua
@@ -21,6 +21,7 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("optimize", {values = {"none", "fast", "faster", "fastest", "smallest", "aggressive"}})
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("optimize", table.join(opt, {values = {"none", "fast", "faster", "fastest", "smallest", "aggressive"}}))
end
diff --git a/xmake/plugins/check/checkers/api/target/packages.lua b/xmake/modules/private/check/checkers/api/target/packages.lua
index e34f602db..994ea5c2a 100644
--- a/xmake/plugins/check/checkers/api/target/packages.lua
+++ b/xmake/modules/private/check/checkers/api/target/packages.lua
@@ -22,11 +22,12 @@
import("core.project.project")
import(".api_checker")
-function main()
+function main(opt)
+ opt = opt or {}
local packages = {}
local requires = project.required_packages()
if requires then
table.join2(packages, table.orderkeys(requires))
end
- api_checker.check_targets("packages", {values = packages, level = "note"})
+ api_checker.check_targets("packages", table.join(opt, {values = packages, level = "note"}))
end
diff --git a/xmake/plugins/check/checkers/api/target/shflags.lua b/xmake/modules/private/check/checkers/api/target/shflags.lua
index bb518015a..20b2f6a05 100644
--- a/xmake/plugins/check/checkers/api/target/shflags.lua
+++ b/xmake/modules/private/check/checkers/api/target/shflags.lua
@@ -22,8 +22,9 @@
import("core.tool.compiler")
import(".api_checker")
-function main()
- api_checker.check_targets("shflags", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("shflags", table.join(opt, {check = function(target, value)
if target:is_shared() then
local linker = target:linker()
if not linker:has_flags(value) then
@@ -31,5 +32,5 @@ function main()
end
end
return true
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/strip.lua b/xmake/modules/private/check/checkers/api/target/strip.lua
index cf14c607b..c6074bc12 100644
--- a/xmake/plugins/check/checkers/api/target/strip.lua
+++ b/xmake/modules/private/check/checkers/api/target/strip.lua
@@ -21,6 +21,7 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("strip", {values = {"none", "debug", "all"}})
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("strip", table.join(opt, {values = {"none", "debug", "all"}}))
end
diff --git a/xmake/plugins/check/checkers/api/target/symbols.lua b/xmake/modules/private/check/checkers/api/target/symbols.lua
index 8f4472a9b..839bd0ede 100644
--- a/xmake/plugins/check/checkers/api/target/symbols.lua
+++ b/xmake/modules/private/check/checkers/api/target/symbols.lua
@@ -21,13 +21,14 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("symbols", {values = function (target)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("symbols", table.join(opt, {values = function (target)
local values = {"none", "debug", "hidden", "hidden_cxx"}
if target:is_plat("windows") and (target:has_tool("cc", "cl") or target:has_tool("cxx", "cl")) then
table.insert(values, "edit")
table.insert(values, "embed")
end
return values
- end})
+ end}))
end
diff --git a/xmake/plugins/check/checkers/api/target/vectorexts.lua b/xmake/modules/private/check/checkers/api/target/vectorexts.lua
index dc6a1a755..77f9ee48c 100644
--- a/xmake/plugins/check/checkers/api/target/vectorexts.lua
+++ b/xmake/modules/private/check/checkers/api/target/vectorexts.lua
@@ -21,6 +21,7 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("vectorexts", {values = {"none", "sse", "sse2", "sse3", "ssse3", "avx", "avx2", "neon"}})
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("vectorexts", table.join(opt, {values = {"none", "sse", "sse2", "sse3", "ssse3", "avx", "avx2", "neon"}}))
end
diff --git a/xmake/plugins/check/checkers/api/target/version.lua b/xmake/modules/private/check/checkers/api/target/version.lua
index e476cd8d4..889864f5b 100644
--- a/xmake/plugins/check/checkers/api/target/version.lua
+++ b/xmake/modules/private/check/checkers/api/target/version.lua
@@ -22,8 +22,9 @@
import("core.base.semver")
import(".api_checker")
-function main()
- api_checker.check_targets("version", {check = function(target, value)
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("version", table.join(opt, {check = function(target, value)
local errors
local ok = try {
function()
@@ -37,5 +38,5 @@ function main()
}
}
return ok, errors
- end, level = "error"})
+ end, level = "error"}))
end
diff --git a/xmake/plugins/check/checkers/api/target/warnings.lua b/xmake/modules/private/check/checkers/api/target/warnings.lua
index 2d2159e91..4e6cf5794 100644
--- a/xmake/plugins/check/checkers/api/target/warnings.lua
+++ b/xmake/modules/private/check/checkers/api/target/warnings.lua
@@ -21,6 +21,7 @@
-- imports
import(".api_checker")
-function main()
- api_checker.check_targets("warnings", {values = {"none", "less", "more", "all", "allextra", "everything", "error"}})
+function main(opt)
+ opt = opt or {}
+ api_checker.check_targets("warnings", table.join(opt, {values = {"none", "less", "more", "all", "allextra", "everything", "error"}}))
end
diff --git a/xmake/plugins/check/checkers/clang/tidy.lua b/xmake/modules/private/check/checkers/clang/tidy.lua
index 9b0d9b21e..9b0d9b21e 100644
--- a/xmake/plugins/check/checkers/clang/tidy.lua
+++ b/xmake/modules/private/check/checkers/clang/tidy.lua
diff --git a/xmake/modules/private/check/checkers/cuda/devlink.lua b/xmake/modules/private/check/checkers/cuda/devlink.lua
new file mode 100644
index 000000000..4281b5a8d
--- /dev/null
+++ b/xmake/modules/private/check/checkers/cuda/devlink.lua
@@ -0,0 +1,54 @@
+--!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, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file devlink.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.project.project")
+
+-- https://github.com/xmake-io/xmake/issues/1976#issuecomment-1427378799
+function _check_target(target, opt)
+ if target:is_binary() then
+ local sourcebatches = target:sourcebatches()
+ if sourcebatches and not sourcebatches["cuda.build"] then
+ for _, dep in ipairs(target:orderdeps()) do
+ if dep:is_static() then
+ sourcebatches = dep:sourcebatches()
+ if sourcebatches and sourcebatches["cuda.build"] then
+ local devlink = dep:policy("build.cuda.devlink") or dep:values("cuda.build.devlink")
+ if not devlink then
+ wprint('target(%s)${clear}: cuda device link is not performed! specify set_policy("build.cuda.devlink", true) to enable it', dep:name())
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function main(opt)
+ if opt.target then
+ _check_target(opt.target, opt)
+ else
+ for _, target in pairs(project.targets()) do
+ _check_target(target, opt)
+ end
+ end
+end
+
diff --git a/xmake/plugins/check/main.lua b/xmake/plugins/check/main.lua
index 9ec6d03fd..5ee89ae3e 100644
--- a/xmake/plugins/check/main.lua
+++ b/xmake/plugins/check/main.lua
@@ -22,7 +22,7 @@
import("core.base.option")
import("core.base.text")
import("core.project.config")
-import("checker")
+import("private.check.checker")
-- show checkers list
function _show_list()
@@ -80,7 +80,7 @@ function _check(group_or_name, arguments)
if showstats == nil and info and info.showstats ~= nil then
showstats = info.showstats
end
- import("checkers." .. name, {anonymous = true})(arguments)
+ import("private.check.checkers." .. name, {anonymous = true})(arguments)
end
if showstats ~= false then
checker.show_stats()
diff --git a/xmake/plugins/check/xmake.lua b/xmake/plugins/check/xmake.lua
index d4a7dc19a..08b4cf87d 100644
--- a/xmake/plugins/check/xmake.lua
+++ b/xmake/plugins/check/xmake.lua
@@ -35,7 +35,7 @@ task("check")
"",
"The supported checkers list:",
values = function (complete, opt)
- return import("plugins.check.checker", {rootdir = os.programdir()}).complete(complete, opt)
+ return import("private.check.checker").complete(complete, opt)
end},
{nil, "arguments", "vs", nil, "Set the checker arguments.",
"e.g.",
diff --git a/xmake/plugins/project/cmake/cmakelists.lua b/xmake/plugins/project/cmake/cmakelists.lua
index 945b280bd..b3d614985 100644
--- a/xmake/plugins/project/cmake/cmakelists.lua
+++ b/xmake/plugins/project/cmake/cmakelists.lua
@@ -345,7 +345,7 @@ function _add_target_sources(cmakelists, target, outputdir)
cmakelists:print(")")
if has_cuda then
cmakelists:print("set_target_properties(%s PROPERTIES CUDA_SEPARABLE_COMPILATION ON)", target:name())
- local devlink = target:values("cuda.build.devlink")
+ local devlink = target:policy("build.cuda.devlink") or target:values("cuda.build.devlink")
if devlink ~= nil then
cmakelists:print("set_target_properties(%s PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS %s)", target:name(), devlink and "ON" or "OFF")
end
diff --git a/xmake/plugins/project/vstudio/impl/vs201x.lua b/xmake/plugins/project/vstudio/impl/vs201x.lua
index 3ba257720..4811a0f74 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x.lua
@@ -316,7 +316,7 @@ function _make_targetinfo(mode, arch, target, vcxprojdir)
targetinfo.culinkflags = linkinst:linkflags({target = target})
-- save cuda devlink status
- targetinfo.cudevlink = target:values("cuda.build.devlink")
+ targetinfo.cudevlink = target:policy("build.cuda.devlink") or target:values("cuda.build.devlink")
end
-- save execution dir (when executed from VS)
diff --git a/xmake/rules/cuda/devlink/xmake.lua b/xmake/rules/cuda/devlink/xmake.lua
index da3bf8aef..0e0a513df 100644
--- a/xmake/rules/cuda/devlink/xmake.lua
+++ b/xmake/rules/cuda/devlink/xmake.lua
@@ -37,7 +37,10 @@ rule("cuda.build.devlink")
import("utils.progress")
-- disable devlink?
- local devlink = target:values("cuda.build.devlink")
+ --
+ -- @note cuda.build.devlink value will be deprecated
+ --
+ local devlink = target:policy("build.cuda.devlink") or target:values("cuda.build.devlink")
if devlink == false then
return
end
diff --git a/xmake/rules/cuda/env/xmake.lua b/xmake/rules/cuda/env/xmake.lua
index d36482901..cb4833dd3 100644
--- a/xmake/rules/cuda/env/xmake.lua
+++ b/xmake/rules/cuda/env/xmake.lua
@@ -23,7 +23,6 @@ rule("cuda.env")
on_load(function (target)
import("detect.sdks.find_cuda")
-
local cuda = assert(find_cuda(nil, {verbose = true}), "Cuda SDK not found!")
if cuda then
target:data_set("cuda", cuda)
diff --git a/xmake/rules/utils/check_targets/check_targets.lua b/xmake/rules/utils/check_targets/check_targets.lua
deleted file mode 100644
index a5073cfa0..000000000
--- a/xmake/rules/utils/check_targets/check_targets.lua
+++ /dev/null
@@ -1,39 +0,0 @@
---!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, TBOOX Open Source Group.
---
--- @author ruki
--- @file check_targets.lua
---
-
--- get values from target
-function _get_values_from_target(target, name)
- local values = table.wrap(target:get(name))
- table.join2(values, target:get_from_opts(name))
- table.join2(values, target:get_from_pkgs(name))
- return values
-end
-
--- main entry
-function main(target)
- for _, name in ipairs({"includedirs", "frameworkdirs", "linkdirs"}) do
- for _, value in ipairs(_get_values_from_target(target, name)) do
- if not os.isdir(value) then
- local sourceinfo = target:sourceinfo(name, value) or {}
- wprint("%s:%d: %s '%s' not found in %s(%s)", sourceinfo.file or "", sourceinfo.line or -1, name, value, target:type(), target:name())
- end
- end
- end
-end
diff --git a/xmake/rules/utils/check_targets/checker.lua b/xmake/rules/utils/check_targets/checker.lua
new file mode 100644
index 000000000..f752f9149
--- /dev/null
+++ b/xmake/rules/utils/check_targets/checker.lua
@@ -0,0 +1,50 @@
+--!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, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file check_targets.lua
+--
+
+import("private.check.checker")
+
+function _show(str, opt)
+ _g.showed = _g.showed or {}
+ local showed = _g.showed
+ local infostr
+ if str then
+ infostr = string.format("%s${clear}: %s", opt.sourcetips, str)
+ else
+ infostr = string.format("%s${clear}: unknown %s value '%s'", opt.sourcetips, opt.apiname, opt.value)
+ end
+ if opt.probable_value then
+ infostr = string.format("%s, it may be '%s'", infostr, opt.probable_value)
+ end
+ if not showed[infostr] then
+ wprint(infostr)
+ showed[infostr] = true
+ end
+end
+
+function check_target(target)
+ local checkers = checker.checkers()
+ for name, info in table.orderpairs(checkers) do
+ -- just do some faster checkers
+ if info.timely then
+ import("private.check.checkers." .. name, {anonymous = true, rootdir = os.programdir()})({
+ target = target, show = _show})
+ end
+ end
+end
diff --git a/xmake/rules/utils/check_targets/xmake.lua b/xmake/rules/utils/check_targets/xmake.lua
index c14d4854e..35f58bc37 100644
--- a/xmake/rules/utils/check_targets/xmake.lua
+++ b/xmake/rules/utils/check_targets/xmake.lua
@@ -18,7 +18,8 @@
-- @file xmake.lua
--
--- define rule: utils.check.targets
rule("utils.check.targets")
- before_build("check_targets")
+ before_build(function (target)
+ import("checker").check_target(target)
+ end)