diff --git a/.github/workflows/precompile-checks.yml b/.github/workflows/precompile-checks.yml new file mode 100644 index 000000000..f090cb75f --- /dev/null +++ b/.github/workflows/precompile-checks.yml @@ -0,0 +1,21 @@ +name: Precompile Checks + +on: + push: + branches: + - master + paths: ['**/*.c', '**/*.cpp'] + pull_request: + types: [opened, synchronize, reopened] + paths: ['**/*.c', '**/*.cpp'] + +jobs: + precompile-check: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Run Forbidden Includes Check + run: bash scripts/precompile-checks.sh diff --git a/Makefile b/Makefile index dc3de3cb1..7d88a7ac7 100644 --- a/Makefile +++ b/Makefile @@ -211,7 +211,7 @@ ifdef GGML_VULKAN BUILD_TARGETS += vulkan-shaders-gen endif -default: $(BUILD_TARGETS) $(LEGACY_TARGETS_BUILD) +default: precompile_checks $(BUILD_TARGETS) $(LEGACY_TARGETS_BUILD) test: $(TEST_TARGETS) @failures=0; \ @@ -248,6 +248,10 @@ test: $(TEST_TARGETS) all: $(BUILD_TARGETS) $(TEST_TARGETS) $(LEGACY_TARGETS_BUILD) +# Run the forbidden includes check before every build +precompile_checks: + @bash ./scripts/precompile-checks.sh + ifdef RISCV_CROSS_COMPILE CC := riscv64-unknown-linux-gnu-gcc CXX := riscv64-unknown-linux-gnu-g++ diff --git a/scripts/precompile-checks.sh b/scripts/precompile-checks.sh new file mode 100755 index 000000000..f0be3a9f0 --- /dev/null +++ b/scripts/precompile-checks.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# This runs some pre compilation sanity checks that certain project rules and guidelines are kept +# This will not contain any signifiant logic, but mostly just obvious and easily greppable checks + +ERROR_FOUND=0 + + +## START OF INCLUDES EXCLUDED FROM EXAMPLES FOLDER ## +SRC_DIR="./examples" +FORBIDDEN_HEADERS=("llama-impl.h") +echo "🔍 Scanning for forbidden includes in $SRC_DIR..." +for HEADER in "${FORBIDDEN_HEADERS[@]}"; do + MATCHES=$(grep -rn --include=\*.{c,cpp} "#include \"$HEADER\"" "$SRC_DIR" 2>/dev/null) + + if [[ -n "$MATCHES" ]]; then + echo "❌ Forbidden include detected: $HEADER" + echo "$MATCHES" | while IFS=: read -r FILE LINE _; do + echo "::error file=$FILE,line=$LINE::Forbidden include: $HEADER in $FILE at line $LINE" + done + ERROR_FOUND=1 + fi + +done +## END OF INCLUDES EXCLUDED FROM EXAMPLES FOLDER ## + + +if [[ "$ERROR_FOUND" -eq 1 ]]; then + echo "❌ Forbidden includes found. Please remove!" + exit 1 +else + echo "✅ No forbidden includes found." +fi