diff --git a/.github/workflows/premerge.yml b/.github/workflows/premerge.yml index 7afa4d5..70cf576 100644 --- a/.github/workflows/premerge.yml +++ b/.github/workflows/premerge.yml @@ -5,7 +5,7 @@ on: branches: [ "main" ] env: - BUILD_TYPE: Release + CMAKE_PRESET: release jobs: build: @@ -25,13 +25,21 @@ jobs: sudo ./llvm.sh 20 sudo apt install libmlir-20-dev mlir-20-tools + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 + with: + create-symlink: true + - name: Configure CMake - run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DENABLE_CACHE=OFF + run: cmake --preset ${{env.CMAKE_PRESET}} - name: Build - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + run: cmake --build --preset ${{env.CMAKE_PRESET}} - name: Test - working-directory: ${{github.workspace}}/build - run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target test + run: | + ctest --preset ${{env.CMAKE_PRESET}} -E integration-tests + # only run the integration-tests with verbose so we can see the + # whole output which includes which python scripts passed + ctest --preset ${{env.CMAKE_PRESET}} -R integration-tests -V diff --git a/.gitignore b/.gitignore index b2b6d48..6a41440 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__/ build/ +.cache/ \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7b55868..718b621 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,4 +2,5 @@ repos: - repo: https://github.com/pre-commit/mirrors-clang-format rev: 'v20.1.8' hooks: - - id: clang-format \ No newline at end of file + - id: clang-format + types_or: [c++, c] \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index b22f4e3..a609182 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,8 +88,6 @@ if(NOT MATH_LIBRARY) message(FATAL_ERROR "Could not find math library") endif() +enable_testing() add_subdirectory(src) add_subdirectory(integration) - -add_custom_target(test) -add_dependencies(test run-unittests integration-tests) diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..fce0cf2 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,52 @@ +{ + "version": 6, + "configurePresets": [ + { + "name": "debug", + "displayName": "Debug", + "generator": "Ninja", + "binaryDir": "build/debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CPM_SOURCE_CACHE": ".cache/CPM" + } + }, + { + "name": "release", + "displayName": "Release", + "generator": "Ninja", + "binaryDir": "build/release", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CPM_SOURCE_CACHE": ".cache/CPM" + } + } + ], + "buildPresets": [ + { + "name": "debug", + "displayName": "Debug Build", + "configurePreset": "debug", + "configuration": "Debug" + }, + { + "name": "release", + "displayName": "Release Build", + "configurePreset": "release", + "configuration": "Release" + } + ], + "testPresets": [ + { + "name": "debug", + "displayName": "Test all in Debug mode", + "configurePreset": "debug" + }, + { + "name": "release", + "displayName": "Test all in Release mode", + "configurePreset": "release" + } + ] + +} \ No newline at end of file diff --git a/integration/CMakeLists.txt b/integration/CMakeLists.txt index 6c58419..4c2d33b 100644 --- a/integration/CMakeLists.txt +++ b/integration/CMakeLists.txt @@ -1,25 +1,21 @@ -include(GoogleTest) - add_executable(integration-tests_ program.cpp ../src/testing/main.cpp) target_link_libraries(integration-tests_ PRIVATE python-cpp gtest gtest_main cxxopts project_options project_warnings tsl::ordered_map) -# gtest_add_tests(TARGET integration-tests_) +# gtest_discover_tests(integration-tests_) + +add_test( + NAME integration-tests + COMMAND ${PROJECT_SOURCE_DIR}/integration/run_integration_tests.sh $ + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/integration +) + +# Ensure the test only runs after the required targets are built +set_tests_properties(integration-tests PROPERTIES + FIXTURES_REQUIRED "python_built" +) -# cmake-format: off -add_custom_target( - integration-tests - COMMAND # $ - echo "------------------------" - && echo "Running python scripts:" - && echo "------------------------" - && echo "" - && $ ${PROJECT_SOURCE_DIR}/integration/fibonacci/main.py --gc-frequency 1 - && $ ${PROJECT_SOURCE_DIR}/integration/mandelbrot/mandelbrot.py --gc-frequency 1 - && ${PROJECT_SOURCE_DIR}/integration/run_python_tests.sh $ - && echo "" - && echo "------------------------" - && echo "Testing LLVM backend:" - && echo "------------------------" - && echo "" - && ${PROJECT_SOURCE_DIR}/integration/run_llvm_python_tests.sh $ - DEPENDS integration-tests_ python) -# cmake-format: on +# Add a setup test that depends on building python +add_test(NAME setup-python COMMAND ${CMAKE_COMMAND} -E echo "Python built") +set_tests_properties(setup-python PROPERTIES + FIXTURES_SETUP "python_built" + DEPENDS python # This may not work in all CMake versions +) diff --git a/integration/run_integration_tests.sh b/integration/run_integration_tests.sh new file mode 100755 index 0000000..c188615 --- /dev/null +++ b/integration/run_integration_tests.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e # Exit on any error + +echo "------------------------" +echo "Running python scripts:" +echo "------------------------" +echo "" + +"$1" fibonacci/main.py --gc-frequency 1 +"$1" mandelbrot/mandelbrot.py --gc-frequency 1 +./run_python_tests.sh "$1" + +echo "" +echo "------------------------" +echo "Testing LLVM backend:" +echo "------------------------" +echo "" + +./run_llvm_python_tests.sh "$1" \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a2e5e76..889a9d7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -349,8 +349,7 @@ elseif(ENABLE_LLVM_BACKEND AND LLVM_FOUND) endif() target_link_libraries(unittests_ PRIVATE python-cpp gtest gtest_main cxxopts project_options project_warnings tsl::ordered_map) -set_target_properties(unittests_ PROPERTIES OUTPUT_NAME "unittests") -add_custom_target(run-unittests COMMAND $ DEPENDS unittests_) +gtest_discover_tests(unittests_) add_executable(python repl/repl.cpp) target_link_libraries(python PRIVATE linenoise cxxopts python-cpp project_options project_warnings stdc++)