Add options to run include-what-you-use with the compiler
Create a <LANG>_INCLUDE_WHAT_YOU_USE target property (initialized by a CMAKE_<LANG>_INCLUDE_WHAT_YOU_USE variable) to specify an IWYU command line to be run along with the compiler.
This commit is contained in:
parent
67fa3da9e8
commit
ada5ffce7b
|
@ -177,6 +177,7 @@ Properties on Targets
|
||||||
/prop_tgt/JOB_POOL_COMPILE
|
/prop_tgt/JOB_POOL_COMPILE
|
||||||
/prop_tgt/JOB_POOL_LINK
|
/prop_tgt/JOB_POOL_LINK
|
||||||
/prop_tgt/LABELS
|
/prop_tgt/LABELS
|
||||||
|
/prop_tgt/LANG_INCLUDE_WHAT_YOU_USE
|
||||||
/prop_tgt/LANG_VISIBILITY_PRESET
|
/prop_tgt/LANG_VISIBILITY_PRESET
|
||||||
/prop_tgt/LIBRARY_OUTPUT_DIRECTORY_CONFIG
|
/prop_tgt/LIBRARY_OUTPUT_DIRECTORY_CONFIG
|
||||||
/prop_tgt/LIBRARY_OUTPUT_DIRECTORY
|
/prop_tgt/LIBRARY_OUTPUT_DIRECTORY
|
||||||
|
|
|
@ -235,6 +235,7 @@ Variables that Control the Build
|
||||||
/variable/CMAKE_INSTALL_NAME_DIR
|
/variable/CMAKE_INSTALL_NAME_DIR
|
||||||
/variable/CMAKE_INSTALL_RPATH
|
/variable/CMAKE_INSTALL_RPATH
|
||||||
/variable/CMAKE_INSTALL_RPATH_USE_LINK_PATH
|
/variable/CMAKE_INSTALL_RPATH_USE_LINK_PATH
|
||||||
|
/variable/CMAKE_LANG_INCLUDE_WHAT_YOU_USE
|
||||||
/variable/CMAKE_LANG_VISIBILITY_PRESET
|
/variable/CMAKE_LANG_VISIBILITY_PRESET
|
||||||
/variable/CMAKE_LIBRARY_OUTPUT_DIRECTORY
|
/variable/CMAKE_LIBRARY_OUTPUT_DIRECTORY
|
||||||
/variable/CMAKE_LIBRARY_OUTPUT_DIRECTORY_CONFIG
|
/variable/CMAKE_LIBRARY_OUTPUT_DIRECTORY_CONFIG
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
<LANG>_INCLUDE_WHAT_YOU_USE
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
This property is implemented only when ``<LANG>`` is ``C`` or ``CXX``.
|
||||||
|
|
||||||
|
Specify a :ref:`;-list <CMake Language Lists>` containing a command
|
||||||
|
line for the ``include-what-you-use`` tool. The :ref:`Makefile Generators`
|
||||||
|
and the :generator:`Ninja` generator will run this tool along with the
|
||||||
|
compiler and report a warning if the tool reports any problems.
|
||||||
|
|
||||||
|
This property is initialized by the value of
|
||||||
|
the :variable:`CMAKE_<LANG>_INCLUDE_WHAT_YOU_USE` variable if it is set
|
||||||
|
when a target is created.
|
|
@ -0,0 +1,8 @@
|
||||||
|
run-include-what-you-use
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
* The :ref:`Makefile Generators` and the :generator:`Ninja` generator
|
||||||
|
learned to optionally run ``include-what-you-use`` along with the
|
||||||
|
compiler for ``C`` and ``CXX`` languages. See the
|
||||||
|
:variable:`CMAKE_<LANG>_INCLUDE_WHAT_YOU_USE` variable and
|
||||||
|
:prop_tgt:`<LANG>_INCLUDE_WHAT_YOU_USE` target property for details.
|
|
@ -0,0 +1,6 @@
|
||||||
|
CMAKE_<LANG>_INCLUDE_WHAT_YOU_USE
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
Default value for :prop_tgt:`<LANG>_INCLUDE_WHAT_YOU_USE` target property.
|
||||||
|
This variable is used to initialize the property on each target as it is
|
||||||
|
created. This is done only when ``<LANG>`` is ``C`` or ``CXX``.
|
|
@ -768,6 +768,20 @@ cmMakefileTargetGenerator
|
||||||
this->LocalGenerator->ExpandRuleVariables(*i, vars);
|
this->LocalGenerator->ExpandRuleVariables(*i, vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Maybe insert an include-what-you-use runner.
|
||||||
|
if (!compileCommands.empty() && (lang == "C" || lang == "CXX"))
|
||||||
|
{
|
||||||
|
std::string const iwyu_prop = lang + "_INCLUDE_WHAT_YOU_USE";
|
||||||
|
const char *iwyu = this->Target->GetProperty(iwyu_prop);
|
||||||
|
if (iwyu && *iwyu)
|
||||||
|
{
|
||||||
|
std::string run_iwyu = "$(CMAKE_COMMAND) -E __run_iwyu --iwyu=";
|
||||||
|
run_iwyu += this->LocalGenerator->EscapeForShell(iwyu);
|
||||||
|
run_iwyu += " -- ";
|
||||||
|
compileCommands.front().insert(0, run_iwyu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Change the command working directory to the local build tree.
|
// Change the command working directory to the local build tree.
|
||||||
this->LocalGenerator->CreateCDCommand
|
this->LocalGenerator->CreateCDCommand
|
||||||
(compileCommands,
|
(compileCommands,
|
||||||
|
|
|
@ -458,6 +458,23 @@ cmNinjaTargetGenerator
|
||||||
std::vector<std::string> compileCmds;
|
std::vector<std::string> compileCmds;
|
||||||
cmSystemTools::ExpandListArgument(compileCmd, compileCmds);
|
cmSystemTools::ExpandListArgument(compileCmd, compileCmds);
|
||||||
|
|
||||||
|
// Maybe insert an include-what-you-use runner.
|
||||||
|
if (!compileCmds.empty() && (lang == "C" || lang == "CXX"))
|
||||||
|
{
|
||||||
|
std::string const iwyu_prop = lang + "_INCLUDE_WHAT_YOU_USE";
|
||||||
|
const char *iwyu = this->Target->GetProperty(iwyu_prop);
|
||||||
|
if (iwyu && *iwyu)
|
||||||
|
{
|
||||||
|
std::string run_iwyu =
|
||||||
|
this->GetLocalGenerator()->ConvertToOutputFormat(
|
||||||
|
cmSystemTools::GetCMakeCommand(), cmLocalGenerator::SHELL);
|
||||||
|
run_iwyu += " -E __run_iwyu --iwyu=";
|
||||||
|
run_iwyu += this->GetLocalGenerator()->EscapeForShell(iwyu);
|
||||||
|
run_iwyu += " -- ";
|
||||||
|
compileCmds.front().insert(0, run_iwyu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!compileCmds.empty())
|
if (!compileCmds.empty())
|
||||||
{
|
{
|
||||||
compileCmds.front().insert(0, cldeps);
|
compileCmds.front().insert(0, cldeps);
|
||||||
|
|
|
@ -333,9 +333,11 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
||||||
this->SetPropertyDefault("MACOSX_BUNDLE", 0);
|
this->SetPropertyDefault("MACOSX_BUNDLE", 0);
|
||||||
this->SetPropertyDefault("MACOSX_RPATH", 0);
|
this->SetPropertyDefault("MACOSX_RPATH", 0);
|
||||||
this->SetPropertyDefault("NO_SYSTEM_FROM_IMPORTED", 0);
|
this->SetPropertyDefault("NO_SYSTEM_FROM_IMPORTED", 0);
|
||||||
|
this->SetPropertyDefault("C_INCLUDE_WHAT_YOU_USE", 0);
|
||||||
this->SetPropertyDefault("C_STANDARD", 0);
|
this->SetPropertyDefault("C_STANDARD", 0);
|
||||||
this->SetPropertyDefault("C_STANDARD_REQUIRED", 0);
|
this->SetPropertyDefault("C_STANDARD_REQUIRED", 0);
|
||||||
this->SetPropertyDefault("C_EXTENSIONS", 0);
|
this->SetPropertyDefault("C_EXTENSIONS", 0);
|
||||||
|
this->SetPropertyDefault("CXX_INCLUDE_WHAT_YOU_USE", 0);
|
||||||
this->SetPropertyDefault("CXX_STANDARD", 0);
|
this->SetPropertyDefault("CXX_STANDARD", 0);
|
||||||
this->SetPropertyDefault("CXX_STANDARD_REQUIRED", 0);
|
this->SetPropertyDefault("CXX_STANDARD_REQUIRED", 0);
|
||||||
this->SetPropertyDefault("CXX_EXTENSIONS", 0);
|
this->SetPropertyDefault("CXX_EXTENSIONS", 0);
|
||||||
|
|
|
@ -241,3 +241,8 @@ if(CMAKE_OSX_ARCHITECTURES AND XCODE AND NOT "${XCODE_VERSION}" MATCHES "^[^12]"
|
||||||
PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CFG_INTDIR}"
|
PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CFG_INTDIR}"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if("${CMAKE_GENERATOR}" MATCHES "Make|Ninja")
|
||||||
|
add_executable(pseudo_iwyu pseudo_iwyu.c)
|
||||||
|
add_RunCMake_test(IncludeWhatYouUse -DPSEUDO_IWYU=$<TARGET_FILE:pseudo_iwyu>)
|
||||||
|
endif()
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
Warning: include-what-you-use reported diagnostics:
|
||||||
|
should add these lines:
|
||||||
|
*
|
||||||
|
#include <\.\.\.>
|
|
@ -0,0 +1,3 @@
|
||||||
|
enable_language(C)
|
||||||
|
set(CMAKE_C_INCLUDE_WHAT_YOU_USE "${PSEUDO_IWYU}" -some -args)
|
||||||
|
add_executable(main main.c)
|
|
@ -0,0 +1,3 @@
|
||||||
|
cmake_minimum_required(VERSION 3.2)
|
||||||
|
project(${RunCMake_TEST} NONE)
|
||||||
|
include(${RunCMake_TEST}.cmake)
|
|
@ -0,0 +1,4 @@
|
||||||
|
Warning: include-what-you-use reported diagnostics:
|
||||||
|
should add these lines:
|
||||||
|
*
|
||||||
|
#include <\.\.\.>
|
|
@ -0,0 +1,3 @@
|
||||||
|
enable_language(CXX)
|
||||||
|
set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "${PSEUDO_IWYU}" -some -args)
|
||||||
|
add_executable(main main.cxx)
|
|
@ -0,0 +1,18 @@
|
||||||
|
include(RunCMake)
|
||||||
|
|
||||||
|
set(RunCMake_TEST_OPTIONS "-DPSEUDO_IWYU=${PSEUDO_IWYU}")
|
||||||
|
|
||||||
|
function(run_iwyu lang)
|
||||||
|
# Use a single build tree for tests without cleaning.
|
||||||
|
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${lang}-build)
|
||||||
|
set(RunCMake_TEST_NO_CLEAN 1)
|
||||||
|
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
|
||||||
|
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
|
||||||
|
run_cmake(${lang})
|
||||||
|
|
||||||
|
set(RunCMake_TEST_OUTPUT_MERGE 1)
|
||||||
|
run_cmake_command(${lang}-Build ${CMAKE_COMMAND} --build .)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
run_iwyu(C)
|
||||||
|
run_iwyu(CXX)
|
|
@ -0,0 +1 @@
|
||||||
|
int main(void) { return 0; }
|
|
@ -0,0 +1 @@
|
||||||
|
int main() { return 0; }
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "should add these lines:\n#include <...>\n");
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue