From: Daniel P. Berrangé <berrange@redhat.com>
Passing warning flags to the C compiler results in incredibly long
command lines, which in turns results in incredibly large CI log
files. Our logs are so large that they often exceed the GitLab
file limits.
We've cut out the irrelevant cruft from the logs and they're still
too large. The only option left is to stop passing so many args
to the compiler.
Fortunately it is easy to achieve this with GCC/CLang as when seeing
an argument "@somepath" they will treat each line in "somepath" as
being an additional compiler argument.
Putting the warning flags in a 'c-warnings.txt' file is fairly
easy and a massive win. We don't loose anything from the CI logs
as we print the full set of warning flags at the end of running
'meson'. Meanwhile for interactive builds the flags are visible
in the c-warning.txt file in the build directory root.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
meson.build | 114 ++++++++++++++++++++------------------
scripts/meson-warnings.py | 9 +++
2 files changed, 69 insertions(+), 54 deletions(-)
create mode 100644 scripts/meson-warnings.py
diff --git a/meson.build b/meson.build
index d72c8e7a23..964d1fa4e1 100644
--- a/meson.build
+++ b/meson.build
@@ -232,6 +232,59 @@ libvirt_revision = arr_version[2].to_int()
libvirt_lib_version = '@0@.@1@.@2@'.format(libvirt_so_version, libvirt_age, libvirt_revision)
+# Where we look for daemons and admin binaries during configure
+
+libvirt_sbin_path = []
+
+if host_machine.system() != 'windows'
+ libvirt_sbin_path += [
+ '/sbin',
+ '/usr/sbin',
+ '/usr/local/sbin',
+ ]
+endif
+
+
+# required programs check
+
+required_programs = [
+ 'perl',
+ 'python3',
+ 'xmllint',
+ 'xsltproc',
+]
+
+foreach name : required_programs
+ prog = find_program(name, dirs: libvirt_sbin_path)
+ varname = name.underscorify()
+ set_variable('@0@_prog'.format(varname), prog)
+endforeach
+
+# optional programs
+
+optional_programs = [
+ 'augparse',
+ 'black',
+ 'flake8',
+ 'pdwtags',
+ 'pytest',
+]
+
+missing_optional_programs = []
+foreach name : optional_programs
+ prog = find_program(name, required: false, dirs: libvirt_sbin_path)
+ varname = name.underscorify()
+ if prog.found()
+ prog_path = prog.full_path()
+ else
+ prog_path = name
+ missing_optional_programs += [ name ]
+ endif
+
+ set_variable('@0@_prog'.format(varname), prog)
+endforeach
+
+
# check compile flags
cc = meson.get_compiler('c')
@@ -534,7 +587,13 @@ if get_option('warning_level') == '2'
endif
endif
-add_project_arguments(supported_cc_flags, language: 'c')
+
+run_command([python3_prog,
+ 'scripts' / 'meson-warnings.py',
+ meson.current_build_dir() / 'c-warnings.txt'] + supported_cc_flags,
+ check: true)
+
+add_project_arguments('@' + meson.current_build_dir() / 'c-warnings.txt', language: 'c')
if cc.has_argument('-Wsuggest-attribute=format')
conf.set('WITH_SUGGEST_ATTRIBUTE_FORMAT', 1)
@@ -809,59 +868,6 @@ endforeach
conf.set('SIZEOF_LONG', cc.sizeof('long'))
-# Where we look for daemons and admin binaries during configure
-
-libvirt_sbin_path = []
-
-if host_machine.system() != 'windows'
- libvirt_sbin_path += [
- '/sbin',
- '/usr/sbin',
- '/usr/local/sbin',
- ]
-endif
-
-
-# required programs check
-
-required_programs = [
- 'perl',
- 'python3',
- 'xmllint',
- 'xsltproc',
-]
-
-foreach name : required_programs
- prog = find_program(name, dirs: libvirt_sbin_path)
- varname = name.underscorify()
- set_variable('@0@_prog'.format(varname), prog)
-endforeach
-
-# optional programs
-
-optional_programs = [
- 'augparse',
- 'black',
- 'flake8',
- 'pdwtags',
- 'pytest',
-]
-
-missing_optional_programs = []
-foreach name : optional_programs
- prog = find_program(name, required: false, dirs: libvirt_sbin_path)
- varname = name.underscorify()
- if prog.found()
- prog_path = prog.full_path()
- else
- prog_path = name
- missing_optional_programs += [ name ]
- endif
-
- set_variable('@0@_prog'.format(varname), prog)
-endforeach
-
-
# early checks where lot of other packages depend on the result
if not get_option('driver_remote').disabled()
diff --git a/scripts/meson-warnings.py b/scripts/meson-warnings.py
new file mode 100644
index 0000000000..27b0d45631
--- /dev/null
+++ b/scripts/meson-warnings.py
@@ -0,0 +1,9 @@
+#!/usr/bin/env python3
+
+import shutil
+import sys
+
+with open(sys.argv[1], "w") as out:
+ for w in sys.argv[2:]:
+ print(w, file=out)
+
--
2.52.0
On a Friday in 2026, Daniel P. Berrangé via Devel wrote: >From: Daniel P. Berrangé <berrange@redhat.com> > >Passing warning flags to the C compiler results in incredibly long >command lines, which in turns results in incredibly large CI log >files. Our logs are so large that they often exceed the GitLab >file limits. > >We've cut out the irrelevant cruft from the logs and they're still >too large. The only option left is to stop passing so many args >to the compiler. > >Fortunately it is easy to achieve this with GCC/CLang as when seeing >an argument "@somepath" they will treat each line in "somepath" as >being an additional compiler argument. > >Putting the warning flags in a 'c-warnings.txt' file is fairly >easy and a massive win. We don't loose anything from the CI logs s/loose/lose/ >as we print the full set of warning flags at the end of running >'meson'. Meanwhile for interactive builds the flags are visible >in the c-warning.txt file in the build directory root. c-warnings.txt Jano > >Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> >--- > meson.build | 114 ++++++++++++++++++++------------------ > scripts/meson-warnings.py | 9 +++ > 2 files changed, 69 insertions(+), 54 deletions(-) > create mode 100644 scripts/meson-warnings.py
© 2016 - 2026 Red Hat, Inc.