diff --git a/extras/scripts/build_qrencode.sh b/extras/scripts/build_qrencode.sh
index f63844ec7720158fd78d5483315818deee5730c4..5eb3d2064ecec11420f4076f5cb86eee199130c0 100755
--- a/extras/scripts/build_qrencode.sh
+++ b/extras/scripts/build_qrencode.sh
@@ -1,61 +1,89 @@
 #!/usr/bin/env bash
+set -e
 
-# Flags:
-
-# -a: architecture to build. Accepted values arm64, x86_64, unified
+# Usage:
+# ./build_qrencode.sh -a <architecture>
+# Accepted architectures: arm64, x86_64, unified
+# If no architecture is specified, the script builds for the host architecture.
 
+# Initialize variables
 arch=''
 while getopts "a:" OPT; do
   case "$OPT" in
-  a)
-    arch="${OPTARG}"
-    ;;
-  \?)
-    exit 1
-    ;;
+    a)
+      arch="${OPTARG}"
+      ;;
+    \?)
+      echo "Invalid option: -$OPTARG" >&2
+      echo "Usage: $0 [-a architecture]"
+      echo "Accepted architectures: arm64, x86_64, unified"
+      exit 1
+      ;;
   esac
 done
 
+# Determine architectures to build
 if [[ "$arch" == 'unified' ]]; then
   ARCHS=("arm64" "x86_64")
 elif [[ "$arch" == '' ]]; then
-  ARCHS=("arm64")
+  # Detect host architecture
+  HOST_ARCH=$(uname -m)
+  case "$HOST_ARCH" in
+    x86_64|arm64)
+      ARCHS=("$HOST_ARCH")
+      ;;
+    *)
+      echo "Unsupported host architecture: $HOST_ARCH"
+      echo "Supported architectures are: arm64, x86_64, unified"
+      exit 1
+      ;;
+  esac
 else
-  ARCHS=("$arch")
+  # Validate specified architecture
+  case "$arch" in
+    x86_64|arm64)
+      ARCHS=("$arch")
+      ;;
+    *)
+      echo "Invalid architecture specified: $arch"
+      echo "Accepted architectures are: arm64, x86_64, unified"
+      exit 1
+      ;;
+  esac
 fi
 
 TOP="$(pwd)"
 QRENCODEDIR="${TOP}/3rdparty/libqrencode"
-if [ -z "$NPROC" ]; then
-  NPROC=$(sysctl -n hw.ncpu || echo -n 1)
-fi
+BUILDDIR="${QRENCODEDIR}/build-libqrencode"
+LIBDIR="${QRENCODEDIR}/lib"
+INCLUDEDIR="${QRENCODEDIR}/include"
 
-for ARCH in "${ARCHS[@]}"; do
-  cd "$QRENCODEDIR" || exit 1
-  BUILDDIR="$ARCH-libqrencode"
-  mkdir "$BUILDDIR"
-  make clean
-  ./autogen.sh
-  ./configure --host="$ARCH" --without-png --prefix="${QRENCODEDIR}/${BUILDDIR}" CFLAGS=" -arch $ARCH $CFLAGS"
-  make -j"$NPROC"
-  make install
-done
-mkdir -p "$QRENCODEDIR"/lib
-mkdir -p "$QRENCODEDIR"/include
-
-if ((${#ARCHS[@]} == "2")); then
-  echo "Making fat lib for ${ARCHS[0]} and ${ARCHS[1]}"
-  LIBFILES="$QRENCODEDIR/${ARCHS[0]}-libqrencode/lib/*.a"
-  for f in $LIBFILES; do
-    libFile=${f##*/}
-    echo "$libFile"
-    lipo -create "$QRENCODEDIR/${ARCHS[0]}-libqrencode/lib/$libFile" \
-      "$QRENCODEDIR/${ARCHS[1]}-libqrencode/lib/$libFile" \
-      -output "${QRENCODEDIR}/lib/$libFile"
-  done
-else
-  echo "No need for fat lib"
-  rsync -ar --delete "$QRENCODEDIR/${ARCHS[0]}-libqrencode/lib/"*.a "${QRENCODEDIR}/lib/"
-fi
+# Clean up build directory
+echo "Preparing clean build directory"
+rm -rf "$BUILDDIR"
+mkdir -p "$BUILDDIR"
+
+# Clean output directories
+rm -rf "$LIBDIR" "$INCLUDEDIR"
+mkdir -p "$LIBDIR"
+mkdir -p "$INCLUDEDIR"
+
+# Convert architectures to semicolon-separated format for cmake
+ARCHS_SEMICOLON_SEPARATED=$(IFS=";"; echo "${ARCHS[*]}")
+
+echo "Configuring CMake for architectures: ${ARCHS[*]}"
+cd "$BUILDDIR"
+cmake "$QRENCODEDIR" \
+  -DCMAKE_OSX_ARCHITECTURES="$ARCHS_SEMICOLON_SEPARATED" \
+  -DCMAKE_INSTALL_PREFIX="$QRENCODEDIR" \
+  -DWITHOUT_PNG=ON \
+  -DBUILD_SHARED_LIBS=OFF \
+  -G "Xcode"
+
+echo "Building libqrencode for architectures: ${ARCHS[*]}"
+cmake --build . --config Release
+
+echo "Installing libqrencode to $LIBDIR and $INCLUDEDIR"
+cmake --install . --config Release
 
-rsync -ar --delete "$QRENCODEDIR/${ARCHS[0]}-libqrencode/include/"* "${QRENCODEDIR}/include/"
+echo "Build and installation completed successfully, with outputs in $LIBDIR and $INCLUDEDIR."