diff options
| -rwxr-xr-x | bootstrap.sh | 18 | ||||
| -rwxr-xr-x | sources/musl.spec | 16 | ||||
| -rwxr-xr-x | treetap | 83 |
3 files changed, 68 insertions, 49 deletions
diff --git a/bootstrap.sh b/bootstrap.sh index 5db4386..532da62 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -8,6 +8,7 @@ ARCH=$(echo $TARGET | cut -d"-" -f1) BOOTSTRAP=$(pwd)/.bootstrap PROCS=$(nproc) SOURCES=$(pwd)/.treetap/sources +SPEC=$(pwd)/sources export AR=llvm-ar export CC=clang export CFLAGS="-fuse-ld=lld -O3 -march=$MICROARCH -pipe --sysroot=$BOOTSTRAP/root -Wno-unused-command-line-argument" @@ -15,8 +16,9 @@ export CXX=clang++ export CXXFLAGS=$CFLAGS export RANLIB=llvm-ranlib export LD=ld.lld -export TREETAP_SYSROOT=$BOOTSTRAP/root -export TREETAP_TARGET=$TARGET +export LDFLAGS="--sysroot=$BOOTSTRAP/root" +export TT_SYSROOT=$BOOTSTRAP/root +export TT_TARGET=$TARGET # Fetch sources required for a bootstrap ./treetap fetch sources/busybox.spec @@ -57,7 +59,8 @@ set(CMAKE_SYSTEM_NAME Linux) EOF # Install headers for Linux -tar xf $SOURCES/linux/*/linux-*.tar* +LINUX_VERSION=$(sed -En "s/SRC_VERSION=\"?(.+)\"/\1/p" $SPEC/linux.spec) +tar xf $SOURCES/linux/$LINUX_VERSION/linux-*.tar* cd linux-*/ # NOTE: LLVM=1 is required here because GCC and other GNU tools are required in # some places still. This allows us to use LLVM and bypass the parts that @@ -71,7 +74,8 @@ cp -r usr/include $BOOTSTRAP/root/usr cd .. # Install headers for musl -tar xf $SOURCES/musl/*/musl-*.tar* +MUSL_VERSION=$(sed -En "s/SRC_VERSION=\"?(.+)\"/\1/p" $SPEC/musl.spec) +tar xf $SOURCES/musl/$MUSL_VERSION/musl-*.tar* cd musl-*/ # NOTE: We are intentionally not passing --target here because musl follows the # GNU approach when it comes to cross-compiling. This means the build @@ -90,7 +94,8 @@ make -O -j $PROCS install-headers DESTDIR=$BOOTSTRAP/root cd .. # Build and install compiler-rt builtins -tar xf $SOURCES/llvm/*/llvm-project-*.tar* +LLVM_VERSION=$(sed -En "s/SRC_VERSION=\"?(.+)\"/\1/p" $SPEC/llvm.spec) +tar xf $SOURCES/llvm/$LLVM_VERSION/llvm-project-*.tar* cd llvm-project-*/ cmake -S compiler-rt/lib/builtins -B build-builtins \ -DCMAKE_BUILD_TYPE=Release \ @@ -187,7 +192,8 @@ cmake --install build-llvm --parallel $PROCS cd .. # Build Busybox -tar xf $SOURCES/busybox/*/busybox-*.tar* +BUSYBOX_VERSION=$(sed -En "s/SRC_VERSION=\"?(.+)\"/\1/p" $SPEC/busybox.spec) +tar xf $SOURCES/busybox/$BUSYBOX_VERSION/busybox-*.tar* cd busybox-*/ # NOTE: Like we did with musl before, we don't set CROSS_COMPILE because LLVM is # smart and doesn't need a compiler to cross-compile code. With that said, diff --git a/sources/musl.spec b/sources/musl.spec index 5811461..a5a904f 100755 --- a/sources/musl.spec +++ b/sources/musl.spec @@ -9,13 +9,13 @@ build() { tar xf ../musl-*.tar* cd musl-*/ ./configure \ - --bindir=$TREETAP_BINDIR \ - --build=$TREETAP_BUILD \ - --includedir=$TREETAP_INCLUDEDIR \ - --libdir=$TREETAP_LIBDIR \ - --prefix=$TREETAP_PREFIX \ - --target=$TREETAP_TARGET - make -j $TREETAP_PROCS + --bindir=$TT_BINDIR \ + --build=$TT_BUILD \ + --includedir=$TT_INCLUDEDIR \ + --libdir=$TT_LIBDIR \ + --prefix=$TT_PREFIX \ + --target=$TT_TARGET + make -O -j $TT_PROCS } clean() { @@ -24,5 +24,5 @@ clean() { package() { cd musl-*/ - DESTDIR=$TREETAP_INSTALLDIR make install + DESTDIR=$TT_INSTALLDIR make install } @@ -18,6 +18,11 @@ # Changelog # ############# +# November 13, 2025 (1.0.2) +# + Added the target triple to the package path +# * Prevented fetch from re-downloading packages given a valid hash +# * Renamed all TREETAP_* variables to TT_* + # November 11, 2025 (1.0.1) # - Removed bashisms to become POSIX compliant @@ -28,10 +33,10 @@ # Global Variables # #################### -[ -z "$TREETAP_DIR" ] && TREETAP_DIR="$(pwd)/.treetap" -[ -z "$TREETAP_PKGDIR" ] && TREETAP_PKGDIR="$TREETAP_DIR/packages" -[ -z "$TREETAP_SYSROOT" ] && TREETAP_SYSROOT=/ -TREETAP_VERSION="1.0.1" +[ -z "$TT_DIR" ] && TT_DIR="$(pwd)/.treetap" +[ -z "$TT_PKGDIR" ] && TT_PKGDIR="$TT_DIR/packages" +[ -z "$TT_SYSROOT" ] && TT_SYSROOT=/ +TT_VERSION="1.0.2" ##################### # Utility Functions # @@ -39,7 +44,7 @@ TREETAP_VERSION="1.0.1" # Displays the usage information for treetap help_message() { - echo "treetap $TREETAP_VERSION" + echo "treetap $TT_VERSION" echo echo "Package Commands:" echo " $0 install <package> [sysroot]" @@ -82,15 +87,15 @@ source_spec() { [ -z "$SRC_FILENAME" ] && SRC_FILENAME=$(basename $SRC_URL) # Environmental Variables - [ -z "$TREETAP_BINDIR" ] && TREETAP_BINDIR=/bin - TREETAP_BUILD=$(clang -dumpmachine) - [ -z "$TREETAP_TARGET" ] && TREETAP_TARGET=$TREETAP_BUILD - TREETAP_BUILDDIR="$TREETAP_DIR/sources/$SRC_NAME/$SRC_VERSION/$TREETAP_TARGET" - [ -z "$TREETAP_INCLUDEDIR" ] && TREETAP_INCLUDEDIR=/usr/include - TREETAP_INSTALLDIR="$TREETAP_BUILDDIR/install" - [ -z "$TREETAP_LIBDIR" ] && TREETAP_LIBDIR=/lib - [ -z "$TREETAP_PREFIX" ] && TREETAP_PREFIX=/ - [ -z "$TREETAP_PROCS" ] && TREETAP_PROCS=$(nproc) + [ -z "$TT_BINDIR" ] && TT_BINDIR=/bin + TT_BUILD=$(clang -dumpmachine) + [ -z "$TT_TARGET" ] && TT_TARGET=$TT_BUILD + TT_BUILDDIR="$TT_DIR/sources/$SRC_NAME/$SRC_VERSION/$TT_TARGET" + [ -z "$TT_INCLUDEDIR" ] && TT_INCLUDEDIR=/usr/include + TT_INSTALLDIR="$TT_BUILDDIR/install" + [ -z "$TT_LIBDIR" ] && TT_LIBDIR=/lib + [ -z "$TT_PREFIX" ] && TT_PREFIX=/ + [ -z "$TT_PROCS" ] && TT_PROCS=$(nproc) true } @@ -101,12 +106,12 @@ source_spec() { # Installs a package to the sysroot package_install() { - [ ! -z "$2" ] && TREETAP_SYSROOT=$2 - package_check $1 $TREETAP_SYSROOT + [ ! -z "$2" ] && TT_SYSROOT=$2 + package_check $1 $TT_SYSROOT echo "Installing $(basename $1)" FULLPATH=$(pwd)/$1 PUSHD=$(pwd) - cd $TREETAP_SYSROOT + cd $TT_SYSROOT xz -cd $FULLPATH | cpio -idmu --quiet cd $PUSHD exit 0 @@ -114,12 +119,12 @@ package_install() { # Uninstalls a package from the sysroot package_uninstall() { - [ ! -z "$2" ] && TREETAP_SYSROOT=$2 - package_check $1 $TREETAP_SYSROOT + [ ! -z "$2" ] && TT_SYSROOT=$2 + package_check $1 $TT_SYSROOT echo "Uninstalling $(basename $1)" FULLPATH=$(pwd)/$1 PUSHD=$(pwd) - cd $TREETAP_SYSROOT + cd $TT_SYSROOT xz -cd $FULLPATH | cpio -it --quiet | tail -n +2 | sort -r | while read path; do if [ -d $path ]; then rmdir --ignore-fail-on-non-empty $path @@ -134,9 +139,9 @@ package_uninstall() { # Builds the source from the previously fetched tarball source_build() { source_spec $1 - mkdir -p $TREETAP_BUILDDIR + mkdir -p $TT_BUILDDIR PUSHD=$(pwd) - cd $TREETAP_BUILDDIR + cd $TT_BUILDDIR echo "Building $SRC_NAME $SRC_VERSION" build > build-$(date +%Y%m%d%H%M%S).log 2>&1 cd $PUSHD @@ -146,12 +151,12 @@ source_build() { # Cleans the source from the previous build source_clean() { source_spec $1 - mkdir -p $TREETAP_BUILDDIR + mkdir -p $TT_BUILDDIR PUSHD=$(pwd) - cd $TREETAP_BUILDDIR + cd $TT_BUILDDIR echo "Cleaning $SRC_NAME $SRC_VERSION" clean - rm -rf $TREETAP_INSTALLDIR + rm -rf $TT_INSTALLDIR cd $PUSHD exit 0 } @@ -159,9 +164,17 @@ source_clean() { # Fetches and verifies the integrity of the source tarball source_fetch() { source_spec $1 - mkdir -p $TREETAP_BUILDDIR + mkdir -p $TT_BUILDDIR PUSHD=$(pwd) - cd $TREETAP_BUILDDIR/.. + cd $TT_BUILDDIR/.. + if [ -f $SRC_FILENAME ]; then + if (echo "$SRC_HASH $SRC_FILENAME" | sha256sum -c - > /dev/null); then + echo "Skipping $SRC_FILENAME" + exit 0 + else + rm -f $SRC_FILENAME + fi + fi echo "Fetching $SRC_FILENAME" curl -L -sS $SRC_URL -o $SRC_FILENAME echo "Verifying $SRC_FILENAME" @@ -173,17 +186,17 @@ source_fetch() { # Packages the built artifacts for distribution source_package() { source_spec $1 - mkdir -p $TREETAP_BUILDDIR - mkdir -p $TREETAP_INSTALLDIR - mkdir -p $TREETAP_PKGDIR + mkdir -p $TT_BUILDDIR + mkdir -p $TT_INSTALLDIR + mkdir -p $TT_PKGDIR/$TT_TARGET PUSHD=$(pwd) - cd $TREETAP_BUILDDIR + cd $TT_BUILDDIR echo "Moving artifacts for $SRC_NAME $SRC_VERSION" package > package-$(date +%Y%m%d%H%M%S).log echo "Archiving $SRC_NAME $SRC_VERSION" - cd $TREETAP_INSTALLDIR - find | cpio -o --quiet | xz -cz > "$TREETAP_PKGDIR/$SRC_NAME-$SRC_VERSION.cpio.xz" - rm -rf $TREETAP_INSTALLDIR + cd $TT_INSTALLDIR + find | cpio -o --quiet | xz -cz > "$TT_PKGDIR/$TT_TARGET/$SRC_NAME-$SRC_VERSION.cpio.xz" + rm -rf $TT_INSTALLDIR cd $PUSHD exit 0 } @@ -191,7 +204,7 @@ source_package() { # Purges the entire build directory for a source source_purge() { source_spec $1 - rm -rf $TREETAP_BUILDDIR + rm -rf $TT_BUILDDIR exit 0 } |
