From c4e16aa8200f43eb8bc1ed58d72b6a365a24ab8b Mon Sep 17 00:00:00 2001 From: Eugene Shalygin Date: Thu, 27 Apr 2017 14:35:28 +0200 Subject: [PATCH] cmake: set warning and error options The set is far from perfect, but guards against common errors with GCC. --- CMakeLists.txt | 1 - cmake/Modules/MacroGlibcDetect.cmake | 49 +++++++++++ cmake/Modules/MacroQbtCompilerSettings.cmake | 89 ++++++++++++++++++++ src/CMakeLists.txt | 3 + src/base/net/private/geoipdatabase.h | 2 +- src/webui/abstractwebapplication.cpp | 2 +- src/webui/abstractwebapplication.h | 4 +- src/webui/webapplication.cpp | 2 +- src/webui/webapplication.h | 2 +- 9 files changed, 147 insertions(+), 7 deletions(-) create mode 100644 cmake/Modules/MacroGlibcDetect.cmake create mode 100644 cmake/Modules/MacroQbtCompilerSettings.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c9c03633..3cf7687be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,6 @@ add_definitions(-DQBT_VERSION="v${PROJECT_VERSION}") add_definitions(-DQBT_VERSION_2="${PROJECT_VERSION}") # } -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Og") if (UNIX AND NOT APPLE) include(GNUInstallDirs) endif (UNIX AND NOT APPLE) diff --git a/cmake/Modules/MacroGlibcDetect.cmake b/cmake/Modules/MacroGlibcDetect.cmake new file mode 100644 index 000000000..7e462e11b --- /dev/null +++ b/cmake/Modules/MacroGlibcDetect.cmake @@ -0,0 +1,49 @@ + ############################################################### + # + # Copyright 2011 Red Hat, Inc. + # + # Licensed under the Apache License, Version 2.0 (the "License"); you + # may not use this file except in compliance with the License. You may + # obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + # + ############################################################### + +MACRO (GLIBC_DETECT _VERSION) + +# there are multiple ways to detect glibc, but given nmi's +# cons'd up paths I will trust only gcc. I guess I could also use +# ldd --version to detect. + + set(_GLIB_SOURCE_DETECT " +#include +#include +int main() +{ + printf(\"%d%d\",__GLIBC__, __GLIBC_MINOR__); + return 0; +} +") + +file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/build/cmake/glibc.cpp "${_GLIB_SOURCE_DETECT}\n") + +try_run(POST26_GLIBC_DETECTED + POST26_GLIBC_COMPILE + ${CMAKE_CURRENT_BINARY_DIR}/build/cmake + ${CMAKE_CURRENT_BINARY_DIR}/build/cmake/glibc.cpp + RUN_OUTPUT_VARIABLE GLIBC_VERSION ) + +if (GLIBC_VERSION AND POST26_GLIBC_COMPILE ) + set(${_VERSION} ${GLIBC_VERSION}) +else() + message(STATUS "NOTE: Could not detect GLIBC_VERSION from compiler") +endif() + +ENDMACRO (GLIBC_DETECT) diff --git a/cmake/Modules/MacroQbtCompilerSettings.cmake b/cmake/Modules/MacroQbtCompilerSettings.cmake new file mode 100644 index 000000000..783457a69 --- /dev/null +++ b/cmake/Modules/MacroQbtCompilerSettings.cmake @@ -0,0 +1,89 @@ +# Sets cache variable QBT_ADDITONAL_FLAGS and QBT_ADDITONAL_CXX_FLAGS to list of additional +# compiler flags for C and C++ (QBT_ADDITONAL_FLAGS) and for C++ only (QBT_ADDITONAL_CXX_FLAGS) +# and appends them to CMAKE_XXX_FLAGS variables. + +# It could use add_compile_options(), but then it is needed to use generator expressions, +# and most interesting of them are not compatible with Visual Studio :( + +macro(qbt_set_compiler_options) +# if (NOT QBT_ADDITONAL_FLAGS) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + #-Wshadow -Wconversion ? + set(_GCC_COMMON_C_AND_CXX_FLAGS "-Wall -Wextra" + "-Wfloat-equal -Wcast-qual -Wcast-align" + "-Wsign-conversion -Winvalid-pch -Werror=return-type -Wno-long-long" +# -fstack-protector-all + "-Werror -Wno-error=deprecated-declarations" + ) + set (_GCC_COMMON_CXX_FLAGS "-fexceptions -frtti" + "-Woverloaded-virtual -Wold-style-cast -Wstrict-null-sentinel" + "-Wnon-virtual-dtor -Wfloat-equal -Wcast-qual -Wcast-align" + "-Werror=overloaded-virtual" + # "-Weffc++" + "-Werror -Wno-error=cpp" + # we should modify code to make these ones obsolete + "-Wno-error=old-style-cast -Wno-error=sign-conversion -Wno-error=float-equal" + ) + + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) + # GCC 4.8 has problems with std::array and its initialization + list(APPEND _GCC_COMMON_CXX_FLAGS "-Wno-error=missing-field-initializers") + endif() + + include(CheckCXXCompilerFlag) + # check for -pedantic + check_cxx_compiler_flag(-pedantic _PEDANTIC_IS_SUPPORTED) + if (_PEDANTIC_IS_SUPPORTED) + list(APPEND _GCC_COMMON_CXX_FLAGS "-pedantic -pedantic-errors") + else (_PEDANTIC_IS_SUPPORTED) + list(APPEND _GCC_COMMON_CXX_FLAGS "-Wpedantic") + endif (_PEDANTIC_IS_SUPPORTED) + + if (CMAKE_SYSTEM_NAME MATCHES Linux) + # if Glibc version is 2.20 or higher, set -D_DEFAULT_SOURCE + include(MacroGlibcDetect) + message(STATUS "Detecting Glibc version...") + glibc_detect(GLIBC_VERSION) + if(${GLIBC_VERSION}) + if(GLIBC_VERSION LESS "220") + message(STATUS "Glibc version is ${GLIBC_VERSION}") + else(GLIBC_VERSION LESS "220") + message(STATUS "Glibc version is ${GLIBC_VERSION}, adding -D_DEFAULT_SOURCE") + add_definitions(-D_DEFAULT_SOURCE) + endif(GLIBC_VERSION LESS "220") + endif(${GLIBC_VERSION}) + endif (CMAKE_SYSTEM_NAME MATCHES Linux) + + string(REPLACE ";" " " _GCC_COMMON_C_AND_CXX_FLAGS_STRING "${_GCC_COMMON_C_AND_CXX_FLAGS}") + string(REPLACE ";" " " _GCC_COMMON_CXX_FLAGS_STRING "${_GCC_COMMON_CXX_FLAGS}") + + string(APPEND CMAKE_C_FLAGS " ${_GCC_COMMON_C_AND_CXX_FLAGS_STRING}") + string(APPEND CMAKE_CXX_FLAGS " ${_GCC_COMMON_C_AND_CXX_FLAGS_STRING} ${_GCC_COMMON_CXX_FLAGS_STRING}") + + set(QBT_ADDITONAL_FLAGS "${_GCC_COMMON_C_AND_CXX_FLAGS_STRING}" CACHE STRING + "Additional qBittorent compile flags" FORCE) + set(QBT_ADDITONAL_CXX_FLAGS "${_GCC_COMMON_CXX_FLAGS_STRING}" CACHE STRING + "Additional qBittorent C++ compile flags" FORCE) + + # check whether we can enable -Og optimization for debug build + # also let's enable -march=native for debug builds + check_cxx_compiler_flag(-Og _DEBUG_OPTIMIZATION_LEVEL_IS_SUPPORTED) + + if (_DEBUG_OPTIMIZATION_LEVEL_IS_SUPPORTED) + string(APPEND CMAKE_C_FLAGS_DEBUG " -Og -g3 -march=native -pipe" ) + string(APPEND CMAKE_CXX_FLAGS_DEBUG " -Og -g3 -march=native -pipe" ) + else(_DEBUG_OPTIMIZATION_LEVEL_IS_SUPPORTED) + string(APPEND CMAKE_C_FLAGS_DEBUG " -O0 -g3 -march=native -pipe" ) + string(APPEND CMAKE_CXX_FLAGS_DEBUG " -O0 -g3 -march=native -pipe" ) + endif (_DEBUG_OPTIMIZATION_LEVEL_IS_SUPPORTED) + endif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + set(QBT_ADDITONAL_FLAGS "-wd4290 -wd4275 -wd4251 /W4" CACHE STRING "Additional qBittorent compile flags") + string(APPEND CMAKE_C_FLAGS " ${QBT_ADDITONAL_FLAGS}") + string(APPEND CMAKE_CXX_FLAGS " ${QBT_ADDITONAL_FLAGS}") + endif () + +# endif (NOT QBT_ADDITONAL_FLAGS) +endmacro(qbt_set_compiler_options) + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 98cc13987..606a8de68 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,6 +2,9 @@ set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_CXX_STANDARD "11") add_definitions(-DBOOST_NO_CXX11_RVALUE_REFERENCES) +include(MacroQbtCompilerSettings) +qbt_set_compiler_options() + include(MacroLinkQtComponents) include(QbtTargetSources) diff --git a/src/base/net/private/geoipdatabase.h b/src/base/net/private/geoipdatabase.h index 5fe05f57e..329e28453 100644 --- a/src/base/net/private/geoipdatabase.h +++ b/src/base/net/private/geoipdatabase.h @@ -96,7 +96,7 @@ private: // Search data mutable QHash m_countries; quint32 m_size; - const uchar *m_data; + uchar *m_data; }; #endif // GEOIPDATABASE_H diff --git a/src/webui/abstractwebapplication.cpp b/src/webui/abstractwebapplication.cpp index f153f6148..ef54802da 100644 --- a/src/webui/abstractwebapplication.cpp +++ b/src/webui/abstractwebapplication.cpp @@ -121,7 +121,7 @@ Http::Response AbstractWebApplication::processRequest(const Http::Request &reque print(QObject::tr("Your IP address has been banned after too many failed authentication attempts."), Http::CONTENT_TYPE_TXT); } else { - processRequest(); + doProcessRequest(); } return response(); diff --git a/src/webui/abstractwebapplication.h b/src/webui/abstractwebapplication.h index 8d1227fc9..d05ea90ba 100644 --- a/src/webui/abstractwebapplication.h +++ b/src/webui/abstractwebapplication.h @@ -54,10 +54,10 @@ public: explicit AbstractWebApplication(QObject *parent = 0); virtual ~AbstractWebApplication(); - Http::Response processRequest(const Http::Request &request, const Http::Environment &env); + Http::Response processRequest(const Http::Request &request, const Http::Environment &env) final; protected: - virtual void processRequest() = 0; + virtual void doProcessRequest() = 0; bool isBanned() const; int failedAttempts() const; diff --git a/src/webui/webapplication.cpp b/src/webui/webapplication.cpp index 9cba1b079..bcaad2081 100644 --- a/src/webui/webapplication.cpp +++ b/src/webui/webapplication.cpp @@ -814,7 +814,7 @@ bool WebApplication::isPublicScope() return (scope_ == DEFAULT_SCOPE || scope_ == VERSION_INFO); } -void WebApplication::processRequest() +void WebApplication::doProcessRequest() { scope_ = DEFAULT_SCOPE; action_ = DEFAULT_ACTION; diff --git a/src/webui/webapplication.h b/src/webui/webapplication.h index 11fefcae9..ff482590b 100644 --- a/src/webui/webapplication.h +++ b/src/webui/webapplication.h @@ -103,7 +103,7 @@ private: QString action_; QStringList args_; - void processRequest(); + void doProcessRequest() override; bool isPublicScope(); void parsePath();