From a40a2706a9c7aff4ed883659a56354c3b31d1b32 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Sun, 29 Oct 2017 07:37:18 +0100 Subject: [PATCH] cmake: add support for include-what-you-use to check #include's The output is currently very verbose and includes many false positives. Adding a mapping file should solve this. See https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUMappings.md --- cmake/ctest/experimental_script.ctest | 2 +- cmake/modules/FindIncludeWhatYouUse.cmake | 29 +++++++++++++++++++++++ cmake_configure.cmake | 15 ++++++++++++ cmake_options.cmake | 4 +++- rwengine/CMakeLists.txt | 2 ++ rwgame/CMakeLists.txt | 2 ++ rwlib/CMakeLists.txt | 2 ++ rwviewer/CMakeLists.txt | 2 ++ tests/CMakeLists.txt | 2 ++ 9 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 cmake/modules/FindIncludeWhatYouUse.cmake diff --git a/cmake/ctest/experimental_script.ctest b/cmake/ctest/experimental_script.ctest index 8120b2f2..6447baa1 100644 --- a/cmake/ctest/experimental_script.ctest +++ b/cmake/ctest/experimental_script.ctest @@ -23,7 +23,7 @@ set(CTEST_BUILD_NAME "experimental_script-${SHORT_COMMIT}") ctest_start("Experimental") ctest_configure( OPTIONS - "-DBUILD_VIEWER=1;-DBUILD_TESTS=1;-DTEST_COVERAGE=1;-DRW_VERBOSE_DEBUG_MESSAGES=1;-DSEPERATE_TEST_SUITES=1" + "-DBUILD_VIEWER=1;-DBUILD_TESTS=1;-DTEST_COVERAGE=1;-DRW_VERBOSE_DEBUG_MESSAGES=1;-DSEPERATE_TEST_SUITES=1;-DCHECK_INCLUDES=1" ) ctest_build() ctest_test() diff --git a/cmake/modules/FindIncludeWhatYouUse.cmake b/cmake/modules/FindIncludeWhatYouUse.cmake new file mode 100644 index 00000000..1d7af28c --- /dev/null +++ b/cmake/modules/FindIncludeWhatYouUse.cmake @@ -0,0 +1,29 @@ +find_program( + INCLUDE_WHAT_YOU_USE_PROGRAM + NAMES include_what_you_use iwyu +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(IncludeWhatYouUse + REQUIRED_VARS + INCLUDE_WHAT_YOU_USE_PROGRAM + ) + +if(INCLUDEWHATYOUUSE_FOUND) + include(CMakeParseArguments) + + function(iwyu_check) + cmake_parse_arguments("IWYU" "" "TARGET" "EXTRA_OPTS" ${ARGN}) + set(IWYU_CMD "${INCLUDE_WHAT_YOU_USE_PROGRAM}") + foreach(OPT ${IWYU_EXTRA_OPTS}) + list(APPEND IWYU_CMD "-Xiwyu" ${OPT}) + endforeach() + set_target_properties("${IWYU_TARGET}" + PROPERTIES + C_INCLUDE_WHAT_YOU_USE + "${IWYU_CMD}" + CXX_INCLUDE_WHAT_YOU_USE + "${IWYU_CMD}" + ) + endfunction() +endif() diff --git a/cmake_configure.cmake b/cmake_configure.cmake index a8cfb11b..15826dbe 100644 --- a/cmake_configure.cmake +++ b/cmake_configure.cmake @@ -90,3 +90,18 @@ if(TEST_COVERAGE) gcov ) endif() + +include(CMakeParseArguments) + +if(CHECK_INCLUDES) + find_package(IncludeWhatYouUse REQUIRED) +endif() + +function(openrw_target_apply_options) + cmake_parse_arguments("OPENRW_APPLY" "" "TARGET" "" ${ARGN}) + if(CHECK_INCLUDES) + iwyu_check(TARGET "${OPENRW_APPLY_TARGET}" + EXTRA_OPTS + ) + endif() +endfunction() diff --git a/cmake_options.cmake b/cmake_options.cmake index f7235f61..6d122135 100644 --- a/cmake_options.cmake +++ b/cmake_options.cmake @@ -15,8 +15,10 @@ set(BIN_DIR "bin" CACHE STRING "Prefix subdirectory to put the binaries in.") set(DOC_DIR "share/doc/openrw" CACHE STRING "Prefix subdirectory to put the documentation in.") if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: Debug Release") + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: Debug Release") endif() +option(CHECK_INCLUDES "Analyze #includes in C and C++ source files") + option(TEST_COVERAGE "Enable coverage analysis (implies CMAKE_BUILD_TYPE=Debug)") option(SEPERATE_TEST_SUITES "Add each test suite as seperate test") diff --git a/rwengine/CMakeLists.txt b/rwengine/CMakeLists.txt index 9caacfbf..e07f222a 100644 --- a/rwengine/CMakeLists.txt +++ b/rwengine/CMakeLists.txt @@ -158,3 +158,5 @@ target_include_directories(rwengine PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src" ) + +openrw_target_apply_options(TARGET rwengine) diff --git a/rwgame/CMakeLists.txt b/rwgame/CMakeLists.txt index d76ffd97..45e41842 100644 --- a/rwgame/CMakeLists.txt +++ b/rwgame/CMakeLists.txt @@ -63,4 +63,6 @@ target_link_libraries(rwgame SDL2::SDL2 ) +openrw_target_apply_options(TARGET rwgame) + install(TARGETS rwgame RUNTIME DESTINATION "${BIN_DIR}") diff --git a/rwlib/CMakeLists.txt b/rwlib/CMakeLists.txt index e829d6f5..64380d6e 100644 --- a/rwlib/CMakeLists.txt +++ b/rwlib/CMakeLists.txt @@ -61,3 +61,5 @@ target_link_libraries(rwlib ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ) + +openrw_target_apply_options(TARGET rwlib) diff --git a/rwviewer/CMakeLists.txt b/rwviewer/CMakeLists.txt index b3f04694..6c5feacd 100644 --- a/rwviewer/CMakeLists.txt +++ b/rwviewer/CMakeLists.txt @@ -31,6 +31,8 @@ target_link_libraries(rwviewer Qt5::Widgets ) +openrw_target_apply_options(TARGET rwviewer) + install(TARGETS rwviewer RUNTIME DESTINATION "${BIN_DIR}" ) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fbfd31b0..bf9cbbba 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -86,6 +86,8 @@ target_link_libraries(run_tests ${Boost_SYSTEM_LIBRARY} ) +openrw_target_apply_options(TARGET run_tests) + if(SEPERATE_TEST_SUITES) foreach(TEST ${TESTS}) add_test(