diff --git a/.github/workflows/test-library.yml b/.github/workflows/test-library.yml index 5bb20daf6..ac9aa6bad 100644 --- a/.github/workflows/test-library.yml +++ b/.github/workflows/test-library.yml @@ -12,6 +12,9 @@ jobs: if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository outputs: hassecrets: ${{ steps.checksecrets.outputs.hassecrets }} + env: + CCACHE: ccache + CCACHE_DIR: ~/.ccache steps: - name: Checkout Colvars @@ -49,8 +52,6 @@ jobs: fi - name: Build and test library (GCC) - env: - CCACHE: ccache run: cmake -P devel-tools/build_test_library.cmake - name: Check documentation of command-line scripting interface @@ -66,16 +67,16 @@ jobs: - name: Build and test library (Clang) env: CMAKE_BUILD_DIR: build-clang - CCACHE: ccache CXX: clang++ CC: clang run: cmake -P devel-tools/build_test_library.cmake - name: Build library with debug flags enabled - env: - CCACHE: ccache run: cmake -D COLVARS_DEBUG=ON -P devel-tools/build_test_library.cmake + - name: Print ccache statistics + run: ${CCACHE} -s + - name: Check whether secrets are available id: checksecrets env: diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index d3e87459c..eaba79fcf 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -6,6 +6,10 @@ get_filename_component(COLVARS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) +if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + # Avoid having to export all the relevant symbols + set(BUILD_SHARED_LIBS OFF) +endif() set(CMAKE_CXX_EXTENSIONS OFF) @@ -120,13 +124,7 @@ endif() option(BUILD_TOOLS "Build standalone tools" ON) -option(BUILD_TESTS "Build tests" ON) - -if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - # TODO fix linkage errors with Visual Studio... - set(BUILD_TOOLS OFF) - set(BUILD_TESTS OFF) -endif() +option(BUILD_TESTS "Build functional tests" ON) option(BUILD_UNITTESTS "Build unit tests" ${BUILD_TESTS}) diff --git a/cmake/buildColvarsTests.cmake b/cmake/buildColvarsTests.cmake index 1ba11c728..d4573ae87 100644 --- a/cmake/buildColvarsTests.cmake +++ b/cmake/buildColvarsTests.cmake @@ -3,42 +3,40 @@ if(BUILD_TESTS) # Build functional tests' executables add_subdirectory(${COLVARS_SOURCE_DIR}/tests/functional tests/functional) - if(DEFINED CMAKE_SYSTEM_NAME) + # # TODO automate this step and make it OS-portable + # if(DEFINED CMAKE_SYSTEM_NAME) + # if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + # add_custom_command(TARGET colvars POST_BUILD + # COMMAND bash build_tests.sh + # ${CMAKE_BINARY_DIR}/tests/functional + # WORKING_DIRECTORY ${COLVARS_SOURCE_DIR}/tests) + # endif() + # endif() + + # Copy the Colvars configuration files + file(GLOB TEST_CONFIG_FILES ${COLVARS_SOURCE_DIR}/tests/input_files/*/test.in) + foreach(TEST_CONFIG_FILE ${TEST_CONFIG_FILES}) + get_filename_component(TEST_NAME ${TEST_CONFIG_FILE} DIRECTORY) + get_filename_component(TEST_NAME ${TEST_NAME} NAME) + add_custom_command(TARGET colvars POST_BUILD + COMMAND ${CMAKE_COMMAND} + -E copy ${TEST_CONFIG_FILE} + ${CMAKE_BINARY_DIR}/tests/functional/${TEST_NAME}/test.in) + add_test(NAME ${TEST_NAME} + COMMAND run_colvars_test ${TEST_NAME}/test.in + WORKING_DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}/tests/functional) + endforeach() + + # Copy other input files (coordinates, index files, etc) + file(GLOB TEST_INPUT_FILES ${COLVARS_SOURCE_DIR}/tests/input_files/*) + foreach(TEST_INPUT_FILE ${TEST_INPUT_FILES}) + add_custom_command(TARGET colvars POST_BUILD + COMMAND ${CMAKE_COMMAND} + -E copy ${TEST_INPUT_FILE} + ${CMAKE_BINARY_DIR}/tests/functional) + endforeach(TEST_INPUT_FILE) - if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - - # TODO automate this step and make it OS-portable - # add_custom_command(TARGET colvars POST_BUILD - # COMMAND bash build_tests.sh - # ${CMAKE_BINARY_DIR}/tests/functional - # WORKING_DIRECTORY ${COLVARS_SOURCE_DIR}/tests) - - # Copy the Colvars configuration files - file(GLOB TEST_CONFIG_FILES ${COLVARS_SOURCE_DIR}/tests/input_files/*/test.in) - foreach(TEST_CONFIG_FILE ${TEST_CONFIG_FILES}) - get_filename_component(TEST_NAME ${TEST_CONFIG_FILE} DIRECTORY) - get_filename_component(TEST_NAME ${TEST_NAME} NAME) - add_custom_command(TARGET colvars POST_BUILD - COMMAND ${CMAKE_COMMAND} - -E copy ${TEST_CONFIG_FILE} - ${CMAKE_BINARY_DIR}/tests/functional/${TEST_NAME}/test.in) - add_test(NAME ${TEST_NAME} - COMMAND run_colvars_test ${TEST_NAME}/test.in - WORKING_DIRECTORY - ${CMAKE_CURRENT_BINARY_DIR}/tests/functional) - endforeach() - - # Copy other input files (coordinates, index files, etc) - file(GLOB TEST_INPUT_FILES ${COLVARS_SOURCE_DIR}/tests/input_files/*) - foreach(TEST_INPUT_FILE ${TEST_INPUT_FILES}) - add_custom_command(TARGET colvars POST_BUILD - COMMAND ${CMAKE_COMMAND} - -E copy ${TEST_INPUT_FILE} - ${CMAKE_BINARY_DIR}/tests/functional) - endforeach(TEST_INPUT_FILE) - - endif() - endif() enable_testing() endif() diff --git a/devel-tools/build_test_library.cmake b/devel-tools/build_test_library.cmake index 53fb22bd1..4f0f4eb55 100644 --- a/devel-tools/build_test_library.cmake +++ b/devel-tools/build_test_library.cmake @@ -7,6 +7,10 @@ else() get_filename_component(COLVARS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) endif() +if(NOT DEFINED CMAKE_SYSTEM_NAME) + set(CMAKE_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME}) +endif() + set(COLVARS_LEPTON ON) if(NOT DEFINED CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 11) @@ -25,7 +29,7 @@ if(NOT DEFINED COLVARS_TCL) set(COLVARS_TCL ON) endif() -if(DEFINED CMAKE_SYSTEM_NAME AND COLVARS_TCL) +if(DEFINED COLVARS_TCL) # If available, use pre-downloaded OS-specific TCL libraries @@ -76,12 +80,17 @@ if(DEFINED ENV{CCACHE}) set(DEFINE_CXX_CCACHE "-DCMAKE_CXX_COMPILER_LAUNCHER=$ENV{CCACHE}") endif() +set(CMAKE_BUILD_TYPE "RelWithDebinfo") +if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + set(CMAKE_BUILD_TYPE "Debug") +endif() + execute_process( COMMAND ${CMAKE_COMMAND} -S cmake -B ${BUILD_DIR} -D COLVARS_DEBUG=${COLVARS_DEBUG} - -D CMAKE_BUILD_TYPE=RelWithDebinfo + -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} -D WARNINGS_ARE_ERRORS=ON -D CMAKE_VERBOSE_MAKEFILE=ON @@ -112,7 +121,7 @@ if(NOT result EQUAL 0) message(FATAL_ERROR "Error building library.") else() execute_process( - COMMAND ${CMAKE_CTEST_COMMAND} + COMMAND ${CMAKE_CTEST_COMMAND} -C ${CMAKE_BUILD_TYPE} WORKING_DIRECTORY ${BUILD_DIR} RESULT_VARIABLE result )