]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
CI: ci_build.sh allows CMake features to be configured.
authorJia Tan <jiat0218@gmail.com>
Fri, 24 Mar 2023 12:35:11 +0000 (20:35 +0800)
committerJia Tan <jiat0218@gmail.com>
Fri, 24 Mar 2023 15:08:24 +0000 (23:08 +0800)
Also included various clean ups for style and helper functions for
repeated work.

build-aux/ci_build.sh

index 0a9dc09bf906a8890700ff81f9142d78577df8b9..8edeb3c569954ab9d3b9be7693ffcf27df3a562a 100755 (executable)
@@ -44,7 +44,11 @@ DEST_DIR="$SRC_DIR/../xz_build"
 PHASE="all"
 ARTIFACTS_DIR_NAME="output"
 
-# Parse arguments
+
+###################
+# Parse arguments #
+###################
+
 while getopts b:c:d:l:n:s:p:f:h opt; do
        # b option can have either value "autotools" OR "cmake"
        case ${opt} in
@@ -60,17 +64,7 @@ while getopts b:c:d:l:n:s:p:f:h opt; do
                esac
                BUILD_SYSTEM="$OPTARG"
        ;;
-       # c options can be a comma separated list of check types to support
-       c)
-       for crc in $(echo "$OPTARG" | sed "s/,/ /g"); do
-               case "$crc" in
-               crc32) ;;
-               crc64) ;;
-               sha256) ;;
-               *) echo "Invalid check type: $crc"; exit 1 ;;
-               esac
-       done
-       CHECK_TYPE="$OPTARG"
+       c) CHECK_TYPE="$OPTARG"
        ;;
        # d options can be a comma separated list of things to disable at
        # configure time
@@ -86,7 +80,7 @@ while getopts b:c:d:l:n:s:p:f:h opt; do
                nls) NATIVE_LANG_SUPPORT="n";;
                *) echo "Invalid disable value: $disable_arg"; exit 1 ;;
                esac
-       done    
+       done
        ;;
        l) DEST_DIR="$OPTARG"
        ;;
@@ -96,111 +90,170 @@ while getopts b:c:d:l:n:s:p:f:h opt; do
        ;;
        p) PHASE="$OPTARG"
        ;;
-       f) 
-       CFLAGS="$OPTARG"
-       export CFLAGS
+       f)
+               CFLAGS="$OPTARG"
+               export CFLAGS
        ;;
        esac
 done
 
-if [ "$PHASE" = "all" ] || [ "$PHASE" = "build" ]; then
+
+####################
+# Helper Functions #
+####################
+
+# These two functions essentially implement the ternary "?" operator.
+add_extra_option() {
+       # First argument is option value ("y" or "n")
+       # Second argument is option to set if "y"
+       # Third argument is option to set if "n"
+       if [ "$1" = "y" ]
+       then
+               EXTRA_OPTIONS="$EXTRA_OPTIONS $2"
+       else
+               EXTRA_OPTIONS="$EXTRA_OPTIONS $3"
+       fi
+}
+
+
+add_to_filter_list() {
+       # First argument is option value ("y" or "n")
+       # Second argument is option to set if "y"
+       if [ "$1" = "y" ]
+       then
+               FILTER_LIST="$FILTER_LIST$2"
+       fi
+}
+
+
+###############
+# Build Phase #
+###############
+
+if [ "$PHASE" = "all" ] || [ "$PHASE" = "build" ]
+then
+       # Checksum options should be specified differently based on the
+       # build system. It must be calculated here since we won't know
+       # the build system used until all args have been parsed.
+       # Autotools - comma separated
+       # CMake - semi-colon separated
+       if [ "$BUILD_SYSTEM" = "autotools" ]
+       then
+               SEP=","
+       else
+               SEP=";"
+       fi
+
+       CHECK_TYPE_TEMP=""
+       for crc in $(echo "$CHECK_TYPE" | sed "s/,/ /g"); do
+                       case "$crc" in
+                       # Remove "crc32" from cmake build, if specified.
+                       crc32)
+                               if [ "$BUILD_SYSTEM" = "cmake" ]
+                               then
+                                       continue
+                               fi
+                       ;;
+                       crc64) ;;
+                       sha256) ;;
+                       *) echo "Invalid check type: $crc"; exit 1 ;;
+                       esac
+
+                       CHECK_TYPE_TEMP="$CHECK_TYPE_TEMP$SEP$crc"
+       done
+
+       # Remove the first character from $CHECK_TYPE_TEMP since it will
+       # always be the delimiter.
+       CHECK_TYPE="${CHECK_TYPE_TEMP:1}"
+
+       FILTER_LIST="lzma1$SEP"lzma2
+
        # Build based on arguments
        mkdir -p "$DEST_DIR"
+
+       # Generate configure option values
+       EXTRA_OPTIONS=""
+
        case $BUILD_SYSTEM in
-               autotools)
+       autotools)
                cd "$SRC_DIR"
 
                # Run autogen.sh script if not already run
                if [ ! -f configure ]
-               then 
+               then
                        "./autogen.sh"
                fi
 
                cd "$DEST_DIR"
 
-               # Generate configure option values
-               EXTRA_OPTIONS=""
-               FILTER_LIST="lzma1,lzma2"
-
-               if [ "$BCJ" = "y" ]
-               then
-                       FILTER_LIST="$FILTER_LIST,x86,powerpc,ia64,arm,armthumb,arm64,sparc"
-               fi
-
-               if [ "$DELTA" = "y" ]
-               then
-                       FILTER_LIST="$FILTER_LIST,delta"
-               fi
-
-               if [ "$ENCODERS" = "y" ]
-               then
-                       EXTRA_OPTIONS="$EXTRA_OPTIONS --enable-encoders=$FILTER_LIST"
-               else
-                       EXTRA_OPTIONS="$EXTRA_OPTIONS --disable-encoders"
-               fi
-
-               if [ "$DECODERS" = "y" ]
-               then
-                       EXTRA_OPTIONS="$EXTRA_OPTIONS --enable-decoders=$FILTER_LIST"
-               else
-                       EXTRA_OPTIONS="$EXTRA_OPTIONS --disable-decoders"
-               fi
-
-               if [ "$THREADS" = "n" ]
-               then
-                       EXTRA_OPTIONS="$EXTRA_OPTIONS --disable-threads"
-               fi
-
-               if [ "$SHARED" = "n" ]
-               then
-                       EXTRA_OPTIONS="$EXTRA_OPTIONS --disable-shared"
-               fi
+               add_to_filter_list "$BCJ" ",x86,powerpc,ia64,arm,armthumb,arm64,sparc"
+               add_to_filter_list "$DELTA" ",delta"
 
-               if [ "$NATIVE_LANG_SUPPORT" = "n" ]
-               then
-                       EXTRA_OPTIONS="$EXTRA_OPTIONS --disable-nls"
-               fi
+               add_extra_option "$ENCODERS" "--enable-encoders=$FILTER_LIST" "--disable-encoders"
+               add_extra_option "$DECODERS" "--enable-decoders=$FILTER_LIST" "--disable-decoders"
+               add_extra_option "$THREADS" "" "--disable-threads"
+               add_extra_option "$SHARED" "" "--disable-shared"
+               add_extra_option "$NATIVE_LANG_SUPPORT" "" "--disable-nls"
 
                # Run configure script
                "$SRC_DIR"/configure --enable-werror --enable-checks="$CHECK_TYPE" $EXTRA_OPTIONS --config-cache
 
                # Build the project
                make
-               ;;
-               cmake)
-               # CMake currently does not support disabling encoders, decoders,
-               # threading, or check types. For now, just run the full build.
+       ;;
+       cmake)
+               # The CMake build currently does not support disabling
+               # threading.
                cd "$DEST_DIR"
-               cmake "$SRC_DIR/CMakeLists.txt" -B "$DEST_DIR"
+
+               add_to_filter_list "$BCJ" ";x86;powerpc;ia64;arm;armthumb;arm64;sparc"
+               add_to_filter_list "$DELTA" ";delta"
+
+               # Disable MicroLZMA if encoders are not configured.
+               add_extra_option "$ENCODERS" "-DENCODERS=$FILTER_LIST" "-DENCODERS= -DMICROLZMA_ENCODER=OFF"
+
+               # Disable MicroLZMA and lzip decoders if decoders are not configured.
+               add_extra_option "$DECODERS" "-DDECODERS=$FILTER_LIST" "-DDECODERS= -DMICROLZMA_DECODER=OFF -DLZIP_DECODER=OFF"
+
+               # CMake disables the shared library by default.
+               add_extra_option "$SHARED" "-DBUILD_SHARED_LIBS=ON" ""
+
+               cmake "$SRC_DIR/CMakeLists.txt" -B "$DEST_DIR" $EXTRA_OPTIONS -DADDITIONAL_CHECK_TYPES="$CHECK_TYPE"
                make
-               ;;
+       ;;
        esac
 fi
 
-if [ "$PHASE" = "all" ] || [ "$PHASE" = "test" ]; then
+
+##############
+# Test Phase #
+##############
+
+if [ "$PHASE" = "all" ] || [ "$PHASE" = "test" ]
+then
        case $BUILD_SYSTEM in
-               autotools)
-                       cd "$DEST_DIR"
-                       # If the tests fail, copy the test logs into the artifacts folder
-                       if make check
-                       then
-                               :
-                       else
-                               mkdir -p "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
-                               cp ./tests/*.log "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
-                               exit 1
-                       fi
-               ;;
-               cmake)
-                       cd "$DEST_DIR"
-                       if make test
-                       then
-                               :
-                       else
-                               mkdir -p "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
-                               cp ./Testing/Temporary/*.log "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
-                               exit 1
-                       fi
-               ;;
+       autotools)
+               cd "$DEST_DIR"
+               # If the tests fail, copy the test logs into the artifacts folder
+               if make check
+               then
+                       :
+               else
+                       mkdir -p "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
+                       cp ./tests/*.log "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
+                       exit 1
+               fi
+       ;;
+       cmake)
+               cd "$DEST_DIR"
+               if make test
+               then
+                       :
+               else
+                       mkdir -p "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
+                       cp ./Testing/Temporary/*.log "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
+                       exit 1
+               fi
+       ;;
        esac
 fi