toolchain: Add wasip1 target and miri

This commit is contained in:
Wildan M 2026-07-26 15:35:18 +02:00
parent af5c2fb695
commit 402f2f4cdb
8 changed files with 63 additions and 48 deletions

View File

@ -14,6 +14,7 @@ LLVM_TARGET=recipes/dev/llvm21/target/$(HOST_TARGET)/$(TARGET)
RUST_TARGET=recipes/dev/rust/target/$(HOST_TARGET)/$(TARGET)
CLANG_TARGET=recipes/dev/clang21/target/$(HOST_TARGET)/$(TARGET)
LLD_TARGET=recipes/dev/lld21/target/$(HOST_TARGET)/$(TARGET)
WASIP1_LIBC_TARGET=recipes/dev/wasi-libc/target/$(HOST_TARGET)/wasm32-wasip1
# dependencies of GCC and Rust
LIBGMP_TARGET=recipes/libs/libgmp/target/$(HOST_TARGET)/$(TARGET)
LIBMPFR_TARGET=recipes/libs/libmpfr/target/$(HOST_TARGET)/$(TARGET)
@ -31,7 +32,7 @@ UPSTREAM_RUSTC_VERSION=2026-05-24
export PREFIX_RUSTFLAGS=-L $(ROOT)/$(PREFIX_INSTALL)/$(TARGET)/lib
export RUSTUP_TOOLCHAIN=$(ROOT)/$(PREFIX_INSTALL)
export REDOXER_TOOLCHAIN=$(RUSTUP_TOOLCHAIN)
PREFIX_CONFIG=CI=1 COOKBOOK_CLEAN_BUILD=true COOKBOOK_CLEAN_TARGET=false COOKBOOK_VERBOSE=true COOKBOOK_NONSTOP=false
PREFIX_CONFIG=CI=1 COOKBOOK_CLEAN_TARGET=false COOKBOOK_VERBOSE=true COOKBOOK_NONSTOP=false
prefix: $(PREFIX)/sysroot
@ -42,7 +43,7 @@ ifeq ($(PREFIX_BINARY),0)
rm -rf $(BINUTILS_TARGET) $(LIBTOOL_TARGET) $(GCC_TARGET) $(LIBSTDCXX_TARGET) $(RELIBC_FREESTANDING_TARGET)
rm -rf $(RELIBC_TARGET) $(LLVM_TARGET) $(RUST_TARGET) $(CLANG_TARGET) $(LLD_TARGET) $(LIBGMP_TARGET) $(LIBMPFR_TARGET)
rm -rf $(LIBMPC_TARGET) $(LIBZLIB_TARGET) $(LIBZSTD_TARGET) $(LIBSSL_TARGET) $(LIBHTTP2_TARGET) $(LIBCURL_TARGET)
rm -rf $(LIBGCC_TARGET) $(LIBCPP_TARGET)
rm -rf $(LIBGCC_TARGET) $(LIBCPP_TARGET) $(WASIP1_LIBC_TARGET)
endif
# Remove relibc in sysroot and all statically linked recipes
@ -391,19 +392,35 @@ endif
# BUILD RUST ---------------------------------------------------
else
$(PREFIX)/rust-install: | $(PREFIX)/gcc-install $(PREFIX)/libtool-install $(FSTOOLS_TAG) $(CONTAINER_TAG)
$(PREFIX)/wasip1-libc-install: $(PREFIX)/clang-install $(FSTOOLS_TAG) $(CONTAINER_TAG)
ifeq ($(PODMAN_BUILD),1)
$(PODMAN_RUN) make $@
else
@echo "\033[1;36;49mBuilding wasip1-libc-install\033[0m"
rm -rf "$@.partial" "$@"
export REDOXER_TOOLCHAIN=$(ROOT)/$(PREFIX)/clang-install REDOXER_USE_CLANG=1 PATH="$(ROOT)/$(PREFIX)/clang-install/bin:$$PATH" \
$(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=wasm32-wasip1 COOKBOOK_CROSS_GNU_TARGET=wasm32-wasip1 && \
$(REPO_BIN) cook host:wasi-libc
cp -r "$(WASIP1_LIBC_TARGET)/stage/usr/". "$@.partial"
mkdir -p "$@.partial/share/wasi-sysroot"
ln -s "../../lib" "$@.partial/share/wasi-sysroot/lib"
ln -s "../../include" "$@.partial/share/wasi-sysroot/include"
mv "$@.partial" "$@"
# TODO: Cache from WASIP1_LIBC_TARGET is currently not cleared.
endif
$(PREFIX)/rust-install: | $(PREFIX)/wasip1-libc-install $(PREFIX)/gcc-install $(PREFIX)/libtool-install $(FSTOOLS_TAG) $(CONTAINER_TAG)
ifeq ($(PODMAN_BUILD),1)
$(PODMAN_RUN) make $@
else
@echo "\033[1;36;49mBuilding rust-install\033[0m"
rm -rf "$@.partial" "$@"
export PATH="$(ROOT)/$(PREFIX)/libtool-install/bin:$(ROOT)/$(PREFIX)/gcc-install/bin:$$PATH" \
export PATH="$(ROOT)/$(PREFIX)/libtool-install/bin:$(ROOT)/$(PREFIX)/gcc-install/bin:$$PATH" WASI_SDK_PATH=$(ROOT)/$(PREFIX)/wasip1-libc-install \
$(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) && \
$(REPO_BIN) cook host:llvm21 host:rust
$(REPO_BIN) cook host:rust
cp -r "$(RUST_TARGET)/stage/usr/". "$@.partial"
cp -r "$(LLVM_TARGET)/stage/usr/". "$@.partial"
mv "$@.partial" "$@"
# TODO: Cache from RUST_TARGET is currently not cleared.
# TODO: Cache from RUST_TARGET and LLVM_TARGET is currently not cleared.
# TIP: If you're developing std for rust, remove COOKBOOK_CLEAN_BUILD=true
# at the top of this file so your next rust build reuses the build cache
endif
@ -411,7 +428,7 @@ endif
endif
# BUILD CLANG ---------------------------------------------------
$(PREFIX)/clang-install: | $(PREFIX)/rust-install $(PREFIX)/libtool-install $(FSTOOLS_TAG) $(CONTAINER_TAG)
$(PREFIX)/clang-install: | $(PREFIX)/libtool-install $(FSTOOLS_TAG) $(CONTAINER_TAG)
ifeq ($(PODMAN_BUILD),1)
$(PODMAN_RUN) make $@
else
@ -420,10 +437,7 @@ else
export PATH="$(ROOT)/$(PREFIX)/libtool-install/bin:$$PATH" \
$(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(TARGET) && \
$(REPO_BIN) cook host:llvm21 host:clang21 host:lld21
# llvm libraries is already in rust if building
ifeq ($(PREFIX_USE_UPSTREAM_RUST_COMPILER),1)
cp -r "$(LLVM_TARGET)/stage/usr/". "$@.partial"
endif
cp -r "$(LLVM_TARGET)/stage.runtime/usr/". "$@.partial"
cp -r "$(LLVM_TARGET)/stage.dev/usr/". "$@.partial"
cp -r "$(CLANG_TARGET)/stage/usr/". "$@.partial"
@ -431,7 +445,7 @@ endif
rm -rf "$@.partial/lib/"*.a
mv "$@.partial" "$@"
# no longer needed, delete build files to save disk space
rm -rf $(LLVM_TARGET) $(CLANG_TARGET) $(LLD_TARGET)
rm -rf $(CLANG_TARGET) $(LLD_TARGET)
endif
endif

View File

@ -240,7 +240,11 @@ DESTDIR?=/
# Install all recipes specified by the filesystem config
install:
ifeq ($(PODMAN_BUILD),1)
$(PODMAN_RUN) make $@
else
$(REPO_BIN) push $(COOKBOOK_OPTS) --no-metadata --with-package-deps "--sysroot=$(DESTDIR)"
endif
# Rebuild and install all recipes specified by the filesystem config
rebuild-install: $(FSTOOLS_TAG) FORCE
@ -248,7 +252,11 @@ rebuild-install: $(FSTOOLS_TAG) FORCE
$(MAKE) install
i.%: $(FSTOOLS_TAG) FORCE
ifeq ($(PODMAN_BUILD),1)
$(PODMAN_RUN) make $@
else
$(REPO_BIN) push $* $(COOKBOOK_OPTS) --no-metadata --with-package-deps "--sysroot=$(DESTDIR)"
endif
# Invoke rebuild and install for one of more targets separated by comma
ri.%: $(FSTOOLS_TAG) FORCE

View File

@ -22,7 +22,7 @@ case "${ARCH}" in
esac
if [ "${COOKBOOK_HOST_SYSROOT}" = "/usr" ]; then
LLVM_TARGETS_TO_BUILD="X86;AArch64;RISCV"
LLVM_TARGETS_TO_BUILD="X86;AArch64;RISCV;WebAssembly"
fi
# This just build the LLVM library and tools just enough for Rust, to build the rest of LLVM see

View File

@ -1,28 +0,0 @@
[llvm]
download-ci-llvm = false
static-libstdcpp = false
link-shared = true
[build]
host = ["TARGET"]
target = ["TARGET", "i586-unknown-redox", "x86_64-unknown-redox", "aarch64-unknown-redox", "riscv64gc-unknown-redox"]
cargo-native-static = true
submodules = false
docs = false
tools = ["cargo", "clippy", "rustdoc", "rustfmt", "src"]
extended = true
verbose = 1
[install]
prefix = "install"
sysconfdir = "etc"
[rust]
backtrace = false
codegen-tests = false
[target.aarch64-unknown-linux-gnu]
llvm-config = "COOKBOOK_TOOLCHAIN/bin/llvm-config"
[target.x86_64-unknown-linux-gnu]
llvm-config = "COOKBOOK_TOOLCHAIN/bin/llvm-config"

View File

@ -5,11 +5,11 @@ link-shared = true
[build]
host = ["TARGET"]
target = ["TARGET", "COOKBOOK_TARGET"]
target = ["TARGET", "COOKBOOK_TARGET", "wasm32-wasip1"]
cargo-native-static = true
submodules = false
docs = false
tools = ["cargo", "clippy", "rustdoc", "rustfmt", "src"]
tools = ["cargo", "cargo-miri", "clippy", "miri", "rustdoc", "rustfmt", "src"]
extended = true
verbose = 1

View File

@ -20,8 +20,7 @@ dev-dependencies = [
script = """
if [ "${COOKBOOK_HOST_SYSROOT}" = "/usr" ]; then
OS=$(echo "${TARGET}" | cut -d - -f3)
cat ${COOKBOOK_RECIPE}/config-cross-$OS.toml > config.toml
cat ${COOKBOOK_RECIPE}/config-cross.toml > config.toml
sed -i "s|COOKBOOK_TOOLCHAIN|${COOKBOOK_TOOLCHAIN}|g" config.toml
sed -i "s|COOKBOOK_TARGET|${COOKBOOK_CROSS_TARGET}|g" config.toml
sed -i "s|COOKBOOK_GNU_TARGET|${COOKBOOK_CROSS_GNU_TARGET}|g" config.toml

View File

@ -0,0 +1,10 @@
# NOTE: This is only used to compile into wasi
[source]
git = "https://github.com/WebAssembly/wasi-libc"
shallow_clone = true
[build]
template = "custom"
script = """
cookbook_cmake
"""

View File

@ -212,11 +212,12 @@ COOKBOOK_CONFIGURE_FLAGS=(
--disable-shared
--enable-static
)
COOKBOOK_MAKE_FLAGS=()
COOKBOOK_MAKE="make"
function cookbook_configure {
"${COOKBOOK_CONFIGURE}" "${COOKBOOK_CONFIGURE_FLAGS[@]}" "$@"
"${COOKBOOK_MAKE}" -j "${COOKBOOK_MAKE_JOBS}"
"${COOKBOOK_MAKE}" -j "${COOKBOOK_MAKE_JOBS}" "${COOKBOOK_MAKE_FLAGS[@]}"
"${COOKBOOK_MAKE}" install DESTDIR="${COOKBOOK_STAGE}"
}
@ -242,17 +243,28 @@ function generate_cookbook_cmake_file {
SYSTEM_NAME="UnixPaths"
fi
if [ -z "${REDOXER_USE_CLANG}" ]; then
cat > $file <<EOF
set(CMAKE_AR ${gcc_prefix}ar)
set(CMAKE_CXX_COMPILER ${gcc_prefix}g++)
set(CMAKE_C_COMPILER ${gcc_prefix}gcc)
set(CMAKE_RANLIB ${gcc_prefix}ranlib)
EOF
else
cat > $file <<EOF
set(CMAKE_AR llvm-ar)
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_C_COMPILER clang)
set(CMAKE_RANLIB llvm-ranlib)
EOF
fi
cat >> $file <<EOF
set(CMAKE_FIND_ROOT_PATH ${sysroot})
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_PLATFORM_USES_PATH_WHEN_NO_SONAME 1)
set(CMAKE_PREFIX_PATH, ${sysroot})
set(CMAKE_RANLIB ${gcc_prefix}ranlib)
set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-soname,")
set(CMAKE_SYSTEM_NAME ${SYSTEM_NAME})
set(CMAKE_SYSTEM_PROCESSOR ${arch})