From 88e7dc0526611a982cb36784bd0edce67bc9ff1c Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Sun, 13 Dec 2020 16:11:53 +0100 Subject: [PATCH 1/2] Add CMake helper for GNU warnings --- cmake/GNUWarnings.cmake | 94 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 cmake/GNUWarnings.cmake diff --git a/cmake/GNUWarnings.cmake b/cmake/GNUWarnings.cmake new file mode 100644 index 00000000..62362ed2 --- /dev/null +++ b/cmake/GNUWarnings.cmake @@ -0,0 +1,94 @@ +# A CMake module to use GNU warning flags with C and C++ +# and detect their availability. +# +# Usage: +# gw_warn(...) +# gw_warn_c(...) +# gw_warn_cxx(...) +# gw_target_warn( ...) +# gw_target_warn_c( ...) +# gw_target_warn_cxx( ...) +# +# Copyright 2020, Jean Pierre Cimalando +# SPDX-License-Identifier: BSD-2-Clause + +function(gw_warn) + gw_warn_c(${ARGN}) + gw_warn_cxx(${ARGN}) +endfunction() + +function(gw_warn_c) + if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") + foreach(flag ${ARGN}) + _gw_check_c_flag_is_silent("${flag}") + if("${GNUWARNINGS_C_FLAG_${flag}_SILENT}") + add_compile_options("$<$:${flag}>") + endif() + endforeach() + endif() +endfunction() + +function(gw_warn_cxx) + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + foreach(flag ${ARGN}) + _gw_check_cxx_flag_is_silent("${flag}") + if("${GNUWARNINGS_CXX_FLAG_${flag}_SILENT}") + add_compile_options("$<$:${flag}>") + endif() + endforeach() + endif() +endfunction() + +function(gw_target_warn TARGET DOMAIN) + gw_target_warn_c("${TARGET}" "${DOMAIN}" ${ARGN}) + gw_target_warn_cxx("${TARGET}" "${DOMAIN}" ${ARGN}) +endfunction() + +function(gw_target_warn_c TARGET DOMAIN) + if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") + foreach(flag ${ARGN}) + _gw_check_c_flag_is_silent("${flag}") + if("${GNUWARNINGS_C_FLAG_${flag}_SILENT}") + target_compile_options("${TARGET}" "${DOMAIN}" "$<$:${flag}>") + endif() + endforeach() + endif() +endfunction() + +function(gw_target_warn_cxx TARGET DOMAIN) + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + foreach(flag ${ARGN}) + _gw_check_cxx_flag_is_silent("${flag}") + if("${GNUWARNINGS_CXX_FLAG_${flag}_SILENT}") + target_compile_options("${TARGET}" "${DOMAIN}" "$<$:${flag}>") + endif() + endforeach() + endif() +endfunction() + +function(_gw_check_c_flag_is_silent FLAG) + if(NOT DEFINED "GNUWARNINGS_C_FLAG_${FLAG}_SILENT") + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CheckGNUWarning.c" "") + _gw_check_command_succeeds_silently(_result "${CMAKE_C_COMPILER}" "${FLAG}" "-c" "-o" "${CMAKE_CURRENT_BINARY_DIR}/CheckGNUWarning.o" "${CMAKE_CURRENT_BINARY_DIR}/CheckGNUWarning.c") + message(STATUS "Have C warning ${flag}: ${_result}") + set("GNUWARNINGS_C_FLAG_${FLAG}_SILENT" "${_result}" CACHE BOOL "Have C warning ${flag}") + endif() +endfunction() + +function(_gw_check_cxx_flag_is_silent FLAG) + if(NOT DEFINED "GNUWARNINGS_CXX_FLAG_${FLAG}_SILENT") + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CheckGNUWarning.cpp" "") + _gw_check_command_succeeds_silently(_result "${CMAKE_CXX_COMPILER}" "${FLAG}" "-c" "-o" "${CMAKE_CURRENT_BINARY_DIR}/CheckGNUWarning.o" "${CMAKE_CURRENT_BINARY_DIR}/CheckGNUWarning.cpp") + message(STATUS "Have C++ warning ${flag}: ${_result}") + set("GNUWARNINGS_CXX_FLAG_${FLAG}_SILENT" "${_result}" CACHE BOOL "Have C++ warning ${flag}") + endif() +endfunction() + +function(_gw_check_command_succeeds_silently RESULT_VARIABLE) + execute_process(COMMAND ${ARGN} RESULT_VARIABLE _result OUTPUT_VARIABLE _output ERROR_VARIABLE _error OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE) + if(_result EQUAL 0 AND _output STREQUAL "" AND _error STREQUAL "") + set("${RESULT_VARIABLE}" TRUE PARENT_SCOPE) + else() + set("${RESULT_VARIABLE}" FALSE PARENT_SCOPE) + endif() +endfunction() From b19ab25af38259e5fd0159784c924b91085ec12e Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Sun, 13 Dec 2020 16:12:15 +0100 Subject: [PATCH 2/2] Use only GNU warnings recognized by compiler --- cmake/SfizzConfig.cmake | 6 ++---- editor/cmake/Vstgui.cmake | 2 +- vst/CMakeLists.txt | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/cmake/SfizzConfig.cmake b/cmake/SfizzConfig.cmake index 52aefdc1..cfc910b0 100644 --- a/cmake/SfizzConfig.cmake +++ b/cmake/SfizzConfig.cmake @@ -1,5 +1,6 @@ include(CMakeDependentOption) include(CheckCXXCompilerFlag) +include(GNUWarnings) set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ standard to be used") set(CMAKE_C_STANDARD 99 CACHE STRING "C standard to be used") @@ -61,10 +62,7 @@ endif() # Add required flags for the builds if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - add_compile_options(-Wall) - add_compile_options(-Wextra) - add_compile_options(-Wno-multichar) - add_compile_options(-Werror=return-type) + gw_warn(-Wall -Wextra -Wno-multichar -Werror=return-type) if (SFIZZ_SYSTEM_PROCESSOR MATCHES "^(i.86|x86_64)$") add_compile_options(-msse2) elseif(SFIZZ_SYSTEM_PROCESSOR MATCHES "^(arm.*)$") diff --git a/editor/cmake/Vstgui.cmake b/editor/cmake/Vstgui.cmake index 56e32ffb..a3cf5dc0 100644 --- a/editor/cmake/Vstgui.cmake +++ b/editor/cmake/Vstgui.cmake @@ -213,7 +213,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Windows") endif() if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - target_compile_options(sfizz-vstgui PRIVATE + gw_target_warn(sfizz-vstgui PRIVATE "-Wno-deprecated-copy" "-Wno-deprecated-declarations" "-Wno-extra" diff --git a/vst/CMakeLists.txt b/vst/CMakeLists.txt index cf082daf..02421af5 100644 --- a/vst/CMakeLists.txt +++ b/vst/CMakeLists.txt @@ -141,7 +141,7 @@ else() endif() if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - target_compile_options(${VSTPLUGIN_PRJ_NAME} PRIVATE + gw_target_warn(${VSTPLUGIN_PRJ_NAME} PRIVATE "-Wno-extra" "-Wno-multichar" "-Wno-reorder" @@ -317,7 +317,7 @@ elseif(SFIZZ_AU) endif() if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - target_compile_options(${AUPLUGIN_PRJ_NAME} PRIVATE + gw_target_warn(${AUPLUGIN_PRJ_NAME} PRIVATE "-Wno-extra" "-Wno-multichar" "-Wno-reorder"