From 3a90341961f7d8194679984948d8debe1412ebe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Wed, 27 May 2020 05:15:46 +0200 Subject: [PATCH] some CMake cleanups and additions (#2639) --- cli/CMakeLists.txt | 6 +++--- cmake/compilerDefinitions.cmake | 25 +++++++++++++++++++------ cmake/compileroptions.cmake | 14 +++----------- cmake/findDependencies.cmake | 19 +++++++++++++++++-- cmake/options.cmake | 2 ++ cmake/printInfo.cmake | 12 +++++++++++- cmake/versions.cmake | 1 - externals/tinyxml/CMakeLists.txt | 2 +- gui/CMakeLists.txt | 5 ++++- lib/CMakeLists.txt | 2 +- oss-fuzz/CMakeLists.txt | 2 +- test/CMakeLists.txt | 5 ++++- 12 files changed, 66 insertions(+), 29 deletions(-) diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 16991d0e9..90166e7da 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -10,10 +10,10 @@ list(REMOVE_ITEM srcs ${mainfile}) add_library(cli_objs OBJECT ${hdrs} ${srcs}) add_executable(cppcheck ${hdrs} ${mainfile} $ $ $ $) if (HAVE_RULES) - find_library(PCRE_LIBRARY pcre) target_link_libraries(cppcheck ${PCRE_LIBRARY}) - find_path(PCRE_INCLUDE pcre.h) - target_include_directories(cppcheck PUBLIC ${PCRE_INCLUDE}) +endif() +if (USE_Z3) + target_link_libraries(cppcheck ${Z3_LIBRARIES}) endif() if (WIN32 AND NOT BORLAND) target_link_libraries(cppcheck Shlwapi.lib) diff --git a/cmake/compilerDefinitions.cmake b/cmake/compilerDefinitions.cmake index d67ed75f2..8bf0b3954 100644 --- a/cmake/compilerDefinitions.cmake +++ b/cmake/compilerDefinitions.cmake @@ -1,15 +1,28 @@ -if (UNIX) +if (MSVC) + # Visual Studio only sets _DEBUG if (CMAKE_BUILD_TYPE MATCHES "Debug") - add_definitions(-D_GLIBCXX_DEBUG) + add_definitions(-DDEBUG) endif() - if (HAVE_RULES) - add_definitions(-DHAVE_RULES -DTIXML_USE_STL) + + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +if (UNIX) + # TODO: check if this can be enabled again for Clang - also done in Makefile + if (CMAKE_BUILD_TYPE MATCHES "Debug" AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) + add_definitions(-D_GLIBCXX_DEBUG) endif() add_definitions(-DFILESDIR="${FILESDIR}") endif() -if (MSVC) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) + +if (HAVE_RULES) + add_definitions(-DHAVE_RULES -DTIXML_USE_STL) endif() + +if (USE_Z3) + add_definitions(-DUSE_Z3) +endif() + if (ENABLE_CHECK_INTERNAL) add_definitions(-DCHECK_INTERNAL) endif() diff --git a/cmake/compileroptions.cmake b/cmake/compileroptions.cmake index 0c81c413c..8e523a704 100644 --- a/cmake/compileroptions.cmake +++ b/cmake/compileroptions.cmake @@ -1,16 +1,8 @@ -if (CMAKE_BUILD_TYPE MATCHES "Debug") - add_definitions(-DDEBUG) -elseif(CMAKE_BUILD_TYPE MATCHES "Release" OR CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") - add_definitions(-DNDEBUG) -endif() - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") - if (CMAKE_BUILD_TYPE MATCHES "Debug") - add_definitions(-g -O0) - elseif(CMAKE_BUILD_TYPE MATCHES "Release" OR CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo") - add_definitions(-O2) + if(CMAKE_BUILD_TYPE MATCHES "Release") + # "Release" uses -O3 by default + add_compile_options(-O2) endif() - if (WARNINGS_ARE_ERRORS) add_compile_options(-Werror) endif() diff --git a/cmake/findDependencies.cmake b/cmake/findDependencies.cmake index 456c4b3d8..bf194d586 100644 --- a/cmake/findDependencies.cmake +++ b/cmake/findDependencies.cmake @@ -7,12 +7,27 @@ if (BUILD_GUI) endif() if (HAVE_RULES) - find_library(PCRE pcre) - if (NOT PCRE) + find_library(PCRE_LIBRARY pcre) + if (NOT PCRE_LIBRARY) message(FATAL_ERROR "pcre dependency for RULES has not been found") endif() endif() +if (USE_Z3) + find_package(Z3 QUIET) + if (NOT Z3_FOUND) + find_library(Z3_LIBRARIES z3) + if (NOT Z3_LIBRARIES) + message(FATAL_ERROR "z3 dependency has not been found") + endif() + find_path(Z3_CXX_INCLUDE_DIRS z3++.h PATH_SUFFIXES "z3") + if (NOT Z3_CXX_INCLUDE_DIRS) + message(FATAL_ERROR "z3++.h has not been found") + endif() + endif() + include_directories(cppcheck SYSTEM ${Z3_CXX_INCLUDE_DIRS}) +endif() + set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC OFF) diff --git a/cmake/options.cmake b/cmake/options.cmake index 4d1bfa6b8..11b89b408 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -34,10 +34,12 @@ endif() option(BUILD_TESTS "Build tests" OFF) option(ENABLE_CHECK_INTERNAL "Enable internal checks" OFF) +option(ENABLE_OSS_FUZZ "Enable the OSS-Fuzz related targets" ON) option(BUILD_GUI "Build the qt application" OFF) option(WITH_QCHART "When building GUI(need BUILD_GUI=ON), use Qt5 Charts" OFF) option(HAVE_RULES "Usage of rules (needs PCRE library and headers)" OFF) +option(USE_Z3 "Usage of z3 library" OFF) set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE ${CMAKE_INSTALL_PREFIX}/include CACHE PATH "Output directory for headers") set(CMAKE_LIB_DIRS_CONFIGCMAKE ${CMAKE_INSTALL_PREFIX}/lib CACHE PATH "Output directory for libraries") diff --git a/cmake/printInfo.cmake b/cmake/printInfo.cmake index 57d0ae7a6..9eda36b14 100644 --- a/cmake/printInfo.cmake +++ b/cmake/printInfo.cmake @@ -7,6 +7,7 @@ message( STATUS "Build type = ${CMAKE_BUILD_TYPE}") message( STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}" ) message( STATUS "C++ flags (General) = ${CMAKE_CXX_FLAGS}") message( STATUS "C++ flags (Release) = ${CMAKE_CXX_FLAGS_RELEASE}") +message( STATUS "C++ flags (RelWithDebInfo) = ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") message( STATUS "C++ flags (Debug) = ${CMAKE_CXX_FLAGS_DEBUG}") get_directory_property( DirDefs DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) foreach( d ${DirDefs} ) @@ -31,12 +32,21 @@ else() endif(NOT DEFINED BUILD_SHARED_LIBS) message( STATUS "BUILD_TESTS = ${BUILD_TESTS}" ) message( STATUS "ENABLE_CHECK_INTERNAL = ${ENABLE_CHECK_INTERNAL}" ) +message( STATUS "ENABLE_OSS_FUZZ = ${ENABLE_OSS_FUZZ}" ) +message( STATUS ) message( STATUS "BUILD_GUI = ${BUILD_GUI}" ) message( STATUS "WITH_QCHART = ${WITH_QCHART}" ) message( STATUS ) message( STATUS "HAVE_RULES = ${HAVE_RULES}" ) +if (HAVE_RULES) + message( STATUS "PCRE_LIBRARY = ${PCRE_LIBRARY}" ) +endif() message( STATUS ) -message( STATUS "Change a value with: cmake -D=" ) +message( STATUS "USE_Z3 = ${USE_Z3}" ) +if (USE_Z3) + message( STATUS "Z3_LIBRARIES = ${Z3_LIBRARIES}" ) + message( STATUS "Z3_CXX_INCLUDE_DIRS = ${Z3_CXX_INCLUDE_DIRS}" ) +endif() message( STATUS ) if(${ANALYZE_ADDRESS}) diff --git a/cmake/versions.cmake b/cmake/versions.cmake index b142ef8dc..b21cdad4b 100644 --- a/cmake/versions.cmake +++ b/cmake/versions.cmake @@ -3,7 +3,6 @@ SET(VERSION "2.0.99") STRING(REGEX MATCHALL "[0-9]" VERSION_PARTS "${VERSION}") LIST(GET VERSION_PARTS 0 VERSION_MAJOR) LIST(GET VERSION_PARTS 1 VERSION_MINOR) -LIST(GET VERSION_PARTS 2 VERSION_PATCH) SET(SOVERSION "${VERSION_MAJOR}.${VERSION_MINOR}") # Postfix of so's: diff --git a/externals/tinyxml/CMakeLists.txt b/externals/tinyxml/CMakeLists.txt index 65466bd89..1010dab77 100644 --- a/externals/tinyxml/CMakeLists.txt +++ b/externals/tinyxml/CMakeLists.txt @@ -14,7 +14,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") endif() # TODO: conflicts with ANALYZE_* options -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") +if (ENABLE_OSS_FUZZ AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_library(tinyxml_objs_sanitized OBJECT EXCLUDE_FROM_ALL ${srcs} ${hdrs}) target_compile_options(tinyxml_objs_sanitized PRIVATE -fsanitize=address) if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.0.0") diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index a64edad9f..fb40ddafa 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -22,7 +22,10 @@ if (BUILD_GUI) add_executable(cppcheck-gui ${hdrs} ${srcs} ${uis_hdrs} ${resources} ${qms} $ $ $) if (HAVE_RULES) - target_link_libraries(cppcheck-gui pcre) + target_link_libraries(cppcheck-gui ${PCRE_LIBRARY}) + endif() + if (USE_Z3) + target_link_libraries(cppcheck-gui ${Z3_LIBRARIES}) endif() target_link_libraries(cppcheck-gui Qt5::Core Qt5::Gui Qt5::Widgets Qt5::PrintSupport) if(WITH_QCHART) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index fdb24d214..088826c96 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -37,7 +37,7 @@ else() endif() add_library(lib_objs OBJECT ${srcs_lib} ${hdrs}) -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") +if (ENABLE_OSS_FUZZ AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_library(lib_objs_sanitized OBJECT EXCLUDE_FROM_ALL ${srcs_lib} ${hdrs}) target_compile_options(lib_objs_sanitized PRIVATE -fsanitize=address) endif() diff --git a/oss-fuzz/CMakeLists.txt b/oss-fuzz/CMakeLists.txt index 903b5681e..b9a3e195e 100644 --- a/oss-fuzz/CMakeLists.txt +++ b/oss-fuzz/CMakeLists.txt @@ -1,4 +1,4 @@ -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") +if (ENABLE_OSS_FUZZ AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_executable(fuzz-client EXCLUDE_FROM_ALL main.cpp type2.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index bf3033e2a..e3af00370 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -21,7 +21,10 @@ if (BUILD_TESTS) add_executable(testrunner ${hdrs} ${srcs} $ $ $ $) if (HAVE_RULES) - target_link_libraries(testrunner pcre) + target_link_libraries(testrunner ${PCRE_LIBRARY}) + endif() + if (USE_Z3) + target_link_libraries(testrunner ${Z3_LIBRARIES}) endif() add_custom_target(copy_cfg ALL