diff --git a/.gitignore b/.gitignore index bb4489c..f3ff765 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -./sources -./build +./sources/ +./build/ diff --git a/Makefile b/Makefile index d5c34d4..4a1ff64 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,5 @@ include config.mk -SOURCES_FILE=./sources.list -ARCH=$(shell uname -m) -FROOT="${ARCH}-musllvm" - all: pull: @@ -19,6 +15,7 @@ pull: build: init ./scripts/headers.sh + ./scripts/musl.sh init: @if [ ! -d ./build/${FROOT} ]; then \ diff --git a/config.mk b/config.mk index 56bc624..76726e1 100644 --- a/config.mk +++ b/config.mk @@ -1,6 +1,5 @@ # musllvm default flags -CC = cc -CFLAGS = -O2 -pipe - - +SOURCES_FILE=./sources.list +ARCH=$(shell uname -m) +FROOT="${ARCH}-musllvm" diff --git a/scripts/check.sh b/scripts/check.sh index bd5ab88..9b88d98 100755 --- a/scripts/check.sh +++ b/scripts/check.sh @@ -1,12 +1,15 @@ -#/bin/sh +#!/bin/sh +set -eu + +SOURCES_FILE=./sources.list while IFS= read -r url; do \ [ -z "$url" ] && continue; \ fname="$(printf '%s' "$url" | sed -E 's/[?#].*$//' | sed -E 's!.*/!!')"; \ -if [ -e "$(OUTDIR)/$fname" ]; then \ +if [ -e "./sources/$fname" ]; then \ printf "SKIP: %s (already exists)\n" "$fname"; \ else \ printf "GET: %s -> %s\n" "$url" "$fname"; \ curl -o "./sources/$fname" "$url" || { printf "ERROR: failed to download %s\n" "$url"; exit 1; }; \ fi; \ -done < ${SOURCES_FILE}; \ +done < "$SOURCES_FILE"; \ diff --git a/scripts/headers.sh b/scripts/headers.sh index df38c95..ae251cc 100755 --- a/scripts/headers.sh +++ b/scripts/headers.sh @@ -1,27 +1,43 @@ -#/bin/sh +#!/bin/sh +set -eu ARCH=$(uname -m) -FROOT="${ARCH}-musllvm" -LINUX_TAR=$(printf '%s' "$url" | sed -E 's/[?#].*$//' | sed -E 's!.*/!!' | grep -i linux) +FROOT="$ARCH-musllvm" +LINUX_TAR=$(ls ./sources/linux-*.tar.* 2>/dev/null | head -n 1 | xargs basename) +if [ -z "$LINUX_TAR" ]; then + echo "ERR: No Linux tarball found in sources directory" + exit 1 +fi LINUX_SOURCE="${LINUX_TAR%%.tar*}" if command -v "clang" >/dev/null 2>&1 && command -v "lld" >/dev/null 2>&1; then export LLVM=1 - export LLVM=IAS + export LLVM_IAS=1 fi -tar -xpf ./sources/${LINUX_TAR} ./build +if [ -z ./build/"$LINUX_SOURCE" ]; then + echo "Extracting Linux tarball to ./build/" + tar -xpf ./sources/"$LINUX_TAR" -C ./build +else + echo "Linux source already extracted." +fi -mkdir -pv ./build/${FROOT}/include +echo "Creating target include directory" +mkdir -pv ./build/"$FROOT"/include echo "Building Headers" -pushd ./build/${LINUX_SOURCE} +if [ -d ./build/"$FROOT"/include/linux ]; then + echo "Headers already built, skipping..." + exit +fi + +cd ./build/"$LINUX_SOURCE" make mrproper make headers -find usr/include \( -name .install -o -name ..install.cmd \) -exec rm -vf {} \; -cp -rv usr/include/* ../${FROOT}/include/ -rm -v ../${FROOT}/include/Makefile +find usr/include -type f ! -name '*.h' -delete +cp -rv usr/include/* ../"$FROOT"/include/ +rm -v ../"$FROOT"/include/Makefile -popd +exit diff --git a/scripts/musl.sh b/scripts/musl.sh new file mode 100755 index 0000000..3cf747a --- /dev/null +++ b/scripts/musl.sh @@ -0,0 +1,38 @@ +#!/bin/sh +set -eu + +ARCH=$(uname -m) +FROOT="$ARCH-musllvm" +MUSL_TAR=$(ls ./sources/musl-*.tar.* 2>/dev/null | head -n 1 | xargs basename) +if [ -z "$MUSL_TAR" ]; then + echo "ERR: No Musl tarball found in sources directory" + exit 1 +fi +MUSL_SOURCE="${MUSL_TAR%%.tar.*}" + +if command -v "clang" >/dev/null 2>&1 && command -v "lld" >/dev/null 2>&1; then + export CC="clang" +else + export CC="cc" +fi + +if [ ! -d ./build/"MUSL_SOURCE" ]; then + echo "Extracting Musl tarball to ./build/" + tar -xpf ./sources/"$MUSL_TAR" -C ./build +else + echo "Musl source already extracted." +fi + +echo "Buliding musl" +if [ -f ./build/"$FROOT"/include/libc.so ]; then + echo "Musl already built, skipping..." + exit +fi + +cd ./build/"$MUSL_SOURCE" + +./configure \ + --prefix=/ \ + +make -j$(nproc) +DESTDIR=$FROOT make install diff --git a/sources.list b/sources.list index 7aa52b7..2983f20 100644 --- a/sources.list +++ b/sources.list @@ -9,3 +9,5 @@ https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.2/clang-21.1 https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.2/compiler-rt-21.1.2.src.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.5/lld-21.1.5.src.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.5/libunwind-21.1.5.src.tar.xz +https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.5/libcxx-21.1.5.src.tar.xz +https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.5/libcxxabi-21.1.5.src.tar.xz