]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
ci: build both w/ and w/o sanitizers on GH Actions
authorFrantisek Sumsal <frantisek@sumsal.cz>
Sat, 30 Jan 2021 17:43:33 +0000 (18:43 +0100)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Mon, 1 Feb 2021 11:00:30 +0000 (12:00 +0100)
.github/workflows/cibuild.sh
.github/workflows/cibuild.yml

index 7fc30c344ca70b9d11b8d206da45e1f4179d338d..d5ad5314647b797cf49fd6aa33b1a3d1ea77d22e 100755 (executable)
@@ -3,17 +3,15 @@
 PHASES=(${@:-CONFIGURE MAKE INSTALL CHECK DISTCHECK})
 COMPILER="${COMPILER:?}"
 COMPILER_VERSION="${COMPILER_VERSION}"
+CFLAGS=(-O1 -g)
+CXXFLAGS=(-O1 -g)
 
 if [[ "$COMPILER" == clang ]]; then
     CC="clang${COMPILER_VERSION:+-$COMPILER_VERSION}"
     CXX="clang++${COMPILER_VERSION:+-$COMPILER_VERSION}"
-    CFLAGS="-shared-libasan -O1 -g -fno-omit-frame-pointer"
-    CXXFLAGS="-shared-libasan -O1 -g -fno-omit-frame-pointer"
 elif [[ "$COMPILER" == gcc ]]; then
     CC="gcc${COMPILER_VERSION:+-$COMPILER_VERSION}"
     CXX="g++${COMPILER_VERSION:+-$COMPILER_VERSION}"
-    CFLAGS="-O1 -g -fno-omit-frame-pointer"
-    CXXFLAGS="-O1 -g -fno-omit-frame-pointer"
 fi
 
 set -ex
@@ -25,20 +23,26 @@ for phase in "${PHASES[@]}"; do
             --disable-use-tty-group
             --disable-makeinstall-chown
             --enable-all-programs
-            --enable-asan
-            --enable-ubsan
             --without-python
             --enable-werror
         )
 
-        if [[ "$COMPILER" == clang* ]]; then
+        if [[ "$SANITIZE" == "yes" ]]; then
+            opts+=(--enable-asan --enable-ubsan)
+            CFLAGS+=(-fno-omit-frame-pointer)
+            CXXFLAGS+=(-fno-omit-frame-pointer)
+        fi
+
+        if [[ "$COMPILER" == clang* && "$SANITIZE" == "yes" ]]; then
             opts+=(--enable-fuzzing-engine)
+            CFLAGS+=(-shared-libasan)
+            CXXFLAGS+=(-shared-libasan)
         fi
 
         sudo -E git clean -xdf
 
         ./autogen.sh
-        CC="$CC" CXX="$CXX" CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" ./configure "${opts[@]}"
+        CC="$CC" CXX="$CXX" CFLAGS="${CFLAGS[@]}" CXXFLAGS="${CXXFLAGS[@]}" ./configure "${opts[@]}"
         ;;
     MAKE)
         make -j
@@ -48,32 +52,34 @@ for phase in "${PHASES[@]}"; do
         make install DESTDIR=/tmp/dest
         ;;
     CHECK)
-        # All the following black magic is to make test/eject/umount work, since
-        # eject execl()s the uninstrumented /bin/umount binary, which confuses
-        # ASan. The workaround for this is to set $LD_PRELOAD to the ASan's
-        # runtime DSO, which works well with gcc without any additional hassle.
-        # However, since clang, by default, links ASan statically, we need to
-        # explicitly state we want dynamic linking (see -shared-libasan above).
-        # That, however, introduces another issue - clang's ASan runtime is in
-        # a non-standard path, so all binaries compiled in such way refuse
-        # to start. That's what the following blob of code is for - it detects
-        # the ASan's runtime path and adds the respective directory to
-        # the dynamic linker cache.
-        #
-        # The actual $LD_PRELOAD sheanigans are done directly in
-        # tests/ts/eject/umount.
-        asan_rt_name="$(ldd ./kill | awk '/lib.+asan.*.so/ {print $1; exit}')"
-        asan_rt_path="$($CC --print-file-name "$asan_rt_name")"
-        echo "Detected ASan runtime: $asan_rt_name ($asan_rt_path)"
-        if [[ -z "$asan_rt_name" || -z "$asan_rt_path" ]]; then
-            echo >&2 "Couldn't detect ASan runtime, can't continue"
-            exit 1
-        fi
+        if [[ "$SANITIZE" == "yes" ]]; then
+            # All the following black magic is to make test/eject/umount work, since
+            # eject execl()s the uninstrumented /bin/umount binary, which confuses
+            # ASan. The workaround for this is to set $LD_PRELOAD to the ASan's
+            # runtime DSO, which works well with gcc without any additional hassle.
+            # However, since clang, by default, links ASan statically, we need to
+            # explicitly state we want dynamic linking (see -shared-libasan above).
+            # That, however, introduces another issue - clang's ASan runtime is in
+            # a non-standard path, so all binaries compiled in such way refuse
+            # to start. That's what the following blob of code is for - it detects
+            # the ASan's runtime path and adds the respective directory to
+            # the dynamic linker cache.
+            #
+            # The actual $LD_PRELOAD sheanigans are done directly in
+            # tests/ts/eject/umount.
+            asan_rt_name="$(ldd ./kill | awk '/lib.+asan.*.so/ {print $1; exit}')"
+            asan_rt_path="$($CC --print-file-name "$asan_rt_name")"
+            echo "Detected ASan runtime: $asan_rt_name ($asan_rt_path)"
+            if [[ -z "$asan_rt_name" || -z "$asan_rt_path" ]]; then
+                echo >&2 "Couldn't detect ASan runtime, can't continue"
+                exit 1
+            fi
 
-        if [[ "$COMPILER" == clang* ]]; then
-            mkdir -p /etc/ld.so.conf.d/
-            echo "${asan_rt_path%/*}" > /etc/ld.so.conf.d/99-clang-libasan.conf
-            ldconfig
+            if [[ "$COMPILER" == clang* ]]; then
+                mkdir -p /etc/ld.so.conf.d/
+                echo "${asan_rt_path%/*}" > /etc/ld.so.conf.d/99-clang-libasan.conf
+                ldconfig
+            fi
         fi
 
         ./tests/run.sh --show-diff
index e8556eba854986f3ecc26349e14eb7ddbfa06971..633cc1a8ed2bc366f3b8fe82f2c219bc0533f438 100644 (file)
@@ -17,8 +17,10 @@ jobs:
       fail-fast: false
       matrix:
         env:
-          - { COMPILER: "gcc",   COMPILER_VERSION: "10" }
-          - { COMPILER: "clang", COMPILER_VERSION: "10" }
+          - { COMPILER: "gcc",   COMPILER_VERSION: "10", SANITIZE: "yes"  }
+          - { COMPILER: "gcc",   COMPILER_VERSION: "10", SANITIZE: "no"   }
+          - { COMPILER: "clang", COMPILER_VERSION: "10", SANITIZE: "yes"  }
+          - { COMPILER: "clang", COMPILER_VERSION: "10", SANITIZE: "no"   }
     env: ${{ matrix.env }}
     steps:
       - name: Repository checkout