diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index a3ec48cf..ad501530 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -61,7 +61,9 @@ jobs: if [ "${{ matrix.compiler }}" == "msvc" ]; then cmake -S . -B build -DMATIO_USE_CONAN=ON -DMATIO_SHARED=OFF elif [ "${{ matrix.compiler }}" == "mingw" ]; then - cmake -S . -B build -DCMAKE_BUILD_TYPE=${{ matrix.configuration }} -DMATIO_USE_CONAN=ON -DMATIO_SHARED=OFF -G "MinGW Makefiles" + cmake -S . -B build -DCMAKE_BUILD_TYPE=${{ matrix.configuration }} -DMATIO_USE_CONAN=ON -DMATIO_SHARED=OFF -DMATIO_ENABLE_CPPCHECK=ON -G "MinGW Makefiles" + elif [ "${{ matrix.compiler }}" == "gcc" ]; then + cmake -S . -B build -DCMAKE_BUILD_TYPE=${{ matrix.configuration }} -DMATIO_USE_CONAN=ON -DMATIO_SHARED=OFF -DMATIO_ENABLE_CPPCHECK=ON else cmake -S . -B build -DCMAKE_BUILD_TYPE=${{ matrix.configuration }} -DMATIO_USE_CONAN=ON -DMATIO_SHARED=OFF fi diff --git a/CMakeLists.txt b/CMakeLists.txt index 745f549e..a99f4047 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ include(GNUInstallDirs) include(cmake/options.cmake) include(cmake/conan.cmake) include(cmake/thirdParties.cmake) +include(cmake/staticAnalyzers.cmake) include(cmake/compilerOptions.cmake) include(cmake/getopt.cmake) include(cmake/src.cmake) diff --git a/cmake/options.cmake b/cmake/options.cmake index f2e36459..3a169848 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -36,3 +36,7 @@ elseif(MATIO_DEFAULT_FILE_VERSION STREQUAL "7.3") else() message(ERROR "Unrecognized MAT file version") endif() + +if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.10") + option(MATIO_ENABLE_CPPCHECK "Enable static analysis with Cppcheck." OFF) +endif() diff --git a/cmake/staticAnalyzers.cmake b/cmake/staticAnalyzers.cmake new file mode 100644 index 00000000..08b47c65 --- /dev/null +++ b/cmake/staticAnalyzers.cmake @@ -0,0 +1,22 @@ +if(MATIO_ENABLE_CPPCHECK) + find_program(CPPCHECK cppcheck) + if(CPPCHECK) + set(CMAKE_C_CPPCHECK ${CPPCHECK} + --language=c + --check-level=exhaustive + --suppress=checkersReport + --suppress=unusedFunction + --suppress=unmatchedSuppression + --suppress=missingIncludeSystem + --enable=all + --inline-suppr + --inconclusive + -i ${CMAKE_SOURCE_DIR}/test + -i ${CMAKE_SOURCE_DIR}/snprintf + -i ${CMAKE_SOURCE_DIR}/getopt + ) + message(VERBOSE "Cppcheck finished setting up.") + else() + message(SEND_ERROR "Cppcheck requested but executable not found.") + endif() +endif() diff --git a/cmake/thirdParties.cmake b/cmake/thirdParties.cmake index 86989f09..4d0b4846 100644 --- a/cmake/thirdParties.cmake +++ b/cmake/thirdParties.cmake @@ -12,16 +12,20 @@ if(MATIO_WITH_HDF5) endif() if(MATIO_USE_CONAN) + set(MATIO_CONAN_REQUIRES "hdf5/[>=1.8 <1.15]" "zlib/[>=1.2.3]") + if(MATIO_ENABLE_CPPCHECK) + list(APPEND MATIO_CONAN_REQUIRES "cppcheck/[>=2.13.3]") + endif() if(HDF5_USE_STATIC_LIBRARIES) conan_cmake_run( - REQUIRES "hdf5/[>=1.8 <1.15]" "zlib/[>=1.2.3]" + REQUIRES ${MATIO_CONAN_REQUIRES} BASIC_SETUP CMAKE_TARGETS OPTIONS hdf5:shared=False zlib:shared=False BUILD missing ) else() conan_cmake_run( - REQUIRES "hdf5/[>=1.8 <1.15]" "zlib/[>=1.2.3]" + REQUIRES ${MATIO_CONAN_REQUIRES} BASIC_SETUP CMAKE_TARGETS OPTIONS hdf5:shared=True zlib:shared=True BUILD missing)