Revolucent

Build XMLStarlet 1.6.1

Oct 17th, 2025
42
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.44 KB | None | 0 0
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3.  
  4. # --------- Configurable ----------
  5. PREFIX="${PREFIX:-$HOME/.local/xmlstarlet-1.6.1}"   # install root for everything
  6. XMLSTARLET_VERSION="1.6.1"
  7. ZLIB_VERSION="1.3.1"
  8. LIBXML2_VERSION="2.12.7"
  9. LIBXSLT_VERSION="1.1.39"
  10. # ---------------------------------
  11.  
  12. # Detect parallel jobs safely (works with set -u)
  13. if command -v nproc >/dev/null 2>&1; then
  14.   JOBS="${JOBS:-$(nproc)}"
  15. elif command -v sysctl >/dev/null 2>&1; then
  16.   JOBS="${JOBS:-$(sysctl -n hw.ncpu)}"
  17. else
  18.   JOBS="${JOBS:-1}"
  19. fi
  20.  
  21. # Platform-specific loader env + rpaths
  22. case "$(uname -s)" in
  23.   Darwin)
  24.     export DYLD_FALLBACK_LIBRARY_PATH="${PREFIX}/lib:${DYLD_FALLBACK_LIBRARY_PATH-}"
  25.     RPATH_REL='@loader_path/../lib'
  26.     RPATH_ABS="${PREFIX}/lib"
  27.     ;;
  28.   *)
  29.     export LD_LIBRARY_PATH="${PREFIX}/lib:${LD_LIBRARY_PATH-}"
  30.     RPATH_REL='$ORIGIN/../lib'
  31.     RPATH_ABS="${PREFIX}/lib"
  32.     ;;
  33. esac
  34.  
  35. fetch() {
  36.   local url="$1" file="$2"
  37.   if [ ! -f "$file" ]; then
  38.     echo "==> Fetch $url"
  39.     curl -fsSL -o "$file" -L "$url"
  40.   fi
  41. }
  42.  
  43. build_zlib() {
  44.   fetch "https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz" "zlib-${ZLIB_VERSION}.tar.gz"
  45.   rm -rf "zlib-${ZLIB_VERSION}"
  46.   tar -xzf "zlib-${ZLIB_VERSION}.tar.gz"
  47.   pushd "zlib-${ZLIB_VERSION}" >/dev/null
  48.   ./configure --prefix="${PREFIX}"
  49.   make -j"${JOBS}"
  50.   make install
  51.   popd >/dev/null
  52. }
  53.  
  54. build_libxml2() {
  55.   fetch "https://download.gnome.org/sources/libxml2/2.12/libxml2-${LIBXML2_VERSION}.tar.xz" "libxml2-${LIBXML2_VERSION}.tar.xz"
  56.   rm -rf "libxml2-${LIBXML2_VERSION}"
  57.   tar -xf "libxml2-${LIBXML2_VERSION}.tar.xz"
  58.   pushd "libxml2-${LIBXML2_VERSION}" >/dev/null
  59.  
  60.   CPPFLAGS="-I${PREFIX}/include" \
  61.   LDFLAGS="-L${PREFIX}/lib -Wl,-rpath,${RPATH_ABS} -Wl,-rpath,${RPATH_REL}" \
  62.   ./configure --prefix="${PREFIX}" \
  63.               --with-zlib="${PREFIX}" \
  64.               --without-python \
  65.               --without-lzma
  66.  
  67.   make -j"${JOBS}"
  68.   make install
  69.   popd >/dev/null
  70.  
  71.   export PATH="${PREFIX}/bin:${PATH}"   # ADDED: ensure xml2-config is visible to later steps
  72. }
  73.  
  74. build_libxslt() {
  75.   fetch "https://download.gnome.org/sources/libxslt/1.1/libxslt-${LIBXSLT_VERSION}.tar.xz" "libxslt-${LIBXSLT_VERSION}.tar.xz"
  76.   rm -rf "libxslt-${LIBXSLT_VERSION}"
  77.   tar -xf "libxslt-${LIBXSLT_VERSION}.tar.xz"
  78.   pushd "libxslt-${LIBXSLT_VERSION}" >/dev/null
  79.  
  80.   # No pkg-config: point directly at our libxml2
  81.   export XML2_CONFIG="${PREFIX}/bin/xml2-config"
  82.  
  83.   CPPFLAGS="-I${PREFIX}/include" \
  84.   LDFLAGS="-L${PREFIX}/lib -Wl,-rpath,${RPATH_ABS} -Wl,-rpath,${RPATH_REL}" \
  85.   ./configure --prefix="${PREFIX}" \
  86.               --with-libxml-prefix="${PREFIX}" \
  87.               --without-crypto \
  88.               --without-python
  89.  
  90.   make -j"${JOBS}"
  91.   make install
  92.   popd >/dev/null
  93. }
  94.  
  95. build_xmlstarlet() {
  96.   local tgz="xmlstarlet-${XMLSTARLET_VERSION}.tar.gz"
  97.   fetch "https://downloads.sourceforge.net/project/xmlstar/xmlstarlet/${XMLSTARLET_VERSION}/${tgz}" "${tgz}"
  98.   rm -rf "xmlstarlet-${XMLSTARLET_VERSION}"
  99.   tar -xzf "${tgz}"
  100.   pushd "xmlstarlet-${XMLSTARLET_VERSION}" >/dev/null
  101.  
  102.   # Apple Clang warning suppression (>= 1500), harmless elsewhere if not applied
  103.   if clang --version 2>/dev/null | grep -q "Apple clang"; then
  104.     APPLE_CLANG_BUILD="$(clang --version | sed -n 's/.*clang-\([0-9][0-9]*\).*/\1/p' | head -n1 || echo 0)"
  105.     if [ "${APPLE_CLANG_BUILD:-0}" -ge 1500 ]; then
  106.       export CFLAGS="${CFLAGS-} -Wno-incompatible-function-pointer-types"
  107.     fi
  108.   fi
  109.  
  110.   # Make absolutely sure configure can find xml2-config:
  111.   export XML2_CONFIG="${PREFIX}/bin/xml2-config"   # ADDED
  112.  
  113.   # Use libxml2's own flags for correctness (-I include/libxml2 etc)
  114.   XML2_CFLAGS="$("${PREFIX}/bin/xml2-config" --cflags)"
  115.   XML2_LIBS="$("${PREFIX}/bin/xml2-config" --libs)"
  116.  
  117.   CPPFLAGS="${XML2_CFLAGS} -I${PREFIX}/include" \
  118.   LDFLAGS="-L${PREFIX}/lib -Wl,-rpath,${RPATH_ABS} -Wl,-rpath,${RPATH_REL}" \
  119.   LIBS="${XML2_LIBS} -lxslt -lexslt" \
  120.   ./configure --disable-dependency-tracking \
  121.               --prefix="${PREFIX}" \
  122.               --mandir="${PREFIX}/share/man"
  123.  
  124.   make -j"${JOBS}"
  125.   make install
  126.  
  127.   ln -sf "${PREFIX}/bin/xml" "${PREFIX}/bin/xmlstarlet"
  128.   popd >/dev/null
  129. }
  130.  
  131. echo ">>> Install prefix: ${PREFIX}"
  132. mkdir -p "${PREFIX}"
  133.  
  134. echo ">>> Building zlib"
  135. build_zlib
  136. echo ">>> Building libxml2"
  137. build_libxml2
  138. echo ">>> Building libxslt"
  139. build_libxslt
  140. echo ">>> Building xmlstarlet"
  141. build_xmlstarlet
  142.  
  143. echo ">>> Done."
  144. echo ">>> Try: ${PREFIX}/bin/xmlstarlet --version"
Comments
Add Comment
Please, Sign In to add comment