Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/arm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -174,9 +174,14 @@ jobs:
c++ --version
cmake --version

ctest -S ${{ github.workspace }}/ITK-dashboard/dashboard.cmake -VV -j ${{ matrix.parallel-level }} ${{ matrix.ctest-options }}
ctest -S ${{ github.workspace }}/ITK-dashboard/dashboard.cmake -V -j ${{ matrix.parallel-level }} ${{ matrix.ctest-options }}
env:
CTEST_OUTPUT_ON_FAILURE: 1

- name: Report build warnings and errors
if: always()
run: python3 ${{ github.workspace }}/Testing/ContinuousIntegration/report_build_diagnostics.py ${{ github.workspace }}/build

- name: Save compiler cache
if: ${{ !cancelled() }}
uses: actions/cache/save@v5
Expand Down
4 changes: 4 additions & 0 deletions Modules/Core/Common/src/itkObject.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@

namespace itk
{
// WIP: Deliberate unused variable to generate a compiler warning.
// This is a test artifact for PR #5971 and must NOT be merged.
static int deliberately_unused_variable_for_ci_test = 42;

/**
* Initialize static member that controls warning display.
*/
Expand Down
9 changes: 8 additions & 1 deletion Modules/Core/Common/test/itkPointGeometryTest.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -297,5 +297,12 @@ itkPointGeometryTest(int, char *[])
std::cout << "Test for Barycentric combination of a VectorContainer of Points PASSED" << std::endl;
}

return EXIT_SUCCESS;
// WIP: Deliberate test failure to verify CTEST_OUTPUT_ON_FAILURE
// works with -V instead of -VV. This is a test artifact for PR #5971
// and must NOT be merged.
std::cerr << "DELIBERATE FAILURE: This output should appear in CI logs" << std::endl;
std::cerr << "because CTEST_OUTPUT_ON_FAILURE=1 is set and -V (not -VV)" << std::endl;
std::cerr << "is used. If you can read this in the CI log, the new" << std::endl;
std::cerr << "verbosity scheme is working correctly." << std::endl;
return EXIT_FAILURE;
}
6 changes: 5 additions & 1 deletion Testing/ContinuousIntegration/AzurePipelinesBatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,16 @@ jobs:
- script: |
cmake --version
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -VV -j 2
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -V -j 2
displayName: 'Build and test'
env:
CTEST_OUTPUT_ON_FAILURE: 1
CCACHE_MAXSIZE: 2.4G

- script: python $(Build.SourcesDirectory)/Testing/ContinuousIntegration/report_build_diagnostics.py $(Build.SourcesDirectory)-build
condition: succeededOrFailed()
displayName: 'Report build warnings and errors'

- script: |
ci_addons ctest_junit_formatter $(Build.SourcesDirectory)-build > $(Agent.BuildDirectory)/JUnitTestResults.xml
condition: succeededOrFailed()
Expand Down
19 changes: 16 additions & 3 deletions Testing/ContinuousIntegration/AzurePipelinesLinux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,16 @@ jobs:
c++ --version
cmake --version

ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -VV -j 2
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -V -j 2
displayName: 'Build and test'
env:
CTEST_OUTPUT_ON_FAILURE: 1
CCACHE_MAXSIZE: 2.4G

- bash: python3 $(Build.SourcesDirectory)/Testing/ContinuousIntegration/report_build_diagnostics.py $(Build.SourcesDirectory)-build
condition: succeededOrFailed()
displayName: 'Report build warnings and errors'

- script: |
ci_addons ctest_junit_formatter $(Build.SourcesDirectory)-build > $(Agent.BuildDirectory)/JUnitTestResults.xml
condition: succeededOrFailed()
Expand Down Expand Up @@ -202,12 +206,16 @@ jobs:
c++ --version
cmake --version

ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -VV -j 2
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -V -j 2
displayName: 'Build and test'
env:
CTEST_OUTPUT_ON_FAILURE: 1
CCACHE_MAXSIZE: 2.4G

- bash: python3 $(Build.SourcesDirectory)/Testing/ContinuousIntegration/report_build_diagnostics.py $(Build.SourcesDirectory)-build
condition: succeededOrFailed()
displayName: 'Report build warnings and errors'

- script: |
ci_addons ctest_junit_formatter $(Build.SourcesDirectory)-build > $(Agent.BuildDirectory)/JUnitTestResults.xml
condition: succeededOrFailed()
Expand Down Expand Up @@ -291,11 +299,16 @@ jobs:
set -x
c++ --version
cmake --version
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -VV -j 2
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -V -j 2
displayName: "Build and test"
env:
CTEST_OUTPUT_ON_FAILURE: 1
CCACHE_MAXSIZE: 2.4G

- bash: python3 $(Build.SourcesDirectory)/Testing/ContinuousIntegration/report_build_diagnostics.py $(Build.SourcesDirectory)-build
condition: succeededOrFailed()
displayName: 'Report build warnings and errors'

- script: |
ci_addons ctest_junit_formatter $(Build.SourcesDirectory)-build > $(Agent.BuildDirectory)/JUnitTestResults.xml
condition: succeededOrFailed()
Expand Down
6 changes: 5 additions & 1 deletion Testing/ContinuousIntegration/AzurePipelinesLinuxPython.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,16 @@ jobs:
c++ --version
cmake --version

ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -VV -j 2 -L Python -E "(PythonExtrasTest)|(PythonFastMarching)|(PythonLazyLoadingImage)|(PythonThresholdSegmentationLevelSetWhiteMatterTest)|(PythonVerifyTTypeAPIConsistency)|(PythonWatershedSegmentation1Test)"
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -V -j 2 -L Python -E "(PythonExtrasTest)|(PythonFastMarching)|(PythonLazyLoadingImage)|(PythonThresholdSegmentationLevelSetWhiteMatterTest)|(PythonVerifyTTypeAPIConsistency)|(PythonWatershedSegmentation1Test)"
displayName: 'Build and test'
env:
CTEST_OUTPUT_ON_FAILURE: 1
CCACHE_MAXSIZE: 2.4G

- bash: python3 $(Build.SourcesDirectory)/Testing/ContinuousIntegration/report_build_diagnostics.py $(Build.SourcesDirectory)-build
condition: succeededOrFailed()
displayName: 'Report build warnings and errors'

- script: |
ci_addons ctest_junit_formatter $(Build.SourcesDirectory)-build > $(Agent.BuildDirectory)/JUnitTestResults.xml
condition: succeededOrFailed()
Expand Down
6 changes: 5 additions & 1 deletion Testing/ContinuousIntegration/AzurePipelinesMacOS.yml
Original file line number Diff line number Diff line change
Expand Up @@ -110,12 +110,16 @@ jobs:
c++ --version
cmake --version

ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -VV -j 3
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -V -j 3
displayName: 'Build and test'
env:
CTEST_OUTPUT_ON_FAILURE: 1
CCACHE_MAXSIZE: 2.4G

- bash: python3 $(Build.SourcesDirectory)/Testing/ContinuousIntegration/report_build_diagnostics.py $(Build.SourcesDirectory)-build
condition: succeededOrFailed()
displayName: 'Report build warnings and errors'

- script: |
ci_addons ctest_junit_formatter $(Build.SourcesDirectory)-build > $(Agent.BuildDirectory)/JUnitTestResults.xml
condition: succeededOrFailed()
Expand Down
6 changes: 5 additions & 1 deletion Testing/ContinuousIntegration/AzurePipelinesMacOSPython.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,16 @@ jobs:
c++ --version
cmake --version

ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -VV -j 3
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -V -j 3
displayName: 'Build and test'
env:
CTEST_OUTPUT_ON_FAILURE: 1
CCACHE_MAXSIZE: 2.4G

- bash: python3 $(Build.SourcesDirectory)/Testing/ContinuousIntegration/report_build_diagnostics.py $(Build.SourcesDirectory)-build
condition: succeededOrFailed()
displayName: 'Report build warnings and errors'

- script: |
ci_addons ctest_junit_formatter $(Build.SourcesDirectory)-build > $(Agent.BuildDirectory)/JUnitTestResults.xml
condition: succeededOrFailed()
Expand Down
6 changes: 5 additions & 1 deletion Testing/ContinuousIntegration/AzurePipelinesWindows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,16 @@ jobs:
- script: |
cmake --version
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -VV -j 2
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -V -j 2
displayName: 'Build and test'
env:
CTEST_OUTPUT_ON_FAILURE: 1
CCACHE_MAXSIZE: 2.4G

- script: python $(Build.SourcesDirectory)/Testing/ContinuousIntegration/report_build_diagnostics.py $(Build.SourcesDirectory)-build
condition: succeededOrFailed()
displayName: 'Report build warnings and errors'

- script: |
ci_addons ctest_junit_formatter $(Build.SourcesDirectory)-build > $(Agent.BuildDirectory)/JUnitTestResults.xml
condition: succeededOrFailed()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,16 @@ jobs:
- script: |
cmake --version
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -VV -j 2 -L Python
ctest -S $(Agent.BuildDirectory)/ITK-dashboard/dashboard.cmake -V -j 2 -L Python
displayName: 'Build and test'
env:
CTEST_OUTPUT_ON_FAILURE: 1
CCACHE_MAXSIZE: 2.4G

- script: python $(Build.SourcesDirectory)/Testing/ContinuousIntegration/report_build_diagnostics.py $(Build.SourcesDirectory)-build
condition: succeededOrFailed()
displayName: 'Report build warnings and errors'

- script: |
ci_addons ctest_junit_formatter $(Build.SourcesDirectory)-build > $(Agent.BuildDirectory)/JUnitTestResults.xml
condition: succeededOrFailed()
Expand Down
83 changes: 83 additions & 0 deletions Testing/ContinuousIntegration/report_build_diagnostics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#!/usr/bin/env python3
"""Extract and print build warnings/errors from CTest Build.xml.

ctest_build() writes compiler diagnostics to Build.xml for CDash but
does not print them to stdout. This script reads Build.xml from the
most recent test run and prints the <Text> content of every <Warning>
and <Error> element so diagnostics appear directly in CI logs.

Usage:
python report_build_diagnostics.py <build-directory>
"""

import os
import sys
import xml.etree.ElementTree as ET


def main():
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <build-directory>", file=sys.stderr)
sys.exit(1)

build_dir = sys.argv[1]

# CTest writes a TAG file whose first line is the timestamp directory.
tag_file = os.path.join(build_dir, "Testing", "TAG")
if not os.path.isfile(tag_file):
print(f"No TAG file found at {tag_file} — skipping.", file=sys.stderr)
return

with open(tag_file) as f:
tag_dir = f.readline().strip()

build_xml = os.path.join(build_dir, "Testing", tag_dir, "Build.xml")
if not os.path.isfile(build_xml):
print(f"No Build.xml found at {build_xml} — skipping.", file=sys.stderr)
return

tree = ET.parse(build_xml)
root = tree.getroot()

# Find all <Warning> and <Error> elements under <Build>.
warnings = []
errors = []
for build_elem in root.iter("Build"):
for warning in build_elem.findall("Warning"):
text = warning.findtext("Text", "").strip()
src = warning.findtext("SourceFile", "").strip()
line = warning.findtext("SourceLineNumber", "").strip()
if text:
warnings.append((src, line, text))
for error in build_elem.findall("Error"):
text = error.findtext("Text", "").strip()
src = error.findtext("SourceFile", "").strip()
line = error.findtext("SourceLineNumber", "").strip()
if text:
errors.append((src, line, text))

if not warnings and not errors:
print("No build warnings or errors found.")
return

if errors:
print(f"========== BUILD ERRORS ({len(errors)}) ==========")
for src, line, text in errors:
print(f" {text}")
print()

if warnings:
print(f"========== BUILD WARNINGS ({len(warnings)}) ==========")
for src, line, text in warnings:
print(f" {text}")
print()

print("====================================================")

# Exit with non-zero status only if there are errors (warnings are
# informational). This lets CI pipelines treat the step as a
# soft-fail for warnings but hard-fail for errors if desired.


if __name__ == "__main__":
main()
Loading