From 122cab1f1e53b7c9c7cd82905b962071f9bad9dc Mon Sep 17 00:00:00 2001 From: Brendan Le Foll Date: Tue, 13 Sep 2016 11:45:48 +0100 Subject: [PATCH] cmake: Add lots of fancy warnings to CC/CXX and make cmake check they exist Thanks to Dan Liew for cmake work in fpbench that this is copied from Signed-off-by: Brendan Le Foll --- CMakeLists.txt | 66 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7083c91..8cb4f37 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,70 @@ cmake_minimum_required (VERSION 2.8) -project (mraa C) +project (mraa C CXX) FIND_PACKAGE (Threads REQUIRED) -set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -fno-omit-frame-pointer ") -set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall ") +############################################################################### +# Detect supported warning flags +# Modified from work By Dan Liew (fpbench - MIT) +# https://github.com/delcypher/fp-bench/blob/master/CMakeLists.txt +############################################################################### +# Warnings for both the C and C++ compiler + +set (MRAA_BOTH_WARNING_FLAGS + -Wall + -Werror=main + -Wformat + -Wmain + -Wuninitialized + -Winit-self +) + +# Warning flags for the C compiler only +set (MRAA_C_WARNING_FLAGS + -Werror=implicit + -Werror=missing-parameter-type +) + +# Warning flags for the C++ compiler only +set (MRAA_CXX_WARNING_FLAGS + -Wnon-virtual-dtor + -Woverloaded-virtual + -Wreorder +) + +include (CheckCCompilerFlag) +include (CheckCXXCompilerFlag) +function (MRAA_SANITIZE_FLAG_NAME OUTPUT_VAR FLAG) + string (REPLACE "-" "_" SANITIZED_FLAG_NAME "${FLAG}") + string (REPLACE "/" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") + string (REPLACE "=" "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") + string (REPLACE " " "_" SANITIZED_FLAG_NAME "${SANITIZED_FLAG_NAME}") + set (${OUTPUT_VAR} "${SANITIZED_FLAG_NAME}" PARENT_SCOPE) +endfunction () + +# Globally set C compiler warning flags that are supported and emit +# a warning about unsupported flags +foreach (flag ${MRAA_BOTH_WARNING_FLAGS} ${MRAA_C_WARNING_FLAGS}) + MRAA_SANITIZE_FLAG_NAME(SANITIZED_FLAG_NAME "${flag}") + CHECK_C_COMPILER_FLAG("${flag}" HAS_C_${SANITIZED_FLAG_NAME}) + if (HAS_C_${SANITIZED_FLAG_NAME}) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") + else () + message (WARNING "C compiler does not support flag \"${flag}\"") + endif () +endforeach () + +# Globally set C++ compiler warning flags that are supported and emit +# a warning about unsupported flags +foreach (flag ${MRAA_BOTH_WARNING_FLAGS} ${MRAA_CXX_WARNING_FLAGS}) + MRAA_SANITIZE_FLAG_NAME (SANITIZED_FLAG_NAME "${flag}") + CHECK_CXX_COMPILER_FLAG ("${flag}" HAS_CXX_${SANITIZED_FLAG_NAME}) + if (HAS_CXX_${SANITIZED_FLAG_NAME}) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") + else () + message (WARNING "C++ compiler does not support flag \"${flag}\"") + endif () +endforeach () # Set CMAKE_INSTALL_LIBDIR if not defined include(GNUInstallDirs)