From dc00cd0e1a318c7d19a16286f0e867241f10d8bb Mon Sep 17 00:00:00 2001 From: liyier90 Date: Fri, 12 Jun 2020 17:08:39 +0800 Subject: [PATCH] Added files for CMake, CI and coverage --- .gitignore | 1 + .gitmodules | 3 + .travis.yml | 36 +++++++ CMakeLists.txt | 114 +++++++++++++++++++++ README.md | 5 +- UnitTest-cpp | 1 + cmake/Modules/EnsureOutOfSourceBuild.cmake | 20 ++++ cmake/Modules/UnfitCompilerFlags.cmake | 17 +++ 8 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 .gitmodules create mode 100755 .travis.yml create mode 100755 CMakeLists.txt create mode 160000 UnitTest-cpp create mode 100755 cmake/Modules/EnsureOutOfSourceBuild.cmake create mode 100755 cmake/Modules/UnfitCompilerFlags.cmake diff --git a/.gitignore b/.gitignore index 9061450..0113850 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ bin obj lib +build diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4f36a2f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "UnitTest-cpp"] + path = UnitTest-cpp + url = https://github.com/liyier90/UnitTest-cpp diff --git a/.travis.yml b/.travis.yml new file mode 100755 index 0000000..e3ade15 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,36 @@ +language: cpp + +os: linux +dist: bionic +compiler: gcc +sudo: true +matrix: + include: + - env: BUILD=Debug COVERAGE=OFF + - env: BUILD=Release COVERAGE=OFF + - env: BUILD=Debug COVERAGE=ON + +before_script: + - sudo apt-get install -yq lcov + +script: + - git submodule update --init --recursive + - cd UnitTest-cpp + - mkdir -p lib/${BUILD} + - cd lib/${BUILD} + - cmake ../.. -DCMAKE_BUILD_TYPE=${BUILD} + - make + - cd ../../.. + - mkdir -p build + - cd build + - cmake .. -DCMAKE_BUILD_TYPE=${BUILD} -DUnfit_ENABLE_TESTING=ON -DUnfit_COVERAGE=${COVERAGE} + - make + - if [ $COVERAGE == "ON" ]; + then make coverage; + else ./UnfitTest; + fi + +after_success: + - if [ $COVERAGE == "ON" ]; then + bash <(curl -s https://codecov.io/bash) -f coverage.info.cleaned -t "30ccfca2-015e-4c4e-913f-3cae31ea6673" || echo "Codecov did not collect coverage reports"; + fi diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..14291d4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,114 @@ +cmake_minimum_required(VERSION 3.10) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) +include(EnsureOutOfSourceBuild) +ensure_out_of_source_build() +project(Unfit) + +####################################################################### +# Set up compiler and build type +####################################################################### +include(UnfitCompilerFlags) +option(Unfit_ENABLE_TESTING "Enable Unfit Testing" OFF) +option(Unfit_COVERAGE "Build Unfit with coverage information" OFF) + +if(Unfit_COVERAGE) + set(Unfit_ENABLE_TESTING ON) + set(CMAKE_BUILD_TYPE "Debug") +endif() + +####################################################################### +# Find libraries +####################################################################### +set(Unfit_INCLUDES include examples) +set(Unfit_LINK_LIBRARIES "") + +# Check prereqs +if(Unfit_COVERAGE) + find_program(GCOV_PATH gcov) + find_program(LCOV_PATH lcov) + find_program(GENHTML_PATH genhtml) + find_program(GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/unittests) + + if(NOT GCOV_PATH) + message(FATAL_ERROR "gcov not found! Aborting...") + endif() + + if(NOT LCOV_PATH) + message(FATAL_ERROR "lcov not found! Aborting...") + endif() + + if(NOT GENHTML_PATH) + message(FATAL_ERROR "genhtml not found! Aborting...") + endif() +endif() + +if(Unfit_ENABLE_TESTING) + list(APPEND Unfit_INCLUDES + "${Unfit_SOURCE_DIR}/UnitTest-cpp" + "${Unfit_SOURCE_DIR}/UnitTest-cpp/UnitTest++/src") + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + list(APPEND Unfit_LINK_LIBRARIES + "${Unfit_SOURCE_DIR}/UnitTest-cpp/lib/Debug/libUnitTest++.a") + else() + list(APPEND Unfit_LINK_LIBRARIES + "${Unfit_SOURCE_DIR}/UnitTest-cpp/lib/Release/libUnitTest++.a") + endif() +endif() + +####################################################################### +# Find pthread +####################################################################### +set(THREADS_PREFER_PTHREAD_FLAG_ON) +find_package(Threads REQUIRED) +list(APPEND Unfit_LINK_LIBRARIES Threads::Threads) + +####################################################################### +# Configure build +####################################################################### +file(GLOB SOURCES "src/*.cpp") +if(Unfit_ENABLE_TESTING) + file(GLOB TEST_SOURCES "examples/*.cpp" "unittests/*.cpp") + file(COPY "${Unfit_SOURCE_DIR}/examples/data" + DESTINATION "${Unfit_BINARY_DIR}/examples") + file(COPY "${Unfit_SOURCE_DIR}/unittests/data" + DESTINATION "${Unfit_BINARY_DIR}/unittests") + + set(target_name ${PROJECT_NAME}Test) + list(FILTER SOURCES EXCLUDE REGEX "main.cpp$") + add_executable(${target_name} ${SOURCES} ${TEST_SOURCES}) + target_include_directories(${target_name} PUBLIC ${Unfit_INCLUDES}) + target_link_libraries(${target_name} ${Unfit_LINK_LIBRARIES}) +else() + set(target_name ${PROJECT_NAME}Example) + list(FILTER SOURCES EXCLUDE REGEX ".*-test.cpp$") + add_executable(${target_name} ${SOURCES} "examples/ParabolicModel.hpp") + target_include_directories(${target_name} PUBLIC include PUBLIC examples) + target_link_libraries(${target_name} ${Unfit_LINK_LIBRARIES}) +endif() + +if(Unfit_COVERAGE) + # Run test with low priority (+15) + set(NICE_COMMAND nice) + set(NICENESS -15) + set(_output_name coverage) + add_custom_target(coverage + # Cleanup lcov + ${LCOV_PATH} --directory . --zerocounters + + # Run tests + COMMAND ${NICE_COMMAND} ${NICENESS} "./${target_name}" + + # Capture lcov counters + COMMAND ${LCOV_PATH} --directory . --capture --output-file ${_output_name}.info + COMMAND ${LCOV_PATH} --remove ${_output_name}.info /usr/* */UnitTest-cpp/* */unittests/* */examples/Test*.cpp --output-file ${_output_name}.info.cleaned + set(_page_title "\"Unfit Coverage Results\"") + COMMAND ${GENHTML_PATH} --title "${_page_title}" --no-function-coverage -o ${_output_name} ${_output_name}.info.cleaned + COMMAND ${CMAKE_COMMAND} -E remove ${_output_name}.info + COMMAND ${LCOV_PATH} --list ${_output_name}.info.cleaned + + WORKING_DIRECTORY ${Chaste_BINARY_DIR} + COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report." + VERBATIM) +endif() diff --git a/README.md b/README.md index ff0e5c4..ffd0616 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -# Unfit +Unfit
+[![Build Status](https://travis-ci.org/liyier90/Unfit.svg?branch=master)](https://travis-ci.org/liyier90/Unfit) +[![codecov](https://codecov.io/gh/liyier90/Unfit/branch/master/graph/badge.svg)](https://codecov.io/gh/liyier90/Unfit) +========== Data fitting and optimization software ### Getting Started (User Version) diff --git a/UnitTest-cpp b/UnitTest-cpp new file mode 160000 index 0000000..d246ddf --- /dev/null +++ b/UnitTest-cpp @@ -0,0 +1 @@ +Subproject commit d246ddf190a32eb528a2e4d630aaf607b1cd1cb5 diff --git a/cmake/Modules/EnsureOutOfSourceBuild.cmake b/cmake/Modules/EnsureOutOfSourceBuild.cmake new file mode 100755 index 0000000..e934a21 --- /dev/null +++ b/cmake/Modules/EnsureOutOfSourceBuild.cmake @@ -0,0 +1,20 @@ +macro(ensure_out_of_source_build) + get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH) + get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH) + + if("${srcdir}" STREQUAL "${bindir}") + message("****************************************************************") + message("* Please build outside the source directory. For example: *") + message("* mkdir ~/tmp/build") + message("* cd ~/tmp/build") + message("* cmake ${CMAKE_SOURCE_DIR}") + message("* *") + message("* Please remove the following files:") + message("* ${CMAKE_SOURCE_DIR}/CMakeCache.txt") + message("* ${CMAKE_SOURCE_DIR}/CMakeFiles/*") + message("* *") + message("* before the next configuration attempt to avoid this message. *") + message("****************************************************************") + message(FATAL_ERROR "Quitting configuration") + endif() +endmacro(ensure_out_of_source_build) diff --git a/cmake/Modules/UnfitCompilerFlags.cmake b/cmake/Modules/UnfitCompilerFlags.cmake new file mode 100755 index 0000000..2cc2b3e --- /dev/null +++ b/cmake/Modules/UnfitCompilerFlags.cmake @@ -0,0 +1,17 @@ +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11") + +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") +endif() +if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -s") +endif() + +if(Unfit_COVERAGE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") +endif() + +string(CONCAT CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weffc++ -Wextra " + "-pedantic -Winit-self -Wmissing-declarations -Wmissing-include-dirs " + "-Wundef -Wredundant-decls -Wfloat-equal -Wmain -Wunreachable-code " + "-Wshadow -Wcast-align -Wswitch-enum")