From 5746f9bc96f95e4a5b4d9c6371095490d04133ba Mon Sep 17 00:00:00 2001 From: gf712 Date: Tue, 16 Dec 2025 14:46:59 +0000 Subject: [PATCH 1/2] build+ci: Use cmake presets --- .github/workflows/premerge.yml | 13 ++++--- .gitignore | 1 + .pre-commit-config.yaml | 3 +- CMakeLists.txt | 4 +-- CMakePresets.json | 52 ++++++++++++++++++++++++++++ integration/CMakeLists.txt | 40 ++++++++++----------- integration/run_integration_tests.sh | 19 ++++++++++ src/CMakeLists.txt | 3 +- 8 files changed, 102 insertions(+), 33 deletions(-) create mode 100644 CMakePresets.json create mode 100755 integration/run_integration_tests.sh diff --git a/.github/workflows/premerge.yml b/.github/workflows/premerge.yml index 7afa4d5a..b20b16c7 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: @@ -26,12 +26,15 @@ jobs: sudo apt install libmlir-20-dev mlir-20-tools - 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 b2b6d480..6a414407 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 7b558688..718b6211 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 b22f4e39..a6091822 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 00000000..fce0cf29 --- /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 6c584190..4c2d33b9 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 00000000..c188615e --- /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 a2e5e767..889a9d75 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++) From d0acae77a948af563b50d8425b939e553f2102bc Mon Sep 17 00:00:00 2001 From: gf712 Date: Tue, 16 Dec 2025 14:51:54 +0000 Subject: [PATCH 2/2] ci: add ccache --- .github/workflows/premerge.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/premerge.yml b/.github/workflows/premerge.yml index b20b16c7..70cf5766 100644 --- a/.github/workflows/premerge.yml +++ b/.github/workflows/premerge.yml @@ -25,6 +25,11 @@ 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 --preset ${{env.CMAKE_PRESET}}