ci: Pass -Werror to compiler linking stage for LTO
authorMichel Dänzer <mdaenzer@redhat.com>
Fri, 10 Feb 2023 15:19:36 +0000 (16:19 +0100)
committerMarge Bot <emma+marge@anholt.net>
Fri, 17 Mar 2023 16:08:33 +0000 (16:08 +0000)
With LTO, some compiler warnings are generated only at the compiler's
linking stage. Therefore -Werror needs to be passed to the linking stage
as well for warnings to be turned into errors.

Meson should really do this when both werror and b_lto are enabled, but
meanwhile let's do it ourselves.

We can't just add -Werror to c{,pp}_link_args, because those are passed
for Meson's feature checks, some of which generate warnings, resulting
in false negatives. We use gcc/g++ wrapper scripts instead.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21781>

.gitlab-ci/build/ccache-g++-link-werror.sh [new file with mode: 0755]
.gitlab-ci/build/ccache-gcc-link-werror.sh [new file with mode: 0755]
.gitlab-ci/build/gitlab-ci.yml
.gitlab-ci/build/meson-native-lto-wrappers.txt [new file with mode: 0644]

diff --git a/.gitlab-ci/build/ccache-g++-link-werror.sh b/.gitlab-ci/build/ccache-g++-link-werror.sh
new file mode 100755 (executable)
index 0000000..1264dec
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh -e
+
+if [ "$(ps -p $(ps -p $PPID -o ppid --no-headers) -o comm --no-headers)" != ninja ]; then
+    # Not invoked by ninja (e.g. for a meson feature check)
+    exec ccache g++ "$@"
+fi
+
+if [ "$(eval printf "'%s'" "\"\${$(($#-1))}\"")" = "-c" ]; then
+    # Not invoked for linking
+    exec ccache g++ "$@"
+fi
+
+# Compiler invoked by ninja for linking. Add -Werror to turn compiler warnings into errors
+# with LTO. (meson's werror should arguably do this, but meanwhile we need to)
+exec ccache g++ "$@" -Werror
diff --git a/.gitlab-ci/build/ccache-gcc-link-werror.sh b/.gitlab-ci/build/ccache-gcc-link-werror.sh
new file mode 100755 (executable)
index 0000000..136f0e7
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh -e
+
+if [ "$(ps -p $(ps -p $PPID -o ppid --no-headers) -o comm --no-headers)" != ninja ]; then
+    # Not invoked by ninja (e.g. for a meson feature check)
+    exec ccache gcc "$@"
+fi
+
+if [ "$(eval printf "'%s'" "\"\${$(($#-1))}\"")" = "-c" ]; then
+    # Not invoked for linking
+    exec ccache gcc "$@"
+fi
+
+# Compiler invoked by ninja for linking. Add -Werror to turn compiler warnings into errors
+# with LTO. (meson's werror should arguably do this, but meanwhile we need to)
+exec ccache gcc "$@" -Werror
index 5af7d53..fd799eb 100644 (file)
@@ -182,6 +182,7 @@ debian-build-testing:
     GALLIUM_DRIVERS: "iris,nouveau,kmsro,r300,r600,freedreno,swrast,svga,v3d,vc4,virgl,etnaviv,panfrost,lima,zink,d3d12,asahi,crocus"
     VULKAN_DRIVERS: swrast
     EXTRA_OPTION: >
+      --native-file .gitlab-ci/build/meson-native-lto-wrappers.txt
       -D spirv-to-dxil=true
       -D osmesa=true
       -D tools=drm-shim,etnaviv,freedreno,glsl,intel,intel-ui,nir,nouveau,lima,panfrost,asahi
@@ -195,7 +196,7 @@ debian-build-testing:
     section_switch yamllint "yamllint"
     .gitlab-ci/run-yamllint.sh
     section_switch meson "meson"
-    .gitlab-ci/meson/build.sh
+    PATH=$PATH:$PWD/.gitlab-ci/build .gitlab-ci/meson/build.sh
     section_switch shader-db "shader-db"
     .gitlab-ci/run-shader-db.sh
 
diff --git a/.gitlab-ci/build/meson-native-lto-wrappers.txt b/.gitlab-ci/build/meson-native-lto-wrappers.txt
new file mode 100644 (file)
index 0000000..e17f64f
--- /dev/null
@@ -0,0 +1,3 @@
+[binaries]
+c = 'ccache-gcc-link-werror.sh'
+cpp = 'ccache-g++-link-werror.sh'