1 #!/bin/bash
   2 # From https://gist.github.com/ryancdotorg/84275935f0b82578d8c222e2e915fc78
   3 # built binaries at https://ryanc-musl-bins.s3.amazonaws.com/SHA256SUMS.html
   4 
   5 set -eo pipefail
   6 set -x
   7 
   8 export BUILD_SCRIPT_DATE="$(date -r "$0" -Iseconds)"
   9 
  10 PV_VERSION=1.10.0
  11 SOCAT_VERSION=1.8.0.3
  12 NCURSES_VERSION=6.5
  13 READLINE_VERSION=8.2
  14 OPENSSL_VERSION=1.1.1w
  15 LIBPCAP_VERSION=1.10.5
  16 ZLIB_VERSION=1.3.1
  17 TCPDUMP_VERSION=4.99.5
  18 RSYNC_VERSION=3.4.1
  19 XZ_VERSION=5.8.1 # to be updated 5.8.1
  20 LZ4_VERSION=v1.10.0
  21 ZSTD_VERSION=v1.5.7
  22 XXHASH_VERSION=v0.8.3
  23 DROPBEAR_VERSION=2022.83 # to be updated
  24 GPGERROR_VERSION=1.48 # 1.50
  25 GCRYPT_VERSION=1.10.3
  26 GLIB_VERSION=2.80.5
  27 CARES_VERSION=1.34.5
  28 PCRE_VERSION=8.45
  29 WIRESHARK_VERSION=4.0.11
  30 LIBSODIUM_VERSION=1.0.20-RELEASE
  31 MINISIGN_VERSION=v0.11-ryanc.4
  32 SHA2SUM_VERSION=v0.3.1
  33 MULTICALL_VERSION=v0.0.6
  34 SQLITE_VERSION=version-3.50.4
  35 WGET_VERSION=1.25.0
  36 
  37 BASE_DIR=/dev/shm/arm-bins
  38 SOURCE_DIR="$BASE_DIR/source"
  39 BUILD_DIR="$BASE_DIR/build"
  40 SCRIPT_DIR="`pwd`"
  41 OUTPUT_DIR="$SCRIPT_DIR/output"
  42 
  43 ORIG_PATH=$PATH
  44 
  45 function setcross() {
  46     MUSL_CROSS=${1:-armv7l-linux-musleabihf}
  47     CROSS_BIN="$BUILD_DIR/$MUSL_CROSS-cross/bin"
  48     CROSS_PFX="$CROSS_BIN/$MUSL_CROSS"
  49     BIN_DIR="$OUTPUT_DIR/$MUSL_CROSS"
  50 
  51     if command -v _ccache > /dev/null; then
  52         export CC="ccache $CROSS_PFX-gcc"
  53         export CXX="ccache $CROSS_PFX-g++"
  54     else
  55         export CC=$CROSS_PFX-gcc
  56         export CXX=$CROSS_PFX-g++
  57     fi
  58 
  59     export AR=$CROSS_PFX-ar
  60     export AS=$CROSS_PFX-as
  61     export LD=$CROSS_PFX-ld
  62     export RANLIB=$CROSS_PFX-ranlib
  63 
  64     export PATH=$CROSS_BIN:$ORIG_PATH
  65     export STRIP="$CROSS_PFX-strip -s -R .comment -R .hash -R .gnu.hash"
  66     export LDFLAGS="-flto -Wl,--gc-sections"
  67     export CFLAGS="-flto -fno-inline-small-functions -ffunction-sections -fdata-sections -Wl,--gc-sections -static -Os"
  68     export CXXFLAGS="$CFLAGS"
  69     export MAKEFLAGS="-sj$((`grep -c '^processor' /proc/cpuinfo` * 125 / 100))"
  70 }
  71 
  72 function extract() {
  73     PACKAGE="$1"
  74     BASEURL="$2"
  75     FILEEXT="$3"
  76     VERSION="${4:-}"
  77 
  78     export PS4="+$arch:$PACKAGE+ "
  79 
  80     # Clean/Download/Extract
  81     cd "$BUILD_DIR"
  82 
  83     if [ "$FILEEXT" = "git" ]; then
  84         if [ -d "$PACKAGE" ]; then
  85             cd "$PACKAGE"
  86             git clean -fdx
  87             git reset --hard HEAD
  88             if [[ ! -z "$VERSION" ]]; then
  89                 git checkout "$VERSION" \
  90                 || git fetch --depth 1 origin tag "$VERSION" --no-tags \
  91                 && git checkout "$VERSION"
  92             else
  93                 git pull
  94             fi
  95         else
  96             if [[ ! -z "$VERSION" ]]; then
  97                 git clone --depth 1 --branch "$VERSION" "$BASEURL/$PACKAGE.$FILEEXT"
  98             else
  99                 git clone --depth 1 "$BASEURL/$PACKAGE.$FILEEXT"
 100             fi
 101             cd "$PACKAGE"
 102         fi
 103         printf '%s  %s.git\n' $(git rev-parse HEAD) "$PACKAGE" >> "$BUILD_DIR/hashes"
 104     else
 105         if [ -d "$PACKAGE-$VERSION" ]; then rm -rf "$PACKAGE-$VERSION"; fi
 106         if ! tar -xaf "$PACKAGE-$VERSION.$FILEEXT" > /dev/null 2> /dev/null; then
 107             curl -LO "$BASEURL/$PACKAGE-$VERSION.$FILEEXT"
 108             if [ -d "$PACKAGE-$VERSION" ]; then rm -rf "$PACKAGE-$VERSION"; fi
 109             tar -xaf "$PACKAGE-$VERSION.$FILEEXT"
 110         fi
 111         ln -fs "$PACKAGE-$VERSION" "$PACKAGE"
 112         sha256sum "$PACKAGE-$VERSION.$FILEEXT" >> "$BUILD_DIR/hashes"
 113         cd "$PACKAGE-$VERSION"
 114     fi
 115 
 116     # Patch
 117     if [ -d "$BUILD_DIR/patches" ]; then
 118         for f in "$BUILD_DIR/patches/$PACKAGE"-*.diff; do
 119             [ -e "$f" ] || continue
 120             patch -p1 < "$f"
 121         done
 122         for f in "$BUILD_DIR/patches/$PACKAGE"-*.sh; do
 123             [ -e "$f" ] || continue
 124             "$f"
 125         done
 126     fi
 127 }
 128 
 129 function output() {
 130     BIN="$1"
 131     DST="${2:-}"
 132     mkdir -p "$BIN_DIR"
 133     chmod 755 "$BIN"
 134     $STRIP "$BIN"
 135     cp "$BIN" "$BIN_DIR/$DST"
 136 }
 137 
 138 function get_musl() {
 139     cd "$BUILD_DIR"
 140 
 141     HASHES="musl.SHA512SUMS"
 142     FLAGS="-L -o $HASHES"
 143     if [ -e "$HASHES" ]; then
 144         FLAGS="$FLAGS -z $HASHES"
 145     fi
 146     curl $FLAGS https://musl.cc/SHA512SUMS
 147 
 148     if [ ! -e "$MUSL_CROSS-cross.tgz" ]; then
 149         if [ -d "$MUSL_CROSS-cross" ]; then
 150            rm -rf "$MUSL_CROSS-cross"
 151         fi
 152         curl -LO "https://musl.cc/$MUSL_CROSS-cross.tgz"
 153     fi
 154 
 155     if (fgrep "$MUSL_CROSS-cross.tgz" "$HASHES" | sha512sum --strict --warn --status -c -); then
 156         if [ ! -d "$MUSL_CROSS-cross" ]; then
 157             tar -xzf "$MUSL_CROSS-cross.tgz"
 158         fi
 159     else
 160         rm "$MUSL_CROSS-cross.tgz"
 161         get_musl
 162     fi
 163 }
 164 
 165 function build_sqlite() {
 166     # Download/extract
 167     extract sqlite https://github.com/sqlite git $SQLITE_VERSION
 168 }
 169 
 170 function build_wget() {
 171     # Download/extract
 172     extract wget https://ftp.gnu.org/gnu/wget tar.gz $WGET_VERSION
 173 
 174     # Configure
 175     PKG_CONFIG='pkg-config --static' \
 176     CFLAGS="-I$BUILD_DIR/openssl-$OPENSSL_VERSION/include -DNETDB_INTERNAL=-1 $CFLAGS" \
 177     LDFLAGS="-L$BUILD_DIR/openssl-$OPENSSL_VERSION $LDFLAGS" \
 178     ./configure \
 179         --enable-static \
 180         --disable-shared \
 181         --with-openssl=yes \
 182         --with-ssl=openssl \
 183         --disable-digest \
 184         --disable-ntlm \
 185         --disable-opie \
 186         --disable-debug \
 187         --disable-xattr \
 188         --disable-iri \
 189         --disable-prce \
 190         --disable-pcre2 \
 191         --disable-largefile \
 192         --disable-threads \
 193         --disable-nls \
 194         --disable-rpath \
 195         --enable-year2038 \
 196         --without-zlib \
 197         --without-cares \
 198         --without-libpsl \
 199         --without-included-regex \
 200         --without-libuuid
 201 
 202     # Build
 203     make
 204     output src/wget
 205     echo "** Finished building wget"
 206 }
 207 
 208 function build_pv() {
 209     # Download/extract
 210     extract pv https://www.ivarch.com/programs/sources tar.gz $PV_VERSION
 211 
 212     # Configure
 213     ./configure \
 214         --enable-static \
 215         --disable-nls \
 216         --disable-dependency-tracking
 217 
 218     # Build
 219     make
 220     output pv
 221     echo "** Finished building pv"
 222 }
 223 
 224 function build_openssl() {
 225     # Download/extract
 226     extract openssl https://www.openssl.org/source tar.gz $OPENSSL_VERSION
 227 
 228     TARGET="$1"
 229     if [ -z "$TARGET" ]; then
 230         case $MUSL_CROSS in
 231             x86_64-linux-musl)
 232             TARGET=linux-x86_64
 233             ;;
 234             aarch64-linux-musl)
 235             TARGET=linux-aarch64
 236             ;;
 237             armv*-linux-*)
 238             TARGET=linux-armv4
 239             ;;
 240             mips-linux-*)
 241             TARGET=linux-mips32
 242             ;;
 243             mipsel-linux-*)
 244             TARGET=linux-mips32
 245             ;;
 246             *)
 247             TARGET=linux-generic32
 248             ;;
 249         esac
 250     fi
 251 
 252     # Configure
 253     SOURCE_DATE_EPOCH="$(date -r CHANGES '+%s')" \
 254     ./Configure \
 255         --openssldir=/etc/ssl \
 256         no-shared no-async no-threads no-err no-hw no-engine no-dso \
 257         no-static-engine no-capieng no-comp \
 258         no-tests no-unit-test \
 259         no-ts no-cms \
 260         no-rfc3779 \
 261         no-srtp \
 262         no-ssl-trace no-ct no-multiblock \
 263         no-cmac no-blake2 no-asm \
 264         no-siphash \
 265         no-scrypt no-ocb no-egd \
 266         no-md4 no-whirlpool no-rmd160 \
 267         no-des no-bf no-rc2 no-rc4 no-rc5 \
 268         no-sm2 no-sm3 no-sm4 \
 269         no-gost no-idea no-cast no-seed no-camellia no-aria \
 270         no-chacha no-poly1305 \
 271         no-dh no-dsa no-psk no-srp \
 272         no-ec2m \
 273         no-weak-ssl-ciphers \
 274         no-dgram no-sctp \
 275         no-dtls no-ssl2 no-ssl3 no-tls1 no-tls1_1 \
 276         no-ssl3-method no-tls1-method no-tls1_1-method \
 277         no-dtls1-method no-dtls1_2-method \
 278         no-crypto-mdebug \
 279         $TARGET
 280 
 281     # Build
 282     SOURCE_DATE_EPOCH="$(date -r CHANGES '+%s')" \
 283     make
 284     output apps/openssl
 285     echo "** Finished building OpenSSL"
 286 }
 287 
 288 function build_gpgerror(){
 289     # Download/extract
 290     extract libgpg-error https://www.gnupg.org/ftp/gcrypt/libgpg-error tar.gz $GPGERROR_VERSION
 291 
 292     # Configure
 293     ./configure \
 294         --enable-silent-rules \
 295         --disable-languages \
 296         --disable-doc \
 297         --disable-tests \
 298         --disable-nls \
 299         --disable-dependency-tracking \
 300         --enable-static --disable-shared \
 301         --prefix="$BUILD_DIR/install" \
 302         --build=x86_64-linux-gnu \
 303         --host=$MUSL_CROSS
 304 
 305     # Build
 306     make install
 307     # no idea why this needs to be done...
 308     mkdir -p "$BUILD_DIR/install/bin"
 309     cp src/gpg-error-config "$BUILD_DIR/install/bin/"
 310     echo "** Finished building libgpg-error"
 311 }
 312 
 313 function build_gcrypt(){
 314     # Download/extract
 315     extract libgcrypt https://www.gnupg.org/ftp/gcrypt/libgcrypt tar.gz $GCRYPT_VERSION
 316 
 317     # Configure
 318     ./configure \
 319         --enable-silent-rules \
 320         --disable-doc \
 321         --disable-dependency-tracking \
 322         --enable-static --disable-shared \
 323         --enable-ciphers="aes chacha20" \
 324         --enable-pubkey-ciphers="ecc rsa" \
 325         --enable-digests="sha256 sha512" \
 326         --enable-kdfs="pkdf2" \
 327         --with-libgpg-error-prefix="$BUILD_DIR/install" \
 328         --prefix="$BUILD_DIR/install" \
 329         --build=x86_64-linux-gnu \
 330         --host=$MUSL_CROSS
 331 
 332     # Disable tests
 333     sed -Ei 's/(SUBDIRS\s*=.*)\s+tests(\s+.+)?/\1\2/' Makefile*
 334 
 335     # Build
 336     make install
 337     echo "** Finished building libgcrypt"
 338 }
 339 
 340 function build_cares(){
 341     # Download/extract
 342     extract c-ares https://github.com/c-ares/c-ares/releases/download/v$CARES_VERSION tar.gz $CARES_VERSION
 343 
 344     # Configure
 345     ./configure \
 346         --prefix="$BUILD_DIR/install" \
 347         --build=x86_64-linux-gnu \
 348         --host=$MUSL_CROSS
 349 
 350     # Build
 351     make install
 352     echo "** Finished building c-ares"
 353 }
 354 
 355 function build_pcre(){
 356     # Download/extract
 357     extract pcre https://downloads.sourceforge.net/project/pcre/pcre/$PCRE_VERSION tar.gz $PCRE_VERSION
 358 
 359     # Configure
 360     ./configure \
 361         --prefix="$BUILD_DIR/install" \
 362         --build=x86_64-linux-gnu \
 363         --host=$MUSL_CROSS
 364 
 365     # Build
 366     make install
 367     echo "** Finished building pcre"
 368 }
 369 
 370 function build_glib(){
 371     # https://download.gnome.org/sources/glib/2.74/glib-2.74.5.tar.xz
 372     # Download/extract
 373     extract glib https://download.gnome.org/sources/glib/$(echo $GLIB_VERSION | cut -d . -f 1-2) tar.xz $GLIB_VERSION
 374 
 375     MESON_CROSS_FILE="cross_$MUSL_CROSS.txt"
 376     MESON_CROSS_OS=linux
 377     MESON_CROSS_ENDIAN=little
 378     MESON_CROSS_CPU=$(echo "$MUSL_CROSS" | cut -d - -f 1)
 379     case $MUSL_CROSS in
 380         x86_64-linux-musl)
 381         MESON_CROSS_FAMILY=x86_64
 382         #MESON_CROSS_WRAPPER=qemu-x86_64-static
 383         ;;
 384         aarch64-linux-musl)
 385         MESON_CROSS_FAMILY=aarch64
 386         MESON_CROSS_WRAPPER=qemu-aarch64-static
 387         ;;
 388         armv*-linux-musl*)
 389         MESON_CROSS_FAMILY=arm
 390         MESON_CROSS_WRAPPER=qemu-arm-static
 391         ;;
 392         mips-linux-musl*)
 393         MESON_CROSS_ENDIAN=big
 394         MESON_CROSS_FAMILY=mips
 395         MESON_CROSS_WRAPPER=qemu-mips-static
 396         ;;
 397         mipsel-linux-musl*)
 398         MESON_CROSS_FAMILY=mipsel
 399         MESON_CROSS_WRAPPER=qemu-mipsel-static
 400         ;;
 401         *)
 402         MESON_CROSS_FAMILY=unknown
 403         ;;
 404     esac
 405 
 406     cat > "$MESON_CROSS_FILE" <<EoF
 407 [binaries]
 408 c = '$CROSS_PFX-gcc'
 409 cpp = '$CROSS_PFX-g++'
 410 ar = '$CROSS_PFX-ar'
 411 as = '$CROSS_PFX-as'
 412 ld = '$CROSS_PFX-ld'
 413 strip = '$CROSS_PFX-strip'
 414 
 415 [host_machine]
 416 system = '$MESON_CROSS_OS'
 417 cpu_family = '$MESON_CROSS_FAMILY'
 418 cpu = '$MESON_CROSS_CPU'
 419 endian = '$MESON_CROSS_ENDIAN'
 420 ${MESON_CROSS_WRAPPER+exe_wrapper = "'$MESON_CROSS_WRAPPER'"}
 421 EoF
 422 
 423     # XXX this is probably a terrible idea...
 424     if [ "$MESON_CROSS_FAMILY" = "x86_64" ]; then
 425         # insert lines overriding check
 426         sed -i '0,/^if not gl_cv_func_frexpl_works and/s//gl_cv_func_frexpl_broken_beyond_repair = false\n&/' glib/gnulib/meson.build
 427     fi
 428 
 429     # Configure
 430     CFLAGS="" CPPFLAGS="" LDFLAGS="" \
 431     meson setup \
 432         --prefix "$BUILD_DIR/install" \
 433         --buildtype minsize \
 434         --prefer-static \
 435         --default-library static \
 436         --cross-file "$MESON_CROSS_FILE" \
 437         -Dtests=false \
 438         "build_$MUSL_CROSS"
 439 
 440     # Build
 441     pushd "build_$MUSL_CROSS"
 442     meson compile
 443     meson install
 444     popd
 445     echo "** Finished building glib"
 446 }
 447 
 448 function build_wireshark(){
 449     # Download/extract
 450     extract wireshark https://www.wireshark.org/download/src/all-versions tar.xz $WIRESHARK_VERSION
 451 
 452     # Configure
 453     #sed -Ei \
 454     #    "s!/opt/local/lib!$BUILD_DIR/glib-$GLIB_VERSION/build_$MUSL_CROSS/install/usr/local/lib!" \
 455     #    cmake/modules/Find{GLIB2,GMODULE2,GTHREAD2}.cmake
 456     mkdir build
 457     pushd build
 458     PKG_CONFIG_LIBDIR="$BUILD_DIR/install/lib/pkgconfig" \
 459     CMAKE_PREFIX_PATH="$BUILD_DIR/install" \
 460     CFLAGS="-I$BUILD_DIR/install/include $CFLAGS" \
 461     CPPFLAGS="-I$BUILD_DIR/install/include $CPPFLAGS" \
 462     LDFLAGS="-L$BUILD_DIR/install/lib $CPPFLAGS" \
 463     cmake \
 464         -DBUILD_wireshark=OFF -DBUILD_sharkd=OFF -DBUILD_tshark=OFF \
 465         -DBUILD_capinfos=OFF -DBUILD_captype=OFF -DBUILD_dftest=OFF \
 466         -DBUILD_randpkt=OFF -DBUILD_dumpcap=OFF -DBUILD_rawshark=OFF \
 467         -DUSE_STATIC=ON -DENABLE_STATIC=ON -DENABLE_PLUGINS=OFF \
 468         -DBUILD_editcap=ON \
 469         -DBUILD_mergecap=ON \
 470         -DBUILD_reordercap=ON \
 471         -DBUILD_text2pcap=ON \
 472         -DENABLE_ZLIB=ON \
 473         ..
 474 
 475     # Build
 476     make
 477     output run/editcap
 478     output run/mergecap
 479     output run/text2pcap
 480     output run/reordercap
 481     popd
 482     echo "** Finished building wireshark"
 483 }
 484 
 485 function build_libpcap(){
 486     # Download/extract
 487     extract libpcap https://www.tcpdump.org/release tar.gz $LIBPCAP_VERSION
 488 
 489     # Configure
 490     CFLAGS="-I$BUILD_DIR/openssl-$OPENSSL_VERSION/include -DNETDB_INTERNAL=-1 $CFLAGS" \
 491     LDFLAGS="-L$BUILD_DIR/openssl-$OPENSSL_VERSION $LDFLAGS" \
 492     ./configure \
 493         --enable-remote \
 494         --disable-usb \
 495         --disable-netmap \
 496         --disable-bluetooth \
 497         --disable-dbus \
 498         --disable-rdma \
 499         --disable-shared \
 500         --prefix="$BUILD_DIR/install" \
 501         --build=x86_64-linux-gnu \
 502         --host=$MUSL_CROSS
 503 
 504     # Build
 505     make
 506     make install
 507     output rpcapd/rpcapd
 508     echo "** Finished building libpcap"
 509 }
 510 
 511 function build_tcpdump(){
 512     # Download/extract
 513     extract tcpdump https://www.tcpdump.org/release tar.gz $TCPDUMP_VERSION
 514 
 515     # The configure script fails to detect OpenSSL if DES is disabled...
 516     #fgrep -rl DES_cbc_encrypt . \
 517     #| xargs perl -i -pe 's/DES_cbc_encrypt/AES_cbc_encrypt/g'
 518 
 519     # Configure
 520     CFLAGS="-I$BUILD_DIR/openssl-$OPENSSL_VERSION/include -DNETDB_INTERNAL=-1 $CFLAGS" \
 521     LDFLAGS="-L$BUILD_DIR/openssl-$OPENSSL_VERSION $LDFLAGS" \
 522     ./configure \
 523         --build=x86_64-linux-gnu \
 524         --host=$MUSL_CROSS
 525 
 526     # Build
 527     make
 528     output tcpdump
 529     echo "** Finished building tcpdump"
 530 }
 531 
 532 function build_proberelay(){
 533     $CROSS_PFX-gcc \
 534         -I$BUILD_DIR/install/include $CFLAGS \
 535         -L$BUILD_DIR/install/lib $LDFLAGS \
 536         -o "$BIN_DIR/proberelay" \
 537         "$BUILD_DIR/proberelay.c" \
 538         -lpcap
 539     $STRIP "$BIN_DIR/proberelay"
 540 
 541     echo "** Finished building proberelay"
 542 }
 543 
 544 function build_ncurses() {
 545     # Download/extract
 546     extract ncurses https://invisible-mirror.net/archives/ncurses tar.gz $NCURSES_VERSION
 547 
 548     # Configure
 549     ./configure \
 550         --disable-shared \
 551         --enable-static \
 552         --without-develop \
 553         --without-manpages \
 554         --without-progs \
 555         --without-tests \
 556         --without-shared \
 557         --without-debug \
 558         --with-normal \
 559         --build=x86_64-linux-gnu \
 560         --host=$MUSL_CROSS
 561 
 562     # Build
 563     make libs
 564     echo "** Finished building ncurses"
 565 }
 566 
 567 function build_zlib() {
 568     extract zlib https://zlib.net tar.gz $ZLIB_VERSION
 569 
 570     # Configure
 571     ./configure --static
 572 
 573     # Build
 574     make libz.a
 575     echo "** Finished building zlib"
 576 }
 577 
 578 function build_xz() {
 579     # Download/extract
 580     extract xz https://tukaani.org/xz tar.xz $XZ_VERSION
 581 
 582     # Configure
 583     ./configure \
 584         --disable-debug \
 585         --disable-dependency-tracking \
 586         --disable-silent-rules \
 587         --disable-shared \
 588         --disable-nls \
 589         --disable-lzmadec \
 590         --disable-lzmainfo \
 591         --disable-microlzma \
 592         --disable-lzip-decoder \
 593         --disable-scripts \
 594         --disable-doc \
 595         --enable-small \
 596         --enable-static \
 597         --prefix="$BUILD_DIR/install" \
 598         --build=x86_64-linux-gnu \
 599         --host=$MUSL_CROSS
 600 
 601     # fuck it, we'll use violence to get static binaries
 602     sed -Ei \
 603         's/^(\s+..LIBTOOLFLAGS.\s+--mode=link.*)\\$/\1-all-static \\/' \
 604         src/xz{,dec}/Makefile
 605 
 606     # Build
 607     make install
 608     output "$BUILD_DIR/install/bin/xz"
 609 }
 610 
 611 function build_xzdec() {
 612     # Download/extract
 613     extract xz https://tukaani.org/xz tar.xz $XZ_VERSION
 614 
 615     # Configure for barebones xzdec
 616     ./configure \
 617         --disable-debug \
 618         --disable-dependency-tracking \
 619         --disable-silent-rules \
 620         --disable-shared \
 621         --disable-nls \
 622         --disable-lzmadec \
 623         --disable-lzmainfo \
 624         --disable-microlzma \
 625         --disable-lzip-decoder \
 626         --disable-scripts \
 627         --disable-doc \
 628         --enable-small \
 629         --enable-static \
 630         --enable-checks=crc32 \
 631         --enable-decoders=lzma1,lzma2,delta,x86,arm,armthumb,arm64 \
 632         --prefix="$BUILD_DIR/install" \
 633         --build=x86_64-linux-gnu \
 634         --host=$MUSL_CROSS
 635 
 636     # fuck it, we'll use violence to get static binaries
 637     sed -Ei \
 638         's/^(\s+..LIBTOOLFLAGS.\s+--mode=link.*)\\$/\1-all-static \\/' \
 639         src/xz{,dec}/Makefile
 640 
 641     # Rebuild
 642     make clean
 643     make install
 644     output "$BUILD_DIR/install/bin/xzdec"
 645 
 646     # Multicall object
 647     cd src/xzdec
 648     sed -E 's/^[ ]*//' <<EoF >> Makefile
 649 
 650     xzdec-main.o: xzdec.c
 651         \$(AM_V_CC)\$(CC) \$(DEFS) \$(DEFAULT_INCLUDES) \$(INCLUDES) \$(xzdec_CPPFLAGS) \$(CPPFLAGS) \$(AM_CFLAGS) \$(CFLAGS) -c -DXZDEC_MAIN=xzdec_main -o xzdec-main.o `test -f 'xzdec.c' || echo '\$(srcdir)/'`xzdec.c
 652 
 653     xzdec-multicall.o: xzdec-main.o \$(xzdec_DEPENDENCIES) \$(EXTRA_xzdec_DEPENDENCIES)
 654         \$(AM_V_CCLD)\$(LINK) --entry xzdec_main -r xzdec-main.o \$(filter-out xzdec-xzdec.o,\$(xzdec_OBJECTS)) ../../src/liblzma/.libs/liblzma.a
 655 EoF
 656 
 657     make xzdec-main.o xzdec-multicall.o
 658     echo "** Finished building xzdec"
 659 }
 660 
 661 function build_lz4() {
 662     extract lz4 https://github.com/lz4 git $LZ4_VERSION
 663     make
 664     #output programs/lz4
 665     echo "** Finished building lz4"
 666 }
 667 
 668 function build_xxHash() {
 669     extract xxHash https://github.com/Cyan4973 git $XXHASH_VERSION
 670     make
 671     #output xxhsum
 672     echo "** Finished building xxHash"
 673 }
 674 
 675 function build_zstd() {
 676     extract zstd https://github.com/facebook git $ZSTD_VERSION
 677 
 678     make clean
 679     CFLAGS="-I$BUILD_DIR/zlib-$ZLIB_VERSION -I$BUILD_DIR/lz4/lib $CFLAGS" \
 680     LDFLAGS="-L$BUILD_DIR/zlib-$ZLIB_VERSION -L$BUILD_DIR/lz4/lib $LDFLAGS" \
 681     FLAGS="$CFLAGS $LDFLAGS -Os" \
 682     make zstd ZSTD_LEGACY_SUPPORT=0 \
 683               HAVE_ZLIB=0 HAVE_LZMA=0 HAVE_LZ4=0 BACKTRACE=0
 684     output programs/zstd zstd-only
 685     CFLAGS="-I$BUILD_DIR/zlib-$ZLIB_VERSION -I$BUILD_DIR/lz4/lib $CFLAGS" \
 686     LDFLAGS="-L$BUILD_DIR/zlib-$ZLIB_VERSION -L$BUILD_DIR/lz4/lib $LDFLAGS" \
 687     FLAGS="$CFLAGS $LDFLAGS -Os" \
 688     make -C programs zstd-decompress ZSTD_LEGACY_SUPPORT=0 \
 689               HAVE_ZLIB=0 HAVE_LZMA=0 HAVE_LZ4=0 BACKTRACE=0
 690     output programs/zstd-decompress unzstd
 691 
 692     make clean
 693     CFLAGS="-I$BUILD_DIR/zlib-$ZLIB_VERSION -I$BUILD_DIR/lz4/lib $CFLAGS" \
 694     LDFLAGS="-L$BUILD_DIR/zlib-$ZLIB_VERSION -L$BUILD_DIR/lz4/lib $LDFLAGS" \
 695     FLAGS="$CFLAGS $LDFLAGS -DZSTD_NO_UNUSED_FUNCTIONS -Os" \
 696     make zstd ZSTD_LEGACY_SUPPORT=0 \
 697               HAVE_ZLIB=0 HAVE_LZMA=0 HAVE_LZ4=0 \
 698               HAVE_THREAD=0 ZSTD_LIB_MINIFY=1 BACKTRACE=0 ZSTD_NO_INLINE=1
 699     output programs/zstd zstd-mini
 700     CFLAGS="-I$BUILD_DIR/zlib-$ZLIB_VERSION -I$BUILD_DIR/lz4/lib $CFLAGS" \
 701     LDFLAGS="-L$BUILD_DIR/zlib-$ZLIB_VERSION -L$BUILD_DIR/lz4/lib $LDFLAGS" \
 702     FLAGS="$CFLAGS $LDFLAGS -DZSTD_NO_UNUSED_FUNCTIONS -Os" \
 703     make -C programs zstd-decompress ZSTD_LEGACY_SUPPORT=0 ZSTD_NOCOMPRESS=1 \
 704               HAVE_ZLIB=0 HAVE_LZMA=0 HAVE_LZ4=0 \
 705               HAVE_THREAD=0 ZSTD_LIB_MINIFY=1 BACKTRACE=0 ZSTD_NO_INLINE=1
 706     output programs/zstd-decompress unzstd-mini
 707 
 708     make clean
 709     CFLAGS="-I$BUILD_DIR/install/include $CFLAGS" \
 710     LDFLAGS="-L$BUILD_DIR/install/lib $LDFLAGS" \
 711     FLAGS="$CFLAGS $LDFLAGS -DZSTD_NO_UNUSED_FUNCTIONS -Os" \
 712     make zstd ZSTD_LEGACY_SUPPORT=0 \
 713               HAVE_ZLIB=0 HAVE_LZMA=1 HAVE_LZ4=0 \
 714               HAVE_THREAD=0 ZSTD_LIB_MINIFY=1 BACKTRACE=0 ZSTD_NO_INLINE=1
 715     output programs/zstd zstd-xz-mini
 716 
 717     make clean
 718     CFLAGS="-I$BUILD_DIR/zlib-$ZLIB_VERSION -I$BUILD_DIR/lz4/lib $CFLAGS" \
 719     LDFLAGS="-L$BUILD_DIR/zlib-$ZLIB_VERSION -L$BUILD_DIR/lz4/lib $LDFLAGS" \
 720     FLAGS="$CFLAGS $LDFLAGS -O3" \
 721     make zstd BACKTRACE=0 ZSTD_LEGACY_SUPPORT=2
 722     output programs/zstd zstd-fast
 723 
 724     make clean
 725     CFLAGS="-I$BUILD_DIR/install/include -I$BUILD_DIR/zlib-$ZLIB_VERSION -I$BUILD_DIR/lz4/lib $CFLAGS" \
 726     LDFLAGS="-L$BUILD_DIR/install/lib -L$BUILD_DIR/zlib-$ZLIB_VERSION -L$BUILD_DIR/lz4/lib $LDFLAGS" \
 727     FLAGS="$CFLAGS $LDFLAGS -O3" \
 728     make zstd BACKTRACE=0 ZSTD_LEGACY_SUPPORT=2
 729     output programs/zstd zstd-full
 730 
 731     make clean
 732     CFLAGS="-I$BUILD_DIR/zlib-$ZLIB_VERSION -I$BUILD_DIR/lz4/lib $CFLAGS" \
 733     LDFLAGS="-L$BUILD_DIR/zlib-$ZLIB_VERSION -L$BUILD_DIR/lz4/lib $LDFLAGS" \
 734     FLAGS="$CFLAGS $LDFLAGS -Os" \
 735     make
 736     output programs/zstd
 737 
 738     echo "** Finished building zstd"
 739 }
 740 
 741 function build_readline() {
 742     # Download/extract
 743     extract readline https://ftp.gnu.org/gnu/readline tar.gz $READLINE_VERSION
 744 
 745     # Prevent building examples (which can't be done when cross-compiling)
 746     sed -i -e 's|examples/Makefile||g' configure.ac
 747 
 748     # Configure
 749     autoconf
 750     ./configure \
 751         --disable-shared \
 752         --enable-static \
 753         --build=x86_64-linux-gnu \
 754         --host=$MUSL_CROSS
 755 
 756     # Build
 757     make
 758 
 759     # Note that socat looks for readline in <readline/readline.h>, so we need
 760     # that directory to exist.
 761     ln -s "$BUILD_DIR/readline-$READLINE_VERSION" "$BUILD_DIR/readline"
 762     echo "** Finished building readline"
 763 }
 764 
 765 function build_dropbear() {
 766     # Download/extract
 767     extract dropbear https://github.com/mkj git DROPBEAR_$DROPBEAR_VERSION
 768 
 769     if [ ! -e configure ]; then
 770         autoconf; autoheader
 771     fi
 772 
 773     SAVED_CFLAGS="$CFLAGS"
 774     CFLAGS="$CFLAGS -Wno-undef"
 775 
 776     # Configure
 777     ./configure \
 778         --build=x86_64-linux-gnu \
 779         --host=$MUSL_CROSS \
 780         --enable-static \
 781         --prefix=/ \
 782         --exec-prefix=/usr \
 783         --disable-zlib \
 784         --disable-lastlog \
 785         --disable-utmp --disable-utmpx \
 786         --disable-wtmp --disable-wtmpx \
 787         --disable-pututline --disable-pututxline \
 788         --enable-bundled-libtom
 789 
 790     # Set build options
 791     sed -E 's/^\s*//' <<EoF > localoptions.h
 792         #define INETD_MODE 0
 793 
 794         #define DROPBEAR_SVR_LOCALTCPFWD 0
 795         #define DROPBEAR_SVR_REMOTETCPFWD 0
 796         #define DROPBEAR_SVR_AGENTFWD 0
 797 
 798         #define DROPBEAR_USER_ALGO_LIST 0
 799         #define DROPBEAR_CHACHA20POLY1305 0
 800         #define DROPBEAR_AES128 1
 801         #define DROPBEAR_AES256 1
 802 
 803         #define DROPBEAR_ENABLE_CTR_MODE 1
 804         #define DROPBEAR_ENABLE_CBC_MODE 0
 805         #define DROPBEAR_ENABLE_GCM_MODE 1
 806 
 807         #define DROPBEAR_SHA1_HMAC 0
 808         #define DROPBEAR_SHA1_96_HMAC 0
 809         #define DROPBEAR_SHA2_256_HMAC 1
 810 
 811         #define DROPBEAR_RSA 0
 812         #define DROPBEAR_DSS 0
 813         #define DROPBEAR_ECDSA 0
 814         #define DROPBEAR_ED25519 1
 815 
 816         #define DROPBEAR_SK_RSA DROPBEAR_RSA
 817         #define DROPBEAR_SK_DSS DROPBEAR_DSS
 818         #define DROPBEAR_SK_ECDSA DROPBEAR_ECDSA
 819         #define DROPBEAR_SK_ED25519 DROPBEAR_ED25519
 820 
 821         #define DROPBEAR_DH_GROUP14_SHA1 0
 822         #define DROPBEAR_DH_GROUP14_SHA256 0
 823         #define DROPBEAR_DH_GROUP16 0
 824         #define DROPBEAR_DH_GROUP1 0
 825         #define DROPBEAR_ECDH 0
 826         #define DROPBEAR_CURVE25519 1
 827 
 828         #define DROPBEAR_SFTPSERVER 0
 829         #define DO_MOTD 0
 830 EoF
 831     # update version string
 832     sed -En "s/^(#define\s+DROPBEAR_VERSION\s+\"[0-9.]+).*/\1+$(git log -1 --format=%h)\"/p" \
 833         sysoptions.h >> localoptions.h
 834     # hide version banner
 835     sed -Ei 's/^(#define\s+LOCAL_IDENT).*/\1 "SSH-2.0-dropbear"/' sysoptions.h
 836     # Enable the delay hostkey option by default
 837     sed -Ei 's/^(\s*svr_opts.delay_hostkey\s*=\s*)0;/\11;/' svr-runopts.c
 838     # fully disable RSA
 839     sed -Ei 's/^(#define DROPBEAR_RSA_SHA1) 1$/\1 DROPBEAR_RSA/' default_options.h
 840     # fully disable DSA
 841     sed -Ei 's/^(#define DROPBEAR_DSS) 1$/\1 0/' sysoptions.h
 842 
 843     # actually compile
 844     if [ "$MUSL_CROSS" = "x86_64-linux-musl" ]; then
 845         sed -Ei 's/^(#define DROPBEAR_RSA) 0$/\1 1/' localoptions.h
 846         sed -Ei 's/^(#define DROPBEAR_ECDSA) 0$/\1 1/' localoptions.h
 847         sed -Ei 's/^(#define DROPBEAR_DSS) 0$/\1 1/' localoptions.h
 848         sed -Ei 's/^(#define DROPBEAR_DSS) 0$/\1 1/' sysoptions.h
 849         make PROGRAMS='dropbearconvert dropbearkey' MULTI=1
 850         output dropbearmulti dbkeyconv
 851     else
 852         export LTM_CFLAGS='-Os'
 853         make PROGRAMS='dropbear'
 854         output dropbear
 855 
 856         make PROGRAMS='dbclient'
 857         output dbclient
 858 
 859         make clean
 860         CFLAGS="$CFLAGS -DDROPBEARKEY_RETURN_TRUE=1" \
 861         make PROGRAMS='dropbear dropbearkey' MULTI=1
 862         output dropbearmulti dbmulti
 863 
 864         make clean
 865         CFLAGS="$CFLAGS -DDROPBEARKEY_RETURN_TRUE=1" \
 866         make PROGRAMS='dropbear dbclient dropbearkey' MULTI=1
 867         output dropbearmulti dbmulti-cli
 868 
 869         make clean
 870         CFLAGS="$CFLAGS -DDROPBEARKEY_RETURN_TRUE=1" \
 871         make PROGRAMS='dropbear dropbearconvert dropbearkey' MULTI=1
 872         output dropbearmulti dbmulti-conv
 873 
 874         make clean
 875         make PROGRAMS='dropbear dropbearkey' MULTI=1
 876         output dropbearmulti dbmulti-key
 877 
 878         make clean
 879         CFLAGS="$CFLAGS -DDROPBEARKEY_RETURN_TRUE=1" \
 880         make PROGRAMS='dropbear scp dropbearkey' MULTI=1
 881         output dropbearmulti dbmulti-scp
 882 
 883         make clean
 884         CFLAGS="$CFLAGS -DDROPBEARKEY_RETURN_TRUE=1" \
 885         make PROGRAMS='dropbear dbclient dropbearconvert dropbearkey' MULTI=1
 886         output dropbearmulti dbmulti-cli-conv
 887 
 888         make clean
 889         make PROGRAMS='dropbear dbclient dropbearkey' MULTI=1
 890         output dropbearmulti dbmulti-cli-key
 891 
 892         make clean
 893         CFLAGS="$CFLAGS -DDROPBEARKEY_RETURN_TRUE=1" \
 894         make PROGRAMS='dropbear dbclient scp dropbearkey' MULTI=1
 895         output dropbearmulti dbmulti-cli-scp
 896 
 897         make clean
 898         make PROGRAMS='dropbear dropbearconvert dropbearkey' MULTI=1
 899         output dropbearmulti dbmulti-conv-key
 900 
 901         make clean
 902         CFLAGS="$CFLAGS -DDROPBEARKEY_RETURN_TRUE=1" \
 903         make PROGRAMS='dropbear dropbearconvert scp dropbearkey' MULTI=1
 904         output dropbearmulti dbmulti-conv-scp
 905 
 906         make clean
 907         make PROGRAMS='dropbear dropbearkey scp' MULTI=1
 908         output dropbearmulti dbmulti-key-scp
 909 
 910         make clean
 911         make PROGRAMS='dropbear dbclient dropbearconvert dropbearkey' MULTI=1
 912         output dropbearmulti dbmulti-cli-conv-key
 913 
 914         make clean
 915         CFLAGS="$CFLAGS -DDROPBEARKEY_RETURN_TRUE=1" \
 916         make PROGRAMS='dropbear dbclient dropbearconvert scp dropbearkey' MULTI=1
 917         output dropbearmulti dbmulti-cli-conv-scp
 918 
 919         make clean
 920         make PROGRAMS='dropbear dbclient dropbearkey scp' MULTI=1
 921         output dropbearmulti dbmulti-cli-key-scp
 922 
 923         make clean
 924         make PROGRAMS='dropbear dropbearconvert dropbearkey scp' MULTI=1
 925         output dropbearmulti dbmulti-conv-key-scp
 926 
 927         make clean
 928         make PROGRAMS='dropbear dbclient dropbearconvert dropbearkey scp' MULTI=1
 929         output dropbearmulti dbmulti-cli-conv-key-scp
 930     fi
 931     echo "** Finished building dropbear"
 932     CFLAGS="$SAVED_CFLAGS"
 933 }
 934 
 935 function build_socat() {
 936     # Download/extract
 937     extract socat http://www.dest-unreach.org/socat/download tar.gz $SOCAT_VERSION
 938 
 939     # Configure
 940     SOURCE_DATE_EPOCH="$(date -r CHANGES '+%s')" \
 941     BUILD_DATE="$(date -r CHANGES '+%b %e %Y %H:%M:%S')" \
 942     CFLAGS="-I$BUILD_DIR -I$BUILD_DIR/openssl-$OPENSSL_VERSION/include -DNETDB_INTERNAL=-1 $CFLAGS" \
 943     LDFLAGS="-L$BUILD_DIR/readline-$READLINE_VERSION -L$BUILD_DIR/ncurses-$NCURSES_VERSION/lib -L$BUILD_DIR/openssl-$OPENSSL_VERSION $LDFLAGS" \
 944     LIBS="$BUILD_DIR/ncurses-$NCURSES_VERSION/lib/libncursesw.a" \
 945     ./configure \
 946         --enable-openssl-base=$BUILD_DIR/openssl-$OPENSSL_VERSION \
 947         --enable-openssl \
 948         --enable-msglevel=info \
 949         --disable-tun \
 950         --disable-sctp \
 951         --disable-vsock \
 952         --disable-readline \
 953         --disable-sycls \
 954         --disable-filan \
 955         --disable-udplite \
 956         --disable-dccp \
 957         --build=x86_64-linux-gnu \
 958         --host=$MUSL_CROSS
 959 
 960     sed -Ei 's/#define\s+HAVE_GETPROTOBYNUMBER_R.*/#define HAVE_GETPROTOBYNUMBER_R 0/' config.h
 961 
 962     # Build
 963     SOURCE_DATE_EPOCH="$(date -r CHANGES '+%s')" \
 964     BUILD_DATE="$(date -r CHANGES '+%b %e %Y %H:%M:%S')" \
 965     make
 966     output socat socat-openssl
 967 
 968     make clean
 969     SOURCE_DATE_EPOCH="$(date -r CHANGES '+%s')" \
 970     BUILD_DATE="$(date -r CHANGES '+%b %e %Y %H:%M:%S')" \
 971     CFLAGS="-I$BUILD_DIR -DNETDB_INTERNAL=-1 $CFLAGS" \
 972     LDFLAGS="-L$BUILD_DIR/readline-$READLINE_VERSION -L$BUILD_DIR/ncurses-$NCURSES_VERSION/lib $LDFLAGS" \
 973     LIBS="$BUILD_DIR/ncurses-$NCURSES_VERSION/lib/libncursesw.a" \
 974     ./configure \
 975         --disable-openssl \
 976         --enable-msglevel=info \
 977         --disable-tun \
 978         --disable-sctp \
 979         --disable-vsock \
 980         --disable-readline \
 981         --disable-sycls \
 982         --disable-filan \
 983         --disable-udplite \
 984         --disable-dccp \
 985         --build=x86_64-linux-gnu \
 986         --host=$MUSL_CROSS
 987 
 988     sed -Ei 's/#define\s+HAVE_GETPROTOBYNUMBER_R.*/#define HAVE_GETPROTOBYNUMBER_R 0/' config.h
 989 
 990     # Build
 991     SOURCE_DATE_EPOCH="$(date -r CHANGES '+%s')" \
 992     BUILD_DATE="$(date -r CHANGES '+%b %e %Y %H:%M:%S')" \
 993     make
 994     output socat
 995 
 996     echo "** Finished building socat"
 997 }
 998 
 999 function build_rsync() {
1000     # Download/extract
1001     extract rsync https://download.samba.org/pub/rsync/src tar.gz $RSYNC_VERSION
1002 
1003     OPTS="--disable-roll-simd --disable-roll-asm --disable-md2man --disable-debug --disable-locale"
1004     if [ "$MUSL_CROSS" != "x86_64-linux-musl" ]; then
1005         OPTS="$OPTS"
1006     else
1007         OPTS="$OPTS"
1008     fi
1009 
1010     # Configure
1011     CFLAGS="-I$BUILD_DIR/openssl-$OPENSSL_VERSION/include -I$BUILD_DIR/zlib-$ZLIB_VERSION -I$BUILD_DIR/xxHash -I$BUILD_DIR/zstd/lib -I$BUILD_DIR/lz4/lib $CFLAGS" \
1012     CXXFLAGS="$CFLAGS" \
1013     LDFLAGS="-L$BUILD_DIR/openssl-$OPENSSL_VERSION -L$BUILD_DIR/zlib-$ZLIB_VERSION -L$BUILD_DIR/xxHash -L$BUILD_DIR/zstd/lib -L$BUILD_DIR/lz4/lib $LDFLAGS" \
1014     ./configure \
1015         --disable-debug $OPTS \
1016         --build=x86_64-linux-gnu \
1017         --host=$MUSL_CROSS
1018 
1019     # Build
1020     make
1021     output rsync rsync-openssl
1022 
1023     make clean
1024     # Configure
1025     CFLAGS="-I$BUILD_DIR/zlib-$ZLIB_VERSION -I$BUILD_DIR/xxHash -I$BUILD_DIR/zstd/lib -I$BUILD_DIR/lz4/lib $CFLAGS" \
1026     CXXFLAGS="$CFLAGS" \
1027     LDFLAGS="-L$BUILD_DIR/zlib-$ZLIB_VERSION -L$BUILD_DIR/xxHash -L$BUILD_DIR/zstd/lib -L$BUILD_DIR/lz4/lib $LDFLAGS" \
1028     ./configure \
1029         --disable-debug $OPTS \
1030         --disable-openssl \
1031         --build=x86_64-linux-gnu \
1032         --host=$MUSL_CROSS
1033 
1034     # Build
1035     make
1036     output rsync
1037 
1038     echo "** Finished building rsync"
1039 }
1040 
1041 function build_libsodium(){
1042     # Download/extract
1043     extract libsodium https://github.com/jedisct1 git $LIBSODIUM_VERSION
1044 
1045     # Configure
1046     ./configure \
1047         --enable-static \
1048         --disable-shared \
1049         --disable-asm \
1050         --disable-ssp \
1051         --without-pthreads \
1052         --prefix="$BUILD_DIR/install" \
1053         --build=x86_64-linux-gnu \
1054         --host=$MUSL_CROSS
1055 
1056     # Build
1057     make install
1058     echo "** Finished building libsodium"
1059 }
1060 
1061 function build_minisign(){
1062     # Download/extract
1063     extract minisign https://github.com/ryancdotorg git $MINISIGN_VERSION
1064 
1065     # Build
1066     WITH_PTHREADS=0 \
1067     CC="$CROSS_PFX-gcc" \
1068     CFLAGS="-I$BUILD_DIR/install/include $CFLAGS" \
1069     LDFLAGS="-L$BUILD_DIR/install/lib $LDFLAGS" \
1070     make bin/miniverify bin/minisign \
1071          obj/miniverify_multicall.o \
1072          obj/minisign_multicall.o
1073     output bin/miniverify
1074     output bin/minisign
1075     echo "** Finished building minisign"
1076 }
1077 
1078 function build_sha2sum(){
1079     # Download/extract
1080     extract sha2sum https://github.com/ryancdotorg git $SHA2SUM_VERSION
1081 
1082     # Build
1083     CFLAGS="-I$BUILD_DIR/install/include $CFLAGS" \
1084     make bin/sha2sum bin/sha256sum \
1085         obj/sha256sum_multicall.o \
1086         obj/sha2sum_nacl_sha512_multicall.o
1087     output bin/sha2sum
1088     output bin/sha256sum
1089     echo "** Finished building sha2sum"
1090 }
1091 
1092 function build_multicall(){
1093     # Download/extract
1094     extract multicall https://github.com/ryancdotorg git $MULTICALL_VERSION
1095 
1096     # Build
1097     LDFLAGS="-L$BUILD_DIR/install/lib $LDFLAGS" \
1098     make bin/multicall-miniverify-sha256sum{,-xzdec} \
1099          bin/multicall-mini{verify,sign}-sha2sum{,-xzdec}
1100     output bin/multicall-miniverify-sha256sum
1101     output bin/multicall-miniverify-sha256sum-xzdec
1102     output bin/multicall-miniverify-sha2sum
1103     output bin/multicall-miniverify-sha2sum-xzdec
1104     output bin/multicall-minisign-sha2sum
1105     output bin/multicall-minisign-sha2sum-xzdec
1106     echo "** Finished building multicall"
1107 }
1108 
1109 
1110 
1111 function unpack_patches() {
1112 # tar -C BUILD_DIR -cz --owner=0 --group=0 patches xxd.c | base64 -w79 \
1113 # | sed -e '/[<]_eof/,/^_eof/{//!d;r /dev/stdin' -e '}' builder.sh \
1114 # | sponge builder.sh
1115 base64 -d <<_eof | tar -C "$1" -xvz
1116 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
1441 zZ/78bp//B3xMHIIAGAEA
1442 _eof
1443 }
1444 
1445 function buildall() {
1446     [ -d "$BUILD_DIR/install" ] && rm -rf "$BUILD_DIR/install"
1447     setcross "$1"
1448 
1449     DISABLE_WIRESHARK=""
1450 
1451     if [ "$MUSL_CROSS" = "mips-linux-muslsf" ]; then
1452         DISABLE_WIRESHARK="1"
1453     fi
1454 
1455     get_musl
1456 
1457     $CROSS_PFX-gcc $CFLAGS $LDFLAGS -o "$BIN_DIR/xxd" "$BUILD_DIR/xxd.c"
1458     $STRIP "$BIN_DIR/xxd"
1459 
1460     $CROSS_PFX-gcc $CFLAGS $LDFLAGS -o "$BIN_DIR/sav" "$BUILD_DIR/sav.c"
1461     $STRIP "$BIN_DIR/sav"
1462 
1463     $CROSS_PFX-gcc $CFLAGS $LDFLAGS -o "$BIN_DIR/pause" "$BUILD_DIR/pause.c" -nostartfiles
1464     $STRIP "$BIN_DIR/pause"
1465 
1466     build_libsodium
1467     build_minisign
1468 
1469     build_sha2sum
1470 
1471     build_xzdec
1472 
1473     build_multicall
1474 
1475     build_pv
1476 
1477     build_zlib
1478 
1479     build_dropbear
1480 
1481     build_xz
1482     build_lz4
1483     build_xxHash
1484     build_zstd
1485 
1486     build_openssl
1487     build_libpcap
1488     build_tcpdump
1489     build_proberelay
1490 
1491     build_wget
1492 
1493     build_rsync
1494 
1495     build_ncurses
1496     #build_readline
1497     build_socat
1498 
1499     if [ -z "$DISABLE_WIRESHARK" ]; then
1500         build_glib
1501         build_gpgerror
1502         build_gcrypt
1503         build_cares
1504         build_pcre
1505 
1506         build_wireshark
1507     fi
1508 }
1509 
1510 function main() {
1511     HASH=$(sha256sum $0|head -c16)
1512     mkdir -p "$BUILD_DIR"
1513 
1514     if [ ! -f .gitignore ]; then
1515         echo -e 'output\npatches\n.gitignore' > .gitignore
1516     fi
1517 
1518     if [ ! -d "$BUILD_DIR/patches" ]; then
1519         unpack_patches "$BUILD_DIR"
1520     fi
1521 
1522     if [ ! -z "$1" ]; then
1523         if [ "$1" = "unpack" ]; then
1524             true
1525         elif [ "$1" = "repack" -a -d "$BUILD_DIR/patches" ]; then
1526             cp -a $0 $0.bak
1527             tar -C $BUILD_DIR -cz --owner=0 --group=0 patches xxd.c sav.c proberelay.c pause.c | base64 -w79 \
1528             | sed -e '/[<]_eof/,/^_eof/{//!d;r /dev/stdin' -e '}' $0 \
1529             | sponge $0
1530         else
1531             buildall "$1"
1532         fi
1533         exit 0
1534     fi
1535 
1536     # armel-linux-musleabihf
1537     # mips-linux-musl mips-linux-muslsf # mipsel-linux-musl mipsel-linux-muslsf mipsel-linux-musln32 mipsel-linux-musln32sf
1538     for arch in armv7l-linux-musleabihf x86_64-linux-musl mips-linux-muslsf armv5l-linux-musleabihf aarch64-linux-musl
1539     do
1540         echo "** building for $arch **"
1541         export arch
1542         export PS4="+$arch+ "
1543         buildall "$arch"
1544         echo "** finished $arch bins **"
1545     done
1546 
1547     echo "** Finished **"
1548 }
1549 
1550 main "$@"
1551 # vim:sw=4:ts=4:et: