5959# CI runs the full suite via ./mfc.sh lint without this variable.
6060export MFC_SKIP_RENDER_TESTS=1
6161
62+ # Detect whether any Fortran sources or CMakeLists changed — if so, run a build.
63+ # This catches compilation errors (duplicate declarations, missing symbols, etc.)
64+ # cheaply: Python-only changes pay zero build cost.
65+ if git diff HEAD --name-only 2> /dev/null | grep -qE ' \.(fpp|f90)$|CMakeLists\.txt' ; then
66+ BUILD_FORTRAN=1
67+ else
68+ BUILD_FORTRAN=0
69+ fi
70+
71+ if [ " $BUILD_FORTRAN " = " 1" ]; then
72+ NCHECK=9
73+ else
74+ NCHECK=8
75+ fi
76+
6277log " Running$MAGENTA precheck$COLOR_RESET (same checks as CI lint-gate)..."
6378echo " "
6479
7994 fi
8095fi
8196
82- # --- Phase 2: All remaining checks in parallel (read-only) ---
97+ # --- Phase 2: All fast checks in parallel (read-only) ---
8398
8499# Spell check
85100(
127142) &
128143PID_PARAM_DOCS=$!
129144
145+ # Generated files check (JSON schema, completions, docs)
146+ (
147+ if ./mfc.sh generate --check > /dev/null 2>&1 ; then
148+ echo " 0" > " $TMPDIR_PC /generate_exit"
149+ else
150+ echo " 1" > " $TMPDIR_PC /generate_exit"
151+ fi
152+ ) &
153+ PID_GENERATE=$!
154+
130155# Example case validation
131156(
132157 failed=0
@@ -140,11 +165,11 @@ PID_PARAM_DOCS=$!
140165) &
141166PID_EXAMPLES=$!
142167
143- # --- Collect results ---
168+ # --- Collect results (fast checks) ---
144169
145170FAILED=0
146171
147- log " [$CYAN 1/7 $COLOR_RESET ] Checking$MAGENTA formatting$COLOR_RESET ..."
172+ log " [$CYAN 1/$NCHECK $COLOR_RESET ] Checking$MAGENTA formatting$COLOR_RESET ..."
148173if [ " $FORMAT_OK " = " 1" ]; then
149174 error " Formatting check failed to run."
150175 FAILED=1
159184fi
160185
161186wait $PID_SPELL
162- log " [$CYAN 2/7 $COLOR_RESET ] Running$MAGENTA spell check$COLOR_RESET ..."
187+ log " [$CYAN 2/$NCHECK $COLOR_RESET ] Running$MAGENTA spell check$COLOR_RESET ..."
163188SPELL_RC=$( cat " $TMPDIR_PC /spell_exit" 2> /dev/null || echo " 1" )
164189if [ " $SPELL_RC " = " 0" ]; then
165190 ok " Spell check passed."
169194fi
170195
171196wait $PID_LINT
172- log " [$CYAN 3/7 $COLOR_RESET ] Running$MAGENTA toolchain lint$COLOR_RESET ..."
197+ log " [$CYAN 3/$NCHECK $COLOR_RESET ] Running$MAGENTA toolchain lint$COLOR_RESET ..."
173198LINT_RC=$( cat " $TMPDIR_PC /lint_exit" 2> /dev/null || echo " 1" )
174199if [ " $LINT_RC " = " 0" ]; then
175200 ok " Toolchain lint passed."
179204fi
180205
181206wait $PID_SOURCE
182- log " [$CYAN 4/7 $COLOR_RESET ] Running$MAGENTA source lint$COLOR_RESET ..."
207+ log " [$CYAN 4/$NCHECK $COLOR_RESET ] Running$MAGENTA source lint$COLOR_RESET ..."
183208SOURCE_RC=$( cat " $TMPDIR_PC /source_exit" 2> /dev/null || echo " 1" )
184209if [ " $SOURCE_RC " = " 0" ]; then
185210 ok " Source lint passed."
188213 FAILED=1
189214fi
190215
191- log " [$CYAN 5/7 $COLOR_RESET ] Checking$MAGENTA doc references$COLOR_RESET ..."
216+ log " [$CYAN 5/$NCHECK $COLOR_RESET ] Checking$MAGENTA doc references$COLOR_RESET ..."
192217if [ $DOC_FAILED -eq 0 ]; then
193218 ok " Doc references are valid."
194219else
197222fi
198223
199224wait $PID_PARAM_DOCS
200- log " [$CYAN 6/7 $COLOR_RESET ] Checking$MAGENTA parameter docs$COLOR_RESET ..."
225+ log " [$CYAN 6/$NCHECK $COLOR_RESET ] Checking$MAGENTA parameter docs$COLOR_RESET ..."
201226PARAM_DOCS_RC=$( cat " $TMPDIR_PC /param_docs_exit" 2> /dev/null || echo " 1" )
202227if [ " $PARAM_DOCS_RC " = " 0" ]; then
203228 ok " Parameter documentation check passed."
@@ -206,8 +231,18 @@ else
206231 FAILED=1
207232fi
208233
234+ wait $PID_GENERATE
235+ log " [$CYAN 7/$NCHECK$COLOR_RESET ] Checking$MAGENTA generated files$COLOR_RESET ..."
236+ GENERATE_RC=$( cat " $TMPDIR_PC /generate_exit" 2> /dev/null || echo " 1" )
237+ if [ " $GENERATE_RC " = " 0" ]; then
238+ ok " Generated files are up to date."
239+ else
240+ error " Generated files are out of date. Run$MAGENTA ./mfc.sh generate$COLOR_RESET to update."
241+ FAILED=1
242+ fi
243+
209244wait $PID_EXAMPLES
210- log " [$CYAN 7/7 $COLOR_RESET ] Validating$MAGENTA example cases$COLOR_RESET ..."
245+ log " [$CYAN 8/ $NCHECK $COLOR_RESET ] Validating$MAGENTA example cases$COLOR_RESET ..."
211246EXAMPLES_FAILED=$( cat " $TMPDIR_PC /examples_exit" 2> /dev/null || echo " 1" )
212247if [ " $EXAMPLES_FAILED " = " 0" ]; then
213248 ok " All example cases are valid."
@@ -216,6 +251,19 @@ else
216251 FAILED=1
217252fi
218253
254+ # --- Phase 3: Build (only when Fortran sources changed) ---
255+
256+ if [ " $BUILD_FORTRAN " = " 1" ]; then
257+ log " [$CYAN 9/9$COLOR_RESET ] Building$MAGENTA (Fortran changes detected)$COLOR_RESET ..."
258+ if ./mfc.sh build -j " $JOBS " > " $TMPDIR_PC /build_out" 2>&1 ; then
259+ ok " Build passed."
260+ else
261+ error " Build failed. Output:"
262+ cat " $TMPDIR_PC /build_out" | tail -20
263+ FAILED=1
264+ fi
265+ fi
266+
219267echo " "
220268
221269if [ $FAILED -eq 0 ]; then
0 commit comments