-
-
Notifications
You must be signed in to change notification settings - Fork 621
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add clangtidy for gmake2 #2247
base: master
Are you sure you want to change the base?
Add clangtidy for gmake2 #2247
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -60,7 +60,13 @@ | |
fileExtension { ".cc", ".cpp", ".cxx", ".mm" } | ||
buildoutputs { "$(OBJDIR)/%{file.objname}.o" } | ||
buildmessage '$(notdir $<)' | ||
buildcommands {'$(CXX) %{premake.modules.gmake2.cpp.fileFlags(cfg, file)} $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<"'} | ||
buildcommands { | ||
-- code checking must be before the build, so that if the code checking | ||
-- fails, the build is not completed, and hence, a re-run will trigger | ||
-- the code check again. | ||
'$(CLANG_TIDY) "$<" -- %{premake.modules.gmake2.cpp.fileFlags(cfg, file)} $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<"', | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
'$(CXX) %{premake.modules.gmake2.cpp.fileFlags(cfg, file)} $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<"' | ||
} | ||
|
||
rule 'cc' | ||
fileExtension {".c", ".s", ".m"} | ||
|
@@ -326,6 +332,7 @@ | |
cpp.cppFlags, | ||
cpp.cFlags, | ||
cpp.cxxFlags, | ||
cpp.clangtidy, | ||
cpp.resFlags, | ||
cpp.libs, | ||
cpp.ldDeps, | ||
|
@@ -425,6 +432,13 @@ | |
p.outln('ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CPPFLAGS)' .. flags) | ||
end | ||
|
||
function cpp.clangtidy(cfg, toolset) | ||
if cfg.clangtidy ~= nil then | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "Off" (or false if there is some translation phases for that parameter) would wrongly enter in that case. |
||
p.outln('CLANG_TIDY = clang-tidy') | ||
else | ||
p.outln('CLANG_TIDY = \\#') | ||
end | ||
end | ||
|
||
function cpp.resFlags(cfg, toolset) | ||
local resflags = table.join(toolset.getdefines(cfg.resdefines), toolset.getincludedirs(cfg, cfg.resincludedirs), cfg.resoptions) | ||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,45 @@ | ||||||
-- | ||||||
-- test_gmake2_clangtidy.lua | ||||||
-- Test ClangTidy support in Makefiles. | ||||||
-- | ||||||
|
||||||
local suite = test.declare("gmake2_clangtidy") | ||||||
local gmake2 = premake.modules.gmake2 | ||||||
|
||||||
local wks, prj, cfg | ||||||
|
||||||
function suite.setup() | ||||||
wks = workspace("MyWorkspace") | ||||||
configurations { "Debug", "Release" } | ||||||
targetname "blink" | ||||||
kind "StaticLib" | ||||||
language "C++" | ||||||
prj = test.createProject(wks) | ||||||
end | ||||||
|
||||||
local function prepare() | ||||||
wks = test.getWorkspace(wks) | ||||||
prj = test.getproject(wks, 1) | ||||||
cfg = test.getconfig(prj, "Debug") | ||||||
gmake2.cpp.clangtidy(cfg, toolset) | ||||||
files { "src/hello.cpp", "src/hello2.c" } | ||||||
|
||||||
end | ||||||
|
||||||
function suite.clangtidyOn() | ||||||
clangtidy "On" | ||||||
|
||||||
prepare() | ||||||
|
||||||
test.capture [[ | ||||||
CLANG_TIDY = clang-tidy | ||||||
]] | ||||||
end | ||||||
|
||||||
function suite.clangtidyOff() | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
currently, and you might add a dedicated test for |
||||||
prepare() | ||||||
|
||||||
test.capture [[ | ||||||
CLANG_TIDY = \# | ||||||
]] | ||||||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How difficult would it be to make it so this isn't emitted when clang-tidy isn't requested, rather than always emitting and just "ignoring" it sometimes?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@nickclark2016 : I knew someone would ask this question, so I already pre-empted the answer in my original PR description: Unfortunately, at the point where the rules are decided, we do not have access to the value of the clangtidy property. You can see it here in this function, there is no information to play with. And then we have other issues as well like turning clang tidy on/off depending on the project configuration.
Then again, I am an outsider to the premake team, you probably know more about the code and can suggest better.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From "
rule
" point of view, we would needrule 'cpp'
andrule 'cpp_with_clang_tidy'
fileExtensions
and do the dispatch "manually".There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you please give some psuedo code to explain what you are saying? I'm not sure I understand.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mix with customcommand as fileextension cannot be removed...
Idea is to customize rule to handle clangtidy:
if you read https://premake.github.io/docs/Custom-Rules/
we might add
propertydefinition
to handle clangtidy, then we have to activate that property for eachfilecfg
with clangtidy.Not sure at which point it is doable without hack.
I will try to add clang-tidy support to premake-ninja, but it doesn't use (premake)
rule
internally but has "intrinsic" rule.Above (adapted) method should do the trick for me.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see. This sounds very messy. Not sure if there is an acceptable solution.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds like there is no elegant fix for adding clang tidy for gmake2. It was fun trying to get it to work but no worries, feel free to close this PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I succeeded with ninja, and failed with gmake currently (to have a correct per-file per-config)
Some features are already partially working (per-file not taken into account for some generator).
Might be better to have partial working solution than no solution at all...
BTW, I will see if I can improve your PR with my suggestion.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Awesome, thanks!