From 3349b5618475e901695b58394c50dfd62ae2702f Mon Sep 17 00:00:00 2001 From: Ojus Chugh Date: Sun, 30 Nov 2025 16:19:32 +0530 Subject: [PATCH 001/407] Added Redox target with package manager support to native_bootstrap.sh Signed-off-by: Ojus Chugh --- native_bootstrap.sh | 83 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/native_bootstrap.sh b/native_bootstrap.sh index 3c89dc87b..fb3f0e5b8 100755 --- a/native_bootstrap.sh +++ b/native_bootstrap.sh @@ -872,6 +872,84 @@ solus() perl-html-parser } +# Function to detect if the OS is Redox +is_os_redox() +{ + [ "$(uname -s)" = "Redox" ] +} + +# Function to detect what packages are installed on Redox OS +# This is a utility function that can be used to check installed packages +# Usage: detect_installed_packages +# Returns: List of installed packages via 'pkg list' +detect_installed_packages() +{ + pkg list +} + +############################################################################### +# This function takes care of installing all dependencies for building Redox on +# Redox OS +# @params: $1 the emulator to install, "virtualbox" or "qemu" +############################################################################### +redox() +{ + echo "Detected Redox OS" + + if [ "$1" == "qemu" ]; then + echo "QEMU is not available on Redox OS yet, but it is mandatory for running the built system." + echo "Please install QEMU manually on a compatible host or use another machine to run the emulator." + elif [ "$1" == "virtualbox" ]; then + echo "VirtualBox is not supported on Redox OS." + exit 1 + else + echo "Unknown emulator: $1" + exit 1 + fi + + echo "Installing missing packages..." + + # Package list + # Note: Some packages may not be available yet on Redox OS + packages="rust \ + cargo \ + gcc \ + gnu-make \ + bison \ + cmake \ + wget \ + file \ + flex \ + gperf \ + expat \ + libgmp \ + libpng \ + libjpeg \ + sdl \ + sdl2-ttf \ + html-parser-perl \ + libtool \ + m4 \ + nasm \ + patch \ + automake \ + autoconf \ + scons \ + pkg-config \ + po4a \ + texinfo \ + ninja-build \ + meson \ + python \ + python3-mako \ + xdg-utils \ + vim \ + perl \ + doxygen" + + sudo pkg install $packages +} + ###################################################################### # This function outlines the different options available for bootstrap ###################################################################### @@ -1097,8 +1175,11 @@ if [ "Darwin" == "$(uname -s)" ]; then else # Here we will use package managers to determine which operating system the user is using. + # Redox OS + if is_os_redox; then + redox "$emulator" # SUSE and derivatives - if hash 2>/dev/null zypper; then + elif hash 2>/dev/null zypper; then suse "$emulator" # Debian or any derivative of it elif hash 2>/dev/null apt-get; then From 74aa25171503bb1a1375c047b4cfb4c9ed3dd1d0 Mon Sep 17 00:00:00 2001 From: Ojus Chugh Date: Sun, 30 Nov 2025 17:54:27 +0530 Subject: [PATCH 002/407] Refine Redox OS support in native_bootstrap.sh - Removed unused detect_installed_packages function - Added git installation check before other packages - Improved package installation with individual checking - Made package list more conservative with core essentials only - Added better error handling that warns instead of failing - Improved comments and messaging for clarity - Added note about experimental nature of building on Redox itself Addresses feedback on issue #1699 Signed-off-by: Ojus Chugh --- native_bootstrap.sh | 95 ++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/native_bootstrap.sh b/native_bootstrap.sh index fb3f0e5b8..561a9b798 100755 --- a/native_bootstrap.sh +++ b/native_bootstrap.sh @@ -872,33 +872,34 @@ solus() perl-html-parser } -# Function to detect if the OS is Redox +############################################################################### +# Helper function to detect if we're running on Redox OS +# This needs to be checked before FreeBSD since both use 'pkg' package manager +############################################################################### is_os_redox() { [ "$(uname -s)" = "Redox" ] } -# Function to detect what packages are installed on Redox OS -# This is a utility function that can be used to check installed packages -# Usage: detect_installed_packages -# Returns: List of installed packages via 'pkg list' -detect_installed_packages() -{ - pkg list -} - ############################################################################### # This function takes care of installing all dependencies for building Redox on -# Redox OS +# Redox OS itself (bootstrapping Redox on Redox) # @params: $1 the emulator to install, "virtualbox" or "qemu" ############################################################################### redox() { echo "Detected Redox OS" + + # Check if git is installed + if [ -z "$(which git)" ]; then + echo "Installing git..." + sudo pkg install git + fi + # Handle emulator selection if [ "$1" == "qemu" ]; then - echo "QEMU is not available on Redox OS yet, but it is mandatory for running the built system." - echo "Please install QEMU manually on a compatible host or use another machine to run the emulator." + echo "Note: QEMU is not yet available as a native package on Redox OS." + echo "Cross-compilation or building on another system is recommended for running the built system." elif [ "$1" == "virtualbox" ]; then echo "VirtualBox is not supported on Redox OS." exit 1 @@ -907,47 +908,45 @@ redox() exit 1 fi - echo "Installing missing packages..." - - # Package list - # Note: Some packages may not be available yet on Redox OS - packages="rust \ - cargo \ - gcc \ - gnu-make \ - bison \ + echo "Installing necessary build tools..." + + # Core development packages that are likely available on Redox + # This list is conservative and only includes essentials + PKGS="gcc \ + make \ cmake \ - wget \ - file \ - flex \ - gperf \ - expat \ - libgmp \ - libpng \ - libjpeg \ - sdl \ - sdl2-ttf \ - html-parser-perl \ - libtool \ - m4 \ nasm \ + pkg-config \ patch \ automake \ autoconf \ - scons \ - pkg-config \ - po4a \ - texinfo \ - ninja-build \ - meson \ - python \ - python3-mako \ - xdg-utils \ - vim \ + bison \ + flex \ + curl \ + wget \ perl \ - doxygen" - - sudo pkg install $packages + python \ + file \ + libtool \ + m4" + + # Try to install packages, but don't fail if some are unavailable + # since Redox package ecosystem is still developing + for pkg in $PKGS; do + if ! pkg list | grep -q "^${pkg}"; then + echo "Attempting to install ${pkg}..." + if ! sudo pkg install ${pkg} 2>/dev/null; then + echo "Warning: ${pkg} could not be installed. It may not be available yet." + fi + else + echo "${pkg} is already installed." + fi + done + + echo "" + echo "Note: Building Redox on Redox itself is experimental." + echo "Some dependencies may not be available yet in the Redox package repository." + echo "For the best build experience, consider using podman_bootstrap.sh on another system." } ###################################################################### From 0be3a313f543f526a79a6a152bae066e9ad6a0e8 Mon Sep 17 00:00:00 2001 From: Ojus Chugh Date: Sun, 30 Nov 2025 18:28:15 +0530 Subject: [PATCH 003/407] Updated the comment message and depencies list Signed-off-by: Ojus Chugh --- native_bootstrap.sh | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/native_bootstrap.sh b/native_bootstrap.sh index 561a9b798..ce1013a12 100755 --- a/native_bootstrap.sh +++ b/native_bootstrap.sh @@ -898,8 +898,9 @@ redox() # Handle emulator selection if [ "$1" == "qemu" ]; then - echo "Note: QEMU is not yet available as a native package on Redox OS." - echo "Cross-compilation or building on another system is recommended for running the built system." + echo "QEMU is not available on Redox OS yet, but it is mandatory for running the built system." + echo "Please install QEMU manually on a compatible host or use another machine to run the emulator." + exit 1 elif [ "$1" == "virtualbox" ]; then echo "VirtualBox is not supported on Redox OS." exit 1 @@ -912,23 +913,23 @@ redox() # Core development packages that are likely available on Redox # This list is conservative and only includes essentials - PKGS="gcc \ - make \ - cmake \ - nasm \ - pkg-config \ - patch \ + packages=""autoconf \ automake \ - autoconf \ - bison \ - flex \ - curl \ - wget \ - perl \ - python \ - file \ - libtool \ - m4" + expat \ + gcc13 \ + gnu-make \ + libgmp \ + libjpeg \ + libpng \ + nasm \ + patch \ + pkg-config \ + rust \ + rustpython \ + sdl1 \ + sdl2-ttf \ + vim" + # Try to install packages, but don't fail if some are unavailable # since Redox package ecosystem is still developing From ac2360f1f7195aed8ef225a4617a6bfc00acd1a2 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 18 Dec 2025 06:12:13 +0700 Subject: [PATCH 004/407] Add one-liner test run to os-test --- mk/config.mk | 1 + mk/podman.mk | 2 +- recipes/core/redoxerd/recipe.toml | 9 --------- recipes/tests/os-test-bins/recipe.toml | 28 ++++++++++++++++++++++++++ src/bin/cookbook_redoxer.rs | 8 ++++++++ 5 files changed, 38 insertions(+), 10 deletions(-) delete mode 100644 recipes/core/redoxerd/recipe.toml create mode 100644 recipes/tests/os-test-bins/recipe.toml diff --git a/mk/config.mk b/mk/config.mk index 274e2ddf6..3c5d82aa7 100644 --- a/mk/config.mk +++ b/mk/config.mk @@ -120,6 +120,7 @@ endif # Automatic variables ROOT=$(CURDIR) export RUST_COMPILER_RT_ROOT=$(ROOT)/rust/src/llvm-project/compiler-rt +export TESTBIN?= RUNNING_IN_PODMAN=$(shell [ -f /run/.containerenv ] && echo 1 || echo 0) ifeq ($(PODMAN_BUILD),1) ifeq ($(RUNNING_IN_PODMAN),1) diff --git a/mk/podman.mk b/mk/podman.mk index 8f5223ee2..e79ba7518 100644 --- a/mk/podman.mk +++ b/mk/podman.mk @@ -21,7 +21,7 @@ PODMAN_VOLUMES?=--volume $(ROOT):$(CONTAINER_WORKDIR)$(PODMAN_VOLUME_FLAG) --vol PODMAN_ENV?=--env PATH=/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env PODMAN_BUILD=0 PODMAN_CONFIG?=--env ARCH=$(ARCH) --env BOARD=$(BOARD) --env CONFIG_NAME=$(CONFIG_NAME) --env FILESYSTEM_CONFIG=$(FILESYSTEM_CONFIG) --env PREFIX_BINARY=$(PREFIX_BINARY) \ --env CI=$(CI) --env COOKBOOK_MAKE_JOBS=$(COOKBOOK_MAKE_JOBS) --env COOKBOOK_LOGS=$(COOKBOOK_LOGS) --env COOKBOOK_VERBOSE=$(COOKBOOK_VERBOSE) \ - --env REPO_APPSTREAM=$(REPO_APPSTREAM) --env REPO_BINARY=$(REPO_BINARY) --env REPO_NONSTOP=$(REPO_NONSTOP) --env REPO_OFFLINE=$(REPO_OFFLINE) + --env REPO_APPSTREAM=$(REPO_APPSTREAM) --env REPO_BINARY=$(REPO_BINARY) --env REPO_NONSTOP=$(REPO_NONSTOP) --env REPO_OFFLINE=$(REPO_OFFLINE) --env TESTBIN=$(TESTBIN) PODMAN_OPTIONS?=--rm --workdir $(CONTAINER_WORKDIR) --interactive --tty --cap-add SYS_ADMIN --device /dev/fuse --network=host --env TERM=$(TERM) PODMAN_RUN?=podman run $(PODMAN_OPTIONS) $(PODMAN_VOLUMES) $(PODMAN_ENV) $(PODMAN_CONFIG) $(IMAGE_TAG) diff --git a/recipes/core/redoxerd/recipe.toml b/recipes/core/redoxerd/recipe.toml deleted file mode 100644 index 8a49ef48b..000000000 --- a/recipes/core/redoxerd/recipe.toml +++ /dev/null @@ -1,9 +0,0 @@ -[source] -git = "https://gitlab.redox-os.org/redox-os/redoxer.git" - -[build] -template = "custom" -script = """ -COOKBOOK_SOURCE="${COOKBOOK_SOURCE}/daemon" -cookbook_cargo -""" diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml new file mode 100644 index 000000000..5346384ed --- /dev/null +++ b/recipes/tests/os-test-bins/recipe.toml @@ -0,0 +1,28 @@ +[source] +same_as = "../os-test" + +[build] +template = "custom" +script = """ +DYNAMIC_INIT +SRC=${COOKBOOK_SOURCE} +DST=${COOKBOOK_STAGE}/root +if [ -z "$TESTBIN" ]; then +pushd ${SRC} +for file in */*/*.c; do + filename="${file%.*}" + mkdir -p $(dirname $DST/$filename) + # adding "true" because compilation can fail + ${CC} ${CFLAGS} ${LDFLAGS} "$SRC/$file" -o "$DST/$filename" -Wall || true + echo "./$filename" >> $DST/run.sh +done +popd +else + mkdir -p $(dirname $DST/$TESTBIN) + ${CC} ${CFLAGS} ${LDFLAGS} "$SRC/$TESTBIN.c" -o "$DST/$TESTBIN" -Wall +fi + +if [ -n "TESTBIN" ]; then +"${COOKBOOK_REDOXER}" write-exec "$DST/$TESTBIN" +fi +""" diff --git a/src/bin/cookbook_redoxer.rs b/src/bin/cookbook_redoxer.rs index 0a9303900..01bfbb159 100644 --- a/src/bin/cookbook_redoxer.rs +++ b/src/bin/cookbook_redoxer.rs @@ -5,6 +5,14 @@ fn main() { // Ensure all flags go to cargo if args.len() >= 2 { args.insert(2, "--".to_string()); + if args[1] == "write-exec" { + if let Ok(stage_dir) = std::env::var("COOKBOOK_STAGE") { + args.insert(2, format!("{}/root", stage_dir)); + args.insert(2, "--folder".to_string()); + args.insert(2, stage_dir); + args.insert(2, "--root".to_string()); + } + } } redoxer::main(&args); } From e8b1c372d60972f3ea3bf10427eac43a21595f92 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 18 Dec 2025 07:33:43 +0700 Subject: [PATCH 005/407] Update lock --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1a5b8c998..009d11f85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -986,7 +986,7 @@ dependencies = [ [[package]] name = "redoxer" version = "0.2.61" -source = "git+https://gitlab.redox-os.org/redox-os/redoxer.git#f2541efeae0396907fb6febc06f95e19479609a7" +source = "git+https://gitlab.redox-os.org/redox-os/redoxer.git#676bda4514e1e74b006816eca7b461a0721feea1" dependencies = [ "anyhow", "dirs", @@ -1321,7 +1321,7 @@ version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 0.1.10", "static_assertions", ] From e802cea77a0141a8f97ea3e3149cc83a196dda73 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 19 Dec 2025 17:03:00 +0700 Subject: [PATCH 006/407] Add TESTBIN to relibc-tests and QEMU exit device --- mk/qemu.mk | 12 ++++++ recipes/tests/os-test-bins/recipe.toml | 2 +- recipes/tests/relibc-tests-bins/recipe.toml | 45 +++++++++++++++++++++ recipes/tests/relibc-tests/recipe.toml | 8 +--- 4 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 recipes/tests/relibc-tests-bins/recipe.toml diff --git a/mk/qemu.mk b/mk/qemu.mk index 6d1ff6226..f61145723 100644 --- a/mk/qemu.mk +++ b/mk/qemu.mk @@ -3,6 +3,7 @@ QEMU=SDL_VIDEO_X11_DGAMOUSE=0 qemu-system-$(QEMU_ARCH) QEMUFLAGS=-d guest_errors -name "Redox OS $(ARCH)" netboot?=no +redoxer?=no VGA_SUPPORTED=no ifeq ($(ARCH),i586) @@ -162,6 +163,17 @@ else QEMUFLAGS+=-serial chardev:debug -mon chardev=debug endif +# redoxer exit code: 51 => success, 53 => failure +ifeq ($(redoxer),yes) +ifeq ($(ARCH),x86_64) + QEMUFLAGS+=-device isa-debug-exit +else ifeq ($(ARCH),i586) + QEMUFLAGS+=-device isa-debug-exit +else ifeq ($(ARCH),aarch64) + QEMUFLAGS+=-semihosting-config enable=on,target=native,userspace=on +endif +endif + ifeq ($(iommu),yes) QEMUFLAGS+=-machine $(QEMU_MACHINE),iommu=on else diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml index 5346384ed..96edb9d30 100644 --- a/recipes/tests/os-test-bins/recipe.toml +++ b/recipes/tests/os-test-bins/recipe.toml @@ -6,7 +6,7 @@ template = "custom" script = """ DYNAMIC_INIT SRC=${COOKBOOK_SOURCE} -DST=${COOKBOOK_STAGE}/root +DST=${COOKBOOK_STAGE}/root/os-test if [ -z "$TESTBIN" ]; then pushd ${SRC} for file in */*/*.c; do diff --git a/recipes/tests/relibc-tests-bins/recipe.toml b/recipes/tests/relibc-tests-bins/recipe.toml new file mode 100644 index 000000000..80dfd9f6a --- /dev/null +++ b/recipes/tests/relibc-tests-bins/recipe.toml @@ -0,0 +1,45 @@ +[source] +same_as = "../../core/relibc" + +[build] +template = "custom" +script = """ +PACKAGE_PATH="tests" cookbook_cargo + +DYNAMIC_INIT +SRC=${COOKBOOK_SOURCE}/tests +EXPECTSRC=${SRC}/expected/bins_dynamic +DST=${COOKBOOK_STAGE}/root/relibc-tests +CFLAGS+=" -I${SRC}" +LDFLAGS+=" -Wl,-rpath=\\$ORIGIN" +pushd ${SRC} +if [ -z "$TESTBIN" ]; then +for file in **/*.c; do + filename="${file%.*}" + mkdir -p $(dirname $DST/$filename) + # adding "true" because compilation can fail + ${CC} ${CFLAGS} ${LDFLAGS} "$SRC/$file" -o "$DST/$filename" -Wall || true + if [[ -f "${EXPECTSRC}/$filename.stdout" ]]; then + echo "relibc-tests ./$filename" >> $DST/run.sh + else + echo "relibc-tests -s./$filename" >> $DST/run.sh + fi +done +rsync -a ${EXPECTSRC} ${DST}/expected +popd +else + mkdir -p $(dirname $DST/$TESTBIN) $(dirname $DST/expected/$TESTBIN) + ${CC} ${CFLAGS} ${LDFLAGS} "$SRC/$TESTBIN.c" -o "$DST/$TESTBIN" -Wall + if [[ -f "${EXPECTSRC}/$TESTBIN.stdout" ]]; then + cp ${EXPECTSRC}/$TESTBIN.{stdout,stderr} $(dirname $DST/expected/$TESTBIN) + fi +fi + +if [ -n "TESTBIN" ]; then +if [[ -f "${EXPECTSRC}/$TESTBIN.stdout" ]]; then +"${COOKBOOK_REDOXER}" write-exec sh -c "cd /root/relibc-tests; relibc-tests ./$TESTBIN" +else +"${COOKBOOK_REDOXER}" write-exec sh -c "cd /root/relibc-tests; relibc-tests -s./$TESTBIN" +fi +fi +""" diff --git a/recipes/tests/relibc-tests/recipe.toml b/recipes/tests/relibc-tests/recipe.toml index fa0acf928..c854833dd 100644 --- a/recipes/tests/relibc-tests/recipe.toml +++ b/recipes/tests/relibc-tests/recipe.toml @@ -4,12 +4,6 @@ same_as = "../../core/relibc" [build] template = "custom" script = """ -rsync -av --delete "${COOKBOOK_SOURCE}/" ./ -pushd tests -export CARGO_TEST="${COOKBOOK_CARGO}" -export NATIVE_RELIBC=1 # to link against prefix -"${COOKBOOK_MAKE}" -j "${COOKBOOK_MAKE_JOBS}" all bins_verify/relibc-tests -popd mkdir -pv "${COOKBOOK_STAGE}/share/relibc" -cp -rv "tests" "${COOKBOOK_STAGE}/share/relibc/tests" +cp -rv "${COOKBOOK_SOURCE}/tests" "${COOKBOOK_STAGE}/share/relibc-tests" """ From 29bf516500b64c5d503443d6b03d993fb996a16b Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 19 Dec 2025 22:28:35 +0700 Subject: [PATCH 007/407] Add recipe for os-test-relibc repo --- recipes/tests/os-test-result/recipe.toml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 recipes/tests/os-test-result/recipe.toml diff --git a/recipes/tests/os-test-result/recipe.toml b/recipes/tests/os-test-result/recipe.toml new file mode 100644 index 000000000..66f22c935 --- /dev/null +++ b/recipes/tests/os-test-result/recipe.toml @@ -0,0 +1,18 @@ +# Must be run on host: "make r.host:os-test-result" +[source] +git = "https://gitlab.redox-os.org/redox-os/os-test-relibc" +script = """ +# update automatically +cd relibc && git pull origin master +""" + +[build] +template = "custom" +script = """ +rsync -a --delete "${COOKBOOK_SOURCE}/" ./ +mkdir -p {COOKBOOK_STAGE}/share/os-test +./linux.sh +mv os-test/html ${COOKBOOK_STAGE}/share/os-test/html +mv os-test/out ${COOKBOOK_STAGE}/share/os-test/out +mv os-test/os-test.json ${COOKBOOK_STAGE}/share/os-test/os-test.json +""" From fcb4bb090085cf3095d81d7917d7dd5369b54637 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 20 Dec 2025 13:52:43 +0700 Subject: [PATCH 008/407] Support running cross compiled os-test --- podman/redox-base-containerfile | 4 ++ recipes/dev/redoxer/recipe.toml | 6 +++ recipes/tests/os-test-result/recipe.toml | 56 +++++++++++++++++++----- 3 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 recipes/dev/redoxer/recipe.toml diff --git a/podman/redox-base-containerfile b/podman/redox-base-containerfile index 525d64e17..837dd30f0 100644 --- a/podman/redox-base-containerfile +++ b/podman/redox-base-containerfile @@ -31,6 +31,7 @@ RUN apt-get update \ gtk-doc-tools \ gtk-update-icon-cache \ help2man \ + ipxe-qemu \ intltool \ itstool \ libaudiofile-dev \ @@ -63,6 +64,9 @@ RUN apt-get update \ pkg-config \ po4a \ protobuf-compiler \ + qemu-system-x86 \ + qemu-system-arm \ + qemu-efi-aarch64 \ python3 \ python3-dev \ python3-mako \ diff --git a/recipes/dev/redoxer/recipe.toml b/recipes/dev/redoxer/recipe.toml new file mode 100644 index 000000000..5579c0566 --- /dev/null +++ b/recipes/dev/redoxer/recipe.toml @@ -0,0 +1,6 @@ +[source] +git = "https://gitlab.redox-os.org/willnode/redoxer" +branch = "artifact-opt" + +[build] +template = "cargo" diff --git a/recipes/tests/os-test-result/recipe.toml b/recipes/tests/os-test-result/recipe.toml index 66f22c935..71d2663a1 100644 --- a/recipes/tests/os-test-result/recipe.toml +++ b/recipes/tests/os-test-result/recipe.toml @@ -1,18 +1,50 @@ -# Must be run on host: "make r.host:os-test-result" [source] -git = "https://gitlab.redox-os.org/redox-os/os-test-relibc" -script = """ -# update automatically -cd relibc && git pull origin master -""" +same_as = "../os-test" [build] template = "custom" +dev-dependencies = [ + "host:redoxer", + "gnu-grep", + "gnu-make", + "libarchive", + "sed", +] script = """ -rsync -a --delete "${COOKBOOK_SOURCE}/" ./ -mkdir -p {COOKBOOK_STAGE}/share/os-test -./linux.sh -mv os-test/html ${COOKBOOK_STAGE}/share/os-test/html -mv os-test/out ${COOKBOOK_STAGE}/share/os-test/out -mv os-test/os-test.json ${COOKBOOK_STAGE}/share/os-test/os-test.json +rsync -a "${COOKBOOK_SOURCE}/" ./ +case "$(echo "${TARGET}" | cut -d - -f3)" in + linux) OS=Linux;; + redox) OS=Redox;; +esac + +make OS=${OS} CC="${CC}" CFLAGS= CPPFLAGS= \ + LDFLAGS= EXTRA_LDFLAGS= \ + CC_FOR_BUILD="${CC_WRAPPER} cc" CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \ + LDFLAGS_FOR_BUILD= all + +skips=( + # Skip fputc_unlocked, hanging on Linux with relibc + basic/stdio/putc_unlocked +) +for skip in "${skips[@]}" +do + mkdir -p out.known/{linux,redox}/"$(dirname "${skip}")" + echo "skipped" > out.known/linux/"${skip}.out" + echo "skipped" > out.known/redox/"${skip}.out" +done +cp -t out -R out.known/linux +cp -t out -R out.known/redox + +if [ "$TARGET" = "$COOKBOOK_HOST_TARGET" ]; then + make test +else + redoxer exec --folder . --folder ${COOKBOOK_SYSROOT}/usr/:/usr --artifact . make test +fi + +make html json jsonl + +mkdir -p ${COOKBOOK_STAGE}/share/os-test +mv html ${COOKBOOK_STAGE}/share/os-test/html +mv out ${COOKBOOK_STAGE}/share/os-test/out +mv os-test.json ${COOKBOOK_STAGE}/share/os-test/os-test.json """ From 865230fde4e67a21d692a77eae836230801a79bd Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 21 Dec 2025 13:50:13 +0700 Subject: [PATCH 009/407] Adapt os-test-result and move packages to redoxer bin --- config/redoxer.toml | 2 + recipes/dev/redoxer/recipe.toml | 4 +- recipes/tests/os-test-result/recipe.toml | 75 +++++++++++++++++++----- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/config/redoxer.toml b/config/redoxer.toml index 8c50e37d5..ad112df79 100644 --- a/config/redoxer.toml +++ b/config/redoxer.toml @@ -9,10 +9,12 @@ ca-certificates = {} coreutils = {} extrautils = {} findutils = {} +gnu-make = {} ion = {} netdb = {} pkgutils = {} relibc = {} +sed = {} # Override to not background dhcpd [[files]] diff --git a/recipes/dev/redoxer/recipe.toml b/recipes/dev/redoxer/recipe.toml index 5579c0566..5f5c20485 100644 --- a/recipes/dev/redoxer/recipe.toml +++ b/recipes/dev/redoxer/recipe.toml @@ -1,6 +1,6 @@ [source] -git = "https://gitlab.redox-os.org/willnode/redoxer" -branch = "artifact-opt" +git = "https://gitlab.redox-os.org/redox-os/redoxer" +branch = "master" [build] template = "cargo" diff --git a/recipes/tests/os-test-result/recipe.toml b/recipes/tests/os-test-result/recipe.toml index 71d2663a1..c346d2c54 100644 --- a/recipes/tests/os-test-result/recipe.toml +++ b/recipes/tests/os-test-result/recipe.toml @@ -5,46 +5,93 @@ same_as = "../os-test" template = "custom" dev-dependencies = [ "host:redoxer", +# allows rebuilding relibc without updating prefix + "relibc", "gnu-grep", - "gnu-make", "libarchive", - "sed", ] script = """ rsync -a "${COOKBOOK_SOURCE}/" ./ -case "$(echo "${TARGET}" | cut -d - -f3)" in +os=$(echo "${TARGET}" | cut -d - -f3) +case "$os" in linux) OS=Linux;; redox) OS=Redox;; esac -make OS=${OS} CC="${CC}" CFLAGS= CPPFLAGS= \ +# allows linking to relibc instead of prefix/host libc +export CC="env LIBRARY_PATH=${COOKBOOK_SYSROOT}/lib ${GNU_TARGET}-gcc" +export CFLAGS="\ +-nostdinc \ +-nostdlib \ +-isystem ${COOKBOOK_SYSROOT}/include \ +-static \ +--sysroot ${COOKBOOK_SYSROOT} \ +${COOKBOOK_SYSROOT}/lib/crt0.o \ +${COOKBOOK_SYSROOT}/lib/crti.o \ +${COOKBOOK_SYSROOT}/lib/crtn.o \ +${COOKBOOK_SYSROOT}/lib/libc.a \ +" + +# allow retest without restesting successful ones +mkdir -p out +for file in $(grep -rL "good" out); do + if [ -f "$file" ]; then + rm "$file" + fi +done + +make OS=${OS} CC="${CC}" CFLAGS="${CFLAGS}" CPPFLAGS= \ LDFLAGS= EXTRA_LDFLAGS= \ CC_FOR_BUILD="${CC_WRAPPER} cc" CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \ - LDFLAGS_FOR_BUILD= all + LDFLAGS_FOR_BUILD= -j ${COOKBOOK_MAKE_JOBS} all skips=( - # Skip fputc_unlocked, hanging on Linux with relibc + # Skip hanging tests on Linux/Redox with relibc basic/stdio/putc_unlocked ) + +if [ "$OS" = "Redox" ]; then +skips+=( + # Skip hanging tests on Redox with relibc + # https://gitlab.redox-os.org/redox-os/redox/-/issues/1752 + basic/sys_socket/accept + basic/sys_socket/recv + basic/sys_socket/send + basic/sys_socket/shutdown + signal/ppoll-block-close + signal/ppoll-block-close-raise + signal/ppoll-block-raise + signal/ppoll-block-sleep-raise-write + signal/ppoll-block-sleep-raise + signal/ppoll-block-sleep-write-raise +) +fi + for skip in "${skips[@]}" do - mkdir -p out.known/{linux,redox}/"$(dirname "${skip}")" - echo "skipped" > out.known/linux/"${skip}.out" - echo "skipped" > out.known/redox/"${skip}.out" + mkdir -p out.known/${os}/"$(dirname "${skip}")" + echo "skipped" > out.known/${os}/"${skip}.out" done -cp -t out -R out.known/linux -cp -t out -R out.known/redox + +cp -t out -R out.known/${os} if [ "$TARGET" = "$COOKBOOK_HOST_TARGET" ]; then make test else - redoxer exec --folder . --folder ${COOKBOOK_SYSROOT}/usr/:/usr --artifact . make test + # bash: gnu-make crashes randomly but can continue + redoxer exec --folder . --folder "${COOKBOOK_SYSROOT}/usr/:/usr" --artifact out:/root/out \ + bash -c "until make -j 4 test; do echo retrying; done" + # html won't generated without this, not sure why + sleep 2 fi -make html json jsonl +make OS=${OS} CC_FOR_BUILD="${CC_WRAPPER} cc" \ + CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \ + LDFLAGS_FOR_BUILD= html json jsonl mkdir -p ${COOKBOOK_STAGE}/share/os-test -mv html ${COOKBOOK_STAGE}/share/os-test/html mv out ${COOKBOOK_STAGE}/share/os-test/out +mv html ${COOKBOOK_STAGE}/share/os-test/html mv os-test.json ${COOKBOOK_STAGE}/share/os-test/os-test.json +mv os-test.jsonl ${COOKBOOK_STAGE}/share/os-test/os-test.jsonl """ From a81cff209f51798d74dc71d284c429988d7e8c65 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 21 Dec 2025 13:54:02 +0700 Subject: [PATCH 010/407] Add a way to update prefix and statically linked recipes --- mk/prefix.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mk/prefix.mk b/mk/prefix.mk index 47fdd6bcd..1975aacb8 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -29,6 +29,11 @@ endif # so would break non-podman builds (not sure if they are still supported though). prefix: $(PREFIX)/sysroot +# Update relibc used for compiling and clean all statically linked recipes +prefix_clean: | $(FSTOOLS_TAG) + rm -rf $(PREFIX)/relibc $(PREFIX)/sysroot + $(MAKE) c.base,base-initfs,extrautils,kernel,ion,pkgutils,redoxfs,relibc + PREFIX_STRIP=\ mkdir -p bin libexec "$(GCC_TARGET)/bin" && \ find bin libexec "$(GCC_TARGET)/bin" "$(GCC_TARGET)/lib" \ From d16eea6f4d3304ad2de5134289eea9f7bbc2dbbf Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 21 Dec 2025 14:00:13 +0700 Subject: [PATCH 011/407] Fix error on fetch logic --- src/cook/fetch.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/cook/fetch.rs b/src/cook/fetch.rs index 5c31a6a87..b5ab0cb8e 100644 --- a/src/cook/fetch.rs +++ b/src/cook/fetch.rs @@ -229,9 +229,13 @@ pub fn fetch(recipe: &CookRecipe, logger: &PtyOut) -> Result { get_git_remote_tracking(&source_dir)?; // TODO: how to get default branch and compare it here? if remote_name == "origin" && &remote_url == chop_dot_git(git) { - let fetch_rev = - get_git_fetch_rev(&source_dir, &remote_url, &remote_branch)?; - fetch_rev == head_rev + match get_git_fetch_rev(&source_dir, &remote_url, &remote_branch) { + Ok(fetch_rev) => fetch_rev == head_rev, + Err(e) => { + log_to_pty!(logger, "{}", e); + false + } + } } else { false } From dbfdb8e1d4890766e5c71894df74b19ea46faf2c Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 21 Dec 2025 19:30:07 +0700 Subject: [PATCH 012/407] Add gnu-make to CI --- config/aarch64/ci.toml | 1 + config/i586/ci.toml | 1 + config/riscv64gc/ci.toml | 1 + 3 files changed, 3 insertions(+) diff --git a/config/aarch64/ci.toml b/config/aarch64/ci.toml index bbe0b3376..76fb84db1 100644 --- a/config/aarch64/ci.toml +++ b/config/aarch64/ci.toml @@ -34,6 +34,7 @@ gettext = {} git = {} # gdbserver = {} # wrong libc type # gnu-binutils = {} # bfd doesn't recognize redox +gnu-make = {} hicolor-icon-theme = {} installer = {} installer-gui = {} diff --git a/config/i586/ci.toml b/config/i586/ci.toml index 1df1e25d3..8c6105c92 100644 --- a/config/i586/ci.toml +++ b/config/i586/ci.toml @@ -32,6 +32,7 @@ freefont = {} freetype2 = {} gettext = {} git = {} +gnu-make = {} hicolor-icon-theme = {} installer = {} installer-gui = {} diff --git a/config/riscv64gc/ci.toml b/config/riscv64gc/ci.toml index 694fbafa4..6da302cbf 100644 --- a/config/riscv64gc/ci.toml +++ b/config/riscv64gc/ci.toml @@ -32,6 +32,7 @@ freefont = {} freetype2 = {} gettext = {} git = {} +gnu-make = {} hicolor-icon-theme = {} installer = {} #installer-gui = {} # redox_syscall 0.4 not working on riscv64gc? From 293fa923ca6d88c0ae744b51f6045f134fec7779 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 21 Dec 2025 19:31:32 +0700 Subject: [PATCH 013/407] Polish os-test-result script --- recipes/dev/gnu-make/recipe.toml | 7 +--- recipes/tests/os-test-result/recipe.toml | 50 +++++++++++++----------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/recipes/dev/gnu-make/recipe.toml b/recipes/dev/gnu-make/recipe.toml index 7199d8059..91e95a5d3 100644 --- a/recipes/dev/gnu-make/recipe.toml +++ b/recipes/dev/gnu-make/recipe.toml @@ -10,9 +10,4 @@ autotools_recursive_regenerate """ [build] -template = "custom" -script = """ -DYNAMIC_INIT -rsync -av --delete "$COOKBOOK_SOURCE/." ./ -cookbook_configure -""" +template = "configure" diff --git a/recipes/tests/os-test-result/recipe.toml b/recipes/tests/os-test-result/recipe.toml index c346d2c54..f0fded6b0 100644 --- a/recipes/tests/os-test-result/recipe.toml +++ b/recipes/tests/os-test-result/recipe.toml @@ -11,6 +11,11 @@ dev-dependencies = [ "libarchive", ] script = """ +if [ "$TARGET" = "$COOKBOOK_HOST_TARGET" ]; then +# TODO: libc conflict on toolchain +export LD_LIBRARY_PATH="/lib/${GNU_TARGET}:${LD_LIBRARY_PATH}" +fi + rsync -a "${COOKBOOK_SOURCE}/" ./ os=$(echo "${TARGET}" | cut -d - -f3) case "$os" in @@ -32,14 +37,6 @@ ${COOKBOOK_SYSROOT}/lib/crtn.o \ ${COOKBOOK_SYSROOT}/lib/libc.a \ " -# allow retest without restesting successful ones -mkdir -p out -for file in $(grep -rL "good" out); do - if [ -f "$file" ]; then - rm "$file" - fi -done - make OS=${OS} CC="${CC}" CFLAGS="${CFLAGS}" CPPFLAGS= \ LDFLAGS= EXTRA_LDFLAGS= \ CC_FOR_BUILD="${CC_WRAPPER} cc" CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \ @@ -75,23 +72,30 @@ done cp -t out -R out.known/${os} -if [ "$TARGET" = "$COOKBOOK_HOST_TARGET" ]; then - make test -else - # bash: gnu-make crashes randomly but can continue - redoxer exec --folder . --folder "${COOKBOOK_SYSROOT}/usr/:/usr" --artifact out:/root/out \ - bash -c "until make -j 4 test; do echo retrying; done" - # html won't generated without this, not sure why - sleep 2 -fi - +postinstall () { make OS=${OS} CC_FOR_BUILD="${CC_WRAPPER} cc" \ CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \ LDFLAGS_FOR_BUILD= html json jsonl -mkdir -p ${COOKBOOK_STAGE}/share/os-test -mv out ${COOKBOOK_STAGE}/share/os-test/out -mv html ${COOKBOOK_STAGE}/share/os-test/html -mv os-test.json ${COOKBOOK_STAGE}/share/os-test/os-test.json -mv os-test.jsonl ${COOKBOOK_STAGE}/share/os-test/os-test.jsonl + mkdir -p ${COOKBOOK_STAGE}/share/os-test + cp -a out ${COOKBOOK_STAGE}/share/os-test/out + cp -a html ${COOKBOOK_STAGE}/share/os-test/html + cp -a os-test.json ${COOKBOOK_STAGE}/share/os-test/os-test.json + cp -a os-test.jsonl ${COOKBOOK_STAGE}/share/os-test/os-test.jsonl +} + +if [ "$TARGET" = "$COOKBOOK_HOST_TARGET" ]; then + make test + postinstall +else + # bash: gnu-make crashes randomly but can continue + # issues with multi-core and make jobs + # https://gitlab.redox-os.org/redox-os/relibc/-/issues/240 + # https://gitlab.redox-os.org/redox-os/redox/-/issues/1753 + export REDOXER_QEMU_ARGS="-smp 1" + # make: jobs doesn't work yet + echo redoxer exec --folder . --folder "${COOKBOOK_SYSROOT}/usr/:/usr" --artifact out:/root/out \ + bash -c "until make test; do echo retrying; done" + postinstall +fi """ From 4c4de9334371e5dbaa77bf96891093fd7b99b57b Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 22 Dec 2025 03:51:42 +0700 Subject: [PATCH 014/407] Remove repo tag on prefix_clean --- mk/prefix.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index 1975aacb8..5daca90d3 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -31,7 +31,7 @@ prefix: $(PREFIX)/sysroot # Update relibc used for compiling and clean all statically linked recipes prefix_clean: | $(FSTOOLS_TAG) - rm -rf $(PREFIX)/relibc $(PREFIX)/sysroot + rm -rf $(PREFIX)/relibc $(PREFIX)/sysroot $(REPO_TAG) $(MAKE) c.base,base-initfs,extrautils,kernel,ion,pkgutils,redoxfs,relibc PREFIX_STRIP=\ From ea39345d355eeea64a306ceed4d52b5e205af9c3 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 22 Dec 2025 05:21:18 +0700 Subject: [PATCH 015/407] Remove ant from podman --- podman/redox-base-containerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/podman/redox-base-containerfile b/podman/redox-base-containerfile index 837dd30f0..08ef01f92 100644 --- a/podman/redox-base-containerfile +++ b/podman/redox-base-containerfile @@ -4,7 +4,6 @@ FROM docker.io/library/debian:trixie RUN apt-get update \ && apt-get install -y --no-install-recommends \ - ant \ appstream \ appstream-compose \ autoconf \ From 59ce6699bc5ccd0297256450b95a2244d810e1bd Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 22 Dec 2025 09:18:33 +0700 Subject: [PATCH 016/407] Update zig to compile stage3 --- recipes/wip/dev/lang/zig/recipe.toml | 58 ++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/recipes/wip/dev/lang/zig/recipe.toml b/recipes/wip/dev/lang/zig/recipe.toml index 5c9d26f7e..d247daabf 100644 --- a/recipes/wip/dev/lang/zig/recipe.toml +++ b/recipes/wip/dev/lang/zig/recipe.toml @@ -1,22 +1,58 @@ #TODO compiling, not tested further [source] git = "https://github.com/willnode/zig" -branch = "zig-0.15-redox" +branch = "zig-0.15.2-redox" [build] template = "custom" +dependencies = [ + "llvm21", + "zstd" +] + +dev-dependencies = [ + "llvm21.dev", + "llvm21.runtime", + "llvm21.clang", + "llvm21.clang-dev", + "llvm21.lld-dev", + "llvm21.lld", + "host:libarchive", + "host:zig", +] + script = """ DYNAMIC_INIT -rsync -av --delete "${COOKBOOK_SOURCE}"/* ./ +rsync -a "${COOKBOOK_SOURCE}"/* ./ +export PATH="${COOKBOOK_BUILD}:${PATH}" -export ZIG_HOST_TARGET_CFLAGS="$CFLAGS" -export ZIG_HOST_TARGET_LDFLAGS="$LDFLAGS" -export ZIG_HOST_TARGET_CC="${TARGET}-gcc" -export ZIG_HOST_TARGET_TRIPLE="${TARGET%%-*}-redox" -unset AR AS CC CXX LD LDFLAGS NM OBJCOPY OBJDUMP RANLIB READELF RUSTFLAGS STRIP -cc bootstrap.c -o ./bootstrap -./bootstrap +mkdir -p "${COOKBOOK_STAGE}"/usr/lib/zig "${COOKBOOK_STAGE}"/usr/bin +ln -s "../lib/zig/bin/zig" "${COOKBOOK_STAGE}"/usr/bin/zig -mkdir -p "${COOKBOOK_STAGE}"/usr/bin -cp ./zig2 "${COOKBOOK_STAGE}"/usr/bin/zig +if [ "$TARGET" != "$COOKBOOK_HOST_TARGET" ]; then + +ARCH="${GNU_TARGET%%-*}" +OS=$(echo "${TARGET}" | cut -d - -f3-4) + +zig build \ + --prefix "${COOKBOOK_STAGE}/usr/lib/zig" \ + --search-prefix "${COOKBOOK_SYSROOT}/usr" \ + -Dflat \ + -Dstatic-llvm \ + -Doptimize=ReleaseFast \ + -Dstrip \ + -Dforce-link-libc \ + -Dtarget="$ARCH-$OS" \ + -Dcpu="baseline" \ + -Dversion-string="0.15.2" \ + -Duse-zig-libcxx \ + -Dno-langref + +else + +COOKBOOK_SOURCE="${COOKBOOK_BUILD}" +COOKBOOK_STAGE="${COOKBOOK_STAGE}/usr/lib/zig" +cookbook_cmake -DCMAKE_INSTALL_PREFIX=/ + +fi """ From 87d71b053d13a4fc90f16895cc86d8ed661398dc Mon Sep 17 00:00:00 2001 From: David Campbell Date: Mon, 22 Dec 2025 18:03:07 -0500 Subject: [PATCH 017/407] Depend on dejavu, install some more binaries. --- .../games/strategy/hnefatafl-copenhagen/recipe.toml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml b/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml index 50b08f452..e5c994678 100644 --- a/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml +++ b/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml @@ -2,8 +2,7 @@ # 1. The CJK and runes fonts don't load. # 2. On a button press two characters are read in instead of one. # 3. Backspace does not work. -# 4. The command line prompt prints 'deprecated: legacy path "time:4" used by /usr/games/hnefatafl-client'. -# 5. TcpStream.shutdown(): shutdown call failed: Os { code: 38, kind: Unsupported, message: "Function not implemented" } +# 4. TcpStream.shutdown() is not implemented. [source] git = "https://github.com/dcampbell24/hnefatafl" @@ -13,15 +12,16 @@ template = "custom" script = """ "${COOKBOOK_CARGO}" build \ --manifest-path "${COOKBOOK_SOURCE}/${PACKAGE_PATH}/Cargo.toml" \ - --bin hnefatafl-client \ --features client \ --release \ --no-default-features mkdir -pv "${COOKBOOK_STAGE}/usr/bin" -cp -v \ - "target/${TARGET}/release/hnefatafl-client" \ - "${COOKBOOK_STAGE}/usr/bin/hnefatafl-client" + +cp -v "target/${TARGET}/release/hnefatafl-ai" "${COOKBOOK_STAGE}/usr/bin/hnefatafl-ai" +cp -v "target/${TARGET}/release/hnefatafl-client" "${COOKBOOK_STAGE}/usr/bin/hnefatafl-client" +cp -v "target/${TARGET}/release/hnefatafl-server" "${COOKBOOK_STAGE}/usr/bin/hnefatafl-server" +cp -v "target/${TARGET}/release/hnefatafl-text-protocol" "${COOKBOOK_STAGE}/usr/bin/hnefatafl-text-protocol" mkdir -pv "${COOKBOOK_STAGE}"/usr/games mkdir -pv "${COOKBOOK_STAGE}"/ui/apps @@ -33,5 +33,6 @@ mv "${COOKBOOK_STAGE}"/usr/bin/hnefatafl-client "${COOKBOOK_STAGE}"/usr/games/hn [package] dependencies = [ + "dejavu", "noto-color-emoji", ] From 1f71aa8b121d681204a8d66766b3ac75337f0c79 Mon Sep 17 00:00:00 2001 From: David Campbell Date: Mon, 22 Dec 2025 18:17:10 -0500 Subject: [PATCH 018/407] hnefatafl: add freefont dependency. --- recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml b/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml index e5c994678..1e629209b 100644 --- a/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml +++ b/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml @@ -34,5 +34,6 @@ mv "${COOKBOOK_STAGE}"/usr/bin/hnefatafl-client "${COOKBOOK_STAGE}"/usr/games/hn [package] dependencies = [ "dejavu", + "freefont", "noto-color-emoji", ] From adcf31d0e86aefb9d972c6f22899a237a1a76361 Mon Sep 17 00:00:00 2001 From: Wildan Mubarok Date: Wed, 24 Dec 2025 19:40:28 +0000 Subject: [PATCH 019/407] Add config to install upstream rustc --- mk/config.mk | 3 +++ mk/prefix.mk | 62 ++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/mk/config.mk b/mk/config.mk index 3c5d82aa7..4a650dcd5 100644 --- a/mk/config.mk +++ b/mk/config.mk @@ -11,6 +11,9 @@ ARCH?=$(HOST_ARCH) BOARD?= ## Enable to use binary prefix (much faster) PREFIX_BINARY?=1 +## Enable to use up-to-date rust compiler (experimental, only available to Tier 2 targets) +## Even more experimental, add -Zbuild-std to cookbook.toml to allow compilation to Tier 3 targets +PREFIX_USE_UPSTREAM_RUST_COMPILER?=0 ## Enable to use binary packages (much faster) REPO_BINARY?=0 ## Name of the configuration to include in the image name e.g. desktop or server diff --git a/mk/prefix.mk b/mk/prefix.mk index 5daca90d3..95b575242 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -9,6 +9,7 @@ RELIBC_SOURCE=recipes/core/relibc/source BINUTILS_BRANCH=redox-2.43.1 GCC_BRANCH=redox-13.2.0 LIBTOOL_VERSION=2.5.4 +UPSTREAM_RUSTC_VERSION="2025-10-03" export PREFIX_RUSTFLAGS=-L $(ROOT)/$(PREFIX_INSTALL)/$(TARGET)/lib export RUSTUP_TOOLCHAIN=$(ROOT)/$(PREFIX_INSTALL) @@ -141,6 +142,7 @@ else touch "$@" endif +# PREFIX_BINARY --------------------------------------------------- ifeq ($(PREFIX_BINARY),1) $(PREFIX)/rust-install.tar.gz: | $(CONTAINER_TAG) @@ -166,10 +168,7 @@ endif else -$(ROOT)/rust/configure: - git submodule sync --recursive - git submodule update --progress --init --recursive --checkout rust - +# BUILD GCC --------------------------------------------------- PREFIX_FREESTANDING_INSTALL=$(PREFIX)/gcc-freestanding-install PREFIX_FREESTANDING_PATH=$(ROOT)/$(PREFIX_FREESTANDING_INSTALL)/bin @@ -326,6 +325,59 @@ $(PREFIX)/gcc-install.tar.gz: $(PREFIX)/gcc-install --directory="$<" \ . +# RUST FROM UPSTREAM COMPILER --------------------------------------------------- +ifeq ($(PREFIX_USE_UPSTREAM_RUST_COMPILER),1) + +$(PREFIX)/rustc-install.tar.xz: + mkdir -p "$(@D)" + wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rustc-nightly-$(HOST_TARGET).tar.xz" + mv $@.partial $@ + +$(PREFIX)/cargo-install.tar.xz: + mkdir -p "$(@D)" + wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/cargo-nightly-$(HOST_TARGET).tar.xz" + mv $@.partial $@ + +$(PREFIX)/rust-std-host-install.tar.xz: + mkdir -p "$(@D)" + wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-std-nightly-$(HOST_TARGET).tar.xz" + mv $@.partial $@ + +$(PREFIX)/rust-std-target-install.tar.xz: + mkdir -p "$(@D)" +ifeq ($(TARGET),x86_64-unknown-redox) + wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-std-nightly-$(TARGET).tar.xz" + mv $@.partial $@ +else + touch $@ +endif + +$(PREFIX)/rust-src-install.tar.xz: + mkdir -p "$(@D)" + wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-src-nightly.tar.xz" + mv $@.partial $@ + +$(PREFIX)/rust-install: $(PREFIX)/gcc-install $(PREFIX)/rustc-install.tar.xz $(PREFIX)/cargo-install.tar.xz $(PREFIX)/rust-std-host-install.tar.xz $(PREFIX)/rust-std-target-install.tar.xz $(PREFIX)/rust-src-install.tar.xz + rm -rf "$@.partial" "$@" + mkdir -p "$@.partial" + cp -r "$(PREFIX)/gcc-install/". "$@.partial" + tar --extract --file "$(PREFIX)/rustc-install.tar.xz" -C "$@.partial" rustc-nightly-$(HOST_TARGET)/rustc/ --strip-components=2 + tar --extract --file "$(PREFIX)/cargo-install.tar.xz" --directory "$@.partial" cargo-nightly-$(HOST_TARGET)/cargo/ --strip-components=2 + tar --extract --file "$(PREFIX)/rust-std-host-install.tar.xz" --directory "$@.partial" rust-std-nightly-$(HOST_TARGET)/rust-std-$(HOST_TARGET)/ --strip-components=2 + tar --extract --file "$(PREFIX)/rust-src-install.tar.xz" --directory "$@.partial" rust-src-nightly/rust-src/ --strip-components=2 +ifeq ($(TARGET),x86_64-unknown-redox) + tar --extract --file "$(PREFIX)/rust-std-target-install.tar.xz" --directory "$@.partial" rust-std-nightly-$(TARGET)/rust-std-$(TARGET)/ --strip-components=2 +endif + touch "$@.partial" + mv "$@.partial" "$@" + +# BUILD RUST --------------------------------------------------- +else + +$(ROOT)/rust/configure: + git submodule sync --recursive + git submodule update --progress --init --recursive --checkout rust + $(PREFIX)/rust-install: $(ROOT)/rust/configure | $(PREFIX)/gcc-install $(PREFIX)/relibc-freestanding-install $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ @@ -359,6 +411,8 @@ else mv "$@.partial" "$@" endif +endif + $(PREFIX)/rust-install.tar.gz: $(PREFIX)/rust-install tar \ --create \ From 925e957c85c7a7fdc0f159c18c9ff69ee096990a Mon Sep 17 00:00:00 2001 From: Ojus Chugh Date: Thu, 25 Dec 2025 20:13:35 +0530 Subject: [PATCH 020/407] Add commit-hash.sh for recipe troubleshooting Signed-off-by: Ojus Chugh --- scripts/commit-hash.sh | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/scripts/commit-hash.sh b/scripts/commit-hash.sh index 19235faea..50653af1c 100755 --- a/scripts/commit-hash.sh +++ b/scripts/commit-hash.sh @@ -1,15 +1,27 @@ #!/usr/bin/env bash -# This script show the current Git branch and commit of the recipe source +# This script shows the current Git commit hash of system recipes at recipes/core -if [ $# -ne 1 ] +set -e + +# Check if recipes/core directory exists +if [ ! -d "recipes/core" ] then - echo "Usage: $0 recipe_name" - echo " Print the commit hash for recipe_name" + echo "Error: recipes/core directory not found" exit 1 fi -recipe_path="$(target/release/find_recipe $1)" - -cd "$recipe_path"/source -git branch -v +# Iterate through all system recipes in recipes/core +for recipe_dir in recipes/core/*/ +do + recipe_name=$(basename "$recipe_dir") + source_dir="$recipe_dir/source" + + # Check if source directory exists and is a git repository + if [ -d "$source_dir" ] && [ -d "$source_dir/.git" ] + then + # Get the commit hash + commit_hash=$(cd "$source_dir" && git rev-parse HEAD) + echo "$recipe_name: $commit_hash" + fi +done From ba31ed300364a34e3f2c2ecd8e6acc009d990844 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 27 Dec 2025 09:17:14 +0700 Subject: [PATCH 021/407] Fix typo on os-test-result recipe --- recipes/tests/os-test-result/recipe.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/tests/os-test-result/recipe.toml b/recipes/tests/os-test-result/recipe.toml index f0fded6b0..b856f3b7b 100644 --- a/recipes/tests/os-test-result/recipe.toml +++ b/recipes/tests/os-test-result/recipe.toml @@ -94,7 +94,7 @@ else # https://gitlab.redox-os.org/redox-os/redox/-/issues/1753 export REDOXER_QEMU_ARGS="-smp 1" # make: jobs doesn't work yet - echo redoxer exec --folder . --folder "${COOKBOOK_SYSROOT}/usr/:/usr" --artifact out:/root/out \ + redoxer exec --folder . --folder "${COOKBOOK_SYSROOT}/usr/:/usr" --artifact out:/root/out \ bash -c "until make test; do echo retrying; done" postinstall fi From bb641f4077d0fa15adb8c721bdfc060d5af0fd6c Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 27 Dec 2025 09:23:33 +0700 Subject: [PATCH 022/407] Bump upstream rustc to fix compiling riscv --- mk/prefix.mk | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index 95b575242..001c5f4d9 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -9,7 +9,8 @@ RELIBC_SOURCE=recipes/core/relibc/source BINUTILS_BRANCH=redox-2.43.1 GCC_BRANCH=redox-13.2.0 LIBTOOL_VERSION=2.5.4 -UPSTREAM_RUSTC_VERSION="2025-10-03" +# official RISC-V support introduced in newer version +UPSTREAM_RUSTC_VERSION="2025-11-15" export PREFIX_RUSTFLAGS=-L $(ROOT)/$(PREFIX_INSTALL)/$(TARGET)/lib export RUSTUP_TOOLCHAIN=$(ROOT)/$(PREFIX_INSTALL) @@ -328,22 +329,33 @@ $(PREFIX)/gcc-install.tar.gz: $(PREFIX)/gcc-install # RUST FROM UPSTREAM COMPILER --------------------------------------------------- ifeq ($(PREFIX_USE_UPSTREAM_RUST_COMPILER),1) -$(PREFIX)/rustc-install.tar.xz: +PREFIX_RUST_VERSION_TAG=$(PREFIX)/rustc-version-tag-$(UPSTREAM_RUSTC_VERSION) + +$(PREFIX_RUST_VERSION_TAG): + rm -f "$(PREFIX)"/rustc-version-tag-* + rm -f "$(PREFIX)"/rustc-install.tar.xz + rm -f "$(PREFIX)"/cargo-install.tar.xz + rm -f "$(PREFIX)"/rust-std-host-install.tar.xz + rm -f "$(PREFIX)"/rust-std-target-install.tar.xz + rm -f "$(PREFIX)"/rust-src-install.tar.xz: + touch $@ + +$(PREFIX)/rustc-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) mkdir -p "$(@D)" wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rustc-nightly-$(HOST_TARGET).tar.xz" mv $@.partial $@ -$(PREFIX)/cargo-install.tar.xz: +$(PREFIX)/cargo-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) mkdir -p "$(@D)" wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/cargo-nightly-$(HOST_TARGET).tar.xz" mv $@.partial $@ -$(PREFIX)/rust-std-host-install.tar.xz: +$(PREFIX)/rust-std-host-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) mkdir -p "$(@D)" wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-std-nightly-$(HOST_TARGET).tar.xz" mv $@.partial $@ -$(PREFIX)/rust-std-target-install.tar.xz: +$(PREFIX)/rust-std-target-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) mkdir -p "$(@D)" ifeq ($(TARGET),x86_64-unknown-redox) wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-std-nightly-$(TARGET).tar.xz" @@ -352,7 +364,7 @@ else touch $@ endif -$(PREFIX)/rust-src-install.tar.xz: +$(PREFIX)/rust-src-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) mkdir -p "$(@D)" wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-src-nightly.tar.xz" mv $@.partial $@ @@ -368,6 +380,7 @@ $(PREFIX)/rust-install: $(PREFIX)/gcc-install $(PREFIX)/rustc-install.tar.xz $(P ifeq ($(TARGET),x86_64-unknown-redox) tar --extract --file "$(PREFIX)/rust-std-target-install.tar.xz" --directory "$@.partial" rust-std-nightly-$(TARGET)/rust-std-$(TARGET)/ --strip-components=2 endif + rm -f "$@.partial/manifest.in" touch "$@.partial" mv "$@.partial" "$@" From 36fba0be16cfc21256135004d7543dd627bfe09b Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sat, 27 Dec 2025 19:54:27 -0700 Subject: [PATCH 023/407] Add WIP recipe for cosmic-comp --- recipes/wip/wayland/cosmic-comp/recipe.toml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 recipes/wip/wayland/cosmic-comp/recipe.toml diff --git a/recipes/wip/wayland/cosmic-comp/recipe.toml b/recipes/wip/wayland/cosmic-comp/recipe.toml new file mode 100644 index 000000000..bad215149 --- /dev/null +++ b/recipes/wip/wayland/cosmic-comp/recipe.toml @@ -0,0 +1,17 @@ +#TODO: does not compile +[source] +git = "https://github.com/jackpot51/cosmic-comp" +branch = "redox" + +[build] +template = "custom" +dependencies = [ + "libffi", + "libwayland", + "libxkbcommon", +] +script = """ +DYNAMIC_INIT +export RUSTFLAGS="${RUSTFLAGS}" +cookbook_cargo --no-default-features +""" From 1d317c3d70a83508f9a486c6d494ab85d283db14 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 29 Dec 2025 07:19:39 +0700 Subject: [PATCH 024/407] Fix rustup keep redownloading --- mk/prefix.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index 001c5f4d9..c9d085bdd 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -10,7 +10,7 @@ BINUTILS_BRANCH=redox-2.43.1 GCC_BRANCH=redox-13.2.0 LIBTOOL_VERSION=2.5.4 # official RISC-V support introduced in newer version -UPSTREAM_RUSTC_VERSION="2025-11-15" +UPSTREAM_RUSTC_VERSION=2025-11-15 export PREFIX_RUSTFLAGS=-L $(ROOT)/$(PREFIX_INSTALL)/$(TARGET)/lib export RUSTUP_TOOLCHAIN=$(ROOT)/$(PREFIX_INSTALL) From dc7816d95aa3ba00ba4f64736f3a38013b6b7d9b Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 29 Dec 2025 21:48:01 +0700 Subject: [PATCH 025/407] Invalidate git fetch when branch name different --- src/cook/fetch.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/cook/fetch.rs b/src/cook/fetch.rs index b5ab0cb8e..f17dc100b 100644 --- a/src/cook/fetch.rs +++ b/src/cook/fetch.rs @@ -228,7 +228,15 @@ pub fn fetch(recipe: &CookRecipe, logger: &PtyOut) -> Result { let (_, remote_branch, remote_name, remote_url) = get_git_remote_tracking(&source_dir)?; // TODO: how to get default branch and compare it here? - if remote_name == "origin" && &remote_url == chop_dot_git(git) { + if let Some(branch) = branch + && branch != &remote_branch + { + false + } else if remote_name != "origin" { + false + } else if &remote_url != chop_dot_git(git) { + false + } else { match get_git_fetch_rev(&source_dir, &remote_url, &remote_branch) { Ok(fetch_rev) => fetch_rev == head_rev, Err(e) => { @@ -236,8 +244,6 @@ pub fn fetch(recipe: &CookRecipe, logger: &PtyOut) -> Result { false } } - } else { - false } } }; From da39ba90ef103c4eb3f318160ef672749f4006f1 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 29 Dec 2025 23:11:12 +0700 Subject: [PATCH 026/407] Add no-test to zig recipe --- recipes/wip/dev/lang/zig/recipe.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/recipes/wip/dev/lang/zig/recipe.toml b/recipes/wip/dev/lang/zig/recipe.toml index d247daabf..da18502d0 100644 --- a/recipes/wip/dev/lang/zig/recipe.toml +++ b/recipes/wip/dev/lang/zig/recipe.toml @@ -23,7 +23,6 @@ dev-dependencies = [ script = """ DYNAMIC_INIT -rsync -a "${COOKBOOK_SOURCE}"/* ./ export PATH="${COOKBOOK_BUILD}:${PATH}" mkdir -p "${COOKBOOK_STAGE}"/usr/lib/zig "${COOKBOOK_STAGE}"/usr/bin @@ -33,6 +32,7 @@ if [ "$TARGET" != "$COOKBOOK_HOST_TARGET" ]; then ARCH="${GNU_TARGET%%-*}" OS=$(echo "${TARGET}" | cut -d - -f3-4) +rsync -a "${COOKBOOK_SOURCE}"/* ./ zig build \ --prefix "${COOKBOOK_STAGE}/usr/lib/zig" \ @@ -46,13 +46,14 @@ zig build \ -Dcpu="baseline" \ -Dversion-string="0.15.2" \ -Duse-zig-libcxx \ - -Dno-langref + -Dno-langref \ + -Dno-test else COOKBOOK_SOURCE="${COOKBOOK_BUILD}" COOKBOOK_STAGE="${COOKBOOK_STAGE}/usr/lib/zig" -cookbook_cmake -DCMAKE_INSTALL_PREFIX=/ +cookbook_cmake -DCMAKE_INSTALL_PREFIX=/ -DZIG_NO_TEST=On fi """ From b369a4ddd14beead8710b2d63191807598034b74 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 29 Dec 2025 23:38:04 +0700 Subject: [PATCH 027/407] Fix cross compiling neovim --- recipes/libs/utf8proc/recipe.toml | 19 +----------- recipes/wip/libs/lua/lpeg/recipe.toml | 1 + .../wip/libs/other/tree-sitter/recipe.toml | 1 + recipes/wip/text/neovim/recipe.toml | 31 ++++++++++++++++--- recipes/wip/text/neovim/redox.patch | 27 ---------------- 5 files changed, 30 insertions(+), 49 deletions(-) diff --git a/recipes/libs/utf8proc/recipe.toml b/recipes/libs/utf8proc/recipe.toml index c34c12f19..417c53cdc 100644 --- a/recipes/libs/utf8proc/recipe.toml +++ b/recipes/libs/utf8proc/recipe.toml @@ -3,21 +3,4 @@ tar = "https://github.com/JuliaStrings/utf8proc/archive/refs/tags/v2.10.0.tar.gz blake3 = "6f675db5d1ae55ad0825351ba9c58a5b5c24c862f559cc7bfed1cb63c1185594" [build] -template = "custom" -script = """ -DYNAMIC_INIT -COOKBOOK_CONFIGURE="cmake" -COOKBOOK_CONFIGURE_FLAGS=( - -DCMAKE_BUILD_TYPE=Release - -DCMAKE_CROSSCOMPILING=True - -DCMAKE_CXX_COMPILER="${TARGET}-g++" - -DCMAKE_C_COMPILER="${TARGET}-gcc" - -DCMAKE_INSTALL_PREFIX="/" - -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" - -DCMAKE_SYSTEM_NAME=Generic - -DCMAKE_SYSTEM_PROCESSOR="$(echo "${TARGET}" | cut -d - -f1)" - -DCMAKE_VERBOSE_MAKEFILE=On -"${COOKBOOK_SOURCE}" -) -cookbook_configure -""" +template = "cmake" diff --git a/recipes/wip/libs/lua/lpeg/recipe.toml b/recipes/wip/libs/lua/lpeg/recipe.toml index 484e5b3a5..ef1ad9a32 100644 --- a/recipes/wip/libs/lua/lpeg/recipe.toml +++ b/recipes/wip/libs/lua/lpeg/recipe.toml @@ -1,5 +1,6 @@ [source] tar = "https://www.inf.puc-rio.br/~roberto/lpeg/lpeg-1.1.0.tar.gz" +blake3 = "69fc6eaa1a1749937b7216e3d655cf47a7802ffe407f8f857664e999a7b7377b" [build] template = "custom" diff --git a/recipes/wip/libs/other/tree-sitter/recipe.toml b/recipes/wip/libs/other/tree-sitter/recipe.toml index e5507e3e9..8285bd265 100644 --- a/recipes/wip/libs/other/tree-sitter/recipe.toml +++ b/recipes/wip/libs/other/tree-sitter/recipe.toml @@ -1,5 +1,6 @@ [source] tar = "https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v0.25.8.tar.gz" +blake3 = "a9bce1e3c610441dc9d7dcc3d7d38e6a74e0b06d6b7d40e22982d927006dbfc4" patches = [ "redox.patch" ] diff --git a/recipes/wip/text/neovim/recipe.toml b/recipes/wip/text/neovim/recipe.toml index 8978c7ed2..1f29bff5f 100644 --- a/recipes/wip/text/neovim/recipe.toml +++ b/recipes/wip/text/neovim/recipe.toml @@ -1,6 +1,8 @@ #TODO mostly work, kinda slow, can't quit (signal issues?) [source] -tar = "https://github.com/neovim/neovim/archive/refs/tags/v0.11.3.tar.gz" +git = "https://github.com/neovim/neovim" +rev = "v0.11.5" +shallow_clone = true patches = [ "redox.patch" ] @@ -8,7 +10,6 @@ patches = [ [build] template = "custom" dependencies = [ - "luajit", "libiconv", "libuv", "luv", @@ -18,10 +19,32 @@ dependencies = [ "unibilium", "utf8proc", ] +dev-dependencies = [ + "host:luajit", + "host:neovim", +] script = """ DYNAMIC_INIT -cookbook_cmake \ - -DLUA_GEN_PRG=luajit + +# the only official way to cross compile in future is via zig +# https://github.com/neovim/neovim/issues/19579 +# the code path below is very hacky, and our zig support is poor yet + +COOKBOOK_CMAKE_FLAGS+=(-DLUA_GEN_PRG=luajit) +export DEPS_BUILD_DIR=$COOKBOOK_SYSROOT/usr +if [ "$TARGET" = "$COOKBOOK_HOST_TARGET" ]; then +cookbook_cmake + +# needed to workaround bootstrapping process +cp ./lib/libnlua0.so ${COOKBOOK_STAGE}/usr/lib/nvim/ + +else + +# this is a very ugly workaround +cookbook_cmake || true +cp ${COOKBOOK_TOOLCHAIN}/usr/lib/nvim/libnlua0.so ./lib/libnlua0.so +cookbook_cmake +fi # Lpeg is absolute path https://github.com/neovim/neovim/issues/23395 patchelf --replace-needed \ diff --git a/recipes/wip/text/neovim/redox.patch b/recipes/wip/text/neovim/redox.patch index 30b3f7229..c8ea25b56 100644 --- a/recipes/wip/text/neovim/redox.patch +++ b/recipes/wip/text/neovim/redox.patch @@ -67,33 +67,6 @@ diff -ruwN source/runtime/CMakeLists.txt source-new/runtime/CMakeLists.txt FILES ${GENERATED_SYN_VIM} DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/syntax/vim) -diff -ruwN source/src/nvim/channel.c source-new/src/nvim/channel.c ---- source/src/nvim/channel.c 2025-07-13 01:34:12.000000000 +0700 -+++ source-new/src/nvim/channel.c 2025-09-16 13:41:27.109978099 +0700 -@@ -547,8 +547,23 @@ - // Redirect stdout/stdin (the UI channel) to stderr. Use fnctl(F_DUPFD_CLOEXEC) instead of dup() - // to prevent child processes from inheriting the file descriptors, which are used by UIs to - // detect when Nvim exits. -+ #ifdef __redox__ -+ int new_stdin_fd = dup(STDIN_FILENO); -+ if (new_stdin_fd >= 0) { -+ fcntl(new_stdin_fd, F_SETFD, FD_CLOEXEC); -+ } -+ stdin_dup_fd = new_stdin_fd; -+ -+ // 2. Duplicate STDOUT and set CLOEXEC flag -+ int new_stdout_fd = dup(STDOUT_FILENO); -+ if (new_stdout_fd >= 0) { -+ fcntl(new_stdout_fd, F_SETFD, FD_CLOEXEC); -+ } -+ stdout_dup_fd = new_stdout_fd; -+ #else - stdin_dup_fd = fcntl(STDIN_FILENO, F_DUPFD_CLOEXEC, STDERR_FILENO + 1); - stdout_dup_fd = fcntl(STDOUT_FILENO, F_DUPFD_CLOEXEC, STDERR_FILENO + 1); -+ #endif // __redox__ - dup2(STDERR_FILENO, STDOUT_FILENO); - dup2(STDERR_FILENO, STDIN_FILENO); - } diff -ruwN source/src/nvim/CMakeLists.txt source-new/src/nvim/CMakeLists.txt --- source/src/nvim/CMakeLists.txt 2025-07-13 01:34:12.000000000 +0700 +++ source-new/src/nvim/CMakeLists.txt 2025-09-16 16:07:40.327319085 +0700 From fe9e3f956703842d10441abc4183df404508f346 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 29 Dec 2025 11:55:52 -0700 Subject: [PATCH 028/407] openttd: use rev instead of branch to workaround fetch issue --- recipes/games/openttd/recipe.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/recipes/games/openttd/recipe.toml b/recipes/games/openttd/recipe.toml index e419e5495..a3b352457 100644 --- a/recipes/games/openttd/recipe.toml +++ b/recipes/games/openttd/recipe.toml @@ -1,6 +1,7 @@ [source] git = "https://github.com/OpenTTD/OpenTTD.git" -branch = "release/1.8" +#TODO: fix issues with this: branch = "release/1.8" +rev = "231402fb4bea0a0d6a16cef90764d9e7aa699c53" shallow_clone = true patches = ["redox.patch"] @@ -41,4 +42,4 @@ if [ -d "${COOKBOOK_STAGE}/usr/bin" ] then find "${COOKBOOK_STAGE}/usr/bin" -type f -exec "${TARGET}-strip" -v {} ';' fi -""" \ No newline at end of file +""" From eb2a7d74132623b217922ea69a43dc5130febe5f Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 25 Dec 2025 11:02:11 +0700 Subject: [PATCH 029/407] Bootstrap GCC prefix using cookbook --- mk/config.mk | 7 +- mk/prefix.mk | 277 +++++------------- podman/redox-base-containerfile | 1 + recipes/core/relibc/recipe.toml | 8 +- recipes/dev/binutils-gdb/recipe.toml | 22 ++ recipes/dev/gcc13/recipe.toml | 52 +++- .../libs/other => dev}/libtool/recipe.toml | 4 + recipes/libs/libstdcxx-v3/recipe.toml | 12 + src/bin/repo.rs | 2 + src/bin/repo_builder.rs | 28 +- src/config.rs | 7 + src/cook/cook_build.rs | 26 +- src/cook/fs.rs | 25 +- src/cook/package.rs | 9 +- 14 files changed, 239 insertions(+), 241 deletions(-) create mode 100644 recipes/dev/binutils-gdb/recipe.toml rename recipes/{wip/libs/other => dev}/libtool/recipe.toml (82%) diff --git a/mk/config.mk b/mk/config.mk index 4a650dcd5..d6553a0a1 100644 --- a/mk/config.mk +++ b/mk/config.mk @@ -54,11 +54,13 @@ SCCACHE_BUILD?=$(shell [ -f /run/.containerenv ] && echo 1 || echo 0) CONTAINERFILE?=podman/redox-base-containerfile # Per host variables -export NPROC=nproc +NPROC=nproc +SED=sed ifneq ($(PODMAN_BUILD),1) FSTOOLS_IN_PODMAN=0 HOST_TARGET := $(shell env -u RUSTUP_TOOLCHAIN rustc -vV | grep host | cut -d: -f2 | tr -d " ") +HOST_GNU_TARGET := $(shell gcc -dumpmachine) # x86_64 linux hosts have all toolchains ifneq ($(HOST_TARGET),x86_64-unknown-linux-gnu) ifeq ($(ARCH),aarch64) @@ -101,7 +103,8 @@ endif UNAME := $(shell uname) ifeq ($(UNAME),Darwin) FUMOUNT=umount - export NPROC=sysctl -n hw.ncpu + NPROC=sysctl -n hw.ncpu + SED=gsed VB_AUDIO=coreaudio VBM=/Applications/VirtualBox.app/Contents/MacOS/VBoxManage else ifeq ($(UNAME),FreeBSD) diff --git a/mk/prefix.mk b/mk/prefix.mk index c9d085bdd..ebe52f5be 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -4,11 +4,13 @@ PREFIX=prefix/$(TARGET) PREFIX_INSTALL=$(PREFIX)/sysroot/ PREFIX_PATH=$(ROOT)/$(PREFIX_INSTALL)/bin -RELIBC_SOURCE=recipes/core/relibc/source +BINUTILS_TARGET=recipes/dev/binutils-gdb/target/$(HOST_TARGET)/$(TARGET) +LIBTOOL_TARGET=recipes/dev/libtool/target/$(HOST_TARGET) +GCC_TARGET=recipes/dev/gcc13/target/$(HOST_TARGET)/$(TARGET) +LIBSTDCXX_TARGET=recipes/libs/libstdcxx-v3/target/$(TARGET)/$(HOST_TARGET) +RELIBC_FREESTANDING_TARGET=recipes/core/relibc/target/$(TARGET)/$(HOST_TARGET) +RELIBC_TARGET=recipes/core/relibc/target/$(TARGET) -BINUTILS_BRANCH=redox-2.43.1 -GCC_BRANCH=redox-13.2.0 -LIBTOOL_VERSION=2.5.4 # official RISC-V support introduced in newer version UPSTREAM_RUSTC_VERSION=2025-11-15 @@ -16,64 +18,27 @@ export PREFIX_RUSTFLAGS=-L $(ROOT)/$(PREFIX_INSTALL)/$(TARGET)/lib export RUSTUP_TOOLCHAIN=$(ROOT)/$(PREFIX_INSTALL) export REDOXER_TOOLCHAIN=$(RUSTUP_TOOLCHAIN) -export CC= -export CXX= - -ifeq ($(TARGET),riscv64gc-unknown-redox) - GCC_ARCH?=--with-arch=rv64gc --with-abi=lp64d -else - GCC_ARCH?= -endif - -# TODO(andypython): Upstream libtool patches to remove the need to locally build libtool. -# Cannot be CI built, i.e. be a part of relibc-install.tar.gz, as the prefix has to be correctly -# set while building. Otherwise aclocal will not be able to find libtool's files. Furthermore, doing -# so would break non-podman builds (not sure if they are still supported though). prefix: $(PREFIX)/sysroot # Update relibc used for compiling and clean all statically linked recipes prefix_clean: | $(FSTOOLS_TAG) - rm -rf $(PREFIX)/relibc $(PREFIX)/sysroot $(REPO_TAG) + rm -rf $(PREFIX)/relibc-install $(PREFIX)/sysroot $(REPO_TAG) $(MAKE) c.base,base-initfs,extrautils,kernel,ion,pkgutils,redoxfs,relibc -PREFIX_STRIP=\ - mkdir -p bin libexec "$(GCC_TARGET)/bin" && \ - find bin libexec "$(GCC_TARGET)/bin" "$(GCC_TARGET)/lib" \ - -type f \ - -exec strip --strip-unneeded {} ';' \ - 2> /dev/null - -$(RELIBC_SOURCE): | $(FSTOOLS_TAG) -ifeq ($(PODMAN_BUILD),1) - $(PODMAN_RUN) make $@ -else - ./target/release/repo fetch relibc - touch $(RELIBC_SOURCE) -endif - -$(PREFIX)/relibc: | $(RELIBC_SOURCE) - mkdir -p "$(@D)" - rm -rf "$@.partial" "$@" - cp -r "$(RELIBC_SOURCE)" "$@.partial" - touch "$@.partial" - mv "$@.partial" "$@" - -$(PREFIX)/relibc-install: $(PREFIX)/relibc | $(PREFIX)/rust-install $(CONTAINER_TAG) +$(PREFIX)/relibc-install: $(PREFIX)/rust-install | $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else + @echo "\033[1;36;49mBuilding relibc-install\033[0m" rm -rf "$@.partial" "$@" cp -r "$(PREFIX)/rust-install" "$@.partial" rm -rf "$@.partial/$(TARGET)/include/"* cp -r "$(PREFIX)/rust-install/$(GNU_TARGET)/include/c++" "$@.partial/$(GNU_TARGET)/include/c++" cp -r "$(PREFIX)/rust-install/lib/rustlib/$(HOST_TARGET)/lib/" "$@.partial/lib/rustlib/$(HOST_TARGET)/" - cd "$<" && \ export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \ - export CARGO="env -u CARGO cargo" && \ - $(MAKE) clean && \ - $(MAKE) -j `$(NPROC)` all && \ - $(MAKE) -j `$(NPROC)` install DESTDIR="$(ROOT)/$@.partial/$(GNU_TARGET)" - cd "$@.partial" && $(PREFIX_STRIP) + export CARGO="env -u CARGO cargo" CI=1 && \ + ./target/release/repo cook relibc + cp -r "$(RELIBC_TARGET)/stage/usr/". "$@.partial/$(GNU_TARGET)" touch "$@.partial" mv "$@.partial" "$@" endif @@ -86,60 +51,30 @@ $(PREFIX)/relibc-install.tar.gz: $(PREFIX)/relibc-install --directory="$<" \ . -$(PREFIX)/libtool: | $(CONTAINER_TAG) +# TODO: move this behind PREFIX_BINARY=0 when compiled prefix has it +$(PREFIX)/libtool-install: | $(FSTOOLS_TAG) $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else + @echo "\033[1;36;49mBuilding libtool-install\033[0m" rm -rf "$@.partial" "$@" mkdir -p "$@.partial" - - git clone \ - --recurse-submodules \ - --shallow-submodules \ - "https://gitlab.redox-os.org/redox-os/libtool/" \ - --branch "v$(LIBTOOL_VERSION)-redox" \ - --depth 2 \ - "$@.partial" - - touch "$@.partial" - echo $(LIBTOOL_VERSION) > $@.partial/.tarball-version - mv "$@.partial" "$@" -endif - -$(PREFIX)/libtool-build: $(PREFIX)/libtool $(PREFIX)/rust-install $(CONTAINER_TAG) -ifeq ($(PODMAN_BUILD),1) - $(PODMAN_RUN) make $@ -else - rm -rf "$@.partial" "$@" - mkdir -p "$@.partial" - PATH="$(ROOT)/$(PREFIX)/rust-install/bin:$$PATH" && \ - cd "$<" && \ - ./bootstrap \ - --skip-po \ - --force \ - --gnulib-srcdir=./gnulib - PATH="$(ROOT)/$(PREFIX)/rust-install/bin:$$PATH" && \ - cd "$@.partial" && \ - cp -r $(abspath $<)/. ./ && \ - "$(ROOT)/$ anyhow::Result<()> { fs::create_dir_all(repo_path)?; } + // Don't publish host packages + let target_packages = &config + .recipe_list + .iter() + .map(PackageName::new) + .filter(|pkg| pkg.as_ref().is_ok_and(|p| !p.is_host())) + .collect::, _>>()?; + + if target_packages.len() == 0 { + return Ok(()); + } + + // TODO: publish cross target builds? + if std::env::var("COOKBOOK_CROSS_TARGET").is_ok_and(|x| !x.is_empty()) { + return Ok(()); + } + // Runtime dependencies include both `[package.dependencies]` and dynamically // linked packages discovered by auto_deps. // // The following adds the package dependencies of the recipes to the repo as // well. - let (recipe_list, recipe_map) = Package::new_recursive_nonstop( - &config - .recipe_list - .iter() - .map(PackageName::new) - // Don't publish host packages - .filter(|pkg| pkg.as_ref().is_ok_and(|p| !p.is_host())) - .collect::, _>>()?, - WALK_DEPTH, - ); + let (recipe_list, recipe_map) = Package::new_recursive_nonstop(target_packages, WALK_DEPTH); if recipe_list.len() == 0 { // Fail-Safe diff --git a/src/config.rs b/src/config.rs index c8836c6d0..cdcc6bef6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -19,6 +19,8 @@ pub struct CookConfigOpt { /// whether to print verbose logs to certain commands /// build failure still be printed anyway pub verbose: Option, + /// whether to always clean the build directory + pub clean_build: Option, } #[derive(Debug, Default, Clone, Deserialize, PartialEq, Serialize)] @@ -29,6 +31,7 @@ pub struct CookConfig { pub logs: bool, pub nonstop: bool, pub verbose: bool, + pub clean_build: bool, } impl From for CookConfig { @@ -40,6 +43,7 @@ impl From for CookConfig { logs: value.logs.unwrap(), nonstop: value.nonstop.unwrap(), verbose: value.verbose.unwrap(), + clean_build: value.clean_build.unwrap(), } } } @@ -91,6 +95,9 @@ pub fn init_config() { if config.cook_opt.nonstop.is_none() { config.cook_opt.nonstop = Some(extract_env("COOKBOOK_NONSTOP", false)); } + if config.cook_opt.clean_build.is_none() { + config.cook_opt.clean_build = Some(extract_env("COOKBOOK_CLEAN_BUILD", false)); + } if config.mirrors.len() == 0 { // The GNU FTP mirror below is automatically inserted for convenience // You can choose other mirrors by setting it on cookbook.toml diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index 3b7b9255a..1b88de0aa 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -174,6 +174,7 @@ pub fn build( recipe: &Recipe, offline_mode: bool, check_source: bool, + clean_build: bool, logger: &PtyOut, ) -> Result<(Vec, BTreeSet), String> { let sysroot_dir = target_dir.join("sysroot"); @@ -276,9 +277,8 @@ pub fn build( create_dir_clean(&stage_dir_tmp)?; // Create build, if it does not exist - //TODO: flag for clean builds where build is wiped out - let build_dir = target_dir.join("build"); - if !build_dir.is_dir() { + let build_dir = get_build_dir(target_dir); + if clean_build || !build_dir.is_dir() { create_dir_clean(&build_dir)?; } @@ -428,15 +428,33 @@ pub fn remove_stage_dir(stage_dir: &PathBuf) -> Result<(), String> { } pub fn get_stage_dirs(features: &Vec, target_dir: &Path) -> Vec { + let mut target_dir = target_dir.to_path_buf(); + if let Some(cross_target) = std::env::var("COOKBOOK_CROSS_TARGET").ok() { + if cross_target != "" { + // TODO: automatically pass COOKBOOK_CROSS_GNU_TARGET? + target_dir = target_dir.join(cross_target) + } + } let mut v = Vec::new(); for f in features { v.push(target_dir.join(format!("stage.{}", f.name))); } // intentionally added last as it contains leftover files from package features - v.push(target_dir.join(format!("stage"))); + v.push(target_dir.join("stage")); v } +pub fn get_build_dir(target_dir: &Path) -> PathBuf { + let mut target_dir = target_dir.to_path_buf(); + if let Some(cross_target) = std::env::var("COOKBOOK_CROSS_TARGET").ok() { + if cross_target != "" { + // TODO: automatically pass COOKBOOK_CROSS_GNU_TARGET? + target_dir = target_dir.join(cross_target) + } + } + target_dir.join("build") +} + fn build_deps_dir( logger: &PtyOut, deps_dir: &PathBuf, diff --git a/src/cook/fs.rs b/src/cook/fs.rs index b32558bf1..a75c8bdab 100644 --- a/src/cook/fs.rs +++ b/src/cook/fs.rs @@ -33,7 +33,8 @@ pub fn create_dir_clean(dir: &Path) -> Result<(), String> { if dir.is_dir() { remove_all(dir)?; } - create_dir(dir) + fs::create_dir_all(dir) + .map_err(|err| format!("failed to create '{}': {}\n{:?}", dir.display(), err, err)) } pub fn create_target_dir(recipe_dir: &Path, target: &'static str) -> Result { @@ -292,9 +293,14 @@ pub fn get_git_head_rev(dir: &PathBuf) -> Result<(String, bool), String> { let head_str = fs::read_to_string(&git_head) .map_err(|e| format!("unable to read {path}: {e}", path = git_head.display()))?; if head_str.starts_with("ref: ") { - let git_ref = dir.join(".git").join(head_str["ref: ".len()..].trim_end()); - let ref_str = fs::read_to_string(&git_ref) - .map_err(|e| format!("unable to read {path}: {e}", path = git_ref.display()))?; + let entry = head_str["ref: ".len()..].trim_end(); + let git_ref = dir.join(".git").join(entry); + let ref_str = if git_ref.is_file() { + fs::read_to_string(&git_ref) + .map_err(|e| format!("unable to read {path}: {e}", path = git_ref.display()))? + } else { + get_git_ref_entry(dir, entry)? + }; Ok((ref_str.trim().to_string(), false)) } else { Ok((head_str.trim().to_string(), true)) @@ -306,12 +312,14 @@ pub fn get_git_tag_rev(dir: &PathBuf, tag: &str) -> Result { if tag.len() == 40 && tag.chars().all(|f| f.is_ascii_hexdigit()) { return Ok(tag.to_string()); } + get_git_ref_entry(dir, &format!("refs/tags/{tag}")) +} +pub fn get_git_ref_entry(dir: &PathBuf, entry: &str) -> Result { let git_refs = dir.join(".git/packed-refs"); let refs_str = fs::read_to_string(&git_refs) .map_err(|e| format!("unable to read {path}: {e}", path = git_refs.display()))?; - let expected_comment_part = format!("refs/tags/{tag}"); for line in refs_str.lines() { - if line.contains(&expected_comment_part) { + if line.contains(entry) { let sha = line .split_whitespace() .next() @@ -321,10 +329,7 @@ pub fn get_git_tag_rev(dir: &PathBuf, tag: &str) -> Result { } } - Err(format!( - "Could not find a rev tag for {}", - expected_comment_part - )) + Err(format!("Could not find a rev for {}", entry)) } /// get commit rev after fetch diff --git a/src/cook/package.rs b/src/cook/package.rs index 3a635377e..81aebdf99 100644 --- a/src/cook/package.rs +++ b/src/cook/package.rs @@ -194,7 +194,14 @@ pub fn package_stage_paths( package: Option<&OptionalPackageRecipe>, target_dir: &Path, ) -> (PathBuf, PathBuf, PathBuf) { - package_name_paths(package, target_dir, "stage") + let mut target_dir = target_dir.to_path_buf(); + if let Some(cross_target) = std::env::var("COOKBOOK_CROSS_TARGET").ok() { + if cross_target != "" { + // TODO: automatically pass COOKBOOK_CROSS_GNU_TARGET? + target_dir = target_dir.join(cross_target) + } + } + package_name_paths(package, &target_dir, "stage") } pub fn package_source_paths( From 0ad7cae812fcdf3745b615f7834a1ecc4275bd7e Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 25 Dec 2025 13:41:25 +0700 Subject: [PATCH 030/407] Further fixes for bootstrap --- mk/prefix.mk | 16 +++++++++------- recipes/core/relibc/recipe.toml | 4 ++-- recipes/libs/libstdcxx-v3/recipe.toml | 14 +++++++------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index ebe52f5be..276634b61 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -72,7 +72,7 @@ ifeq ($(PODMAN_BUILD),1) else rm -rf "$@" cp -r "$(PREFIX)/relibc-install/" "$@" - cp -r "$(PREFIX)/libtool-install/". "$@.partial" + cp -r "$(PREFIX)/libtool-install/". "$@" # adapt path for libtoolize $(SED) -i 's|/usr/share|$(ROOT)/$@/share|g' "$@/bin/libtoolize" touch "$@" @@ -124,7 +124,7 @@ ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else @echo "\033[1;36;49mBuilding gcc-freestanding-install\033[0m" - rm -rf "$@.partial" "$@" $(PREFIX)/relibc-freestanding-install $(PREFIX)/sysroot + rm -rf "$@.partial" "$@" $(PREFIX)/relibc-freestanding-install $(PREFIX)/sysroot mkdir -p "$@.partial" $(PREFIX)/relibc-freestanding-install/$(TARGET)/include export CI=1 PATH="$(ROOT)/$(PREFIX)/binutils-install/bin:$$PATH" \ COOKBOOK_CLEAN_BUILD=true COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) \ @@ -132,12 +132,13 @@ else ./target/release/repo cook host:gcc13 cp -r "$(GCC_TARGET)/stage/usr/". "$@.partial" cp -r "$(GCC_TARGET)/stage.cxx/usr/". "$@.partial" + cp -r "$(PREFIX)/binutils-install/". "$@.partial" rm -rf $(PREFIX)/relibc-freestanding-install touch "$@.partial" mv "$@.partial" "$@" endif -$(PREFIX)/relibc-freestanding-install: $(PREFIX)/gcc-freestanding-install $(PREFIX)/binutils-install | $(FSTOOLS_TAG) $(CONTAINER_TAG) +$(PREFIX)/relibc-freestanding-install: $(PREFIX)/gcc-freestanding-install | $(FSTOOLS_TAG) $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else @@ -145,8 +146,8 @@ else rm -rf "$@.partial" "$@" mkdir -p "$@.partial/$(TARGET)" export CARGO="env -u CARGO -u RUSTUP_TOOLCHAIN cargo" && \ - export PATH="$(ROOT)/$(PREFIX)/gcc-freestanding-install/bin:$(ROOT)/$(PREFIX)/binutils-install/bin:$$PATH" && \ - export CC_$(subst -,_,$(TARGET))="$(GNU_TARGET)-gcc -isystem $(ROOT)/$@.partial/$(GNU_TARGET)/include" && \ + export PATH="$(ROOT)/$(PREFIX)/gcc-freestanding-install/bin:$$PATH" && \ + export CC_$(subst -,_,$(TARGET))="$(GNU_TARGET)-gcc -isystem $(ROOT)/$@.partial/$(GNU_TARGET)/include" LINKFLAGS="" && \ export CI=1 COOKBOOK_CLEAN_BUILD=true COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \ ./target/release/repo cook relibc cp -r "$(RELIBC_FREESTANDING_TARGET)/stage/usr/". "$@.partial/$(TARGET)" @@ -154,7 +155,7 @@ else mv "$@.partial" "$@" endif -$(PREFIX)/gcc-install: $(PREFIX)/relibc-freestanding-install $(PREFIX)/binutils-install $(PREFIX)/libtool-install | $(FSTOOLS_TAG) $(CONTAINER_TAG) +$(PREFIX)/gcc-install: $(PREFIX)/relibc-freestanding-install $(PREFIX)/libtool-install | $(FSTOOLS_TAG) $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else @@ -167,8 +168,9 @@ else mkdir -p "$@.partial" "$@-build.partial" cp -r "$(PREFIX)/gcc-freestanding-install/". "$@.partial" cp -r "$(PREFIX)/relibc-freestanding-install/". "$@.partial" - cp -r "$(PREFIX)/binutils-install/". "$@.partial" cp -r "$(PREFIX)/libtool-install/". "$@.partial" + @#TODO: how to make this not conflict with libc? + rm -f "$@.partial/lib/gcc/$(GNU_TARGET)/13.2.0/include/limits.h" # libgcc export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \ $(MAKE) -C "$(ROOT)/$(GCC_TARGET)/build" all-target-libgcc && \ diff --git a/recipes/core/relibc/recipe.toml b/recipes/core/relibc/recipe.toml index 938414b5d..046479417 100644 --- a/recipes/core/relibc/recipe.toml +++ b/recipes/core/relibc/recipe.toml @@ -1,5 +1,5 @@ -# [source] -# git = "https://gitlab.redox-os.org/redox-os/relibc.git" +[source] +git = "https://gitlab.redox-os.org/redox-os/relibc.git" [build] template = "custom" diff --git a/recipes/libs/libstdcxx-v3/recipe.toml b/recipes/libs/libstdcxx-v3/recipe.toml index d9b4a145f..892629216 100644 --- a/recipes/libs/libstdcxx-v3/recipe.toml +++ b/recipes/libs/libstdcxx-v3/recipe.toml @@ -3,26 +3,26 @@ same_as = "../../dev/gcc13" [build] template = "custom" -dependencies = [ - "libgmp", - "libmpfr", - "mpc", - "zlib" -] script = """ DYNAMIC_INIT # this results C++ missing nice stuff like mutex # our prefix workaround this by compiling twice -if [ ! -z "${COOKBOOK_CROSS_GNU_TARGET}" ]; then +if [[ -n "$COOKBOOK_CROSS_GNU_TARGET" ]]; then COOKBOOK_STAGE+="/usr" COOKBOOK_CONFIGURE_FLAGS=( --prefix="" --host="${GNU_TARGET}" --disable-hosted-libstdcxx + --with-cross-host="${COOKBOOK_CROSS_GNU_TARGET}" ) fi +COOKBOOK_CONFIGURE_FLAGS+=( + --enable-threads=posix + --enable-libstdcxx-threads +) + CPPINCLUDE="${COOKBOOK_HOST_SYSROOT}/$TARGET/include/c++/13.2.0" export CPPFLAGS+=" -I${CPPINCLUDE} -I${CPPINCLUDE}/$TARGET/bits" COOKBOOK_CONFIGURE="${COOKBOOK_SOURCE}/libstdc++-v3/configure" From 2fe4fdc2fb2a7c0d3f2c64bc0b22e3235aff7a8d Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 25 Dec 2025 16:21:19 +0700 Subject: [PATCH 031/407] Further fixes to make gcc13 compile --- mk/prefix.mk | 2 +- recipes/dev/gcc13/recipe.toml | 7 +++---- recipes/libs/libstdcxx-v3/recipe.toml | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index 276634b61..92fbf5225 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -25,7 +25,7 @@ prefix_clean: | $(FSTOOLS_TAG) rm -rf $(PREFIX)/relibc-install $(PREFIX)/sysroot $(REPO_TAG) $(MAKE) c.base,base-initfs,extrautils,kernel,ion,pkgutils,redoxfs,relibc -$(PREFIX)/relibc-install: $(PREFIX)/rust-install | $(CONTAINER_TAG) +$(PREFIX)/relibc-install: $(PREFIX)/rust-install | $(FSTOOLS_TAG) $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else diff --git a/recipes/dev/gcc13/recipe.toml b/recipes/dev/gcc13/recipe.toml index 305562d6b..19866f018 100644 --- a/recipes/dev/gcc13/recipe.toml +++ b/recipes/dev/gcc13/recipe.toml @@ -17,7 +17,7 @@ dependencies = [ "zlib" ] script = """ -DYNAMIC_INIT +DYNAMIC_STATIC_INIT CROSS_GNU_TARGET=${COOKBOOK_CROSS_GNU_TARGET:-$GNU_TARGET} if [ "${COOKBOOK_HOST_SYSROOT}" = "/usr" ]; then @@ -27,12 +27,12 @@ COOKBOOK_CONFIGURE_FLAGS=( --prefix="" --host="${GNU_TARGET}" --program-prefix="${CROSS_GNU_TARGET}-" + --with-native-system-header-dir="/include" --with-sysroot ) else COOKBOOK_CONFIGURE_FLAGS+=( - --with-sysroot=/usr - --prefix="/usr" + --with-sysroot=/ ) fi @@ -46,7 +46,6 @@ fi COOKBOOK_CONFIGURE_FLAGS+=( --target="${CROSS_GNU_TARGET}" --with-build-sysroot="${COOKBOOK_CROSS_SYSROOT:-$COOKBOOK_SYSROOT}" - --with-native-system-header-dir="/include" --with-linker-hash-style=gnu --enable-languages=c,c++,lto --enable-initfini-array diff --git a/recipes/libs/libstdcxx-v3/recipe.toml b/recipes/libs/libstdcxx-v3/recipe.toml index 892629216..9499cd8ef 100644 --- a/recipes/libs/libstdcxx-v3/recipe.toml +++ b/recipes/libs/libstdcxx-v3/recipe.toml @@ -4,7 +4,7 @@ same_as = "../../dev/gcc13" [build] template = "custom" script = """ -DYNAMIC_INIT +DYNAMIC_STATIC_INIT # this results C++ missing nice stuff like mutex # our prefix workaround this by compiling twice From 3049ad1e2216a29de147b72d0b195b6b779413d8 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 25 Dec 2025 16:36:26 +0700 Subject: [PATCH 032/407] Try fix CI --- recipes/dev/libtool/recipe.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/dev/libtool/recipe.toml b/recipes/dev/libtool/recipe.toml index b8d07ec4d..b62946be9 100644 --- a/recipes/dev/libtool/recipe.toml +++ b/recipes/dev/libtool/recipe.toml @@ -12,7 +12,7 @@ DYNAMIC_INIT # libtool saves absolute path to sysroot which contains nothing unset CFLAGS -rsync -av --delete "${COOKBOOK_SOURCE}/" ./ +cp -r "${COOKBOOK_SOURCE}"/. ./ ./bootstrap \ --skip-po \ --force \ From d034e6a381106053c0441aec490dd65c685ecc8e Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 26 Dec 2025 07:18:29 +0700 Subject: [PATCH 033/407] Fixes for other arch like RISC-V --- mk/prefix.mk | 30 ++++++++++++++------------- recipes/dev/gcc13/recipe.toml | 2 ++ recipes/libs/libstdcxx-v3/recipe.toml | 12 ----------- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index 92fbf5225..686d3cccf 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -125,10 +125,10 @@ ifeq ($(PODMAN_BUILD),1) else @echo "\033[1;36;49mBuilding gcc-freestanding-install\033[0m" rm -rf "$@.partial" "$@" $(PREFIX)/relibc-freestanding-install $(PREFIX)/sysroot - mkdir -p "$@.partial" $(PREFIX)/relibc-freestanding-install/$(TARGET)/include + mkdir -p "$@.partial" $(PREFIX)/relibc-freestanding-install/$(GNU_TARGET)/include export CI=1 PATH="$(ROOT)/$(PREFIX)/binutils-install/bin:$$PATH" \ COOKBOOK_CLEAN_BUILD=true COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) \ - COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_SYSROOT=$(ROOT)/$(PREFIX)/relibc-freestanding-install/$(TARGET) && \ + COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_SYSROOT=$(ROOT)/$(PREFIX)/relibc-freestanding-install/$(GNU_TARGET) && \ ./target/release/repo cook host:gcc13 cp -r "$(GCC_TARGET)/stage/usr/". "$@.partial" cp -r "$(GCC_TARGET)/stage.cxx/usr/". "$@.partial" @@ -144,13 +144,13 @@ ifeq ($(PODMAN_BUILD),1) else @echo "\033[1;36;49mBuilding relibc-freestanding-install\033[0m" rm -rf "$@.partial" "$@" - mkdir -p "$@.partial/$(TARGET)" + mkdir -p "$@.partial" export CARGO="env -u CARGO -u RUSTUP_TOOLCHAIN cargo" && \ export PATH="$(ROOT)/$(PREFIX)/gcc-freestanding-install/bin:$$PATH" && \ export CC_$(subst -,_,$(TARGET))="$(GNU_TARGET)-gcc -isystem $(ROOT)/$@.partial/$(GNU_TARGET)/include" LINKFLAGS="" && \ export CI=1 COOKBOOK_CLEAN_BUILD=true COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \ ./target/release/repo cook relibc - cp -r "$(RELIBC_FREESTANDING_TARGET)/stage/usr/". "$@.partial/$(TARGET)" + cp -r "$(RELIBC_FREESTANDING_TARGET)/stage/usr/". "$@.partial/$(GNU_TARGET)" touch "$@.partial" mv "$@.partial" "$@" endif @@ -171,25 +171,27 @@ else cp -r "$(PREFIX)/libtool-install/". "$@.partial" @#TODO: how to make this not conflict with libc? rm -f "$@.partial/lib/gcc/$(GNU_TARGET)/13.2.0/include/limits.h" -# libgcc +# libgcc and bare features of libstdcxx export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \ - $(MAKE) -C "$(ROOT)/$(GCC_TARGET)/build" all-target-libgcc && \ - $(MAKE) -C "$(ROOT)/$(GCC_TARGET)/build" install-target-libgcc DESTDIR="$(ROOT)/$@-build.partial/usr" + $(MAKE) -C "$(ROOT)/$(GCC_TARGET)/build" all-target-libgcc all-target-libstdc++-v3 && \ + $(MAKE) -C "$(ROOT)/$(GCC_TARGET)/build" install-target-libgcc install-target-libstdc++-v3 DESTDIR="$(ROOT)/$@-build.partial/usr" cp -r "$@-build.partial/usr/". "$@.partial" -# libstdcxx, bare features - export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \ - export CI=1 COOKBOOK_CLEAN_BUILD=true "COOKBOOK_HOST_SYSROOT=$(ROOT)/$@.partial" COOKBOOK_CROSS_TARGET=$(HOST_TARGET) COOKBOOK_CROSS_GNU_TARGET=$(HOST_GNU_TARGET) && \ - ./target/release/repo cook libstdcxx-v3 - cp -r "$(LIBSTDCXX_TARGET)/stage/usr/". "$@.partial" -# libstdcxx, full features + @#TODO: in riscv64gc libgcc_s.so is a GNU ld script + rm -f "$@.partial"/$(GNU_TARGET)/lib/libgcc_s.so + ln -s libgcc_s.so.1 "$@.partial"/$(GNU_TARGET)/lib/libgcc_s.so +# fully featured libstdcxx, not supported for targets only supporting static linking +ifneq ($(TARGET),riscv64gc-unknown-redox) +ifneq ($(TARGET),i586-unknown-redox) export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \ export CI=1 COOKBOOK_CLEAN_BUILD=true "COOKBOOK_HOST_SYSROOT=$(ROOT)/$@.partial" COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \ rm -rf "$(LIBSTDCXX_TARGET)/stage" && ./target/release/repo cook libstdcxx-v3 cp -r "$(LIBSTDCXX_TARGET)/stage/usr/". "$@.partial/$(GNU_TARGET)" +endif +endif rm -rf "$@-build.partial" touch "$@.partial" mv "$@.partial" "$@" -# no longer needed, delete to save disk space +# no longer needed, delete build files to save disk space rm -rf $(BINUTILS_TARGET) $(LIBTOOL_TARGET) $(GCC_TARGET) $(LIBSTDCXX_TARGET) $(RELIBC_FREESTANDING_TARGET) endif diff --git a/recipes/dev/gcc13/recipe.toml b/recipes/dev/gcc13/recipe.toml index 19866f018..4a460b0ad 100644 --- a/recipes/dev/gcc13/recipe.toml +++ b/recipes/dev/gcc13/recipe.toml @@ -28,6 +28,7 @@ COOKBOOK_CONFIGURE_FLAGS=( --host="${GNU_TARGET}" --program-prefix="${CROSS_GNU_TARGET}-" --with-native-system-header-dir="/include" + --disable-hosted-libstdcxx --with-sysroot ) else @@ -55,6 +56,7 @@ COOKBOOK_CONFIGURE_FLAGS+=( --enable-host-shared --enable-threads=posix --enable-frame-pointer + --enable-libstdcxx-threads --with-bugurl="https://gitlab.redox-os.org/redox-os/gcc/-/issues" ) diff --git a/recipes/libs/libstdcxx-v3/recipe.toml b/recipes/libs/libstdcxx-v3/recipe.toml index 9499cd8ef..a0d76ef06 100644 --- a/recipes/libs/libstdcxx-v3/recipe.toml +++ b/recipes/libs/libstdcxx-v3/recipe.toml @@ -6,18 +6,6 @@ template = "custom" script = """ DYNAMIC_STATIC_INIT -# this results C++ missing nice stuff like mutex -# our prefix workaround this by compiling twice -if [[ -n "$COOKBOOK_CROSS_GNU_TARGET" ]]; then -COOKBOOK_STAGE+="/usr" -COOKBOOK_CONFIGURE_FLAGS=( - --prefix="" - --host="${GNU_TARGET}" - --disable-hosted-libstdcxx - --with-cross-host="${COOKBOOK_CROSS_GNU_TARGET}" -) -fi - COOKBOOK_CONFIGURE_FLAGS+=( --enable-threads=posix --enable-libstdcxx-threads From 85047bd2d59d582538cd1783b28811297e9cb844 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 28 Dec 2025 19:48:58 +0700 Subject: [PATCH 034/407] Add back libstdcx++ la files --- mk/prefix.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mk/prefix.mk b/mk/prefix.mk index 686d3cccf..fa7ead17d 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -179,6 +179,9 @@ else @#TODO: in riscv64gc libgcc_s.so is a GNU ld script rm -f "$@.partial"/$(GNU_TARGET)/lib/libgcc_s.so ln -s libgcc_s.so.1 "$@.partial"/$(GNU_TARGET)/lib/libgcc_s.so + @#TODO: generates wrong lib path for libtool + rm -f "$@.partial"/$(GNU_TARGET)/lib/libstdc++.la + rm -f "$@.partial"/$(GNU_TARGET)/lib/libsupc++.la # fully featured libstdcxx, not supported for targets only supporting static linking ifneq ($(TARGET),riscv64gc-unknown-redox) ifneq ($(TARGET),i586-unknown-redox) From bbca5b2386713f8af2d143d103dc1688597874cf Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 28 Dec 2025 19:50:06 +0700 Subject: [PATCH 035/407] Remove HOST_GNU_TARGET --- mk/config.mk | 1 - 1 file changed, 1 deletion(-) diff --git a/mk/config.mk b/mk/config.mk index d6553a0a1..d985c3964 100644 --- a/mk/config.mk +++ b/mk/config.mk @@ -60,7 +60,6 @@ SED=sed ifneq ($(PODMAN_BUILD),1) FSTOOLS_IN_PODMAN=0 HOST_TARGET := $(shell env -u RUSTUP_TOOLCHAIN rustc -vV | grep host | cut -d: -f2 | tr -d " ") -HOST_GNU_TARGET := $(shell gcc -dumpmachine) # x86_64 linux hosts have all toolchains ifneq ($(HOST_TARGET),x86_64-unknown-linux-gnu) ifeq ($(ARCH),aarch64) From 573bb50cca53e6e75c7ae2e47b6ad9818ae24653 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 30 Dec 2025 17:21:20 +0700 Subject: [PATCH 036/407] Build cargo in rust recipe --- config/x86_64/ci.toml | 1 - config/x86_64/jeremy.toml | 1 - recipes/dev/rust/config.toml | 14 +++++++------ recipes/dev/rust/recipe.toml | 25 ++++++++++++++++++------ recipes/groups/dev-essential/recipe.toml | 1 - 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/config/x86_64/ci.toml b/config/x86_64/ci.toml index be544cc7e..7394289b2 100644 --- a/config/x86_64/ci.toml +++ b/config/x86_64/ci.toml @@ -33,7 +33,6 @@ ca-certificates = {} cairo = {} #cairodemo = {} # linking errors #calculator = {} -cargo = {} cleye = {} #cmatrix = {} # needs ncursesw now composer = {} diff --git a/config/x86_64/jeremy.toml b/config/x86_64/jeremy.toml index dc8eef32e..64a836e19 100644 --- a/config/x86_64/jeremy.toml +++ b/config/x86_64/jeremy.toml @@ -55,7 +55,6 @@ winit = {} # dev autoconf = {} automake = {} -cargo = {} cookbook = {} gcc13 = {} gnu-binutils = {} diff --git a/recipes/dev/rust/config.toml b/recipes/dev/rust/config.toml index 9674da00f..588402686 100644 --- a/recipes/dev/rust/config.toml +++ b/recipes/dev/rust/config.toml @@ -1,4 +1,4 @@ -#TODO: use sed to replace hardcoded paths into env +# Note: this file is not tracked by cookbook, run `make c.rust` after change. [llvm] download-ci-llvm = false static-libstdcpp = false @@ -8,9 +8,11 @@ experimental-targets = "" [build] host = ["x86_64-unknown-redox"] target = ["x86_64-unknown-redox"] -docs = false submodules = false -tools = ["src"] +# TODO: enable rustdoc and others +docs = false +tools = ["cargo", "clippy", "rustfmt", "src"] +extended = true verbose = 1 [install] @@ -28,10 +30,10 @@ ar = "x86_64-unknown-redox-ar" linker = "x86_64-unknown-redox-gcc" rpath = false crt-static = false -llvm-config = "/mnt/redox/recipes/dev/rust/target/x86_64-unknown-redox/sysroot/bin/llvm-config" +llvm-config = "COOKBOOK_SYSROOT/bin/llvm-config" [target.aarch64-unknown-linux-gnu] -llvm-config = "/mnt/redox/recipes/dev/rust/target/x86_64-unknown-redox/toolchain/bin/llvm-config" +llvm-config = "COOKBOOK_TOOLCHAIN/bin/llvm-config" [target.x86_64-unknown-linux-gnu] -llvm-config = "/mnt/redox/recipes/dev/rust/target/x86_64-unknown-redox/toolchain/bin/llvm-config" +llvm-config = "COOKBOOK_TOOLCHAIN/bin/llvm-config" diff --git a/recipes/dev/rust/recipe.toml b/recipes/dev/rust/recipe.toml index fdf501862..c8cce01f0 100644 --- a/recipes/dev/rust/recipe.toml +++ b/recipes/dev/rust/recipe.toml @@ -8,6 +8,8 @@ template = "custom" dependencies = [ "llvm21", "zlib", + "curl", + "openssl1", ] dev-dependencies = [ "llvm21.dev", @@ -36,20 +38,31 @@ export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS="${RUSTFLAGS_BOOTSTRAP}" # Don't poison the stage1 compiler (host -> host) unset AR AS CC CXX LD LDFLAGS NM OBJCOPY OBJDUMP RANLIB READELF RUSTFLAGS STRIP + +# modify config.toml to correct path, only do this once as it trigger full rebuild +if [ ! -f config.toml ]; then + cat ${COOKBOOK_RECIPE}/config.toml > config.toml + sed -i "s|COOKBOOK_SYSROOT|${COOKBOOK_SYSROOT}|g" config.toml + sed -i "s|COOKBOOK_TOOLCHAIN|${COOKBOOK_TOOLCHAIN}|g" config.toml +fi + python3 "${COOKBOOK_SOURCE}/x.py" install \ - --config "${COOKBOOK_RECIPE}/config.toml" \ + --config config.toml \ --jobs $(nproc) mkdir -p "${COOKBOOK_STAGE}"/usr rsync -av --delete "${COOKBOOK_BUILD}"/install/* "${COOKBOOK_STAGE}"/usr/ -# TODO: rustdoc +rm -rf "${COOKBOOK_STAGE}"/usr/lib/rustlib/*.log """ - + [package] -dependencies = [ - "cargo" -] # TODO: Not implemented # version_script = """ # printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" # """ + +[[optional-packages]] +name = "doc" +files = [ + "usr/share/doc/**", +] diff --git a/recipes/groups/dev-essential/recipe.toml b/recipes/groups/dev-essential/recipe.toml index efe81319b..b6621ac86 100644 --- a/recipes/groups/dev-essential/recipe.toml +++ b/recipes/groups/dev-essential/recipe.toml @@ -2,7 +2,6 @@ dependencies = [ "autoconf", "automake", - "cargo", "gcc13", "gcc13.cxx", "llvm21", From c756677427c9b66c383a24a7f0af80ca36c9a091 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 31 Dec 2025 00:56:12 +0700 Subject: [PATCH 037/407] Flipped arg --- src/cook/cook_build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index 1b88de0aa..a7e537332 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -173,8 +173,8 @@ pub fn build( name: &PackageName, recipe: &Recipe, offline_mode: bool, - check_source: bool, clean_build: bool, + check_source: bool, logger: &PtyOut, ) -> Result<(Vec, BTreeSet), String> { let sysroot_dir = target_dir.join("sysroot"); From bd781773290223e2c24e4b90f3bd8ada99a8c538 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 29 Dec 2025 21:53:57 +0700 Subject: [PATCH 038/407] Flat out package names when building --- src/bin/repo.rs | 1 + src/cook/cook_build.rs | 2 +- src/recipe.rs | 32 ++++++++++++++++++++++++++++---- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 8a939da3f..82664f14a 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -497,6 +497,7 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec Result, PackageError> { let mut packages = Self::new_recursive( names, @@ -399,6 +405,24 @@ impl CookRecipe { } } + if flatten_opt_package { + let old_packages = packages; + packages = Vec::new(); + let mut packages_set = BTreeSet::new(); + for mut package in old_packages { + let is_host = package.name.is_host(); + let mut name = package.name.with_suffix(None); + if is_host { + name = name.with_host(); + } + if !packages_set.contains(name.as_str()) { + packages_set.insert(name.to_string()); + package.name = name; + packages.push(package); + } + } + } + Ok(packages) } From 7654063412fff420f68ef3cfbe074463b6e5148c Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 31 Dec 2025 07:38:21 +0700 Subject: [PATCH 039/407] Refactor out deps helper fn --- src/bin/repo.rs | 15 +++++------ src/cook/cook_build.rs | 4 +-- src/recipe.rs | 56 +++++++++++++++++++++--------------------- 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 82664f14a..9fe66a217 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -10,7 +10,7 @@ use cookbook::cook::pty::{PtyOut, UnixSlavePty, flush_pty, setup_pty}; use cookbook::cook::script::KILL_ALL_PID; use cookbook::cook::tree::{WalkTreeEntry, display_tree_entry, format_size, walk_tree_entry}; use cookbook::log_to_pty; -use cookbook::recipe::CookRecipe; +use cookbook::recipe::{CookRecipe, recipes_flatten_package_names, recipes_mark_as_deps}; use pkg::PackageName; use pkg::package::PackageError; use ratatui::Terminal; @@ -492,13 +492,14 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec Result, PackageError> { - let mut packages = Self::new_recursive( + let packages = Self::new_recursive( names, true, include_dev, @@ -399,30 +397,6 @@ impl CookRecipe { WALK_DEPTH, )?; - if mark_is_deps { - for package in packages.iter_mut() { - package.is_deps = !names.contains(&package.name); - } - } - - if flatten_opt_package { - let old_packages = packages; - packages = Vec::new(); - let mut packages_set = BTreeSet::new(); - for mut package in old_packages { - let is_host = package.name.is_host(); - let mut name = package.name.with_suffix(None); - if is_host { - name = name.with_host(); - } - if !packages_set.contains(name.as_str()) { - packages_set.insert(name.to_string()); - package.name = name; - packages.push(package); - } - } - } - Ok(packages) } @@ -497,6 +471,32 @@ impl CookRecipe { } } +// TODO: Wrap these vectors in a struct + +pub fn recipes_mark_as_deps(names: &[PackageName], packages: &mut Vec) { + for package in packages.iter_mut() { + package.is_deps = !names.contains(&package.name); + } +} + +pub fn recipes_flatten_package_names(packages: Vec) -> Vec { + let mut new_packages = Vec::new(); + let mut packages_set = BTreeSet::new(); + for mut package in packages { + let is_host = package.name.is_host(); + let mut name = package.name.with_suffix(None); + if is_host { + name = name.with_host(); + } + if !packages_set.contains(name.as_str()) { + packages_set.insert(name.to_string()); + package.name = name; + new_packages.push(package); + } + } + new_packages +} + #[derive(Serialize, Deserialize)] pub struct AutoDeps { pub packages: BTreeSet, From 802c162cc0fb95c13657bdba218a384db257b412 Mon Sep 17 00:00:00 2001 From: Wildan Mubarok Date: Wed, 31 Dec 2025 04:11:30 +0000 Subject: [PATCH 040/407] Just overwrite config.toml --- recipes/dev/rust/config.toml | 1 - recipes/dev/rust/recipe.toml | 15 +++------------ 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/recipes/dev/rust/config.toml b/recipes/dev/rust/config.toml index 588402686..4418c3dd3 100644 --- a/recipes/dev/rust/config.toml +++ b/recipes/dev/rust/config.toml @@ -1,4 +1,3 @@ -# Note: this file is not tracked by cookbook, run `make c.rust` after change. [llvm] download-ci-llvm = false static-libstdcpp = false diff --git a/recipes/dev/rust/recipe.toml b/recipes/dev/rust/recipe.toml index c8cce01f0..dadb3e1d8 100644 --- a/recipes/dev/rust/recipe.toml +++ b/recipes/dev/rust/recipe.toml @@ -39,12 +39,9 @@ export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS="${RUSTFLAGS_BOOTSTRAP}" # Don't poison the stage1 compiler (host -> host) unset AR AS CC CXX LD LDFLAGS NM OBJCOPY OBJDUMP RANLIB READELF RUSTFLAGS STRIP -# modify config.toml to correct path, only do this once as it trigger full rebuild -if [ ! -f config.toml ]; then - cat ${COOKBOOK_RECIPE}/config.toml > config.toml - sed -i "s|COOKBOOK_SYSROOT|${COOKBOOK_SYSROOT}|g" config.toml - sed -i "s|COOKBOOK_TOOLCHAIN|${COOKBOOK_TOOLCHAIN}|g" config.toml -fi +cat ${COOKBOOK_RECIPE}/config.toml > config.toml +sed -i "s|COOKBOOK_SYSROOT|${COOKBOOK_SYSROOT}|g" config.toml +sed -i "s|COOKBOOK_TOOLCHAIN|${COOKBOOK_TOOLCHAIN}|g" config.toml python3 "${COOKBOOK_SOURCE}/x.py" install \ --config config.toml \ @@ -54,12 +51,6 @@ mkdir -p "${COOKBOOK_STAGE}"/usr rsync -av --delete "${COOKBOOK_BUILD}"/install/* "${COOKBOOK_STAGE}"/usr/ rm -rf "${COOKBOOK_STAGE}"/usr/lib/rustlib/*.log """ - -[package] -# TODO: Not implemented -# version_script = """ -# printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" -# """ [[optional-packages]] name = "doc" From 0ab40110b64cdc5c7ac31da68348e556a106dd90 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 31 Dec 2025 16:08:03 +0700 Subject: [PATCH 041/407] Make clean relibc implies clean sysroot --- mk/prefix.mk | 4 ++-- mk/repo.mk | 12 +++++++++++- src/bin/repo.rs | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index fa7ead17d..4af8f8254 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -22,8 +22,8 @@ prefix: $(PREFIX)/sysroot # Update relibc used for compiling and clean all statically linked recipes prefix_clean: | $(FSTOOLS_TAG) - rm -rf $(PREFIX)/relibc-install $(PREFIX)/sysroot $(REPO_TAG) - $(MAKE) c.base,base-initfs,extrautils,kernel,ion,pkgutils,redoxfs,relibc + $(MAKE) c.relibc + $(MAKE) c.base,base-initfs,extrautils,kernel,ion,pkgutils,redoxfs $(PREFIX)/relibc-install: $(PREFIX)/rust-install | $(FSTOOLS_TAG) $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) diff --git a/mk/repo.mk b/mk/repo.mk index cfe0424e7..f97982ba6 100644 --- a/mk/repo.mk +++ b/mk/repo.mk @@ -39,6 +39,16 @@ else @./target/release/repo find $(foreach f,$(subst $(comma), ,$*),$(f)) endif +# Invoke clean for relibc in recipe and relibc in sysroot +c.relibc: $(FSTOOLS_TAG) FORCE +ifeq ($(PODMAN_BUILD),1) + $(PODMAN_RUN) make $@ +else + ./target/release/repo clean relibc + rm -rf $(PREFIX)/relibc-install $(PREFIX)/sysroot $(REPO_TAG) + @echo "\033[1;36;49mSysroot cleaned\033[0m" +endif + # Invoke clean for one or more targets separated by comma c.%: $(FSTOOLS_TAG) FORCE ifeq ($(PODMAN_BUILD),1) @@ -58,7 +68,7 @@ else endif # Invoke repo.sh for one or more targets separated by comma -r.%: $(FSTOOLS_TAG) FORCE +r.%: prefix $(FSTOOLS_TAG) FORCE ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 9fe66a217..7dcbc5f16 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -237,7 +237,7 @@ fn main_inner() -> anyhow::Result<()> { return publish_packages(&recipe_names, &config.repo_dir); } - if verbose { + if verbose && recipe_names.len() > 1 { println!( "\nCommand '{}' completed for {} recipes.", command.to_string(), From 34e9d4494d990ccb87f1fa7ae0a42fc327d0652f Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 31 Dec 2025 16:44:43 +0700 Subject: [PATCH 042/407] Don't generate dsa key for server-demo --- config/x86_64/server-demo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/x86_64/server-demo.toml b/config/x86_64/server-demo.toml index 53c3d1773..252d226e1 100644 --- a/config/x86_64/server-demo.toml +++ b/config/x86_64/server-demo.toml @@ -248,8 +248,7 @@ path = "/root/keygen.sh" data = """ #!/usr/bin/env bash -if [ ! -f /etc/ssh/ssh_host_dsa_key ]; then -ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N "" +if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" From d5189f8f46555149f2152302b209a7273df7d8ce Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 31 Dec 2025 16:48:04 +0700 Subject: [PATCH 043/407] Don't print info if already PREFIX_BINARY=0 --- mk/config.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mk/config.mk b/mk/config.mk index d985c3964..8b1b3ed12 100644 --- a/mk/config.mk +++ b/mk/config.mk @@ -61,6 +61,7 @@ ifneq ($(PODMAN_BUILD),1) FSTOOLS_IN_PODMAN=0 HOST_TARGET := $(shell env -u RUSTUP_TOOLCHAIN rustc -vV | grep host | cut -d: -f2 | tr -d " ") # x86_64 linux hosts have all toolchains +ifeq ($(PREFIX_BINARY),1) ifneq ($(HOST_TARGET),x86_64-unknown-linux-gnu) ifeq ($(ARCH),aarch64) # aarch64 linux hosts have aarch64 toolchain @@ -74,6 +75,7 @@ ifneq ($(HOST_TARGET),x86_64-unknown-linux-gnu) endif endif endif +endif ifeq ($(SCCACHE_BUILD),1) ifeq (,$(shell command -v sccache)) From 395b9867d1203e889715610258eaec263e160234 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 31 Dec 2025 16:52:16 +0700 Subject: [PATCH 044/407] Limit relibc jobs --- recipes/core/relibc/recipe.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/recipes/core/relibc/recipe.toml b/recipes/core/relibc/recipe.toml index 046479417..478952585 100644 --- a/recipes/core/relibc/recipe.toml +++ b/recipes/core/relibc/recipe.toml @@ -4,6 +4,9 @@ git = "https://gitlab.redox-os.org/redox-os/relibc.git" [build] template = "custom" script = """ +# obscure crash if jobs number is too much +COOKBOOK_MAKE_JOBS="$(( ${COOKBOOK_MAKE_JOBS} > 8 ? 8 : ${COOKBOOK_MAKE_JOBS} ))" + export CARGO=${CARGO:-env -u CARGO cargo} "${COOKBOOK_MAKE}" \ -C "${COOKBOOK_SOURCE}" \ From 8470ecd84a2fc0681d72f2d2305474ca07f532cf Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 1 Jan 2026 21:30:07 +0700 Subject: [PATCH 045/407] Allow not compiling FUSE when requested --- mk/config.mk | 4 ++++ mk/fstools.mk | 7 +++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mk/config.mk b/mk/config.mk index 8b1b3ed12..a1a72a31b 100644 --- a/mk/config.mk +++ b/mk/config.mk @@ -157,6 +157,8 @@ INSTALLER=$(FSTOOLS)/bin/redox_installer REDOXFS=$(FSTOOLS)/bin/redoxfs REDOXFS_MKFS=$(FSTOOLS)/bin/redoxfs-mkfs INSTALLER_OPTS=--cookbook=. +INSTALLER_FEATURES= +REDOXFS_FEATURES= COOKBOOK_OPTS="--filesystem=$(FILESYSTEM_CONFIG)" ifeq ($(REPO_BINARY),1) INSTALLER_OPTS+=--repo-binary @@ -164,6 +166,8 @@ COOKBOOK_OPTS+=--repo-binary endif ifeq ($(FSTOOLS_NO_MOUNT),1) INSTALLER_OPTS+=--no-mount +INSTALLER_FEATURES=--no-default-features --features installer +REDOXFS_FEATURES= --no-default-features --features std,log endif REPO_TAG=$(BUILD)/repo.tag diff --git a/mk/fstools.mk b/mk/fstools.mk index 0a294b9c0..4ee5cf325 100644 --- a/mk/fstools.mk +++ b/mk/fstools.mk @@ -13,16 +13,15 @@ endif else rm -rf $@ $@.partial mkdir -p $@.partial - ln -sr recipes $@.partial/recipes + ln -s ../../recipes $@.partial/recipes # Install cookbook, installer, and redoxfs for host (may be outside of podman container) - #TODO: Build and install installer and redoxfs using cookbook? cd $@.partial && \ export CARGO_TARGET_DIR=../$@-target && \ $(HOST_CARGO) install --root . --path ../.. --locked && \ env -u RUSTUP_TOOLCHAIN ./bin/repo fetch installer redoxfs && \ - $(HOST_CARGO) install --root . --path recipes/core/installer/source && \ - $(HOST_CARGO) install --root . --path recipes/core/redoxfs/source + $(HOST_CARGO) install --root . --path recipes/core/installer/source $(INSTALLER_FEATURES) && \ + $(HOST_CARGO) install --root . --path recipes/core/redoxfs/source $(REDOXFS_FEATURES) mv $@.partial $@ touch $@ From b007d20f9240561ed6d8a12617b608e2f2288bb7 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 2 Jan 2026 18:09:17 +0700 Subject: [PATCH 046/407] Avoid compiling cookbook on host --- mk/fstools.mk | 17 ++++++++++++----- mk/repo.mk | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/mk/fstools.mk b/mk/fstools.mk index 4ee5cf325..7df6d99ca 100644 --- a/mk/fstools.mk +++ b/mk/fstools.mk @@ -3,7 +3,7 @@ fstools: $(FSTOOLS_TAG) $(FSTOOLS) # These tools run inside Podman if it is used, or on the host if Podman is not used -$(FSTOOLS): $(CONTAINER_TAG) +$(FSTOOLS): | prefix $(CONTAINER_TAG) $(FSTOOLS_TAG) ifeq ($(PODMAN_BUILD),1) ifeq ($(FSTOOLS_IN_PODMAN),1) $(PODMAN_RUN) make $@ @@ -14,12 +14,11 @@ else rm -rf $@ $@.partial mkdir -p $@.partial ln -s ../../recipes $@.partial/recipes + $(MAKE) fstools_fetch PODMAN_BUILD=$(SKIP_CHECK_TOOLS) - # Install cookbook, installer, and redoxfs for host (may be outside of podman container) + # Compile installer and redoxfs for host (may be outside of podman container) cd $@.partial && \ export CARGO_TARGET_DIR=../$@-target && \ - $(HOST_CARGO) install --root . --path ../.. --locked && \ - env -u RUSTUP_TOOLCHAIN ./bin/repo fetch installer redoxfs && \ $(HOST_CARGO) install --root . --path recipes/core/installer/source $(INSTALLER_FEATURES) && \ $(HOST_CARGO) install --root . --path recipes/core/redoxfs/source $(REDOXFS_FEATURES) @@ -27,11 +26,19 @@ else touch $@ endif -$(FSTOOLS_TAG): $(FSTOOLS) +fstools_fetch: $(FSTOOLS_TAG) FORCE +ifeq ($(PODMAN_BUILD),1) + $(PODMAN_RUN) make $@ +else + ./target/release/repo fetch installer redoxfs +endif + +$(FSTOOLS_TAG): ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else $(HOST_CARGO) build --manifest-path Cargo.toml --release --locked + mkdir -p $(@D) touch $@ endif diff --git a/mk/repo.mk b/mk/repo.mk index f97982ba6..fde29b408 100644 --- a/mk/repo.mk +++ b/mk/repo.mk @@ -1,6 +1,6 @@ # Configuration file for recipe commands -$(REPO_TAG): prefix $(FILESYSTEM_CONFIG) | $(FSTOOLS_TAG) $(CONTAINER_TAG) +$(REPO_TAG): prefix $(FILESYSTEM_CONFIG) | $(FSTOOLS) $(FSTOOLS_TAG) $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else From 5e9f08ac0593743c3460d6d9905a09246aac2d96 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 2 Jan 2026 18:29:35 +0700 Subject: [PATCH 047/407] Fix prefix build in podman --- mk/prefix.mk | 46 +++++++++++++++++++++++----- recipes/dev/binutils-gdb/recipe.toml | 7 +++++ recipes/dev/gcc13/recipe.toml | 5 +-- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index 4af8f8254..9b44ffba0 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -17,9 +17,17 @@ UPSTREAM_RUSTC_VERSION=2025-11-15 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_VERBOSE=true COOKBOOK_NONSTOP=false prefix: $(PREFIX)/sysroot +PREFIX_STRIP=\ + mkdir -p bin libexec "$(TARGET)/bin" && \ + find bin libexec "$(TARGET)/bin" "$(TARGET)/lib" \ + -type f \ + -exec strip --strip-unneeded {} ';' \ + 2> /dev/null + # Update relibc used for compiling and clean all statically linked recipes prefix_clean: | $(FSTOOLS_TAG) $(MAKE) c.relibc @@ -36,7 +44,7 @@ else cp -r "$(PREFIX)/rust-install/$(GNU_TARGET)/include/c++" "$@.partial/$(GNU_TARGET)/include/c++" cp -r "$(PREFIX)/rust-install/lib/rustlib/$(HOST_TARGET)/lib/" "$@.partial/lib/rustlib/$(HOST_TARGET)/" export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \ - export CARGO="env -u CARGO cargo" CI=1 && \ + export CARGO="env -u CARGO cargo" $(PREFIX_CONFIG) && \ ./target/release/repo cook relibc cp -r "$(RELIBC_TARGET)/stage/usr/". "$@.partial/$(GNU_TARGET)" touch "$@.partial" @@ -59,7 +67,7 @@ else @echo "\033[1;36;49mBuilding libtool-install\033[0m" rm -rf "$@.partial" "$@" mkdir -p "$@.partial" - export CI=1 COOKBOOK_CLEAN_BUILD=true COOKBOOK_HOST_SYSROOT=/usr && \ + export $(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr && \ ./target/release/repo cook host:libtool cp -r "$(LIBTOOL_TARGET)/stage/usr/". "$@.partial" touch "$@.partial" @@ -112,7 +120,7 @@ else @echo "\033[1;36;49mBuilding binutils-install\033[0m" rm -rf "$@.partial" "$@" mkdir -p "$@.partial" - export CI=1 COOKBOOK_CLEAN_BUILD=true COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) && \ + export CI=1 $(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) && \ ./target/release/repo cook host:binutils-gdb cp -r "$(BINUTILS_TARGET)/stage/usr/". "$@.partial" touch "$@.partial" @@ -126,8 +134,8 @@ else @echo "\033[1;36;49mBuilding gcc-freestanding-install\033[0m" rm -rf "$@.partial" "$@" $(PREFIX)/relibc-freestanding-install $(PREFIX)/sysroot mkdir -p "$@.partial" $(PREFIX)/relibc-freestanding-install/$(GNU_TARGET)/include - export CI=1 PATH="$(ROOT)/$(PREFIX)/binutils-install/bin:$$PATH" \ - COOKBOOK_CLEAN_BUILD=true COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) \ + export $(PREFIX_CONFIG) PATH="$(ROOT)/$(PREFIX)/binutils-install/bin:$$PATH" \ + COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) \ COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_SYSROOT=$(ROOT)/$(PREFIX)/relibc-freestanding-install/$(GNU_TARGET) && \ ./target/release/repo cook host:gcc13 cp -r "$(GCC_TARGET)/stage/usr/". "$@.partial" @@ -148,7 +156,7 @@ else export CARGO="env -u CARGO -u RUSTUP_TOOLCHAIN cargo" && \ export PATH="$(ROOT)/$(PREFIX)/gcc-freestanding-install/bin:$$PATH" && \ export CC_$(subst -,_,$(TARGET))="$(GNU_TARGET)-gcc -isystem $(ROOT)/$@.partial/$(GNU_TARGET)/include" LINKFLAGS="" && \ - export CI=1 COOKBOOK_CLEAN_BUILD=true COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \ + export $(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \ ./target/release/repo cook relibc cp -r "$(RELIBC_FREESTANDING_TARGET)/stage/usr/". "$@.partial/$(GNU_TARGET)" touch "$@.partial" @@ -186,7 +194,7 @@ else ifneq ($(TARGET),riscv64gc-unknown-redox) ifneq ($(TARGET),i586-unknown-redox) export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \ - export CI=1 COOKBOOK_CLEAN_BUILD=true "COOKBOOK_HOST_SYSROOT=$(ROOT)/$@.partial" COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \ + export $(PREFIX_CONFIG) "COOKBOOK_HOST_SYSROOT=$(ROOT)/$@.partial" COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \ rm -rf "$(LIBSTDCXX_TARGET)/stage" && ./target/release/repo cook libstdcxx-v3 cp -r "$(LIBSTDCXX_TARGET)/stage/usr/". "$@.partial/$(GNU_TARGET)" endif @@ -221,21 +229,36 @@ $(PREFIX_RUST_VERSION_TAG): touch $@ $(PREFIX)/rustc-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) +ifeq ($(PODMAN_BUILD),1) + $(PODMAN_RUN) make $@ +else mkdir -p "$(@D)" wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rustc-nightly-$(HOST_TARGET).tar.xz" mv $@.partial $@ +endif $(PREFIX)/cargo-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) +ifeq ($(PODMAN_BUILD),1) + $(PODMAN_RUN) make $@ +else mkdir -p "$(@D)" wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/cargo-nightly-$(HOST_TARGET).tar.xz" mv $@.partial $@ +endif $(PREFIX)/rust-std-host-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) +ifeq ($(PODMAN_BUILD),1) + $(PODMAN_RUN) make $@ +else mkdir -p "$(@D)" wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-std-nightly-$(HOST_TARGET).tar.xz" mv $@.partial $@ +endif $(PREFIX)/rust-std-target-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) +ifeq ($(PODMAN_BUILD),1) + $(PODMAN_RUN) make $@ +else mkdir -p "$(@D)" ifeq ($(TARGET),x86_64-unknown-redox) wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-std-nightly-$(TARGET).tar.xz" @@ -243,13 +266,21 @@ ifeq ($(TARGET),x86_64-unknown-redox) else touch $@ endif +endif $(PREFIX)/rust-src-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG) +ifeq ($(PODMAN_BUILD),1) + $(PODMAN_RUN) make $@ +else mkdir -p "$(@D)" wget -O $@.partial "https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-src-nightly.tar.xz" mv $@.partial $@ +endif $(PREFIX)/rust-install: $(PREFIX)/gcc-install $(PREFIX)/rustc-install.tar.xz $(PREFIX)/cargo-install.tar.xz $(PREFIX)/rust-std-host-install.tar.xz $(PREFIX)/rust-std-target-install.tar.xz $(PREFIX)/rust-src-install.tar.xz +ifeq ($(PODMAN_BUILD),1) + $(PODMAN_RUN) make $@ +else @echo "\033[1;36;49mBuilding rust-install\033[0m" rm -rf "$@.partial" "$@" mkdir -p "$@.partial" @@ -264,6 +295,7 @@ endif rm -f "$@.partial/manifest.in" touch "$@.partial" mv "$@.partial" "$@" +endif # BUILD RUST --------------------------------------------------- else diff --git a/recipes/dev/binutils-gdb/recipe.toml b/recipes/dev/binutils-gdb/recipe.toml index a1d4c733c..33f3b8827 100644 --- a/recipes/dev/binutils-gdb/recipe.toml +++ b/recipes/dev/binutils-gdb/recipe.toml @@ -4,6 +4,12 @@ branch = "redox-2.43.1" [build] template = "custom" +dependencies = [ +# "libgmp", +# "libmpfr", +# TODO: this zlib get linked when boostrapping binutils +# "zlib" +] script = """ DYNAMIC_INIT @@ -16,6 +22,7 @@ COOKBOOK_CONFIGURE_FLAGS+=( --target="${COOKBOOK_CROSS_GNU_TARGET:-$GNU_TARGET}" --enable-default-hash-style=gnu --disable-werror +# --with-system-zlib ) cookbook_configure diff --git a/recipes/dev/gcc13/recipe.toml b/recipes/dev/gcc13/recipe.toml index 4a460b0ad..2422b7fc6 100644 --- a/recipes/dev/gcc13/recipe.toml +++ b/recipes/dev/gcc13/recipe.toml @@ -14,7 +14,8 @@ dependencies = [ "libgmp", "libmpfr", "mpc", - "zlib" +# TODO: this zlib get linked when boostrapping gcc +# "zlib" ] script = """ DYNAMIC_STATIC_INIT @@ -52,7 +53,7 @@ COOKBOOK_CONFIGURE_FLAGS+=( --enable-initfini-array --disable-nls --disable-multilib - --with-system-zlib +# --with-system-zlib --enable-host-shared --enable-threads=posix --enable-frame-pointer From bba611dfa53e38bf1c9d28f55e12e6f5da2675e5 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 2 Jan 2026 23:08:08 +0700 Subject: [PATCH 048/407] Fix relibc jobs not being passed --- recipes/core/relibc/recipe.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/core/relibc/recipe.toml b/recipes/core/relibc/recipe.toml index 478952585..c0c059d4b 100644 --- a/recipes/core/relibc/recipe.toml +++ b/recipes/core/relibc/recipe.toml @@ -10,7 +10,7 @@ COOKBOOK_MAKE_JOBS="$(( ${COOKBOOK_MAKE_JOBS} > 8 ? 8 : ${COOKBOOK_MAKE_JOBS} )) export CARGO=${CARGO:-env -u CARGO cargo} "${COOKBOOK_MAKE}" \ -C "${COOKBOOK_SOURCE}" \ - -j"$($NPROC)" \ + -j"${COOKBOOK_MAKE_JOBS}" \ DESTDIR="${COOKBOOK_STAGE}/usr" \ install """ From f71d59b8af9cdd07ad85b606c58a31d2fbe1a591 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Fri, 2 Jan 2026 18:30:50 -0300 Subject: [PATCH 049/407] Some improvements and fixes to CONTRIBUTING.md --- CONTRIBUTING.md | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 073d72144..bdbad207b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -63,6 +63,24 @@ By sending a message in the room, your MR will not be forgotten or accumulate co You can read the best practices and guidelines on the [Best practices and guidelines](https://doc.redox-os.org/book/best-practices.html) chapter. +## Development Recommendations and Tips + +- Read the entire [Build System Reference](https://doc.redox-os.org/book/build-system-reference.html) and [Developer FAQ](https://doc.redox-os.org/book/developer-faq.html) pages +- Make sure your build system is up-to-date, read the [Update The Build System](https://doc.redox-os.org/book/build-system-reference.html#update-the-build-system) section if in doubt. +- If you want to make local changes in recipe sources it's recommended to automatic recipe source update, read [this](https://doc.redox-os.org/book/configuration-settings.html#local-recipe-changes) section to learn how to this for one or multiple recipes and [this](https://doc.redox-os.org/book/configuration-settings.html#cookbook-offline-mode) section for all recipes. +- If you want to make changes to system components, drivers or RedoxFS you need to manually update initfs, read [this](https://doc.redox-os.org/book/coding-and-building.html#how-to-update-initfs) section to learn how to do that. +- If some program can't build or work, something can be missing/hiding on [relibc](https://gitlab.redox-os.org/redox-os/relibc), like a POSIX/Linux function or bug. +- If you have some error on QEMU remember to test different settings or verify your operating system (Pop_OS!, Ubuntu, Debian and Fedora are the recommend Linux distributions to do testing/development for Redox). +- Remember to log all errors, you can use this command as example: + +```sh +your-command 2>&1 | tee file-name.log +``` + +- If you have a problem that seems to not have a solution, think on simple/stupid things. Sometimes you are very confident on your method and forget obvious things (very common). +- If you want a quick review of your Merge Request, make it small. +- If your big Merge Request is taking too long to be reviewed and merged try to split it in small MRs. But make sure it don't break anything, if this method break your changes, don't shrink. + ## Style Guidelines ### Rust @@ -95,7 +113,7 @@ Please follow [our process](https://doc.redox-os.org/book/creating-proper-pull-r ## Important Places to Contribute -Before starting to contribute, we recommend reading the [Website FAQ](https://www.redox-os.org/faq/) and the [Redox Book](https://doc.redox-os.org/book/). +Before starting to contribute, we recommend reading the [General FAQ](https://www.redox-os.org/faq/) and the [Redox Book](https://doc.redox-os.org/book/). You can contribute to the Redox documentation and code on the following repositories (non-exhaustive, easiest-to-hardest order): @@ -224,10 +242,6 @@ You can read the [Libraries and APIs](https://doc.redox-os.org/book/libraries-ap To learn how to configure your VS Code to do Redox development please read the information below the [Visual Studio Code Configuration](https://doc.redox-os.org/book/coding-and-building.html#visual-studio-code-configuration) section. -## Development Tips - -You can find important tips on the [Development Tips](https://doc.redox-os.org/book/coding-and-building.html#development-tips) section. - ## References We maintain a list of wikis, articles and videos to learn Rust, OS development and computer science on the [References](https://doc.redox-os.org/book/references.html) page. From d15c096addd3d657b443b8126c36cfeaf515a597 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 3 Jan 2026 07:57:08 +0700 Subject: [PATCH 050/407] Fix podman build skipped --- mk/fstools.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mk/fstools.mk b/mk/fstools.mk index 7df6d99ca..7ec951cb1 100644 --- a/mk/fstools.mk +++ b/mk/fstools.mk @@ -33,7 +33,7 @@ else ./target/release/repo fetch installer redoxfs endif -$(FSTOOLS_TAG): +$(FSTOOLS_TAG): $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else From 7670c9aebf61c86097999835a6e9fafc4453567a Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 3 Jan 2026 08:25:09 +0700 Subject: [PATCH 051/407] Fix DYNAMIC_INIT support targets --- src/cook/script.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/cook/script.rs b/src/cook/script.rs index fe7736829..1b42341c5 100644 --- a/src/cook/script.rs +++ b/src/cook/script.rs @@ -10,15 +10,7 @@ function DYNAMIC_INIT { } case "${TARGET}" in - "x86_64-unknown-redox") - ;; - "aarch64-unknown-redox") - ;; - "x86_64-unknown-linux-gnu") - ;; - "aarch64-unknown-linux-gnu") - ;; - *) + "i586-unknown-redox" | "riscv64gc-unknown-redox") [ -z "${COOKBOOK_VERBOSE}" ] || echo "WARN: ${TARGET} does not support dynamic linking." >&2 return ;; From 570f2537fe7ae8e0f23f26a45127a37b1800f351 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 3 Jan 2026 15:42:06 +0700 Subject: [PATCH 052/407] Fix libtool init in prefix gcc --- mk/podman.mk | 3 +-- mk/prefix.mk | 13 +++++++++---- recipes/dev/gcc13/recipe.toml | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/mk/podman.mk b/mk/podman.mk index e79ba7518..e30ddf49e 100644 --- a/mk/podman.mk +++ b/mk/podman.mk @@ -57,12 +57,11 @@ container_kill: FORCE ## Must match the value of CONTAINER_TAG in config.mk build/container.tag: $(CONTAINERFILE) ifeq ($(PODMAN_BUILD),1) - rm -f build/container.tag + rm -f $@ $(FSTOOLS_TAG) -podman image rm --force $(IMAGE_TAG) || true mkdir -p $(PODMAN_HOME) @echo "Building Podman image. This may take some time." cat $(CONTAINERFILE) | podman build --file - $(PODMAN_VOLUMES) --tag $(IMAGE_TAG) - @echo "Mapping Podman user space. Please wait." $(PODMAN_RUN) bash -e podman/rustinstall.sh mkdir -p build touch $@ diff --git a/mk/prefix.mk b/mk/prefix.mk index 9b44ffba0..7e3e22692 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -70,6 +70,10 @@ else export $(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr && \ ./target/release/repo cook host:libtool cp -r "$(LIBTOOL_TARGET)/stage/usr/". "$@.partial" + mv "$@.partial/bin/libtoolize" "$@.partial/bin/libtoolize.orig" +# adapt path for libtoolize + sed 's|/usr/share|$(ROOT)/$@/share|g' "$@.partial/bin/libtoolize.orig" > "$@.partial/bin/libtoolize" + chmod 0755 "$@.partial/bin/libtoolize" touch "$@.partial" mv "$@.partial" "$@" endif @@ -82,7 +86,8 @@ else cp -r "$(PREFIX)/relibc-install/" "$@" cp -r "$(PREFIX)/libtool-install/". "$@" # adapt path for libtoolize - $(SED) -i 's|/usr/share|$(ROOT)/$@/share|g' "$@/bin/libtoolize" + sed 's|/usr/share|$(ROOT)/$@/share|g' "$@/bin/libtoolize.orig" > "$@/bin/libtoolize" + chmod 0755 "$@/bin/libtoolize" touch "$@" endif @@ -127,15 +132,15 @@ else mv "$@.partial" "$@" endif -$(PREFIX)/gcc-freestanding-install: $(PREFIX)/binutils-install | $(FSTOOLS_TAG) $(CONTAINER_TAG) +$(PREFIX)/gcc-freestanding-install: $(PREFIX)/libtool-install $(PREFIX)/binutils-install | $(FSTOOLS_TAG) $(CONTAINER_TAG) ifeq ($(PODMAN_BUILD),1) $(PODMAN_RUN) make $@ else @echo "\033[1;36;49mBuilding gcc-freestanding-install\033[0m" rm -rf "$@.partial" "$@" $(PREFIX)/relibc-freestanding-install $(PREFIX)/sysroot mkdir -p "$@.partial" $(PREFIX)/relibc-freestanding-install/$(GNU_TARGET)/include - export $(PREFIX_CONFIG) PATH="$(ROOT)/$(PREFIX)/binutils-install/bin:$$PATH" \ - COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) \ + export $(PREFIX_CONFIG) PATH="$(ROOT)/$(PREFIX)/libtool-install/bin:$(ROOT)/$(PREFIX)/binutils-install/bin:$$PATH" \ + COOKBOOK_LIBTOOL_DIR=$(ROOT)/$(PREFIX)/libtool-install COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) \ COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_SYSROOT=$(ROOT)/$(PREFIX)/relibc-freestanding-install/$(GNU_TARGET) && \ ./target/release/repo cook host:gcc13 cp -r "$(GCC_TARGET)/stage/usr/". "$@.partial" diff --git a/recipes/dev/gcc13/recipe.toml b/recipes/dev/gcc13/recipe.toml index 2422b7fc6..597f8baf2 100644 --- a/recipes/dev/gcc13/recipe.toml +++ b/recipes/dev/gcc13/recipe.toml @@ -5,7 +5,8 @@ shallow_clone = true script = """ DYNAMIC_INIT COOKBOOK_AUTORECONF=autoreconf2.69 autotools_recursive_regenerate -I"$(realpath ./config)" -cp -fpv "${COOKBOOK_HOST_SYSROOT}"/share/libtool/build-aux/{config.sub,config.guess,install-sh} libiberty/ +LIBTOOL_BUILD_AUX="${COOKBOOK_LIBTOOL_DIR:-$COOKBOOK_HOST_SYSROOT}"/share/libtool/build-aux +cp -fpv "$LIBTOOL_BUILD_AUX"/{config.sub,config.guess,install-sh} libiberty/ """ [build] From 9b44e603c8f881d9181b2d8072bb85b33117e782 Mon Sep 17 00:00:00 2001 From: Bendeguz Pisch Date: Sat, 3 Jan 2026 13:46:14 +0100 Subject: [PATCH 053/407] Relocate and update file and jq recipes. --- recipes/dev/jq/recipe.toml | 5 +++++ recipes/{wip => }/tools/file/recipe.toml | 2 +- recipes/wip/dev/other/jq/recipe.toml | 5 ----- 3 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 recipes/dev/jq/recipe.toml rename recipes/{wip => }/tools/file/recipe.toml (54%) delete mode 100644 recipes/wip/dev/other/jq/recipe.toml diff --git a/recipes/dev/jq/recipe.toml b/recipes/dev/jq/recipe.toml new file mode 100644 index 000000000..d51e130f9 --- /dev/null +++ b/recipes/dev/jq/recipe.toml @@ -0,0 +1,5 @@ +#TODO undefined reference +[source] +tar = "https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-1.8.1.tar.gz" +[build] +template = "configure" diff --git a/recipes/wip/tools/file/recipe.toml b/recipes/tools/file/recipe.toml similarity index 54% rename from recipes/wip/tools/file/recipe.toml rename to recipes/tools/file/recipe.toml index b8bc7572f..8d17d7549 100644 --- a/recipes/wip/tools/file/recipe.toml +++ b/recipes/tools/file/recipe.toml @@ -1,5 +1,5 @@ #TODO compilation error [source] -tar = "https://astron.com/pub/file/file-5.45.tar.gz" +tar = "https://astron.com/pub/file/file-5.46.tar.gz" [build] template = "configure" diff --git a/recipes/wip/dev/other/jq/recipe.toml b/recipes/wip/dev/other/jq/recipe.toml deleted file mode 100644 index 26932f402..000000000 --- a/recipes/wip/dev/other/jq/recipe.toml +++ /dev/null @@ -1,5 +0,0 @@ -#TODO undefined reference -[source] -tar = "https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-1.7.1.tar.gz" -[build] -template = "configure" From 5b98cdeee9c7cd3f6102db605d6f2995f113fd04 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 3 Jan 2026 23:43:39 +0700 Subject: [PATCH 054/407] Print build cache status --- src/cook/cook_build.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index 281edd46e..a4271a1c9 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -207,6 +207,9 @@ pub fn build( if !check_source && stage_dirs.iter().all(|dir| dir.exists()) { let auto_deps = build_auto_deps(recipe, target_dir, &stage_dirs, dep_pkgars, logger)?; + if cli_verbose { + log_to_pty!(logger, "DEBUG: using cached build, not checking source"); + } return Ok((stage_dirs, auto_deps)); } @@ -229,7 +232,7 @@ pub fn build( // Rebuild sysroot if source is newer if recipe.build.kind != BuildKind::Remote { - build_deps_dir( + let updated = build_deps_dir( logger, &sysroot_dir, target_dir.join("sysroot.tmp"), @@ -241,9 +244,12 @@ pub fn build( source_modified, deps_modified, )?; + if cli_verbose && !updated { + log_to_pty!(logger, "DEBUG: using cached sysroot"); + } } if recipe.build.kind != BuildKind::Remote && !name.is_host() && dep_host_pkgars.len() > 0 { - build_deps_dir( + let updated = build_deps_dir( logger, &toolchain_dir, target_dir.join("toolchain.tmp"), @@ -251,6 +257,9 @@ pub fn build( source_modified, deps_host_modified, )?; + if cli_verbose && !updated { + log_to_pty!(logger, "DEBUG: using cached toolchain"); + } } // Rebuild stage if source is newer @@ -265,6 +274,10 @@ pub fn build( log_to_pty!(logger, "DEBUG: updating '{}'", stage_dir.display()); remove_stage_dir(stage_dir)?; } + } else { + if cli_verbose { + log_to_pty!(logger, "DEBUG: using cached build"); + } } } @@ -462,7 +475,7 @@ fn build_deps_dir( dep_pkgars: &BTreeSet<(PackageName, PathBuf)>, source_modified: SystemTime, deps_modified: SystemTime, -) -> Result<(), String> { +) -> Result { if deps_dir.is_dir() { let tags_dir = deps_dir.join(".tags"); let sysroot_modified = modified_dir(&tags_dir).unwrap_or(SystemTime::UNIX_EPOCH); @@ -511,9 +524,11 @@ fn build_deps_dir( // Move sysroot.tmp to sysroot atomically rename(&deps_dir_tmp, deps_dir)?; + + return Ok(true); } - Ok(()) + Ok(false) } /// Calculate automatic dependencies From 812ff830b2b71cb7f4d49d00b3f89cc2116a3c05 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Sat, 3 Jan 2026 15:20:34 -0300 Subject: [PATCH 055/407] Add recipes --- recipes/wip/db/stoolap/recipe.toml | 6 ++++++ recipes/wip/db/tsql/recipe.toml | 10 ++++++++++ recipes/wip/demos/nibble/recipe.toml | 5 +++++ recipes/wip/dev/git-tools/oyo/recipe.toml | 8 ++++++++ recipes/wip/dev/git-tools/shackle-shell/recipe.toml | 5 +++++ recipes/wip/games/platform/supertux/recipe.toml | 7 +++++++ recipes/wip/media/effy/recipe.toml | 9 +++++++++ 7 files changed, 50 insertions(+) create mode 100644 recipes/wip/db/stoolap/recipe.toml create mode 100644 recipes/wip/db/tsql/recipe.toml create mode 100644 recipes/wip/demos/nibble/recipe.toml create mode 100644 recipes/wip/dev/git-tools/oyo/recipe.toml create mode 100644 recipes/wip/dev/git-tools/shackle-shell/recipe.toml create mode 100644 recipes/wip/games/platform/supertux/recipe.toml create mode 100644 recipes/wip/media/effy/recipe.toml diff --git a/recipes/wip/db/stoolap/recipe.toml b/recipes/wip/db/stoolap/recipe.toml new file mode 100644 index 000000000..533f4aa34 --- /dev/null +++ b/recipes/wip/db/stoolap/recipe.toml @@ -0,0 +1,6 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/stoolap/stoolap" +shallow_clone = "true" +[build] +template = "cargo" diff --git a/recipes/wip/db/tsql/recipe.toml b/recipes/wip/db/tsql/recipe.toml new file mode 100644 index 000000000..cd964706f --- /dev/null +++ b/recipes/wip/db/tsql/recipe.toml @@ -0,0 +1,10 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/fcoury/tsql" +[build] +template = "custom" +script = """ +cookbook_cargo_packages tsql +""" +[package] +dependencies = ["postgresql16"] diff --git a/recipes/wip/demos/nibble/recipe.toml b/recipes/wip/demos/nibble/recipe.toml new file mode 100644 index 000000000..586247a2a --- /dev/null +++ b/recipes/wip/demos/nibble/recipe.toml @@ -0,0 +1,5 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/Vaishnav-Sabari-Girish/nibble" +[build] +template = "cargo" diff --git a/recipes/wip/dev/git-tools/oyo/recipe.toml b/recipes/wip/dev/git-tools/oyo/recipe.toml new file mode 100644 index 000000000..7ca99f5b7 --- /dev/null +++ b/recipes/wip/dev/git-tools/oyo/recipe.toml @@ -0,0 +1,8 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/ahkohd/oyo" +[build] +template = "custom" +script = """ +cookbook_cargo_packages oyo +""" diff --git a/recipes/wip/dev/git-tools/shackle-shell/recipe.toml b/recipes/wip/dev/git-tools/shackle-shell/recipe.toml new file mode 100644 index 000000000..960e2e274 --- /dev/null +++ b/recipes/wip/dev/git-tools/shackle-shell/recipe.toml @@ -0,0 +1,5 @@ +#TODO not compiled or tested +[source] +git = "https://codeberg.org/worthe-it/shackle-shell" +[build] +template = "cargo" diff --git a/recipes/wip/games/platform/supertux/recipe.toml b/recipes/wip/games/platform/supertux/recipe.toml new file mode 100644 index 000000000..d19d11e39 --- /dev/null +++ b/recipes/wip/games/platform/supertux/recipe.toml @@ -0,0 +1,7 @@ +#TODO not compiled or tested +#TODO determine minimum dependencies from cmake log +# build instructions: https://github.com/SuperTux/supertux/blob/master/INSTALL.md#compiling +[source] +tar = "https://github.com/SuperTux/supertux/releases/download/v0.7.0-beta.1/SuperTux-v0.7.0-beta.1-Source.tar.gz" +[build] +template = "cmake" diff --git a/recipes/wip/media/effy/recipe.toml b/recipes/wip/media/effy/recipe.toml new file mode 100644 index 000000000..4e94b0944 --- /dev/null +++ b/recipes/wip/media/effy/recipe.toml @@ -0,0 +1,9 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/aNNiMON/effy" +[build] +template = "cargo" +[package] +dependencies = [ + "ffmpeg6", +] From 1f465acfe3cef913b7a5f0bcab1d882a9e416b0d Mon Sep 17 00:00:00 2001 From: Ribbon Date: Sat, 3 Jan 2026 15:44:34 -0300 Subject: [PATCH 056/407] Improve some recipes --- recipes/wip/db/cockroachdb/recipe.toml | 6 ++++-- recipes/wip/db/gobang/recipe.toml | 1 + recipes/wip/db/influxdb/recipe.toml | 1 + recipes/wip/db/iotdb/recipe.toml | 6 ++++-- recipes/wip/db/limbo/recipe.toml | 1 + recipes/wip/db/mongodb6/recipe.toml | 4 +++- recipes/wip/db/mongodb7/recipe.toml | 4 +++- recipes/wip/db/postgresql16/recipe.toml | 1 - recipes/wip/db/rainfrog/recipe.toml | 1 + recipes/wip/db/rocksdb/recipe.toml | 3 ++- recipes/wip/db/skytable/recipe.toml | 2 ++ recipes/wip/db/sqllogictest/recipe.toml | 9 ++++----- recipes/wip/db/stoolap/recipe.toml | 2 +- recipes/wip/db/tidb-server/recipe.toml | 6 ++++-- 14 files changed, 31 insertions(+), 16 deletions(-) diff --git a/recipes/wip/db/cockroachdb/recipe.toml b/recipes/wip/db/cockroachdb/recipe.toml index 6d548c7d3..1e81fe2bb 100644 --- a/recipes/wip/db/cockroachdb/recipe.toml +++ b/recipes/wip/db/cockroachdb/recipe.toml @@ -1,6 +1,8 @@ -#TODO missing script for Bazel, see https://cockroachlabs.atlassian.net/wiki/spaces/CRDB/pages/181338446/Getting+and+building+CockroachDB+from+source +#TODO missing script for Bazel +# build instructions: https://cockroachlabs.atlassian.net/wiki/spaces/CRDB/pages/181338446/Getting+and+building+CockroachDB+from+source [source] git = "https://github.com/cockroachdb/cockroach" -rev = "0ad77cfcc5a81b96dd2f27ed608536388b680537" +branch = "release-25.4" +shallow_clone = true [build] template = "custom" diff --git a/recipes/wip/db/gobang/recipe.toml b/recipes/wip/db/gobang/recipe.toml index 275810a14..1d46a7c4e 100644 --- a/recipes/wip/db/gobang/recipe.toml +++ b/recipes/wip/db/gobang/recipe.toml @@ -1,5 +1,6 @@ #TODO update mio to 0.8 (after cargo update and patch on ring) [source] git = "https://github.com/TaKO8Ki/gobang" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/db/influxdb/recipe.toml b/recipes/wip/db/influxdb/recipe.toml index faad6d63e..cf43f1b70 100644 --- a/recipes/wip/db/influxdb/recipe.toml +++ b/recipes/wip/db/influxdb/recipe.toml @@ -2,5 +2,6 @@ #TODO configure the CLI and service [source] git = "https://github.com/influxdata/influxdb" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/db/iotdb/recipe.toml b/recipes/wip/db/iotdb/recipe.toml index 7a8a21482..0ab03bc4b 100644 --- a/recipes/wip/db/iotdb/recipe.toml +++ b/recipes/wip/db/iotdb/recipe.toml @@ -1,6 +1,8 @@ -#TODO missing script for Maven, see https://github.com/apache/iotdb#build-iotdb-from-source +#TODO missing script for Maven, +# build instructions: https://github.com/apache/iotdb#build-iotdb-from-source [source] git = "https://github.com/apache/iotdb" -rev = "5d0bfb0c25082b61cb8830aa04ec34a13edccd31" +rev = "v2.0.5" +shallow_clone = true [build] template = "custom" diff --git a/recipes/wip/db/limbo/recipe.toml b/recipes/wip/db/limbo/recipe.toml index ac1a00d86..8412bb00a 100644 --- a/recipes/wip/db/limbo/recipe.toml +++ b/recipes/wip/db/limbo/recipe.toml @@ -1,6 +1,7 @@ #TODO compilation error on the sqlite3 parser [source] git = "https://github.com/tursodatabase/limbo" +shallow_clone = true [build] template = "custom" script = """ diff --git a/recipes/wip/db/mongodb6/recipe.toml b/recipes/wip/db/mongodb6/recipe.toml index aed11b08e..b1d8bec8f 100644 --- a/recipes/wip/db/mongodb6/recipe.toml +++ b/recipes/wip/db/mongodb6/recipe.toml @@ -1,7 +1,9 @@ -#TODO missing script for SCons, see https://github.com/mongodb/mongo/blob/master/docs/building.md +#TODO missing script for SCons +# build instructions: https://github.com/mongodb/mongo/blob/master/docs/building.md [source] git = "https://github.com/mongodb/mongo" branch = "v6.0" +shallow_clone = true [build] template = "custom" dependencies = [ diff --git a/recipes/wip/db/mongodb7/recipe.toml b/recipes/wip/db/mongodb7/recipe.toml index 69d167b51..a2dab0024 100644 --- a/recipes/wip/db/mongodb7/recipe.toml +++ b/recipes/wip/db/mongodb7/recipe.toml @@ -1,7 +1,9 @@ -#TODO missing script for SCons, see https://github.com/mongodb/mongo/blob/master/docs/building.md +#TODO missing script for SCons +# build instructions: https://github.com/mongodb/mongo/blob/master/docs/building.md [source] git = "https://github.com/mongodb/mongo" branch = "v7.2" +shallow_clone = true [build] template = "custom" dependencies = [ diff --git a/recipes/wip/db/postgresql16/recipe.toml b/recipes/wip/db/postgresql16/recipe.toml index e247d0b6b..bfe0a9e20 100644 --- a/recipes/wip/db/postgresql16/recipe.toml +++ b/recipes/wip/db/postgresql16/recipe.toml @@ -12,6 +12,5 @@ configureflags = [ "--with-template=redox", ] dependencies = [ - "readline", "zlib", ] diff --git a/recipes/wip/db/rainfrog/recipe.toml b/recipes/wip/db/rainfrog/recipe.toml index b28e5e1a2..096e60f38 100644 --- a/recipes/wip/db/rainfrog/recipe.toml +++ b/recipes/wip/db/rainfrog/recipe.toml @@ -1,6 +1,7 @@ #TODO not compiled or tested [source] git = "https://github.com/achristmascarl/rainfrog" +shallow_clone = true [build] template = "cargo" [package] diff --git a/recipes/wip/db/rocksdb/recipe.toml b/recipes/wip/db/rocksdb/recipe.toml index 94e5507e7..fdbdfe014 100644 --- a/recipes/wip/db/rocksdb/recipe.toml +++ b/recipes/wip/db/rocksdb/recipe.toml @@ -1,4 +1,5 @@ -#TODO missing script for gnu make: https://github.com/facebook/rocksdb/blob/main/INSTALL.md +#TODO missing script for gnu make +# build instructions: https://github.com/facebook/rocksdb/blob/main/INSTALL.md [source] git = "https://github.com/facebook/rocksdb" rev = "v10.7.5" diff --git a/recipes/wip/db/skytable/recipe.toml b/recipes/wip/db/skytable/recipe.toml index 0bf74a609..02ce69669 100644 --- a/recipes/wip/db/skytable/recipe.toml +++ b/recipes/wip/db/skytable/recipe.toml @@ -1,11 +1,13 @@ #TODO libsky crate error [source] git = "https://github.com/skytable/skytable" +shallow_clone = true [build] template = "custom" dependencies = [ "openssl1", ] script = """ +DYNAMIC_INIT cookbook_cargo_packages skysh skyd """ diff --git a/recipes/wip/db/sqllogictest/recipe.toml b/recipes/wip/db/sqllogictest/recipe.toml index 1e47a39c5..072d38c43 100644 --- a/recipes/wip/db/sqllogictest/recipe.toml +++ b/recipes/wip/db/sqllogictest/recipe.toml @@ -1,9 +1,8 @@ #TODO Works, but not reliably -#TODO Raises the following warnings. -#setsockopt(16, 6, 1, 0x7fffffff4adc, 4) - unknown option -#setsockopt(16, 1, 9, 0x7fffffff4ad0, 4) - unknown option -#setsockopt(16, 6, 1, 0x7fffffff4ad4, 4) - unknown option - +#TODO Raises the following warnings: +# setsockopt(16, 6, 1, 0x7fffffff4adc, 4) - unknown option +# setsockopt(16, 1, 9, 0x7fffffff4ad0, 4) - unknown option +# setsockopt(16, 6, 1, 0x7fffffff4ad4, 4) - unknown option [source] git = "https://github.com/risinglightdb/sqllogictest-rs.git" diff --git a/recipes/wip/db/stoolap/recipe.toml b/recipes/wip/db/stoolap/recipe.toml index 533f4aa34..e03d9277b 100644 --- a/recipes/wip/db/stoolap/recipe.toml +++ b/recipes/wip/db/stoolap/recipe.toml @@ -1,6 +1,6 @@ #TODO not compiled or tested [source] git = "https://github.com/stoolap/stoolap" -shallow_clone = "true" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/db/tidb-server/recipe.toml b/recipes/wip/db/tidb-server/recipe.toml index 088b3fe4e..68b4ce8ff 100644 --- a/recipes/wip/db/tidb-server/recipe.toml +++ b/recipes/wip/db/tidb-server/recipe.toml @@ -1,6 +1,8 @@ -#TODO missing script for "make", see https://pingcap.github.io/tidb-dev-guide/get-started/build-tidb-from-source.html#build +#TODO missing script for gnu make +# build instructions: https://pingcap.github.io/tidb-dev-guide/get-started/build-tidb-from-source.html#build [source] git = "https://github.com/pingcap/tidb" -rev = "8445821f105477d5e31de9d8451b7fbf35a02cd1" +rev = "v8.5.4" +shallow_clone = true [build] template = "custom" From a7ee72c4c50018408be14c8631a079df91bc301d Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 4 Jan 2026 03:48:09 +0700 Subject: [PATCH 057/407] Fix rustup in freestanding relibc --- mk/prefix.mk | 2 +- recipes/core/relibc/recipe.toml | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index 7e3e22692..5b34e1f1c 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -158,7 +158,7 @@ else @echo "\033[1;36;49mBuilding relibc-freestanding-install\033[0m" rm -rf "$@.partial" "$@" mkdir -p "$@.partial" - export CARGO="env -u CARGO -u RUSTUP_TOOLCHAIN cargo" && \ + export CARGO="env -u CARGO -u RUSTUP_TOOLCHAIN cargo" RUSTUP="env -u CARGO -u RUSTUP_TOOLCHAIN rustup" && \ export PATH="$(ROOT)/$(PREFIX)/gcc-freestanding-install/bin:$$PATH" && \ export CC_$(subst -,_,$(TARGET))="$(GNU_TARGET)-gcc -isystem $(ROOT)/$@.partial/$(GNU_TARGET)/include" LINKFLAGS="" && \ export $(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \ diff --git a/recipes/core/relibc/recipe.toml b/recipes/core/relibc/recipe.toml index c0c059d4b..11eeec21b 100644 --- a/recipes/core/relibc/recipe.toml +++ b/recipes/core/relibc/recipe.toml @@ -7,6 +7,15 @@ script = """ # obscure crash if jobs number is too much COOKBOOK_MAKE_JOBS="$(( ${COOKBOOK_MAKE_JOBS} > 8 ? 8 : ${COOKBOOK_MAKE_JOBS} ))" +# rustup workaround https://github.com/rust-lang/rustup/issues/988 +if [ "${COOKBOOK_HOST_SYSROOT}" = "/usr" ]; then +if command -v rustup >/dev/null 2>&1; then + pushd ${COOKBOOK_SOURCE} + ${RUSTUP:-rustup} install + popd +fi +fi + export CARGO=${CARGO:-env -u CARGO cargo} "${COOKBOOK_MAKE}" \ -C "${COOKBOOK_SOURCE}" \ From eae1524558443b38c5658bea595956e221b5b13c Mon Sep 17 00:00:00 2001 From: Ribbon Date: Sat, 3 Jan 2026 18:07:24 -0300 Subject: [PATCH 058/407] Improve more recipes --- .../game-console/dolphin-emu/recipe.toml | 16 ++++++++++++++++ .../emulators/game-console/pcsx2/recipe.toml | 7 +++++++ .../game-console/ps1/duckstation/recipe.toml | 13 ++++++++++--- .../emulators/game-console/rpcs3/recipe.toml | 13 +++++++++---- recipes/wip/games/fps/assaultcube/recipe.toml | 5 +++-- .../wip/games/fps/chocolate-doom/recipe.toml | 6 +----- recipes/wip/games/fps/crispy-doom/recipe.toml | 8 ++------ recipes/wip/games/fps/et-legacy/recipe.toml | 3 ++- recipes/wip/games/fps/gzdoom/recipe.toml | 14 ++++++++++---- .../wip/games/fps/openspades-free/recipe.toml | 1 + .../wip/games/platform/supertux/recipe.toml | 19 ++++++++++++++++++- recipes/wip/libs/fs/physicsfs/recipe.toml | 10 ++++++++++ 12 files changed, 89 insertions(+), 26 deletions(-) create mode 100644 recipes/wip/libs/fs/physicsfs/recipe.toml diff --git a/recipes/wip/emulators/game-console/dolphin-emu/recipe.toml b/recipes/wip/emulators/game-console/dolphin-emu/recipe.toml index 0cc024f5a..f47d2eec3 100644 --- a/recipes/wip/emulators/game-console/dolphin-emu/recipe.toml +++ b/recipes/wip/emulators/game-console/dolphin-emu/recipe.toml @@ -7,6 +7,22 @@ rev = "71e15c2875f36458c8f29ee160f01606967bcd13" shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DENABLE_LTO=ON", + "-DUSE_UPNP=OFF", + "-DENABLE_ALSA=OFF", + "-DENABLE_PULSEAUDIO=OFF", + "-DENABLE_CUBEB=OFF", + "-DENABLE_TESTS=OFF", + "-DENABLE_VULKAN=OFF", + "-DUSE_DISCORD_PRESENCE=OFF", + "-DUSE_MGBA=OFF", + "-DENABLE_AUTOUPDATE=OFF", + "-DUSE_RETRO_ACHIEVEMENTS=OFF", + "=DENABLE_ANALYTICS=OFF", + "-DENCODE_FRAMEDUMPS=OFF", + "-DENABLE_LLVM=OFF", +] dependencies = [ #"ffmpeg6", #"libevdev", diff --git a/recipes/wip/emulators/game-console/pcsx2/recipe.toml b/recipes/wip/emulators/game-console/pcsx2/recipe.toml index c8161ae28..7eb2c3952 100644 --- a/recipes/wip/emulators/game-console/pcsx2/recipe.toml +++ b/recipes/wip/emulators/game-console/pcsx2/recipe.toml @@ -1,4 +1,5 @@ #TODO not compiled or tested +#TODO need to be built with clang for best performance # build instructions: https://pcsx2.net/docs/advanced/building#building-on-linux [source] git = "https://github.com/PCSX2/pcsx2" @@ -9,6 +10,12 @@ template = "cmake" cmakeflags = [ "-DCMAKE_CXX_COMPILER_LAUNCHER=ccache", "-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON", + "-DENABLE_TESTS=OFF", + "-DLTO_PCSX2_CORE=ON", + "-DPACKAGE_MODE=ON", + "-DUSE_VULKAN=OFF", + "-DWAYLAND_API=OFF", + "-DUSE_BACKTRACE=OFF", ] # dependencies = [ # "sdl2", diff --git a/recipes/wip/emulators/game-console/ps1/duckstation/recipe.toml b/recipes/wip/emulators/game-console/ps1/duckstation/recipe.toml index 09240d794..e48f39f54 100644 --- a/recipes/wip/emulators/game-console/ps1/duckstation/recipe.toml +++ b/recipes/wip/emulators/game-console/ps1/duckstation/recipe.toml @@ -6,9 +6,16 @@ rev = "16e56d7824e15657be26e30030394d0668493635" shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DENABLE_OPENGL=OFF", + "-DENABLE_VULKAN=OFF", + "-DENABLE_WAYLAND=OFF", + "-DBUILD_QT_FRONTEND=OFF", + "-DBUILD_MINI_FRONTEND=ON", +] dependencies = [ - "sdl2", - "qt6-base", - "qt6-svg", + #"sdl2", + #"qt6-base", + #"qt6-svg", #"qt6-tools", ] diff --git a/recipes/wip/emulators/game-console/rpcs3/recipe.toml b/recipes/wip/emulators/game-console/rpcs3/recipe.toml index a1796e901..29a04d5ae 100644 --- a/recipes/wip/emulators/game-console/rpcs3/recipe.toml +++ b/recipes/wip/emulators/game-console/rpcs3/recipe.toml @@ -14,10 +14,12 @@ cmakeflags = [ "-DUSE_ALSA=OFF", "-DUSE_PULSE=OFF", "-DUSE_LIBEVDEV=OFF", - "-DUSE_DISCORD_RPC=OFF", "-DBUILD_LLVM_SUBMODULE=OFF", "-DUSE_SYSTEM_FFMPEG=ON", "-DUSE_VULKAN=OFF", + "-DUSE_FAUDIO=OFF", + "-DUSE_SYSTEM_OPENAL=ON", + "-DUSE_SYSTEM_ZSTD=ON", ] dependencies = [ #"mesa-x11", @@ -25,11 +27,14 @@ dependencies = [ "qt6-multimedia", "qt6-svg", "qt6-declarative", - #"sdl2", + "curl", + "opencv4", + "sdl2", #"eudev", #"glew", - #"openal", - #"zlib", + "openal", + "zlib", + "zstd", #"libpng", #"libevdev", #"libedit", diff --git a/recipes/wip/games/fps/assaultcube/recipe.toml b/recipes/wip/games/fps/assaultcube/recipe.toml index b1c804916..1d3ecbc04 100644 --- a/recipes/wip/games/fps/assaultcube/recipe.toml +++ b/recipes/wip/games/fps/assaultcube/recipe.toml @@ -1,7 +1,8 @@ -#TODO missing script for "make", see https://wiki.cubers.net/action/view/Linux_Support#Compiling_AssaultCube +#TODO missing script for gnu make +# build instructions: https://wiki.cubers.net/action/view/Linux_Support#Compiling_AssaultCube [source] git = "https://github.com/assaultcube/AC" -rev = "1ece5af7533983bb8f827616381d282470793d90" +rev = "v1.3.0.2" [build] template = "configure" dependencies = [ diff --git a/recipes/wip/games/fps/chocolate-doom/recipe.toml b/recipes/wip/games/fps/chocolate-doom/recipe.toml index 6821d4c4d..3dd25cc55 100644 --- a/recipes/wip/games/fps/chocolate-doom/recipe.toml +++ b/recipes/wip/games/fps/chocolate-doom/recipe.toml @@ -2,13 +2,9 @@ [source] tar = "https://www.chocolate-doom.org/downloads/3.0.1/chocolate-doom-3.0.1.tar.gz" [build] -template = "custom" +template = "configure" dependencies = [ "sdl2", "sdl2-mixer", "sdl2-net", ] -script = """ -DYNAMIC_INIT -cookbook_configure -""" diff --git a/recipes/wip/games/fps/crispy-doom/recipe.toml b/recipes/wip/games/fps/crispy-doom/recipe.toml index 354bb2603..f416d906f 100644 --- a/recipes/wip/games/fps/crispy-doom/recipe.toml +++ b/recipes/wip/games/fps/crispy-doom/recipe.toml @@ -1,15 +1,11 @@ #TODO Not compiled/tested yet [source] git = "https://github.com/fabiangreffrath/crispy-doom" -rev = "593f5b97023ed39b7640073160c06895bbfc3d26" +rev = "crispy-doom-7.1" [build] -template = "custom" +template = "configure" dependencies = [ "sdl2", "sdl2-mixer", "sdl2-net", ] -script = """ -DYNAMIC_INIT -cookbook_configure -""" diff --git a/recipes/wip/games/fps/et-legacy/recipe.toml b/recipes/wip/games/fps/et-legacy/recipe.toml index bff1a0201..ec979ba57 100644 --- a/recipes/wip/games/fps/et-legacy/recipe.toml +++ b/recipes/wip/games/fps/et-legacy/recipe.toml @@ -2,7 +2,8 @@ # build instructions: https://github.com/etlegacy/etlegacy#compile-and-install [source] git = "https://github.com/etlegacy/etlegacy" -rev = "956269f4c13ebe31ba2a0f0b805588383209bd5b" +rev = "v2.83.2" +shallow_clone = true [build] template = "cmake" dependencies = [ diff --git a/recipes/wip/games/fps/gzdoom/recipe.toml b/recipes/wip/games/fps/gzdoom/recipe.toml index bbb08c2b3..801f5d155 100644 --- a/recipes/wip/games/fps/gzdoom/recipe.toml +++ b/recipes/wip/games/fps/gzdoom/recipe.toml @@ -1,13 +1,19 @@ -#TODO maybe incomplete script, see https://zdoom.org/wiki/Compile_GZDoom_on_Linux +#TODO not compiled or tested +# build instructions: https://zdoom.org/wiki/Compile_GZDoom_on_Linux [source] git = "https://github.com/ZDoom/gzdoom" -rev = "6ce809efe2902e43ceaa7031b875225d3a0367de" +branch = "4.14.2" +shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DHAVE_VULKAN=OFF", + "-DHAVE_GLES2=OFF", +] dependencies = [ "sdl2", - "mesa", - "mesa-glu", + #"mesa", + #"mesa-glu", "openal", "zmusic", ] diff --git a/recipes/wip/games/fps/openspades-free/recipe.toml b/recipes/wip/games/fps/openspades-free/recipe.toml index 2c85ccf5a..8ea894c8f 100644 --- a/recipes/wip/games/fps/openspades-free/recipe.toml +++ b/recipes/wip/games/fps/openspades-free/recipe.toml @@ -2,6 +2,7 @@ # build instructions: https://github.com/yvt/openspades#on-unixes-from-source [source] git = "https://github.com/yvt/openspades" +shallow_clone = true [build] template = "custom" dependencies = [ diff --git a/recipes/wip/games/platform/supertux/recipe.toml b/recipes/wip/games/platform/supertux/recipe.toml index d19d11e39..bbd1bd7fd 100644 --- a/recipes/wip/games/platform/supertux/recipe.toml +++ b/recipes/wip/games/platform/supertux/recipe.toml @@ -1,7 +1,24 @@ #TODO not compiled or tested -#TODO determine minimum dependencies from cmake log # build instructions: https://github.com/SuperTux/supertux/blob/master/INSTALL.md#compiling [source] tar = "https://github.com/SuperTux/supertux/releases/download/v0.7.0-beta.1/SuperTux-v0.7.0-beta.1-Source.tar.gz" [build] template = "cmake" +cmakeflags = [ + "-DENABLE_OPENGL=OFF", + "-DUSE_SYSTEM_SDL2_TTF=ON", +] +dependencies = [ + "sdl2", + "sdl2-image", + "sdl2-ttf", + "zlib", + "libpng", + "freetype2", + "libfmt", + "libcurl", + "openal", + "libogg", + "libvorbis", + "physicsfs", +] diff --git a/recipes/wip/libs/fs/physicsfs/recipe.toml b/recipes/wip/libs/fs/physicsfs/recipe.toml new file mode 100644 index 000000000..31b92617b --- /dev/null +++ b/recipes/wip/libs/fs/physicsfs/recipe.toml @@ -0,0 +1,10 @@ +#TODO not compiled or tested +# build instructions: https://github.com/icculus/physfs/blob/main/docs/INSTALL.txt +[source] +git = "https://github.com/icculus/physfs" +branch = "stable-3.2" +[build] +template = "cmake" +cmakeflags = [ + "-DPHYSFS_BUILD_DOCS=OFF", +] From e9d0d843d0c719c231e182a90c9feda1482bfcff Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 6 Jan 2026 09:44:21 +0700 Subject: [PATCH 059/407] Avoid overriding GCC build sysroot --- recipes/dev/gcc13/recipe.toml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/recipes/dev/gcc13/recipe.toml b/recipes/dev/gcc13/recipe.toml index 597f8baf2..425fc7c2d 100644 --- a/recipes/dev/gcc13/recipe.toml +++ b/recipes/dev/gcc13/recipe.toml @@ -32,10 +32,17 @@ COOKBOOK_CONFIGURE_FLAGS=( --with-native-system-header-dir="/include" --disable-hosted-libstdcxx --with-sysroot + --with-build-sysroot="${COOKBOOK_CROSS_SYSROOT:-$COOKBOOK_SYSROOT}" ) else +export CFLAGS_FOR_TARGET="${CPPFLAGS}" CXXFLAGS_FOR_TARGET="${CPPFLAGS}" LDFLAGS_FOR_TARGET="${LDFLAGS}" +export CC_FOR_BUILD="$CC_WRAPPER gcc" CXX_FOR_BUILD="$CC_WRAPPER g++" +unset CFLAGS CPPFLAGS LDFLAGS COOKBOOK_CONFIGURE_FLAGS+=( --with-sysroot=/ + --with-gmp="${COOKBOOK_SYSROOT}/usr" + --with-mpfr="${COOKBOOK_SYSROOT}/usr" + --with-mpc="${COOKBOOK_SYSROOT}/usr" ) fi @@ -48,7 +55,6 @@ fi COOKBOOK_CONFIGURE_FLAGS+=( --target="${CROSS_GNU_TARGET}" - --with-build-sysroot="${COOKBOOK_CROSS_SYSROOT:-$COOKBOOK_SYSROOT}" --with-linker-hash-style=gnu --enable-languages=c,c++,lto --enable-initfini-array From 4cfc66732274dde720ccd539aa8b3220387a8771 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 6 Jan 2026 16:58:31 +0700 Subject: [PATCH 060/407] Temporarily allow gnu-make without named pipes --- recipes/dev/gnu-make/recipe.toml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/recipes/dev/gnu-make/recipe.toml b/recipes/dev/gnu-make/recipe.toml index 91e95a5d3..fa9acfce5 100644 --- a/recipes/dev/gnu-make/recipe.toml +++ b/recipes/dev/gnu-make/recipe.toml @@ -10,4 +10,12 @@ autotools_recursive_regenerate """ [build] -template = "configure" +template = "custom" +script = """ +DYNAMIC_INIT +COOKBOOK_CONFIGURE_FLAGS+=( +# TODO: https://gitlab.redox-os.org/redox-os/redox/-/issues/1753 + 'ac_cv_func_mkfifo=no' +) +cookbook_configure +""" From 465f91f5138198e804732394b5e30f63d77cff15 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 6 Jan 2026 18:30:31 +0700 Subject: [PATCH 061/407] Remove usage of nproc in builds --- recipes/games/eduke32/recipe.toml | 2 +- recipes/libs/duktape/recipe.toml | 2 +- recipes/web/netsurf/recipe.toml | 4 ++-- recipes/wip/vice/recipe.sh | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/recipes/games/eduke32/recipe.toml b/recipes/games/eduke32/recipe.toml index 2cc38c167..9f2562990 100644 --- a/recipes/games/eduke32/recipe.toml +++ b/recipes/games/eduke32/recipe.toml @@ -22,7 +22,7 @@ rsync -av --delete "${COOKBOOK_SOURCE}/" ./ export CFLAGS="${CFLAGS} -I${COOKBOOK_SYSROOT}/include/SDL" export SDLCONFIG="${COOKBOOK_SYSROOT}/bin/sdl-config --prefix=${COOKBOOK_SYSROOT}" -PLATFORM=REDOX "${COOKBOOK_MAKE}" -j"$($NPROC)" +PLATFORM=REDOX "${COOKBOOK_MAKE}" -j"$COOKBOOK_MAKE_JOBS" mkdir -pv "${COOKBOOK_STAGE}/usr/games" cp -v ./eduke32 "${COOKBOOK_STAGE}/usr/games/eduke32" diff --git a/recipes/libs/duktape/recipe.toml b/recipes/libs/duktape/recipe.toml index 13b3f1781..e00eb2343 100644 --- a/recipes/libs/duktape/recipe.toml +++ b/recipes/libs/duktape/recipe.toml @@ -9,7 +9,7 @@ rsync -av --delete "${COOKBOOK_SOURCE}/" ./ sed -i "s/= gcc/= ${TARGET}-gcc/g" Makefile.cmdline -"${COOKBOOK_MAKE}" -f Makefile.cmdline -j"$($NPROC)" +"${COOKBOOK_MAKE}" -f Makefile.cmdline -j"$COOKBOOK_MAKE_JOBS" mkdir -pv "${COOKBOOK_STAGE}/usr/bin" cp ./duk "${COOKBOOK_STAGE}/usr/bin/duk" diff --git a/recipes/web/netsurf/recipe.toml b/recipes/web/netsurf/recipe.toml index fabdc0321..b8fd4fa00 100644 --- a/recipes/web/netsurf/recipe.toml +++ b/recipes/web/netsurf/recipe.toml @@ -32,8 +32,8 @@ export LDFLAGS="${LDFLAGS} -L${COOKBOOK_SYSROOT}/lib -L${PWD}/inst-${TARGET}/lib # nghttp2 is not linked for some reason export LDFLAGS="${LDFLAGS} -lcurl -lnghttp2" -"$COOKBOOK_MAKE" PREFIX=/usr V=1 -j"$($NPROC)" -"$COOKBOOK_MAKE" DESTDIR="$COOKBOOK_STAGE" PREFIX=/usr install -j"$($NPROC)" +"$COOKBOOK_MAKE" PREFIX=/usr V=1 -j"$COOKBOOK_MAKE_JOBS" +"$COOKBOOK_MAKE" DESTDIR="$COOKBOOK_STAGE" PREFIX=/usr install -j"$COOKBOOK_MAKE_JOBS" mkdir -pv "$COOKBOOK_STAGE/ui/apps" cp -v "${COOKBOOK_RECIPE}/manifest" "$COOKBOOK_STAGE/ui/apps/00_netsurf" """ diff --git a/recipes/wip/vice/recipe.sh b/recipes/wip/vice/recipe.sh index 1f5a713e1..fc46f122e 100644 --- a/recipes/wip/vice/recipe.sh +++ b/recipes/wip/vice/recipe.sh @@ -26,7 +26,7 @@ function recipe_build { --disable-rs232 \ --disable-realdevice \ --disable-midi - "$REDOX_MAKE" -j"$($NPROC)" + "$REDOX_MAKE" -j"$COOKBOOK_MAKE_JOBS" skip=1 } From e0d029cb296e26b3a7b3c24353923573d8badd36 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 6 Jan 2026 18:34:14 +0700 Subject: [PATCH 062/407] Limit netsurf jobs --- recipes/web/netsurf/recipe.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/recipes/web/netsurf/recipe.toml b/recipes/web/netsurf/recipe.toml index b8fd4fa00..c403fafe5 100644 --- a/recipes/web/netsurf/recipe.toml +++ b/recipes/web/netsurf/recipe.toml @@ -26,6 +26,9 @@ DYNAMIC_INIT # Netsurf does not currently support out-of-tree builds :( rsync -av --delete "${COOKBOOK_SOURCE}/" ./ +# obscure crash from sccache if jobs number is too much +COOKBOOK_MAKE_JOBS="$(( ${COOKBOOK_MAKE_JOBS} > 8 ? 8 : ${COOKBOOK_MAKE_JOBS} ))" + export TARGET="framebuffer" export CFLAGS="${CFLAGS} -I${PWD}/inst-${TARGET}/include" export LDFLAGS="${LDFLAGS} -L${COOKBOOK_SYSROOT}/lib -L${PWD}/inst-${TARGET}/lib -Wl,--allow-multiple-definition -Wl,-rpath-link,${COOKBOOK_SYSROOT}/lib" From 37e197f42dde0c07decc2a2c84cc0411057cc049 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 6 Jan 2026 19:26:18 +0700 Subject: [PATCH 063/407] Update redoxer --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 009d11f85..3bea31f74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -986,7 +986,7 @@ dependencies = [ [[package]] name = "redoxer" version = "0.2.61" -source = "git+https://gitlab.redox-os.org/redox-os/redoxer.git#676bda4514e1e74b006816eca7b461a0721feea1" +source = "git+https://gitlab.redox-os.org/redox-os/redoxer.git#4cbd0fce38d19427c8619dd67f1d94f899100683" dependencies = [ "anyhow", "dirs", From fd0276aa88dcb927230e87440167e612cd3ba5ce Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 7 Jan 2026 15:34:44 +0700 Subject: [PATCH 064/407] Define prefix_clean, rename existing one as static_clean --- mk/prefix.mk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index 5b34e1f1c..cb907ea05 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -28,8 +28,12 @@ PREFIX_STRIP=\ -exec strip --strip-unneeded {} ';' \ 2> /dev/null -# Update relibc used for compiling and clean all statically linked recipes +# Remove prefix builds but retain downloaded binaries prefix_clean: | $(FSTOOLS_TAG) + rm -rf $(PREFIX)/sysroot $(PREFIX)/*-install + +# Remove relibc in sysroot and all statically linked recipes +static_clean: | $(FSTOOLS_TAG) $(MAKE) c.relibc $(MAKE) c.base,base-initfs,extrautils,kernel,ion,pkgutils,redoxfs From d17be3c5a4f9c711be65d5f45c01845c3a4b50b0 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 7 Jan 2026 15:37:04 +0700 Subject: [PATCH 065/407] Remove deps --- mk/prefix.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index cb907ea05..f77756682 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -29,7 +29,7 @@ PREFIX_STRIP=\ 2> /dev/null # Remove prefix builds but retain downloaded binaries -prefix_clean: | $(FSTOOLS_TAG) +prefix_clean: rm -rf $(PREFIX)/sysroot $(PREFIX)/*-install # Remove relibc in sysroot and all statically linked recipes From 44c77960afcf11f99d93083135853e3db3da1681 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 9 Jan 2026 13:22:20 -0700 Subject: [PATCH 066/407] os-test-bins: pre-compile tests using makefiles, so they can be run using makefiles on redox --- recipes/tests/os-test-bins/recipe.toml | 30 ++++++++++---------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml index 96edb9d30..c62cb519b 100644 --- a/recipes/tests/os-test-bins/recipe.toml +++ b/recipes/tests/os-test-bins/recipe.toml @@ -5,24 +5,16 @@ same_as = "../os-test" template = "custom" script = """ DYNAMIC_INIT -SRC=${COOKBOOK_SOURCE} -DST=${COOKBOOK_STAGE}/root/os-test -if [ -z "$TESTBIN" ]; then -pushd ${SRC} -for file in */*/*.c; do - filename="${file%.*}" - mkdir -p $(dirname $DST/$filename) - # adding "true" because compilation can fail - ${CC} ${CFLAGS} ${LDFLAGS} "$SRC/$file" -o "$DST/$filename" -Wall || true - echo "./$filename" >> $DST/run.sh -done -popd -else - mkdir -p $(dirname $DST/$TESTBIN) - ${CC} ${CFLAGS} ${LDFLAGS} "$SRC/$TESTBIN.c" -o "$DST/$TESTBIN" -Wall -fi -if [ -n "TESTBIN" ]; then -"${COOKBOOK_REDOXER}" write-exec "$DST/$TESTBIN" -fi +# Copy source to /usr/share/os-test +mkdir -p "${COOKBOOK_STAGE}/usr/share/os-test" +cd "${COOKBOOK_STAGE}/usr/share/os-test" +rsync -a "${COOKBOOK_SOURCE}/" "./" + +# Pre-compile tests for Redox +make OS=Redox CC="${CC_WRAPPER} ${GNU_TARGET}-gcc" \ + CFLAGS= CPPFLAGS= \ + LDFLAGS= EXTRA_LDFLAGS= \ + CC_FOR_BUILD="${CC_WRAPPER} cc" CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \ + LDFLAGS_FOR_BUILD= -j ${COOKBOOK_MAKE_JOBS} all """ From dc3026c3e9f04f854a511b276673f74084bb0594 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 9 Jan 2026 14:14:13 -0700 Subject: [PATCH 067/407] os-test-bins: add runner script and dependencies --- recipes/tests/os-test-bins/recipe.toml | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml index c62cb519b..9e40c9010 100644 --- a/recipes/tests/os-test-bins/recipe.toml +++ b/recipes/tests/os-test-bins/recipe.toml @@ -17,4 +17,31 @@ make OS=Redox CC="${CC_WRAPPER} ${GNU_TARGET}-gcc" \ LDFLAGS= EXTRA_LDFLAGS= \ CC_FOR_BUILD="${CC_WRAPPER} cc" CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \ LDFLAGS_FOR_BUILD= -j ${COOKBOOK_MAKE_JOBS} all + +# Create runner script +mkdir -p "${COOKBOOK_STAGE}/usr/bin" +cat > "${COOKBOOK_STAGE}/usr/bin/os-test-runner" < Date: Fri, 9 Jan 2026 14:44:03 -0700 Subject: [PATCH 068/407] os-test-bins: skip two hung ppoll tests and fix namespace tests --- recipes/tests/os-test-bins/recipe.toml | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml index 9e40c9010..4c42050ae 100644 --- a/recipes/tests/os-test-bins/recipe.toml +++ b/recipes/tests/os-test-bins/recipe.toml @@ -18,19 +18,33 @@ make OS=Redox CC="${CC_WRAPPER} ${GNU_TARGET}-gcc" \ CC_FOR_BUILD="${CC_WRAPPER} cc" CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \ LDFLAGS_FOR_BUILD= -j ${COOKBOOK_MAKE_JOBS} all +skips=( + # These tests hang + ppoll-block-sleep-raise-write + ppoll-block-sleep-write-raise +) + +for skip in "${skips[@]}" +do + mkdir -p out.known/${os}/"$(dirname "${skip}")" + echo "skipped" > out.known/${os}/"${skip}.out" +done + +cp -t out -R out.known/${os} + # Create runner script mkdir -p "${COOKBOOK_STAGE}/usr/bin" cat > "${COOKBOOK_STAGE}/usr/bin/os-test-runner" < Date: Fri, 9 Jan 2026 15:05:00 -0700 Subject: [PATCH 069/407] os-test-bins: fix test skipping --- recipes/tests/os-test-bins/recipe.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml index 4c42050ae..e2816674c 100644 --- a/recipes/tests/os-test-bins/recipe.toml +++ b/recipes/tests/os-test-bins/recipe.toml @@ -20,17 +20,17 @@ make OS=Redox CC="${CC_WRAPPER} ${GNU_TARGET}-gcc" \ skips=( # These tests hang - ppoll-block-sleep-raise-write - ppoll-block-sleep-write-raise + signal/ppoll-block-sleep-raise-write + signal/ppoll-block-sleep-write-raise ) for skip in "${skips[@]}" do - mkdir -p out.known/${os}/"$(dirname "${skip}")" - echo "skipped" > out.known/${os}/"${skip}.out" + mkdir -p out.known/redox/"$(dirname "${skip}")" + echo "skipped" > out.known/redox/"${skip}.out" done -cp -t out -R out.known/${os} +cp -t out -R out.known/redox # Create runner script mkdir -p "${COOKBOOK_STAGE}/usr/bin" From 6d1586f805ab578bc37510dacb5b2c9f803ef3d2 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 10 Jan 2026 18:23:08 +0700 Subject: [PATCH 070/407] Add arch config to update redoxer --- config/aarch64/redoxer.toml | 8 ++++++++ config/i586/redoxer.toml | 8 ++++++++ config/x86_64/redoxer.toml | 8 ++++++++ 3 files changed, 24 insertions(+) create mode 100644 config/aarch64/redoxer.toml create mode 100644 config/i586/redoxer.toml create mode 100644 config/x86_64/redoxer.toml diff --git a/config/aarch64/redoxer.toml b/config/aarch64/redoxer.toml new file mode 100644 index 000000000..a17c50c9c --- /dev/null +++ b/config/aarch64/redoxer.toml @@ -0,0 +1,8 @@ +# Configuration used for building redoxer base image + +include = ["../redoxer.toml"] + +# General settings +[general] +# Filesystem size in MiB +filesystem_size = 1024 diff --git a/config/i586/redoxer.toml b/config/i586/redoxer.toml new file mode 100644 index 000000000..a17c50c9c --- /dev/null +++ b/config/i586/redoxer.toml @@ -0,0 +1,8 @@ +# Configuration used for building redoxer base image + +include = ["../redoxer.toml"] + +# General settings +[general] +# Filesystem size in MiB +filesystem_size = 1024 diff --git a/config/x86_64/redoxer.toml b/config/x86_64/redoxer.toml new file mode 100644 index 000000000..a17c50c9c --- /dev/null +++ b/config/x86_64/redoxer.toml @@ -0,0 +1,8 @@ +# Configuration used for building redoxer base image + +include = ["../redoxer.toml"] + +# General settings +[general] +# Filesystem size in MiB +filesystem_size = 1024 From 6b716ddaf5ddb46dbfe3477f7f28836741236dec Mon Sep 17 00:00:00 2001 From: Ribbon Date: Sat, 10 Jan 2026 21:06:44 -0300 Subject: [PATCH 071/407] Add and improve some recipes --- recipes/wip/backup/partclone/recipe.toml | 16 ++++++++++++++++ recipes/wip/data-recovery/ddrescue/recipe.toml | 5 +++++ recipes/wip/kde/marble/recipe.toml | 11 +++++++++++ recipes/wip/libs/other/grpc/recipe.toml | 8 ++++++++ recipes/wip/libs/other/opencv4/recipe.toml | 7 +++++-- recipes/wip/libs/other/sdl3/recipe.toml | 11 +++++++++-- recipes/wip/storage/ezio/recipe.toml | 13 +++++++++++++ 7 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 recipes/wip/backup/partclone/recipe.toml create mode 100644 recipes/wip/data-recovery/ddrescue/recipe.toml create mode 100644 recipes/wip/kde/marble/recipe.toml create mode 100644 recipes/wip/libs/other/grpc/recipe.toml create mode 100644 recipes/wip/storage/ezio/recipe.toml diff --git a/recipes/wip/backup/partclone/recipe.toml b/recipes/wip/backup/partclone/recipe.toml new file mode 100644 index 000000000..96d8c8e37 --- /dev/null +++ b/recipes/wip/backup/partclone/recipe.toml @@ -0,0 +1,16 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/Thomas-Tsai/partclone" +rev = "0.3.40" +script = """ +DYNAMIC_INIT +autotools_recursive_regenerate +""" +[build] +template = "configure" +configureflags = [ + "--enable-ncursesw", +] +dependencies = [ + "ncursesw", +] diff --git a/recipes/wip/data-recovery/ddrescue/recipe.toml b/recipes/wip/data-recovery/ddrescue/recipe.toml new file mode 100644 index 000000000..73ef99cca --- /dev/null +++ b/recipes/wip/data-recovery/ddrescue/recipe.toml @@ -0,0 +1,5 @@ +#TODO not compiled or tested +[source] +tar = "https://ftp.gnu.org/gnu/ddrescue/ddrescue-1.30.tar.lz" +[build] +template = "configure" diff --git a/recipes/wip/kde/marble/recipe.toml b/recipes/wip/kde/marble/recipe.toml new file mode 100644 index 000000000..2549c7f5d --- /dev/null +++ b/recipes/wip/kde/marble/recipe.toml @@ -0,0 +1,11 @@ +#TODO not compiled or tested +#TODO determine minimum dependencies from cmake log +[source] +git = "https://invent.kde.org/education/marble" +branch = "release/25.12" +shallow_clone = true +[build] +template = "cmake" +cmakeflags = [ + "-DBUILD_WITH_DBUS=OFF", +] diff --git a/recipes/wip/libs/other/grpc/recipe.toml b/recipes/wip/libs/other/grpc/recipe.toml new file mode 100644 index 000000000..c06250b64 --- /dev/null +++ b/recipes/wip/libs/other/grpc/recipe.toml @@ -0,0 +1,8 @@ +#TODO not compiled or tested +# build instructions: https://github.com/grpc/grpc/blob/v1.76.x/BUILDING.md +[source] +git = "https://github.com/grpc/grpc" +branch = "v1.76.x" +shallow_clone = true +[build] +template = "cmake" diff --git a/recipes/wip/libs/other/opencv4/recipe.toml b/recipes/wip/libs/other/opencv4/recipe.toml index c2c16eac4..38f30f7a5 100644 --- a/recipes/wip/libs/other/opencv4/recipe.toml +++ b/recipes/wip/libs/other/opencv4/recipe.toml @@ -2,7 +2,10 @@ # lacking build instructions [source] git = "https://github.com/opencv/opencv" -rev = "49486f61fb25722cbcf586b7f4320921d46fb38e" - +branch = "4.x" +shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DOPENCV_FORCE_3RDPARTY_BUILD=ON", +] diff --git a/recipes/wip/libs/other/sdl3/recipe.toml b/recipes/wip/libs/other/sdl3/recipe.toml index 4171f7199..f1f98db12 100644 --- a/recipes/wip/libs/other/sdl3/recipe.toml +++ b/recipes/wip/libs/other/sdl3/recipe.toml @@ -9,10 +9,17 @@ template = "cmake" cmakeflags = [ "-DSDL_SHARED=ON", "-DSDL_STATIC=OFF", - "-DSDL_TESTS=OFF", + "-DSDL_TEST_LIBRARY=OFF", "-DSDL_DISABLE_INSTALL_DOCS=ON", + "-DSDL_DBUS=OFF", + "-DSDL_LIBURING=OFF", + "-DSDL_IBUS=OFF", + "-DSDL_OPENGL=OFF", + "-DSDL_OPENGLES=OFF", + "-DSDL_LIBUDEV=OFF", + "-DSDL_AUDIO=OFF", ] dependencies = [ - "liborbital", + #"liborbital", "mesa", ] diff --git a/recipes/wip/storage/ezio/recipe.toml b/recipes/wip/storage/ezio/recipe.toml new file mode 100644 index 000000000..07f617804 --- /dev/null +++ b/recipes/wip/storage/ezio/recipe.toml @@ -0,0 +1,13 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/tjjh89017/ezio" +rev = "v2.0.21" +[build] +template = "cmake" +dependencies = [ + "boost", + "libtorrent", + "protobuf", + "libspdlog", + "grpc", +] From 43e1bd6211c1adfd43ce0720fecf014a0e417f8f Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 12 Jan 2026 15:58:09 +0700 Subject: [PATCH 072/407] Add an option to always clean target dir --- mk/prefix.mk | 4 +- src/bin/repo.rs | 46 ++++++++++----- src/config.rs | 10 +++- src/cook/cook_build.rs | 123 +++++++++++++++++++++++++++-------------- src/cook/package.rs | 9 ++- src/cook/tree.rs | 41 +++++++++++++- 6 files changed, 174 insertions(+), 59 deletions(-) diff --git a/mk/prefix.mk b/mk/prefix.mk index f77756682..7edcfb604 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -17,7 +17,7 @@ UPSTREAM_RUSTC_VERSION=2025-11-15 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_VERBOSE=true COOKBOOK_NONSTOP=false +PREFIX_CONFIG=CI=1 COOKBOOK_CLEAN_BUILD=true COOKBOOK_CLEAN_TARGET=false COOKBOOK_VERBOSE=true COOKBOOK_NONSTOP=false prefix: $(PREFIX)/sysroot @@ -129,7 +129,7 @@ else @echo "\033[1;36;49mBuilding binutils-install\033[0m" rm -rf "$@.partial" "$@" mkdir -p "$@.partial" - export CI=1 $(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) && \ + export $(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) && \ ./target/release/repo cook host:binutils-gdb cp -r "$(BINUTILS_TARGET)/stage/usr/". "$@.partial" touch "$@.partial" diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 7dcbc5f16..f1eebf228 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -8,7 +8,7 @@ use cookbook::cook::ident; use cookbook::cook::package::package; use cookbook::cook::pty::{PtyOut, UnixSlavePty, flush_pty, setup_pty}; use cookbook::cook::script::KILL_ALL_PID; -use cookbook::cook::tree::{WalkTreeEntry, display_tree_entry, format_size, walk_tree_entry}; +use cookbook::cook::tree::{self, WalkTreeEntry}; use cookbook::log_to_pty; use cookbook::recipe::{CookRecipe, recipes_flatten_package_names, recipes_mark_as_deps}; use pkg::PackageName; @@ -63,14 +63,15 @@ const REPO_HELP_STR: &str = r#" --repo-binary override recipes config to use repo_binary cook env and their defaults: - CI= set to any value to disable TUI - COOKBOOK_LOGS= whether to capture build logs (default is !CI) - COOKBOOK_OFFLINE=false prevent internet access if possible + CI= set to any value to disable TUI + COOKBOOK_LOGS= whether to capture build logs (default is !CI) + COOKBOOK_OFFLINE=false prevent internet access if possible ignored when command "fetch" is used - COOKBOOK_NONSTOP=false pkeep running even a recipe build failed - COOKBOOK_VERBOSE=true print success/error on each recipe - COOKBOOK_CLEAN_BUILD=false remove build directory before building - COOKBOOK_MAKE_JOBS= override build jobs count from nproc + COOKBOOK_NONSTOP=false keep running even a recipe build failed + COOKBOOK_VERBOSE=true print success/error on each recipe + COOKBOOK_CLEAN_BUILD=false remove build directory before building + COOKBOOK_CLEAN_TARGET=false remove target directory after building + COOKBOOK_MAKE_JOBS= override build jobs count from nproc "#; #[derive(Clone)] @@ -579,8 +580,7 @@ fn handle_cook( &target_dir, &recipe.name, &recipe.recipe, - config.cook.offline, - config.cook.clean_build, + &config.cook, !is_deps, logger, ) @@ -589,6 +589,24 @@ fn handle_cook( package(&recipe, &stage_dirs, &auto_deps, logger) .map_err(|err| anyhow!("failed to package: {:?}", err))?; + if config.cook.clean_target { + let stage_dirs = get_stage_dirs(&recipe.recipe.optional_packages, &target_dir); + if config.cook.verbose && stage_dirs.iter().any(|d| d.is_dir()) { + log_to_pty!(logger, "DEBUG: Listing stage files before removing them"); + } + for stage_dir in stage_dirs { + if stage_dir.is_dir() { + if config.cook.verbose { + if let Some(stage_name) = stage_dir.file_name() { + log_to_pty!(logger, "--- {}.pkgar:", stage_name.to_string_lossy()); + } + tree::walk_file_tree(&stage_dir, " ", logger)?; + } + fs::remove_dir_all(&stage_dir) + .map_err(|err| anyhow!("failed to remove stage dir: {:?}", err))?; + } + } + } Ok(()) } @@ -669,7 +687,7 @@ fn handle_push(recipes: &Vec, config: &CliConfig) -> anyhow::Result< }; if config.with_package_deps { for (i, root) in roots.iter().enumerate() { - walk_tree_entry( + tree::walk_tree_entry( &root.name, &recipe_map, "", @@ -706,7 +724,7 @@ fn handle_push(recipes: &Vec, config: &CliConfig) -> anyhow::Result< println!(""); println!( "Pushed {} of {} {}", - format_size(total_size), + tree::format_size(total_size), visited.len(), if visited.len() == 1 { "package" @@ -727,7 +745,7 @@ fn handle_tree(recipes: &Vec, _config: &CliConfig) -> anyhow::Result let roots: Vec<&CookRecipe> = recipes.iter().filter(|r| !r.is_deps).collect(); let num_roots = roots.len(); for (i, root) in roots.iter().enumerate() { - display_tree_entry( + tree::display_tree_entry( &root.name, &recipe_map, "", @@ -740,7 +758,7 @@ fn handle_tree(recipes: &Vec, _config: &CliConfig) -> anyhow::Result println!(""); println!( "Estimated image size: {} of {} {}", - format_size(total_size), + tree::format_size(total_size), visited.len(), if visited.len() == 1 { "package" diff --git a/src/config.rs b/src/config.rs index cdcc6bef6..05f1baa1f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -19,8 +19,11 @@ pub struct CookConfigOpt { /// whether to print verbose logs to certain commands /// build failure still be printed anyway pub verbose: Option, - /// whether to always clean the build directory + /// whether to always clean the build directory before building pub clean_build: Option, + /// whether to always clean the target directory after building + /// (deletes everything except pkgar files) + pub clean_target: Option, } #[derive(Debug, Default, Clone, Deserialize, PartialEq, Serialize)] @@ -32,6 +35,7 @@ pub struct CookConfig { pub nonstop: bool, pub verbose: bool, pub clean_build: bool, + pub clean_target: bool, } impl From for CookConfig { @@ -44,6 +48,7 @@ impl From for CookConfig { nonstop: value.nonstop.unwrap(), verbose: value.verbose.unwrap(), clean_build: value.clean_build.unwrap(), + clean_target: value.clean_target.unwrap(), } } } @@ -98,6 +103,9 @@ pub fn init_config() { if config.cook_opt.clean_build.is_none() { config.cook_opt.clean_build = Some(extract_env("COOKBOOK_CLEAN_BUILD", false)); } + if config.cook_opt.clean_target.is_none() { + config.cook_opt.clean_target = Some(extract_env("COOKBOOK_CLEAN_TARGET", false)); + } if config.mirrors.len() == 0 { // The GNU FTP mirror below is automatically inserted for convenience // You can choose other mirrors by setting it on cookbook.toml diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index a4271a1c9..2ec252e02 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -1,6 +1,7 @@ use pkg::package::PackageError; use pkg::{Package, PackageName}; +use crate::config::CookConfig; use crate::cook::fs::*; use crate::cook::package::{package_source_paths, package_target}; use crate::cook::pty::PtyOut; @@ -172,16 +173,15 @@ pub fn build( target_dir: &Path, name: &PackageName, recipe: &Recipe, - offline_mode: bool, - clean_build: bool, + cook_config: &CookConfig, check_source: bool, logger: &PtyOut, ) -> Result<(Vec, BTreeSet), String> { let sysroot_dir = target_dir.join("sysroot"); let toolchain_dir = target_dir.join("toolchain"); let stage_dirs = get_stage_dirs(&recipe.optional_packages, target_dir); - let cli_verbose = crate::config::get_config().cook.verbose; - let cli_jobs = crate::config::get_config().cook.jobs; + let cli_verbose = cook_config.verbose; + let cli_jobs = cook_config.jobs; if recipe.build.kind == BuildKind::None { // metapackages don't need to do anything here return Ok((stage_dirs, BTreeSet::new())); @@ -205,11 +205,24 @@ pub fn build( } } + macro_rules! make_auto_deps { + () => { + build_auto_deps( + recipe, + target_dir, + &stage_dirs, + cook_config, + dep_pkgars, + logger, + ) + }; + } + if !check_source && stage_dirs.iter().all(|dir| dir.exists()) { - let auto_deps = build_auto_deps(recipe, target_dir, &stage_dirs, dep_pkgars, logger)?; if cli_verbose { log_to_pty!(logger, "DEBUG: using cached build, not checking source"); } + let auto_deps = make_auto_deps!()?; return Ok((stage_dirs, auto_deps)); } @@ -219,6 +232,7 @@ pub fn build( source_modified = recipe_modified } } + let deps_modified = dep_pkgars .iter() .map(|(_dep, pkgar)| modified(pkgar)) @@ -230,6 +244,37 @@ pub fn build( .max() .unwrap_or(Ok(SystemTime::UNIX_EPOCH))?; + // check stage dir modified against pkgar files, any files missing will result in UNIX_EPOCH + let stage_modified = modified_all( + &stage_dirs + .iter() + .map(|p| p.with_added_extension("pkgar")) + .collect(), + modified, + ) + .unwrap_or(SystemTime::UNIX_EPOCH); + // Rebuild stage if source is newer + if stage_modified < source_modified + || stage_modified < deps_modified + || stage_modified < deps_host_modified + { + for stage_dir in &stage_dirs { + if stage_dir.is_dir() { + log_to_pty!(logger, "DEBUG: updating '{}'", stage_dir.display()); + remove_stage_dir(stage_dir)?; + } + } + } else { + if cli_verbose { + log_to_pty!(logger, "DEBUG: using cached build"); + } + if cook_config.clean_target { + // stop early otherwise we'll end up rebuilding + let auto_deps = make_auto_deps!()?; + return Ok((stage_dirs, auto_deps)); + } + } + // Rebuild sysroot if source is newer if recipe.build.kind != BuildKind::Remote { let updated = build_deps_dir( @@ -262,36 +307,17 @@ pub fn build( } } - // Rebuild stage if source is newer - if stage_dirs.iter().any(|dir| dir.is_dir()) { - let stage_modified = - modified_all(&stage_dirs, modified_dir).unwrap_or(SystemTime::UNIX_EPOCH); - if stage_modified < source_modified - || stage_modified < deps_modified - || stage_modified < deps_host_modified - { - for stage_dir in &stage_dirs { - log_to_pty!(logger, "DEBUG: updating '{}'", stage_dir.display()); - remove_stage_dir(stage_dir)?; - } - } else { - if cli_verbose { - log_to_pty!(logger, "DEBUG: using cached build"); - } - } - } - - if !stage_dirs.last().is_some_and(|dir| dir.is_dir()) { - let stage_dir = stage_dirs - .last() - .expect("Should have atleast one stage dir"); + let stage_dir = stage_dirs + .last() + .expect("Should have atleast one stage dir"); + let build_dir = get_build_dir(target_dir); + if !stage_dir.is_dir() { // Create stage.tmp let stage_dir_tmp = target_dir.join("stage.tmp"); create_dir_clean(&stage_dir_tmp)?; - // Create build, if it does not exist - let build_dir = get_build_dir(target_dir); - if clean_build || !build_dir.is_dir() { + // Create build dir, if it does not exist + if cook_config.clean_build || !build_dir.is_dir() { create_dir_clean(&build_dir)?; } @@ -307,8 +333,9 @@ pub fn build( }; if recipe.build.kind == BuildKind::Remote { - return build_remote(stage_dirs, recipe, target_dir); + return build_remote(stage_dirs, recipe, target_dir, cook_config); } + //TODO: better integration with redoxer (library instead of binary) //TODO: configurable target //TODO: Add more configurability, convert scripts to Rust? @@ -382,7 +409,7 @@ pub fn build( if cli_verbose { command.env("COOKBOOK_VERBOSE", "1"); } - if offline_mode { + if cook_config.offline { command.env("COOKBOOK_OFFLINE", "1"); } command @@ -421,8 +448,16 @@ pub fn build( rename(&stage_dir_tmp, &stage_dir)?; } - let auto_deps = build_auto_deps(recipe, target_dir, &stage_dirs, dep_pkgars, logger)?; + if cook_config.clean_target { + remove_all(&build_dir)?; + remove_all(&sysroot_dir)?; + if toolchain_dir.is_dir() { + remove_all(&toolchain_dir)?; + } + // don't remove stage dir yet + } + let auto_deps = make_auto_deps!()?; Ok((stage_dirs, auto_deps)) } @@ -536,13 +571,15 @@ fn build_auto_deps( recipe: &Recipe, target_dir: &Path, stage_dirs: &Vec, + cook_config: &CookConfig, mut dep_pkgars: BTreeSet<(PackageName, PathBuf)>, logger: &PtyOut, ) -> Result, String> { let auto_deps_path = target_dir.join("auto_deps.toml"); - if auto_deps_path.is_file() && modified(&auto_deps_path)? < modified_all(stage_dirs, modified)? - { - remove_all(&auto_deps_path)? + if auto_deps_path.is_file() && !cook_config.clean_target { + if modified(&auto_deps_path)? < modified_all(stage_dirs, modified)? { + remove_all(&auto_deps_path)? + } } let auto_deps = if auto_deps_path.exists() { @@ -572,6 +609,7 @@ pub fn build_remote( stage_dirs: Vec, recipe: &Recipe, target_dir: &Path, + cook_config: &CookConfig, ) -> Result<(Vec, BTreeSet), String> { let source_toml = target_dir.join("source.toml"); let source_pubkey = target_dir.join("id_ed25519.pub.toml"); @@ -581,6 +619,10 @@ pub fn build_remote( // declare pkg dependencies as autodeps dependency let stage_dir = &stage_dirs[i]; + if cook_config.clean_target && stage_dir.with_added_extension("pkgar").is_file() { + continue; + } + if !stage_dir.is_dir() { let (_, source_pkgar, _) = package_source_paths(package, &target_dir); let stage_dir_tmp = target_dir.join("stage.tmp"); @@ -598,9 +640,10 @@ pub fn build_remote( } let auto_deps_path = target_dir.join("auto_deps.toml"); - if auto_deps_path.is_file() && modified(&auto_deps_path)? < modified_all(&stage_dirs, modified)? - { - remove_all(&auto_deps_path)? + if auto_deps_path.is_file() && !cook_config.clean_target { + if modified(&auto_deps_path)? < modified_all(&stage_dirs, modified)? { + remove_all(&auto_deps_path)? + } } let auto_deps = if auto_deps_path.exists() { diff --git a/src/cook/package.rs b/src/cook/package.rs index 81aebdf99..0c4f29cb6 100644 --- a/src/cook/package.rs +++ b/src/cook/package.rs @@ -47,7 +47,14 @@ pub fn package( .map_err(|err| format!("failed to save pkgar secret key: {:?}", err))?; } - let stage_modified = modified_all(stage_dirs, modified_dir)?; + let Ok(stage_modified) = modified_all(stage_dirs, modified_dir) else { + // stage dirs doesn't exist, assume safe only when clean_target = true + if !crate::config::get_config().cook.clean_target { + return Err("Stage directory is not present at packaging step".into()); + } else { + return Ok(()); + } + }; let packages = recipe.recipe.get_packages_list(); diff --git a/src/cook/tree.rs b/src/cook/tree.rs index 70bacb1d3..0174a5cf3 100644 --- a/src/cook/tree.rs +++ b/src/cook/tree.rs @@ -7,7 +7,7 @@ use std::{ use anyhow::Context; use pkg::{Package, PackageName}; -use crate::recipe::CookRecipe; +use crate::{cook::pty::PtyOut, log_to_pty, recipe::CookRecipe}; pub enum WalkTreeEntry<'a> { Built(&'a PathBuf, u64), @@ -123,6 +123,45 @@ pub fn display_pkg_fn( Ok(()) } +pub fn walk_file_tree(dir: &PathBuf, prefix: &str, logger: &PtyOut) -> std::io::Result { + if !dir.is_dir() { + return Ok(0); + } + + let entries: Vec<_> = std::fs::read_dir(dir)?.filter_map(|e| e.ok()).collect(); + let mut total_size = 0; + for (index, entry) in entries.iter().enumerate() { + let path = entry.path(); + let metadata = entry.metadata()?; + let is_last = index == entries.len() - 1; + + let line_prefix = if is_last { "└── " } else { "├── " }; + let file_name = path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("Unknown"); + + if path.is_dir() { + log_to_pty!(logger, "{}{}{}/", prefix, line_prefix, file_name); + let new_prefix = format!("{}{}", prefix, if is_last { " " } else { "│ " }); + walk_file_tree(&path, &new_prefix, logger)?; + } else { + let size = metadata.len(); + total_size += size; + log_to_pty!( + logger, + "{}{}{} ({})", + prefix, + line_prefix, + file_name, + format_size(size) + ); + } + } + + Ok(total_size) +} + pub fn format_size(bytes: u64) -> String { if bytes == 0 { return "0 B".to_string(); From 0bdad8670ba8adb302f187e05f5343bd4236da27 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 12 Jan 2026 15:02:35 -0700 Subject: [PATCH 073/407] os-test-bins: add gettext, libarchive, and libiconv to build depends and run make html --- recipes/tests/os-test-bins/recipe.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml index e2816674c..10ab2b04a 100644 --- a/recipes/tests/os-test-bins/recipe.toml +++ b/recipes/tests/os-test-bins/recipe.toml @@ -2,6 +2,11 @@ same_as = "../os-test" [build] +dependencies = [ + "gettext", + "libarchive", + "libiconv", +] template = "custom" script = """ DYNAMIC_INIT @@ -46,6 +51,7 @@ echo "Ensuring outputs are newer than sources and executables" find out -type f -exec touch '{}' ';' make test +make html EOF chmod +x "${COOKBOOK_STAGE}/usr/bin/os-test-runner" """ From e7f59bb39b994d82bd4446b36aa36c478340fb2a Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 12 Jan 2026 15:21:29 -0700 Subject: [PATCH 074/407] os-test-bins: include and link files from sysroot --- recipes/tests/os-test-bins/recipe.toml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml index 10ab2b04a..a44692acf 100644 --- a/recipes/tests/os-test-bins/recipe.toml +++ b/recipes/tests/os-test-bins/recipe.toml @@ -17,11 +17,18 @@ cd "${COOKBOOK_STAGE}/usr/share/os-test" rsync -a "${COOKBOOK_SOURCE}/" "./" # Pre-compile tests for Redox -make OS=Redox CC="${CC_WRAPPER} ${GNU_TARGET}-gcc" \ - CFLAGS= CPPFLAGS= \ - LDFLAGS= EXTRA_LDFLAGS= \ - CC_FOR_BUILD="${CC_WRAPPER} cc" CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \ - LDFLAGS_FOR_BUILD= -j ${COOKBOOK_MAKE_JOBS} all +make OS=Redox \ + CC="${CC_WRAPPER} ${GNU_TARGET}-gcc" \ + CFLAGS="-I${COOKBOOK_SYSROOT}/include" \ + CPPFLAGS="-I${COOKBOOK_SYSROOT}/include" \ + LDFLAGS="-L${COOKBOOK_SYSROOT}/lib" \ + EXTRA_LDFLAGS= \ + CC_FOR_BUILD="${CC_WRAPPER} cc" \ + CFLAGS_FOR_BUILD= \ + CPPFLAGS_FOR_BUILD= \ + LDFLAGS_FOR_BUILD= \ + -j "${COOKBOOK_MAKE_JOBS}" \ + all skips=( # These tests hang From 13996ec2ae343434d97f56a0f41f883c533cb12f Mon Sep 17 00:00:00 2001 From: Ribbon Date: Wed, 14 Jan 2026 13:32:12 -0300 Subject: [PATCH 075/407] HARDWARE.md: Some improvements and update information state --- HARDWARE.md | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/HARDWARE.md b/HARDWARE.md index cee97a41d..7e1343145 100644 --- a/HARDWARE.md +++ b/HARDWARE.md @@ -1,6 +1,6 @@ # Hardware Compatibility -This document tracks the current hardware compatibility of Redox. +This document tracks the current hardware compatibility of Redox OS. - [Why are hardware reports needed?](#why-are-hardware-reports-needed) - [What if my computer is customized?](#what-if-my-computer-is-customized) @@ -25,22 +25,28 @@ These reports helps us to fix the problems above, your report may help to fix ma ## What if my computer is customized? -You can use the "Custom" word on the "Vendor" and "Model" categories, we also recommend to add your `pciutils` log on [this document link](https://gitlab.redox-os.org/redox-os/drivers/-/blob/master/COMMUNITY-HW.md?ref_type=heads) to help us with probable porting. +If your desktop is customized (common) you should use the "Custom" word on the "Vendor" category and insert the motherboard and CPU vendor/model in the "Model" category. + +A customized laptop should only be reported if you replaced the original CPU, report the CPU vendor and model in the "Model" category. + +We also recommend to add your `pciutils` log on [this](https://gitlab.redox-os.org/redox-os/base/-/blob/main/drivers/COMMUNITY-HW.md) document to help us with probable porting. ## Status -- **Recommended:** The system boots with all features working. -- **Booting:** The system boots with some issues. -- **Broken:** The system can't boot. +- **Recommended:** The operating system boots with video, sound, PS/2 or USB input, Ethernet, terminal and Orbital working. +- **Booting:** The operating system boots with some issues or lacking hardware support (write the issues and what supported hardware is not working in the "Report" section). +- **Broken:** The boot loader don't work or can't bootstrap the operating system. ## General -This section contain limitations to consider. +This section contain limitations that apply to any status. - ACPI support is incomplete (some things are hardcoded on the kernel) -- Wi-Fi is not supported yet -- GPU drivers aren't supported yet (only VESA and UEFI GOP) -- Automatic operating system discovery on boot loader is not implemented (remember this before installing Redox) +- Wi-Fi and Bluetooth aren't supported yet +- AMD, NVIDIA, and ARM GPU drivers aren't available yet (only BIOS VESA and UEFI GOP) +- I2C devices aren't supported yet (PS/2 or USB devices should be used) +- USB support varies on each device model because some USB devices require specific drivers (use input devices with stanrdized controls for more compatibility) +- Automatic operating system discovery is not implemented in the boot loader yet (remember this before installing Redox) ## Contribute to this document From 886b2d18f70856e09de43795403e9c6845722e35 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Wed, 14 Jan 2026 14:30:57 -0300 Subject: [PATCH 076/407] HARDWARE.md: small improvement and fixes --- HARDWARE.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/HARDWARE.md b/HARDWARE.md index 7e1343145..7e3926b05 100644 --- a/HARDWARE.md +++ b/HARDWARE.md @@ -41,11 +41,11 @@ We also recommend to add your `pciutils` log on [this](https://gitlab.redox-os.o This section contain limitations that apply to any status. -- ACPI support is incomplete (some things are hardcoded on the kernel) +- ACPI support is incomplete (some things are hardcoded on the kernel to work) - Wi-Fi and Bluetooth aren't supported yet -- AMD, NVIDIA, and ARM GPU drivers aren't available yet (only BIOS VESA and UEFI GOP) +- AMD, NVIDIA, ARM, and PowerVR GPUs aren't supported yet (only BIOS VESA and UEFI GOP) - I2C devices aren't supported yet (PS/2 or USB devices should be used) -- USB support varies on each device model because some USB devices require specific drivers (use input devices with stanrdized controls for more compatibility) +- USB support varies on each device model because some USB devices require specific drivers (use input devices with standardized controls for more compatibility) - Automatic operating system discovery is not implemented in the boot loader yet (remember this before installing Redox) ## Contribute to this document From cfd0b9611821395b4453f42a0325f4d50e58a9f7 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 15 Jan 2026 08:41:48 -0300 Subject: [PATCH 077/407] Rename the WIP "emulators" recipe category to "emu" --- recipes/wip/{emulators => emu}/cpu/6502-emulator/recipe.toml | 0 recipes/wip/{emulators => emu}/cpu/8086-emulator/recipe.toml | 0 recipes/wip/{emulators => emu}/cpu/mipsy/recipe.toml | 0 recipes/wip/{emulators => emu}/cpu/rustzx/recipe.toml | 0 recipes/wip/{emulators => emu}/cpu/rvemu/recipe.toml | 0 recipes/wip/{emulators => emu}/cpu/scemu/recipe.toml | 0 recipes/wip/{emulators => emu}/cpu/unicorn/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/azahar/recipe.toml | 0 .../wip/{emulators => emu}/game-console/clementine/recipe.toml | 0 .../wip/{emulators => emu}/game-console/dolphin-emu/recipe.toml | 0 .../wip/{emulators => emu}/game-console/finalburn-neo/recipe.toml | 0 .../{emulators => emu}/game-console/gameboy/boytacean/recipe.toml | 0 .../{emulators => emu}/game-console/gameboy/gameroy/recipe.toml | 0 .../wip/{emulators => emu}/game-console/gameboy/mimic/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/gopher64/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/jgenesis/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/mame/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/melonds/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/meru/recipe.toml | 0 .../{emulators => emu}/game-console/mupen64plus-core/recipe.toml | 0 .../wip/{emulators => emu}/game-console/obliteration/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/pcsx2/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/picodrive/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/play/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/ppsspp/recipe.toml | 0 .../{emulators => emu}/game-console/ps1/duckstation/recipe.toml | 0 .../{emulators => emu}/game-console/ps1/pcsx-rearmed/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/ps1/rpsx/recipe.toml | 0 .../wip/{emulators => emu}/game-console/ps1/trapezoid/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/rpcs3/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/shadps4/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/snes9x/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/tetanes/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/uoyabause/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/vita3k/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/xemu/recipe.toml | 0 .../wip/{emulators => emu}/game-console/xenia-canary/recipe.toml | 0 recipes/wip/{emulators => emu}/game-console/zsnes/recipe.toml | 0 recipes/wip/{emulators => emu}/mobile/touchhle/recipe.toml | 0 recipes/wip/{emulators => emu}/mobile/wie/recipe.toml | 0 recipes/wip/{emulators => emu}/pc/darling/recipe.toml | 0 recipes/wip/{emulators => emu}/pc/martypc/recipe.toml | 0 recipes/wip/{emulators => emu}/pc/opengmk/recipe.toml | 0 recipes/wip/{emulators => emu}/pc/ruffle/recipe.toml | 0 recipes/wip/{emulators => emu}/security/rust-u2f/recipe.toml | 0 recipes/wip/{emulators => emu}/windows/boxedwine/recipe.toml | 0 recipes/wip/{emulators => emu}/windows/hangover/recipe.toml | 0 recipes/wip/{emulators => emu}/windows/retrowin32/recipe.toml | 0 recipes/wip/{emulators => emu}/windows/wine-stable/recipe.toml | 0 49 files changed, 0 insertions(+), 0 deletions(-) rename recipes/wip/{emulators => emu}/cpu/6502-emulator/recipe.toml (100%) rename recipes/wip/{emulators => emu}/cpu/8086-emulator/recipe.toml (100%) rename recipes/wip/{emulators => emu}/cpu/mipsy/recipe.toml (100%) rename recipes/wip/{emulators => emu}/cpu/rustzx/recipe.toml (100%) rename recipes/wip/{emulators => emu}/cpu/rvemu/recipe.toml (100%) rename recipes/wip/{emulators => emu}/cpu/scemu/recipe.toml (100%) rename recipes/wip/{emulators => emu}/cpu/unicorn/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/azahar/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/clementine/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/dolphin-emu/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/finalburn-neo/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/gameboy/boytacean/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/gameboy/gameroy/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/gameboy/mimic/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/gopher64/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/jgenesis/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/mame/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/melonds/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/meru/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/mupen64plus-core/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/obliteration/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/pcsx2/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/picodrive/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/play/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/ppsspp/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/ps1/duckstation/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/ps1/pcsx-rearmed/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/ps1/rpsx/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/ps1/trapezoid/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/rpcs3/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/shadps4/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/snes9x/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/tetanes/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/uoyabause/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/vita3k/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/xemu/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/xenia-canary/recipe.toml (100%) rename recipes/wip/{emulators => emu}/game-console/zsnes/recipe.toml (100%) rename recipes/wip/{emulators => emu}/mobile/touchhle/recipe.toml (100%) rename recipes/wip/{emulators => emu}/mobile/wie/recipe.toml (100%) rename recipes/wip/{emulators => emu}/pc/darling/recipe.toml (100%) rename recipes/wip/{emulators => emu}/pc/martypc/recipe.toml (100%) rename recipes/wip/{emulators => emu}/pc/opengmk/recipe.toml (100%) rename recipes/wip/{emulators => emu}/pc/ruffle/recipe.toml (100%) rename recipes/wip/{emulators => emu}/security/rust-u2f/recipe.toml (100%) rename recipes/wip/{emulators => emu}/windows/boxedwine/recipe.toml (100%) rename recipes/wip/{emulators => emu}/windows/hangover/recipe.toml (100%) rename recipes/wip/{emulators => emu}/windows/retrowin32/recipe.toml (100%) rename recipes/wip/{emulators => emu}/windows/wine-stable/recipe.toml (100%) diff --git a/recipes/wip/emulators/cpu/6502-emulator/recipe.toml b/recipes/wip/emu/cpu/6502-emulator/recipe.toml similarity index 100% rename from recipes/wip/emulators/cpu/6502-emulator/recipe.toml rename to recipes/wip/emu/cpu/6502-emulator/recipe.toml diff --git a/recipes/wip/emulators/cpu/8086-emulator/recipe.toml b/recipes/wip/emu/cpu/8086-emulator/recipe.toml similarity index 100% rename from recipes/wip/emulators/cpu/8086-emulator/recipe.toml rename to recipes/wip/emu/cpu/8086-emulator/recipe.toml diff --git a/recipes/wip/emulators/cpu/mipsy/recipe.toml b/recipes/wip/emu/cpu/mipsy/recipe.toml similarity index 100% rename from recipes/wip/emulators/cpu/mipsy/recipe.toml rename to recipes/wip/emu/cpu/mipsy/recipe.toml diff --git a/recipes/wip/emulators/cpu/rustzx/recipe.toml b/recipes/wip/emu/cpu/rustzx/recipe.toml similarity index 100% rename from recipes/wip/emulators/cpu/rustzx/recipe.toml rename to recipes/wip/emu/cpu/rustzx/recipe.toml diff --git a/recipes/wip/emulators/cpu/rvemu/recipe.toml b/recipes/wip/emu/cpu/rvemu/recipe.toml similarity index 100% rename from recipes/wip/emulators/cpu/rvemu/recipe.toml rename to recipes/wip/emu/cpu/rvemu/recipe.toml diff --git a/recipes/wip/emulators/cpu/scemu/recipe.toml b/recipes/wip/emu/cpu/scemu/recipe.toml similarity index 100% rename from recipes/wip/emulators/cpu/scemu/recipe.toml rename to recipes/wip/emu/cpu/scemu/recipe.toml diff --git a/recipes/wip/emulators/cpu/unicorn/recipe.toml b/recipes/wip/emu/cpu/unicorn/recipe.toml similarity index 100% rename from recipes/wip/emulators/cpu/unicorn/recipe.toml rename to recipes/wip/emu/cpu/unicorn/recipe.toml diff --git a/recipes/wip/emulators/game-console/azahar/recipe.toml b/recipes/wip/emu/game-console/azahar/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/azahar/recipe.toml rename to recipes/wip/emu/game-console/azahar/recipe.toml diff --git a/recipes/wip/emulators/game-console/clementine/recipe.toml b/recipes/wip/emu/game-console/clementine/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/clementine/recipe.toml rename to recipes/wip/emu/game-console/clementine/recipe.toml diff --git a/recipes/wip/emulators/game-console/dolphin-emu/recipe.toml b/recipes/wip/emu/game-console/dolphin-emu/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/dolphin-emu/recipe.toml rename to recipes/wip/emu/game-console/dolphin-emu/recipe.toml diff --git a/recipes/wip/emulators/game-console/finalburn-neo/recipe.toml b/recipes/wip/emu/game-console/finalburn-neo/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/finalburn-neo/recipe.toml rename to recipes/wip/emu/game-console/finalburn-neo/recipe.toml diff --git a/recipes/wip/emulators/game-console/gameboy/boytacean/recipe.toml b/recipes/wip/emu/game-console/gameboy/boytacean/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/gameboy/boytacean/recipe.toml rename to recipes/wip/emu/game-console/gameboy/boytacean/recipe.toml diff --git a/recipes/wip/emulators/game-console/gameboy/gameroy/recipe.toml b/recipes/wip/emu/game-console/gameboy/gameroy/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/gameboy/gameroy/recipe.toml rename to recipes/wip/emu/game-console/gameboy/gameroy/recipe.toml diff --git a/recipes/wip/emulators/game-console/gameboy/mimic/recipe.toml b/recipes/wip/emu/game-console/gameboy/mimic/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/gameboy/mimic/recipe.toml rename to recipes/wip/emu/game-console/gameboy/mimic/recipe.toml diff --git a/recipes/wip/emulators/game-console/gopher64/recipe.toml b/recipes/wip/emu/game-console/gopher64/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/gopher64/recipe.toml rename to recipes/wip/emu/game-console/gopher64/recipe.toml diff --git a/recipes/wip/emulators/game-console/jgenesis/recipe.toml b/recipes/wip/emu/game-console/jgenesis/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/jgenesis/recipe.toml rename to recipes/wip/emu/game-console/jgenesis/recipe.toml diff --git a/recipes/wip/emulators/game-console/mame/recipe.toml b/recipes/wip/emu/game-console/mame/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/mame/recipe.toml rename to recipes/wip/emu/game-console/mame/recipe.toml diff --git a/recipes/wip/emulators/game-console/melonds/recipe.toml b/recipes/wip/emu/game-console/melonds/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/melonds/recipe.toml rename to recipes/wip/emu/game-console/melonds/recipe.toml diff --git a/recipes/wip/emulators/game-console/meru/recipe.toml b/recipes/wip/emu/game-console/meru/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/meru/recipe.toml rename to recipes/wip/emu/game-console/meru/recipe.toml diff --git a/recipes/wip/emulators/game-console/mupen64plus-core/recipe.toml b/recipes/wip/emu/game-console/mupen64plus-core/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/mupen64plus-core/recipe.toml rename to recipes/wip/emu/game-console/mupen64plus-core/recipe.toml diff --git a/recipes/wip/emulators/game-console/obliteration/recipe.toml b/recipes/wip/emu/game-console/obliteration/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/obliteration/recipe.toml rename to recipes/wip/emu/game-console/obliteration/recipe.toml diff --git a/recipes/wip/emulators/game-console/pcsx2/recipe.toml b/recipes/wip/emu/game-console/pcsx2/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/pcsx2/recipe.toml rename to recipes/wip/emu/game-console/pcsx2/recipe.toml diff --git a/recipes/wip/emulators/game-console/picodrive/recipe.toml b/recipes/wip/emu/game-console/picodrive/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/picodrive/recipe.toml rename to recipes/wip/emu/game-console/picodrive/recipe.toml diff --git a/recipes/wip/emulators/game-console/play/recipe.toml b/recipes/wip/emu/game-console/play/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/play/recipe.toml rename to recipes/wip/emu/game-console/play/recipe.toml diff --git a/recipes/wip/emulators/game-console/ppsspp/recipe.toml b/recipes/wip/emu/game-console/ppsspp/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/ppsspp/recipe.toml rename to recipes/wip/emu/game-console/ppsspp/recipe.toml diff --git a/recipes/wip/emulators/game-console/ps1/duckstation/recipe.toml b/recipes/wip/emu/game-console/ps1/duckstation/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/ps1/duckstation/recipe.toml rename to recipes/wip/emu/game-console/ps1/duckstation/recipe.toml diff --git a/recipes/wip/emulators/game-console/ps1/pcsx-rearmed/recipe.toml b/recipes/wip/emu/game-console/ps1/pcsx-rearmed/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/ps1/pcsx-rearmed/recipe.toml rename to recipes/wip/emu/game-console/ps1/pcsx-rearmed/recipe.toml diff --git a/recipes/wip/emulators/game-console/ps1/rpsx/recipe.toml b/recipes/wip/emu/game-console/ps1/rpsx/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/ps1/rpsx/recipe.toml rename to recipes/wip/emu/game-console/ps1/rpsx/recipe.toml diff --git a/recipes/wip/emulators/game-console/ps1/trapezoid/recipe.toml b/recipes/wip/emu/game-console/ps1/trapezoid/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/ps1/trapezoid/recipe.toml rename to recipes/wip/emu/game-console/ps1/trapezoid/recipe.toml diff --git a/recipes/wip/emulators/game-console/rpcs3/recipe.toml b/recipes/wip/emu/game-console/rpcs3/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/rpcs3/recipe.toml rename to recipes/wip/emu/game-console/rpcs3/recipe.toml diff --git a/recipes/wip/emulators/game-console/shadps4/recipe.toml b/recipes/wip/emu/game-console/shadps4/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/shadps4/recipe.toml rename to recipes/wip/emu/game-console/shadps4/recipe.toml diff --git a/recipes/wip/emulators/game-console/snes9x/recipe.toml b/recipes/wip/emu/game-console/snes9x/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/snes9x/recipe.toml rename to recipes/wip/emu/game-console/snes9x/recipe.toml diff --git a/recipes/wip/emulators/game-console/tetanes/recipe.toml b/recipes/wip/emu/game-console/tetanes/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/tetanes/recipe.toml rename to recipes/wip/emu/game-console/tetanes/recipe.toml diff --git a/recipes/wip/emulators/game-console/uoyabause/recipe.toml b/recipes/wip/emu/game-console/uoyabause/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/uoyabause/recipe.toml rename to recipes/wip/emu/game-console/uoyabause/recipe.toml diff --git a/recipes/wip/emulators/game-console/vita3k/recipe.toml b/recipes/wip/emu/game-console/vita3k/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/vita3k/recipe.toml rename to recipes/wip/emu/game-console/vita3k/recipe.toml diff --git a/recipes/wip/emulators/game-console/xemu/recipe.toml b/recipes/wip/emu/game-console/xemu/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/xemu/recipe.toml rename to recipes/wip/emu/game-console/xemu/recipe.toml diff --git a/recipes/wip/emulators/game-console/xenia-canary/recipe.toml b/recipes/wip/emu/game-console/xenia-canary/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/xenia-canary/recipe.toml rename to recipes/wip/emu/game-console/xenia-canary/recipe.toml diff --git a/recipes/wip/emulators/game-console/zsnes/recipe.toml b/recipes/wip/emu/game-console/zsnes/recipe.toml similarity index 100% rename from recipes/wip/emulators/game-console/zsnes/recipe.toml rename to recipes/wip/emu/game-console/zsnes/recipe.toml diff --git a/recipes/wip/emulators/mobile/touchhle/recipe.toml b/recipes/wip/emu/mobile/touchhle/recipe.toml similarity index 100% rename from recipes/wip/emulators/mobile/touchhle/recipe.toml rename to recipes/wip/emu/mobile/touchhle/recipe.toml diff --git a/recipes/wip/emulators/mobile/wie/recipe.toml b/recipes/wip/emu/mobile/wie/recipe.toml similarity index 100% rename from recipes/wip/emulators/mobile/wie/recipe.toml rename to recipes/wip/emu/mobile/wie/recipe.toml diff --git a/recipes/wip/emulators/pc/darling/recipe.toml b/recipes/wip/emu/pc/darling/recipe.toml similarity index 100% rename from recipes/wip/emulators/pc/darling/recipe.toml rename to recipes/wip/emu/pc/darling/recipe.toml diff --git a/recipes/wip/emulators/pc/martypc/recipe.toml b/recipes/wip/emu/pc/martypc/recipe.toml similarity index 100% rename from recipes/wip/emulators/pc/martypc/recipe.toml rename to recipes/wip/emu/pc/martypc/recipe.toml diff --git a/recipes/wip/emulators/pc/opengmk/recipe.toml b/recipes/wip/emu/pc/opengmk/recipe.toml similarity index 100% rename from recipes/wip/emulators/pc/opengmk/recipe.toml rename to recipes/wip/emu/pc/opengmk/recipe.toml diff --git a/recipes/wip/emulators/pc/ruffle/recipe.toml b/recipes/wip/emu/pc/ruffle/recipe.toml similarity index 100% rename from recipes/wip/emulators/pc/ruffle/recipe.toml rename to recipes/wip/emu/pc/ruffle/recipe.toml diff --git a/recipes/wip/emulators/security/rust-u2f/recipe.toml b/recipes/wip/emu/security/rust-u2f/recipe.toml similarity index 100% rename from recipes/wip/emulators/security/rust-u2f/recipe.toml rename to recipes/wip/emu/security/rust-u2f/recipe.toml diff --git a/recipes/wip/emulators/windows/boxedwine/recipe.toml b/recipes/wip/emu/windows/boxedwine/recipe.toml similarity index 100% rename from recipes/wip/emulators/windows/boxedwine/recipe.toml rename to recipes/wip/emu/windows/boxedwine/recipe.toml diff --git a/recipes/wip/emulators/windows/hangover/recipe.toml b/recipes/wip/emu/windows/hangover/recipe.toml similarity index 100% rename from recipes/wip/emulators/windows/hangover/recipe.toml rename to recipes/wip/emu/windows/hangover/recipe.toml diff --git a/recipes/wip/emulators/windows/retrowin32/recipe.toml b/recipes/wip/emu/windows/retrowin32/recipe.toml similarity index 100% rename from recipes/wip/emulators/windows/retrowin32/recipe.toml rename to recipes/wip/emu/windows/retrowin32/recipe.toml diff --git a/recipes/wip/emulators/windows/wine-stable/recipe.toml b/recipes/wip/emu/windows/wine-stable/recipe.toml similarity index 100% rename from recipes/wip/emulators/windows/wine-stable/recipe.toml rename to recipes/wip/emu/windows/wine-stable/recipe.toml From 4764eb8a00c934d149a42a7f6803faff2027dc7c Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 15 Jan 2026 08:42:42 -0300 Subject: [PATCH 078/407] Rename the "windows" recipe sub-category to "win" --- recipes/wip/emu/{windows => win}/boxedwine/recipe.toml | 0 recipes/wip/emu/{windows => win}/hangover/recipe.toml | 0 recipes/wip/emu/{windows => win}/retrowin32/recipe.toml | 0 recipes/wip/emu/{windows => win}/wine-stable/recipe.toml | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename recipes/wip/emu/{windows => win}/boxedwine/recipe.toml (100%) rename recipes/wip/emu/{windows => win}/hangover/recipe.toml (100%) rename recipes/wip/emu/{windows => win}/retrowin32/recipe.toml (100%) rename recipes/wip/emu/{windows => win}/wine-stable/recipe.toml (100%) diff --git a/recipes/wip/emu/windows/boxedwine/recipe.toml b/recipes/wip/emu/win/boxedwine/recipe.toml similarity index 100% rename from recipes/wip/emu/windows/boxedwine/recipe.toml rename to recipes/wip/emu/win/boxedwine/recipe.toml diff --git a/recipes/wip/emu/windows/hangover/recipe.toml b/recipes/wip/emu/win/hangover/recipe.toml similarity index 100% rename from recipes/wip/emu/windows/hangover/recipe.toml rename to recipes/wip/emu/win/hangover/recipe.toml diff --git a/recipes/wip/emu/windows/retrowin32/recipe.toml b/recipes/wip/emu/win/retrowin32/recipe.toml similarity index 100% rename from recipes/wip/emu/windows/retrowin32/recipe.toml rename to recipes/wip/emu/win/retrowin32/recipe.toml diff --git a/recipes/wip/emu/windows/wine-stable/recipe.toml b/recipes/wip/emu/win/wine-stable/recipe.toml similarity index 100% rename from recipes/wip/emu/windows/wine-stable/recipe.toml rename to recipes/wip/emu/win/wine-stable/recipe.toml From 621c06e841d68b5ea0611713180c835a550e2fb7 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 15 Jan 2026 08:53:15 -0300 Subject: [PATCH 079/407] Improve wine-stable and hangover recipes --- recipes/wip/emu/win/hangover/recipe.toml | 6 +++++- recipes/wip/emu/win/wine-stable/recipe.toml | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/recipes/wip/emu/win/hangover/recipe.toml b/recipes/wip/emu/win/hangover/recipe.toml index 0d60487a1..57361881b 100644 --- a/recipes/wip/emu/win/hangover/recipe.toml +++ b/recipes/wip/emu/win/hangover/recipe.toml @@ -2,8 +2,12 @@ # build instructions: https://github.com/AndreRH/hangover/blob/master/docs/COMPILE.md [source] git = "https://github.com/AndreRH/hangover" -rev = "hangover-10.18" +rev = "hangover-11.0" shallow_clone = true +script = """ +DYNAMIC_INIT +autotools_recursive_regenerate +""" [build] template = "custom" dependencies = [ diff --git a/recipes/wip/emu/win/wine-stable/recipe.toml b/recipes/wip/emu/win/wine-stable/recipe.toml index 1034be31b..d0019de59 100644 --- a/recipes/wip/emu/win/wine-stable/recipe.toml +++ b/recipes/wip/emu/win/wine-stable/recipe.toml @@ -1,8 +1,9 @@ #TODO port to redox #build instructions: https://gitlab.winehq.org/wine/wine/-/wikis/Building-Wine [source] -tar = "http://dl.winehq.org/wine/source/10.x/wine-10.18.tar.xz" -blake3 = "0517c4200935456fbc22b152a19c5fd0d027d2b06c511968a5533101e1274f54" +git = "https://gitlab.winehq.org/wine/wine" +branch = "stable" +shallow_clone = true script = """ DYNAMIC_INIT autotools_recursive_regenerate From 19b7f13a9433901378115d9d882584ea8af920f6 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 15 Jan 2026 08:57:40 -0300 Subject: [PATCH 080/407] Move a recipe --- recipes/wip/{video/editors => gnome}/pitivi/recipe.toml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename recipes/wip/{video/editors => gnome}/pitivi/recipe.toml (100%) diff --git a/recipes/wip/video/editors/pitivi/recipe.toml b/recipes/wip/gnome/pitivi/recipe.toml similarity index 100% rename from recipes/wip/video/editors/pitivi/recipe.toml rename to recipes/wip/gnome/pitivi/recipe.toml From 9138b541f6ad1036abb62889cd5052b84dda29b3 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 15 Jan 2026 12:12:48 -0300 Subject: [PATCH 081/407] Improve some recipes --- recipes/wip/kde/ark/recipe.toml | 2 +- recipes/wip/kde/discover/recipe.toml | 2 +- recipes/wip/kde/k3b/recipe.toml | 14 +++++++++++++- recipes/wip/kde/kamoso/recipe.toml | 5 ++++- recipes/wip/kde/kde-dolphin/recipe.toml | 2 +- recipes/wip/kde/kdenlive/recipe.toml | 6 +++++- recipes/wip/kde/kdevelop/recipe.toml | 8 +++++--- recipes/wip/kde/kpatience/recipe.toml | 5 ++++- recipes/wip/kde/krita/recipe.toml | 6 +++++- recipes/wip/kde/kwave/recipe.toml | 8 +++++++- recipes/wip/kde/skanpage/recipe.toml | 3 ++- 11 files changed, 48 insertions(+), 13 deletions(-) diff --git a/recipes/wip/kde/ark/recipe.toml b/recipes/wip/kde/ark/recipe.toml index d5078e8ca..e0d18d4b7 100644 --- a/recipes/wip/kde/ark/recipe.toml +++ b/recipes/wip/kde/ark/recipe.toml @@ -2,7 +2,7 @@ #TODO discover minimum dependencies from cmake log [source] git = "https://invent.kde.org/utilities/ark" -branch = "release/25.08" +branch = "release/25.12" shallow_clone = true [build] template = "cmake" diff --git a/recipes/wip/kde/discover/recipe.toml b/recipes/wip/kde/discover/recipe.toml index 32828d4da..ddfda1b31 100644 --- a/recipes/wip/kde/discover/recipe.toml +++ b/recipes/wip/kde/discover/recipe.toml @@ -2,7 +2,7 @@ #TODO determine minimum dependencies from cmake log [source] git = "https://invent.kde.org/plasma/discover" -branch = "Plasma/6.5" +branch = "Plasma/6.6" shallow_clone = true [build] template = "cmake" diff --git a/recipes/wip/kde/k3b/recipe.toml b/recipes/wip/kde/k3b/recipe.toml index f9a01119c..9177fe46a 100644 --- a/recipes/wip/kde/k3b/recipe.toml +++ b/recipes/wip/kde/k3b/recipe.toml @@ -3,10 +3,22 @@ # build instructions: https://invent.kde.org/multimedia/k3b/-/blob/master/INSTALL.txt?ref_type=heads [source] git = "https://invent.kde.org/multimedia/k3b" -branch = "release/25.08" +branch = "release/25.12" shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DK3B_DOC=OFF", + "-DK3B_ENABLE_TAGLIB=OFF", + "-DK3B_ENABLE_DVD_RIPPING=OFF", + "-DK3B_BUILD_MUSE_DECODER_PLUGIN=OFF", + "-DK3B_BUILD_FLAC_DECODER_PLUGIN=OFF", + "-DK3B_BUILD_SNDFILE_DECODER_PLUGIN=OFF", + "-DK3B_BUILD_LAME_ENCODER_PLUGIN=OFF", + "-DK3B_BUILD_SOX_ENCODER_PLUGIN=OFF", + "-DK3B_BUILD_EXTERNAL_ENCODER_PLUGIN=OFF", + "-DK3B_BUILD_WAVE_DECODER_PLUGIN=OFF", +] dependencies = [ "libcdio-paranoia", ] diff --git a/recipes/wip/kde/kamoso/recipe.toml b/recipes/wip/kde/kamoso/recipe.toml index ced03c4e5..e0ae99f65 100644 --- a/recipes/wip/kde/kamoso/recipe.toml +++ b/recipes/wip/kde/kamoso/recipe.toml @@ -2,9 +2,12 @@ #TODO missing dependencies: https://invent.kde.org/multimedia/kamoso/-/blob/master/CMakeLists.txt?ref_type=heads#L29 [source] git = "https://invent.kde.org/multimedia/kamoso" -branch = "release/25.08" +branch = "release/25.12" [build] template = "cmake" +cmakeflags = [ + "-DBUILD_DOC=OFF", +] dependencies = [ "qt6-base", ] diff --git a/recipes/wip/kde/kde-dolphin/recipe.toml b/recipes/wip/kde/kde-dolphin/recipe.toml index e562f033d..6298a3800 100644 --- a/recipes/wip/kde/kde-dolphin/recipe.toml +++ b/recipes/wip/kde/kde-dolphin/recipe.toml @@ -2,7 +2,7 @@ #TODO discover minimum dependencies from cmake log [source] git = "https://invent.kde.org/system/dolphin" -branch = "release/25.08" +branch = "release/25.12" shallow_clone = true [build] template = "cmake" diff --git a/recipes/wip/kde/kdenlive/recipe.toml b/recipes/wip/kde/kdenlive/recipe.toml index 95447b59f..917b0ca92 100644 --- a/recipes/wip/kde/kdenlive/recipe.toml +++ b/recipes/wip/kde/kdenlive/recipe.toml @@ -3,10 +3,14 @@ # build instructions: https://invent.kde.org/multimedia/kdenlive/-/blob/master/dev-docs/build.md#build-and-install-the-projects [source] git = "https://invent.kde.org/multimedia/kdenlive" -branch = "release/25.08" +branch = "release/25.12" shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DBUILD_TESTING=OFF", + "-DUSE_DBUS=OFF", +] # dependencies = [ # "mlt", # "ffmpeg6", diff --git a/recipes/wip/kde/kdevelop/recipe.toml b/recipes/wip/kde/kdevelop/recipe.toml index f1e1cb5db..fa11c57bc 100644 --- a/recipes/wip/kde/kdevelop/recipe.toml +++ b/recipes/wip/kde/kdevelop/recipe.toml @@ -1,12 +1,14 @@ #TODO not compiled or tested -#TODO probably missing dependencies, see https://packages.debian.org/source/trixie/kdevelop -# build instructions: https://kdevelop.org/build-it/ +#TODO discover minimum dependencies from cmake log [source] git = "https://invent.kde.org/kdevelop/kdevelop" -branch = "release/25.08" +branch = "release/25.12" shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DBUILD_DOC=OFF", +] # dependencies = [ # "apr", # "apr-util", diff --git a/recipes/wip/kde/kpatience/recipe.toml b/recipes/wip/kde/kpatience/recipe.toml index 7702e707b..2a2fe9697 100644 --- a/recipes/wip/kde/kpatience/recipe.toml +++ b/recipes/wip/kde/kpatience/recipe.toml @@ -2,7 +2,10 @@ #TODO discover minimum dependencies from cmake log [source] git = "https://invent.kde.org/games/kpat" -branch = "release/25.08" +branch = "release/25.12" shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DBUILD_DOC=OFF", +] diff --git a/recipes/wip/kde/krita/recipe.toml b/recipes/wip/kde/krita/recipe.toml index 746db5b78..c166860fc 100644 --- a/recipes/wip/kde/krita/recipe.toml +++ b/recipes/wip/kde/krita/recipe.toml @@ -3,10 +3,14 @@ # build instructions: https://docs.krita.org/en/untranslatable_pages/building_krita.html#building-on-linux [source] git = "https://invent.kde.org/graphics/krita" -rev = "v5.2.13" +branch = "release/5.2.14" shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DLIMIT_LONG_TESTS=OFF", + "-DENABLE_UPDATERS=OFF", +] # dependencies = [ # "gexiv2", # "ffmpeg6", diff --git a/recipes/wip/kde/kwave/recipe.toml b/recipes/wip/kde/kwave/recipe.toml index cf7dbe575..cab1f7291 100644 --- a/recipes/wip/kde/kwave/recipe.toml +++ b/recipes/wip/kde/kwave/recipe.toml @@ -1,10 +1,16 @@ #TODO not compiled or tested [source] git = "https://invent.kde.org/multimedia/kwave" -rev = "release/25.08" +rev = "release/25.12" shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "--preset=release", + "-DWITH_DOC=OFF", + "-DWITH_FLAC=OFF", + "-DWITH_OSS=OFF", +] dependencies = [ "libpulse", "libmad", diff --git a/recipes/wip/kde/skanpage/recipe.toml b/recipes/wip/kde/skanpage/recipe.toml index 398fb80f5..091785aae 100644 --- a/recipes/wip/kde/skanpage/recipe.toml +++ b/recipes/wip/kde/skanpage/recipe.toml @@ -2,10 +2,11 @@ #TODO discover minimum dependencies from cmake log [source] git = "https://invent.kde.org/utilities/skanpage" -branch = "release/25.08" +branch = "release/25.12" shallow_clone = true [build] template = "cmake" +cmakeflags = ["--preset=release"] dependencies = [ "sane-backends", ] From 46805147e46588db59a05c83f7fd6e3474af9fb0 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 15 Jan 2026 13:01:52 -0300 Subject: [PATCH 082/407] Improve more recipes --- recipes/wip/gnome/gnome-web/recipe.toml | 15 ++++++--------- recipes/wip/gnome/pitivi/recipe.toml | 2 +- recipes/wip/image/editors/drawing/recipe.toml | 6 +++++- recipes/wip/image/editors/inkscape/recipe.toml | 3 ++- .../wip/image/other/graphicsmagick/recipe.toml | 5 ++--- recipes/wip/image/upscaling/upscaler/recipe.toml | 9 ++++++++- 6 files changed, 24 insertions(+), 16 deletions(-) diff --git a/recipes/wip/gnome/gnome-web/recipe.toml b/recipes/wip/gnome/gnome-web/recipe.toml index b106ca738..1f2f7be35 100644 --- a/recipes/wip/gnome/gnome-web/recipe.toml +++ b/recipes/wip/gnome/gnome-web/recipe.toml @@ -1,9 +1,13 @@ # TODO: Need to port more libs # newer version requires c_std=gnu23 [source] -tar = "https://github.com/GNOME/epiphany/archive/refs/tags/46.4.tar.gz" - +tar = "https://download.gnome.org/sources/epiphany/46/epiphany-46.5.tar.xz" [build] +template = "meson" +mesonflags = [ + "-Dunit_tests=disabled", + "-Dman-pages=disabled", +] dependencies = [ "cairo", # "gck2", @@ -31,10 +35,3 @@ dependencies = [ # "webkitgtk6", # "webkitgtk-web-process-extension6" ] - -template = "custom" -script = """ -DYNAMIC_INIT - -cookbook_meson -""" diff --git a/recipes/wip/gnome/pitivi/recipe.toml b/recipes/wip/gnome/pitivi/recipe.toml index e4acd1ee3..10e4f9cba 100644 --- a/recipes/wip/gnome/pitivi/recipe.toml +++ b/recipes/wip/gnome/pitivi/recipe.toml @@ -1,8 +1,8 @@ #TODO not compiled or tested #TODO determine minimum dependencies from meson log # lacking build instructions +# the tarball lacks an important recent fix [source] -#tar = "https://download.gnome.org/sources/pitivi/2023/pitivi-2023.03.tar.xz" git = "https://gitlab.gnome.org/GNOME/pitivi" rev = "b9864c4aca6d88dae38fde5609047d0ebd7b0506" shallow_clone = true diff --git a/recipes/wip/image/editors/drawing/recipe.toml b/recipes/wip/image/editors/drawing/recipe.toml index 77a0e5c4e..dc8bf3716 100644 --- a/recipes/wip/image/editors/drawing/recipe.toml +++ b/recipes/wip/image/editors/drawing/recipe.toml @@ -4,9 +4,13 @@ # dependencies: https://github.com/maoschanz/drawing/blob/master/CONTRIBUTING.md#dependencies [source] git = "https://github.com/maoschanz/drawing" -rev = "1.0.2" +branch = "1.0.x-stable" +shallow_clone = true [build] template = "meson" +mesonflags = [ + "-Denable-translations-and-appdata=false" +] #dependencies = [ # "gtk3", # "cairo", diff --git a/recipes/wip/image/editors/inkscape/recipe.toml b/recipes/wip/image/editors/inkscape/recipe.toml index 49dd872a7..f75218320 100644 --- a/recipes/wip/image/editors/inkscape/recipe.toml +++ b/recipes/wip/image/editors/inkscape/recipe.toml @@ -1,8 +1,9 @@ #TODO not compiled or tested #TODO discover minimum dependencies from cmake log # build instructions: https://inkscape.org/develop/getting-started/#compile +# build options: https://gitlab.com/inkscape/inkscape/-/blob/master/CMakeLists.txt?ref_type=heads#L87 [source] -tar = "https://inkscape.org/gallery/item/56344/inkscape-1.4.2.tar.xz" +tar = "https://inkscape.org/gallery/item/58914/inkscape-1.4.3.tar.xz" [build] template = "cmake" # dependencies = [ diff --git a/recipes/wip/image/other/graphicsmagick/recipe.toml b/recipes/wip/image/other/graphicsmagick/recipe.toml index 9711bca14..aa24af391 100644 --- a/recipes/wip/image/other/graphicsmagick/recipe.toml +++ b/recipes/wip/image/other/graphicsmagick/recipe.toml @@ -1,6 +1,5 @@ -#TODO compilation error - missing sys/poll.h -#TODO fix libwebp -#TODO more features - http://www.graphicsmagick.org/README.html#add-on-libraries-programs +#TODO compilation error: missing sys/poll.h +#TODO more features: http://www.graphicsmagick.org/README.html#add-on-libraries-programs [source] tar = "https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/1.3.42/GraphicsMagick-1.3.42.tar.xz/download" [build] diff --git a/recipes/wip/image/upscaling/upscaler/recipe.toml b/recipes/wip/image/upscaling/upscaler/recipe.toml index 6d6b73cfa..e8933ffb5 100644 --- a/recipes/wip/image/upscaling/upscaler/recipe.toml +++ b/recipes/wip/image/upscaling/upscaler/recipe.toml @@ -2,9 +2,16 @@ # build instructions: https://gitlab.gnome.org/World/Upscaler#meson [source] git = "https://gitlab.gnome.org/World/Upscaler" -rev = "30c2a8411fac281ed548189a9fea45dc9efe5b68" +rev = "1.6.3" +shallow_clone = true [build] template = "meson" +mesonflags = [ + "-Dnetwork_tests=false", +] +dev-dependencies = [ + "blueprint" +] dependencies = [ "gtk4", "libadwaita", From d4d95a02053512c1d59f4c453f863b563d6da3f5 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 15 Jan 2026 13:06:36 -0300 Subject: [PATCH 083/407] Add blueprint recipe --- recipes/wip/dev/lang/blueprint/recipe.toml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 recipes/wip/dev/lang/blueprint/recipe.toml diff --git a/recipes/wip/dev/lang/blueprint/recipe.toml b/recipes/wip/dev/lang/blueprint/recipe.toml new file mode 100644 index 000000000..747d6a5de --- /dev/null +++ b/recipes/wip/dev/lang/blueprint/recipe.toml @@ -0,0 +1,5 @@ +#TODO not compiled or tested +[source] +tar = "https://download.gnome.org/sources/blueprint-compiler/0.19/blueprint-compiler-0.19.0.tar.xz" +[build] +template = "meson" From dcbde556621110ce4dfb0029e222ee6b62debce0 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 15 Jan 2026 19:18:23 -0700 Subject: [PATCH 084/407] glib: default to decimal_point being '.' in locale --- recipes/libs/glib/redox.patch | 99 ++++++++++++++++++++++++----------- 1 file changed, 69 insertions(+), 30 deletions(-) diff --git a/recipes/libs/glib/redox.patch b/recipes/libs/glib/redox.patch index 47f8a2fe7..a150e5eed 100644 --- a/recipes/libs/glib/redox.patch +++ b/recipes/libs/glib/redox.patch @@ -1,6 +1,6 @@ -diff -ruwN source-old/fuzzing/fuzz_resolver.c source/fuzzing/fuzz_resolver.c ---- source-old/fuzzing/fuzz_resolver.c 2025-11-03 05:42:10.000000000 -0700 -+++ source/fuzzing/fuzz_resolver.c 2025-11-10 12:32:57.663974728 -0700 +diff -ruwN glib-2.87.0/fuzzing/fuzz_resolver.c source/fuzzing/fuzz_resolver.c +--- glib-2.87.0/fuzzing/fuzz_resolver.c 2025-11-03 05:42:10.000000000 -0700 ++++ source/fuzzing/fuzz_resolver.c 2026-01-15 18:35:07.058788231 -0700 @@ -29,7 +29,7 @@ gint rrtype) { @@ -10,9 +10,9 @@ diff -ruwN source-old/fuzzing/fuzz_resolver.c source/fuzzing/fuzz_resolver.c GList *record_list = NULL; /* Data too long? */ -diff -ruwN source-old/gio/gcredentialsprivate.h source/gio/gcredentialsprivate.h ---- source-old/gio/gcredentialsprivate.h 2025-11-03 05:42:10.000000000 -0700 -+++ source/gio/gcredentialsprivate.h 2025-11-10 12:35:09.114747806 -0700 +diff -ruwN glib-2.87.0/gio/gcredentialsprivate.h source/gio/gcredentialsprivate.h +--- glib-2.87.0/gio/gcredentialsprivate.h 2025-11-03 05:42:10.000000000 -0700 ++++ source/gio/gcredentialsprivate.h 2026-01-15 18:35:07.058963309 -0700 @@ -104,7 +104,7 @@ */ #undef G_CREDENTIALS_HAS_PID @@ -22,9 +22,9 @@ diff -ruwN source-old/gio/gcredentialsprivate.h source/gio/gcredentialsprivate.h #define G_CREDENTIALS_SUPPORTED 1 #define G_CREDENTIALS_USE_LINUX_UCRED 1 #define G_CREDENTIALS_NATIVE_TYPE G_CREDENTIALS_TYPE_LINUX_UCRED -diff -ruwN source-old/gio/glocalfile.c source/gio/glocalfile.c ---- source-old/gio/glocalfile.c 2025-11-03 05:42:10.000000000 -0700 -+++ source/gio/glocalfile.c 2025-11-10 12:32:57.664235788 -0700 +diff -ruwN glib-2.87.0/gio/glocalfile.c source/gio/glocalfile.c +--- glib-2.87.0/gio/glocalfile.c 2025-11-03 05:42:10.000000000 -0700 ++++ source/gio/glocalfile.c 2026-01-15 18:35:07.058984475 -0700 @@ -47,6 +47,10 @@ #include #endif @@ -36,9 +36,9 @@ diff -ruwN source-old/gio/glocalfile.c source/gio/glocalfile.c #ifndef O_BINARY #define O_BINARY 0 #endif -diff -ruwN source-old/gio/gnetworking.h.in source/gio/gnetworking.h.in ---- source-old/gio/gnetworking.h.in 2025-11-03 05:42:10.000000000 -0700 -+++ source/gio/gnetworking.h.in 2025-11-10 12:32:57.664602707 -0700 +diff -ruwN glib-2.87.0/gio/gnetworking.h.in source/gio/gnetworking.h.in +--- glib-2.87.0/gio/gnetworking.h.in 2025-11-03 05:42:10.000000000 -0700 ++++ source/gio/gnetworking.h.in 2026-01-15 18:35:07.059494095 -0700 @@ -40,13 +40,17 @@ #include #include @@ -57,9 +57,9 @@ diff -ruwN source-old/gio/gnetworking.h.in source/gio/gnetworking.h.in @NAMESER_COMPAT_INCLUDE@ #ifndef __GI_SCANNER__ -diff -ruwN source-old/gio/gthreadedresolver.c source/gio/gthreadedresolver.c ---- source-old/gio/gthreadedresolver.c 2025-11-03 05:42:10.000000000 -0700 -+++ source/gio/gthreadedresolver.c 2025-11-10 12:32:57.664870630 -0700 +diff -ruwN glib-2.87.0/gio/gthreadedresolver.c source/gio/gthreadedresolver.c +--- glib-2.87.0/gio/gthreadedresolver.c 2025-11-03 05:42:10.000000000 -0700 ++++ source/gio/gthreadedresolver.c 2026-01-15 18:35:07.059664185 -0700 @@ -698,7 +698,7 @@ } @@ -82,9 +82,9 @@ diff -ruwN source-old/gio/gthreadedresolver.c source/gio/gthreadedresolver.c gint len = 512; gint herr; GByteArray *answer; -diff -ruwN source-old/gio/gunixconnection.c source/gio/gunixconnection.c ---- source-old/gio/gunixconnection.c 2025-11-03 05:42:10.000000000 -0700 -+++ source/gio/gunixconnection.c 2025-11-10 12:36:14.017908505 -0700 +diff -ruwN glib-2.87.0/gio/gunixconnection.c source/gio/gunixconnection.c +--- glib-2.87.0/gio/gunixconnection.c 2025-11-03 05:42:10.000000000 -0700 ++++ source/gio/gunixconnection.c 2026-01-15 18:35:07.059895298 -0700 @@ -496,7 +496,7 @@ GSocket *socket; gint n; @@ -112,9 +112,9 @@ diff -ruwN source-old/gio/gunixconnection.c source/gio/gunixconnection.c if (turn_off_so_passcreds) { if (!g_socket_set_option (socket, -diff -ruwN source-old/gio/gunixmounts.c source/gio/gunixmounts.c ---- source-old/gio/gunixmounts.c 2025-11-03 05:42:10.000000000 -0700 -+++ source/gio/gunixmounts.c 2025-11-10 12:32:57.665218112 -0700 +diff -ruwN glib-2.87.0/gio/gunixmounts.c source/gio/gunixmounts.c +--- glib-2.87.0/gio/gunixmounts.c 2025-11-03 05:42:10.000000000 -0700 ++++ source/gio/gunixmounts.c 2026-01-15 18:35:07.060167680 -0700 @@ -1114,7 +1114,7 @@ } @@ -153,9 +153,9 @@ diff -ruwN source-old/gio/gunixmounts.c source/gio/gunixmounts.c /* Common code {{{2 */ #else #error No g_get_mount_table() implementation for system -diff -ruwN source-old/gio/meson.build source/gio/meson.build ---- source-old/gio/meson.build 2025-11-03 05:42:10.000000000 -0700 -+++ source/gio/meson.build 2025-11-10 12:32:57.665641216 -0700 +diff -ruwN glib-2.87.0/gio/meson.build source/gio/meson.build +--- glib-2.87.0/gio/meson.build 2025-11-03 05:42:10.000000000 -0700 ++++ source/gio/meson.build 2026-01-15 18:35:07.060812870 -0700 @@ -18,7 +18,7 @@ gnetworking_h_nameser_compat_include = '' @@ -174,9 +174,9 @@ diff -ruwN source-old/gio/meson.build source/gio/meson.build # res_query() res_query_test = '''#include int main (int argc, char ** argv) { -diff -ruwN source-old/gio/tests/gdbus-server-auth.c source/gio/tests/gdbus-server-auth.c ---- source-old/gio/tests/gdbus-server-auth.c 2025-11-03 05:42:10.000000000 -0700 -+++ source/gio/tests/gdbus-server-auth.c 2025-11-10 12:36:39.750972219 -0700 +diff -ruwN glib-2.87.0/gio/tests/gdbus-server-auth.c source/gio/tests/gdbus-server-auth.c +--- glib-2.87.0/gio/tests/gdbus-server-auth.c 2025-11-03 05:42:10.000000000 -0700 ++++ source/gio/tests/gdbus-server-auth.c 2026-01-15 18:35:07.061075904 -0700 @@ -243,7 +243,7 @@ } else /* We should prefer EXTERNAL whenever it is allowed. */ @@ -186,9 +186,9 @@ diff -ruwN source-old/gio/tests/gdbus-server-auth.c source/gio/tests/gdbus-serve /* We know that both GDBus and libdbus support full credentials-passing * on Linux. */ g_assert_cmpint (uid, ==, getuid ()); -diff -ruwN source-old/glib/glib-unix.c source/glib/glib-unix.c ---- source-old/glib/glib-unix.c 2025-11-03 05:42:10.000000000 -0700 -+++ source/glib/glib-unix.c 2025-11-10 12:32:57.665846181 -0700 +diff -ruwN glib-2.87.0/glib/glib-unix.c source/glib/glib-unix.c +--- glib-2.87.0/glib/glib-unix.c 2025-11-03 05:42:10.000000000 -0700 ++++ source/glib/glib-unix.c 2026-01-15 18:35:07.061343737 -0700 @@ -74,6 +74,10 @@ #include #endif /* defined (__FreeBSD__ )*/ @@ -221,3 +221,42 @@ diff -ruwN source-old/glib/glib-unix.c source/glib/glib-unix.c #else #error "g_unix_fd_query_path() not supported on this platform" #endif +diff -ruwN glib-2.87.0/glib/gstrfuncs.c source/glib/gstrfuncs.c +--- glib-2.87.0/glib/gstrfuncs.c 2025-11-03 05:42:10.000000000 -0700 ++++ source/glib/gstrfuncs.c 2026-01-15 19:15:21.406736293 -0700 +@@ -707,7 +707,7 @@ + + gchar *fail_pos; + gdouble val; +-#ifndef __BIONIC__ ++#if !defined(__BIONIC__) && !defined(__redox__) + struct lconv *locale_data; + #endif + const char *decimal_point; +@@ -720,7 +720,7 @@ + + fail_pos = NULL; + +-#ifndef __BIONIC__ ++#if !defined(__BIONIC__) && !defined(__redox__) + locale_data = localeconv (); + decimal_point = locale_data->decimal_point; + decimal_point_len = strlen (decimal_point); +@@ -931,7 +931,7 @@ + + return buffer; + #else +-#ifndef __BIONIC__ ++#if !defined(__BIONIC__) && !defined(__redox__) + struct lconv *locale_data; + #endif + const char *decimal_point; +@@ -964,7 +964,7 @@ + + _g_snprintf (buffer, buf_len, format, d); + +-#ifndef __BIONIC__ ++#if !defined(__BIONIC__) && !defined(__redox__) + locale_data = localeconv (); + decimal_point = locale_data->decimal_point; + decimal_point_len = strlen (decimal_point); From 9b9f0b80d7b6bee5eb8e82ae208c8230f76c4295 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 16 Jan 2026 16:23:37 +0700 Subject: [PATCH 085/407] server-demo: Update rustysd init, update PHP --- config/x86_64/server-demo.toml | 69 +++++++++++++++++++++++---------- recipes/dev/php84/recipe.toml | 3 +- recipes/dev/php84/redox.patch | 36 +++++++++-------- recipes/net/openssh/recipe.toml | 1 + 4 files changed, 70 insertions(+), 39 deletions(-) diff --git a/config/x86_64/server-demo.toml b/config/x86_64/server-demo.toml index 252d226e1..616654ffa 100644 --- a/config/x86_64/server-demo.toml +++ b/config/x86_64/server-demo.toml @@ -82,9 +82,8 @@ Description=The nginx HTTP and reverse proxy server After=network-online.target [Service] -Type=notify -ExecStart=/usr/bin/nginx -TimeoutStopSec=5 +Type=simple +ExecStart=/usr/bin/nginx -g "daemon off;" [Install] WantedBy=multi-user.target @@ -99,16 +98,34 @@ Description=OpenBSD Secure Shell server After=network-online.target [Service] -Type=notify -ExecStart=/usr/bin/sshd -TimeoutStopSec=5 +Type=simple +ExecStart=/usr/bin/sshd -D + +[Install] +WantedBy=multi-user.target +""" + + + +[[files]] +path = "/etc/rustysd/system/php.service" +data = """ +[Unit] +Description=OpenBSD Secure Shell server +After=network-online.target + +[Service] +Type=simple +# currently php-fpm not that quite work +ExecStart=env PWD=/var/www/html php -S localhost:9000 +# ExecStart=/usr/bin/php-fpm --fpm-config /etc/php/84/php-fpm.conf --nodaemonize [Install] WantedBy=multi-user.target """ [[files]] -path = "/home/user/public_html/index.php" +path = "/var/www/html/index.php" data = """ sudo bash server.sh -# -# A WIP port of rustysd is available, you can try start it manually +# There should be rustysd already running, if not, you can try start it manually # > sudo rustysd --conf /etc/rustysd # -# The server will start port 22 (ssh), 80 (static web) and 8080 (php) +# You can also try running all daemons manually +# > sudo bash server.sh +# +# The server will start port 22 (ssh), 80 (static web) and 8081 (php) +# If you use the Redox OS build system, starting QEMU with `net=redir` +# should expose those port to 8022, 8080 and 8081. +# Try logging in to console via SSH with `ssh user@localhost -p 8022` +# ############################################################################## """ diff --git a/recipes/dev/php84/recipe.toml b/recipes/dev/php84/recipe.toml index 1e109c25d..a8defe885 100644 --- a/recipes/dev/php84/recipe.toml +++ b/recipes/dev/php84/recipe.toml @@ -1,5 +1,6 @@ [source] -tar = "https://www.php.net/distributions/php-8.4.12.tar.xz" +tar = "https://www.php.net/distributions/php-8.4.17.tar.xz" +blake3 = "a8478dddd948d4b26e51c5727ac0895440da76e8ad9be947098a4284ca0b7f2a" patches = [ "redox.patch" ] diff --git a/recipes/dev/php84/redox.patch b/recipes/dev/php84/redox.patch index 25308e146..c1d6ef25e 100644 --- a/recipes/dev/php84/redox.patch +++ b/recipes/dev/php84/redox.patch @@ -1,7 +1,7 @@ diff -ruwN source/configure source-new/configure ---- source/configure 2025-08-26 20:36:28.000000000 +0700 -+++ source-new/configure 2025-09-26 16:31:28.871157195 +0700 -@@ -25863,7 +25863,7 @@ +--- source/configure 2026-01-14 00:17:10.000000000 +0700 ++++ source-new/configure 2026-01-16 15:56:01.944755811 +0700 +@@ -26007,7 +26007,7 @@ then : ac_cv_lib_curl_curl_easy_perform=yes else case e in #( @@ -10,7 +10,7 @@ diff -ruwN source/configure source-new/configure esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ -@@ -37356,7 +37356,7 @@ +@@ -37728,7 +37728,7 @@ then : php_cv_lib_gd_works=yes else case e in #( @@ -19,7 +19,7 @@ diff -ruwN source/configure source-new/configure esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ -@@ -40056,7 +40056,7 @@ +@@ -40464,7 +40464,7 @@ LIBS_SAVED=$LIBS CFLAGS="$CFLAGS $GMP_CFLAGS" LIBS="$LIBS $GMP_LIBS" @@ -29,8 +29,8 @@ diff -ruwN source/configure source-new/configure if test "x$ac_cv_header_gmp_h" = xyes then : diff -ruwN source/ext/phar/Makefile.frag source-new/ext/phar/Makefile.frag ---- source/ext/phar/Makefile.frag 2025-08-26 20:36:28.000000000 +0700 -+++ source-new/ext/phar/Makefile.frag 2025-09-26 16:31:29.029526842 +0700 +--- source/ext/phar/Makefile.frag 2026-01-14 00:17:10.000000000 +0700 ++++ source-new/ext/phar/Makefile.frag 2026-01-16 15:56:01.946130660 +0700 @@ -30,7 +30,7 @@ -@test -f $(builddir)/phar/phar.inc || cp $(srcdir)/phar/phar.inc $(builddir)/phar/phar.inc @@ -41,8 +41,8 @@ diff -ruwN source/ext/phar/Makefile.frag source-new/ext/phar/Makefile.frag $(builddir)/phar.php: $(srcdir)/build_precommand.php $(srcdir)/phar/*.inc $(srcdir)/phar/*.php $(SAPI_CLI_PATH) -@(echo "Generating phar.php"; \ diff -ruwN source/ext/posix/posix.c source-new/ext/posix/posix.c ---- source/ext/posix/posix.c 2025-08-26 20:36:28.000000000 +0700 -+++ source-new/ext/posix/posix.c 2025-09-26 16:31:29.085983450 +0700 +--- source/ext/posix/posix.c 2026-01-14 00:17:10.000000000 +0700 ++++ source-new/ext/posix/posix.c 2026-01-16 15:56:01.946290813 +0700 @@ -375,7 +375,7 @@ ZEND_PARSE_PARAMETERS_NONE(); @@ -53,25 +53,27 @@ diff -ruwN source/ext/posix/posix.c source-new/ext/posix/posix.c RETURN_FALSE; } diff -ruwN source/sapi/fpm/fpm/fpm_status.c source-new/sapi/fpm/fpm/fpm_status.c ---- source/sapi/fpm/fpm/fpm_status.c 2025-08-26 20:36:28.000000000 +0700 -+++ source-new/sapi/fpm/fpm/fpm_status.c 2025-09-27 01:07:38.657514932 +0700 -@@ -104,11 +104,15 @@ +--- source/sapi/fpm/fpm/fpm_status.c 2026-01-14 00:17:10.000000000 +0700 ++++ source-new/sapi/fpm/fpm/fpm_status.c 2026-01-16 15:57:37.781307156 +0700 +@@ -84,6 +84,7 @@ + continue; } - proc_p = &procs[i]; /* prevent NaN */ +#ifdef HAVE_TIMES - if (procs[i].cpu_duration.tv_sec == 0 && procs[i].cpu_duration.tv_usec == 0) { + if (proc_p->cpu_duration.tv_sec == 0 && proc_p->cpu_duration.tv_usec == 0) { cpu = 0.; } else { - cpu = (procs[i].last_request_cpu.tms_utime + procs[i].last_request_cpu.tms_stime + procs[i].last_request_cpu.tms_cutime + procs[i].last_request_cpu.tms_cstime) / fpm_scoreboard_get_tick() / (procs[i].cpu_duration.tv_sec + procs[i].cpu_duration.tv_usec / 1000000.) * 100.; +@@ -91,6 +92,9 @@ + proc_p->last_request_cpu.tms_cstime) / fpm_scoreboard_get_tick() / + (proc_p->cpu_duration.tv_sec + proc_p->cpu_duration.tv_usec / 1000000.) * 100.; } +#else + cpu = 0.; +#endif array_init(&fpm_proc_stat); - add_assoc_long(&fpm_proc_stat, "pid", procs[i].pid); -@@ -590,11 +594,15 @@ + add_assoc_long(&fpm_proc_stat, "pid", proc_p->pid); +@@ -573,11 +577,15 @@ } /* prevent NaN */ diff --git a/recipes/net/openssh/recipe.toml b/recipes/net/openssh/recipe.toml index b1b643580..a348a732a 100644 --- a/recipes/net/openssh/recipe.toml +++ b/recipes/net/openssh/recipe.toml @@ -18,6 +18,7 @@ COOKBOOK_CONFIGURE_FLAGS+=( --disable-strip --sysconfdir=/etc/ssh ) +export CFLAGS+=" -DSYSTEMD_NOTIFY=1" cookbook_configure mv "${COOKBOOK_STAGE}"/usr/sbin/sshd "${COOKBOOK_STAGE}"/usr/bin/sshd rmdir "${COOKBOOK_STAGE}"/usr/sbin From 461406409d794fef97c0a8863e332add9732d82d Mon Sep 17 00:00:00 2001 From: Ribbon Date: Fri, 16 Jan 2026 15:38:57 -0300 Subject: [PATCH 086/407] Add and improve more recipes --- .../wip/image/upscaling/upscaler/recipe.toml | 2 +- .../image/upscaling/upscayl-ncnn/recipe.toml | 15 ++++++++++++--- recipes/wip/kde/ktorrent/recipe.toml | 8 ++++++++ recipes/wip/libs/other/sdl2-pango/recipe.toml | 3 ++- recipes/wip/libs/other/sdl3/recipe.toml | 2 +- recipes/wip/libs/perf/openmp/recipe.toml | 9 +++++++++ .../bittorrent/transmission-cli/recipe.toml | 18 ++++++++++++++++++ .../bittorrent/transmission-daemon/recipe.toml | 16 ++++++++++++---- .../bittorrent/transmission-gtk/recipe.toml | 13 ++++++++++--- .../net/bittorrent/webtorrent-cli/recipe.toml | 1 + recipes/wip/net/email/thunderbird/recipe.toml | 8 +++----- recipes/wip/tools/flameshot/recipe.toml | 16 +++++++++++----- 12 files changed, 88 insertions(+), 23 deletions(-) create mode 100644 recipes/wip/kde/ktorrent/recipe.toml create mode 100644 recipes/wip/libs/perf/openmp/recipe.toml create mode 100644 recipes/wip/net/bittorrent/transmission-cli/recipe.toml diff --git a/recipes/wip/image/upscaling/upscaler/recipe.toml b/recipes/wip/image/upscaling/upscaler/recipe.toml index e8933ffb5..c7eae8da0 100644 --- a/recipes/wip/image/upscaling/upscaler/recipe.toml +++ b/recipes/wip/image/upscaling/upscaler/recipe.toml @@ -10,7 +10,7 @@ mesonflags = [ "-Dnetwork_tests=false", ] dev-dependencies = [ - "blueprint" + "host:blueprint" # add script for linux compilation ] dependencies = [ "gtk4", diff --git a/recipes/wip/image/upscaling/upscayl-ncnn/recipe.toml b/recipes/wip/image/upscaling/upscayl-ncnn/recipe.toml index de2f4f7b8..1955bff3d 100644 --- a/recipes/wip/image/upscaling/upscayl-ncnn/recipe.toml +++ b/recipes/wip/image/upscaling/upscayl-ncnn/recipe.toml @@ -1,7 +1,16 @@ #TODO not compiled or tested -# build instructions: https://github.com/upscayl/upscayl-ncnn/blob/master/README.md [source] git = "https://github.com/upscayl/upscayl-ncnn" -rev = "22774bc42e2bc3c785b5b585d213d960b1348ad5" +rev = "d02fa88e078e7109fd689932453362430144014d" +shallow_clone = true [build] -template = "cmake" +template = "custom" +dependencies = [ + "libvulkan", + "openmp", +] +script = """ +COOKBOOK_SOURCE="${COOKBOOK_SOURCE}/src" +DYNAMIC_INIT +cookbook_cmake +""" diff --git a/recipes/wip/kde/ktorrent/recipe.toml b/recipes/wip/kde/ktorrent/recipe.toml new file mode 100644 index 000000000..fd1a768a7 --- /dev/null +++ b/recipes/wip/kde/ktorrent/recipe.toml @@ -0,0 +1,8 @@ +#TODO not compiled or tested +#TODO discover minimum dependencies from cmake log +[source] +git = "https://invent.kde.org/network/ktorrent" +branch = "release/25.12" +shallow_clone = true +[build] +template = "cmake" diff --git a/recipes/wip/libs/other/sdl2-pango/recipe.toml b/recipes/wip/libs/other/sdl2-pango/recipe.toml index 3e9cb3c7b..dc7f3bc68 100644 --- a/recipes/wip/libs/other/sdl2-pango/recipe.toml +++ b/recipes/wip/libs/other/sdl2-pango/recipe.toml @@ -1,7 +1,8 @@ #TODO Not compiled or tested [source] git = "https://github.com/markuskimius/SDL2_Pango" -rev = "3afd884fddf8d81dbe2c140135deea0c79de31c1" +rev = "v2.1.5" +shallow_clone = true [build] template = "configure" dependencies = [ diff --git a/recipes/wip/libs/other/sdl3/recipe.toml b/recipes/wip/libs/other/sdl3/recipe.toml index f1f98db12..be9c68bc6 100644 --- a/recipes/wip/libs/other/sdl3/recipe.toml +++ b/recipes/wip/libs/other/sdl3/recipe.toml @@ -3,7 +3,7 @@ # build instructions: https://github.com/libsdl-org/SDL/blob/main/docs/README-cmake.md # dependencies: https://github.com/libsdl-org/SDL/blob/main/docs/README-linux.md [source] -tar = "https://github.com/libsdl-org/SDL/releases/download/release-3.2.26/SDL3-3.2.26.tar.gz" +tar = "https://github.com/libsdl-org/SDL/releases/download/release-3.4.0/SDL3-3.4.0.tar.gz" [build] template = "cmake" cmakeflags = [ diff --git a/recipes/wip/libs/perf/openmp/recipe.toml b/recipes/wip/libs/perf/openmp/recipe.toml new file mode 100644 index 000000000..5daee9c0c --- /dev/null +++ b/recipes/wip/libs/perf/openmp/recipe.toml @@ -0,0 +1,9 @@ +#TODO not compiled or tested +# build instructions: https://github.com/llvm/llvm-project/blob/main/openmp/README.rst +[source] +tar = "https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.6/openmp-21.1.6.src.tar.xz" +[build] +template = "cmake" +dependencies = [ + "llvm21", +] diff --git a/recipes/wip/net/bittorrent/transmission-cli/recipe.toml b/recipes/wip/net/bittorrent/transmission-cli/recipe.toml new file mode 100644 index 000000000..ca10c7665 --- /dev/null +++ b/recipes/wip/net/bittorrent/transmission-cli/recipe.toml @@ -0,0 +1,18 @@ +#TODO not compiled or tested +#TODO discover minimum dependencies from cmake log +# build instructions: https://github.com/transmission/transmission/blob/4.0.x/docs/Building-Transmission.md#on-unix +# build options: https://github.com/transmission/transmission/blob/4.0.x/CMakeLists.txt#L45 +[source] +tar = "https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz" +[build] +template = "cmake" +cmakeflags = [ + "-DENABLE_CLI=ON", + "-DINSTALL_WEB=OFF", + "-DENABLE_TESTS=OFF", + "-DINSTALL_DOC=OFF", +] +#dependencies = [ + #"openssl3", + #"curl", +#] diff --git a/recipes/wip/net/bittorrent/transmission-daemon/recipe.toml b/recipes/wip/net/bittorrent/transmission-daemon/recipe.toml index 867a34f86..8c547af18 100644 --- a/recipes/wip/net/bittorrent/transmission-daemon/recipe.toml +++ b/recipes/wip/net/bittorrent/transmission-daemon/recipe.toml @@ -1,10 +1,18 @@ #TODO not compiled or tested -# build instructions: https://github.com/transmission/transmission/blob/main/docs/Building-Transmission.md#on-unix +#TODO discover minimum dependencies from cmake log +# build instructions: https://github.com/transmission/transmission/blob/4.0.x/docs/Building-Transmission.md#on-unix +# build options: https://github.com/transmission/transmission/blob/4.0.x/CMakeLists.txt#L45 [source] tar = "https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz" [build] template = "cmake" -dependencies = [ - "openssl1", - "curl", +cmakeflags = [ + "-DINSTALL_WEB=OFF", + "-DENABLE_UTILS=OFF", + "-DENABLE_TESTS=OFF", + "-DINSTALL_DOC=OFF", ] +#dependencies = [ +# "openssl3", +# "curl", +#] diff --git a/recipes/wip/net/bittorrent/transmission-gtk/recipe.toml b/recipes/wip/net/bittorrent/transmission-gtk/recipe.toml index d4646b4ea..4df0e5ac6 100644 --- a/recipes/wip/net/bittorrent/transmission-gtk/recipe.toml +++ b/recipes/wip/net/bittorrent/transmission-gtk/recipe.toml @@ -1,11 +1,18 @@ #TODO not compiled or tested -# build instructions: https://github.com/transmission/transmission/blob/main/docs/Building-Transmission.md#on-unix +#TODO discover minimum dependencies from cmake log +# build instructions: https://github.com/transmission/transmission/blob/4.0.x/docs/Building-Transmission.md#on-unix +# build options: https://github.com/transmission/transmission/blob/4.0.x/CMakeLists.txt#L45 [source] tar = "https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz" [build] template = "cmake" +cmakeflags = [ + "-DINSTALL_WEB=OFF", + "-DENABLE_TESTS=OFF", + "-DINSTALL_DOC=OFF", +] dependencies = [ - "openssl1", - "curl", + #"openssl3", + #"curl", "gtk3mm", ] diff --git a/recipes/wip/net/bittorrent/webtorrent-cli/recipe.toml b/recipes/wip/net/bittorrent/webtorrent-cli/recipe.toml index d0eaa70ec..55e076786 100644 --- a/recipes/wip/net/bittorrent/webtorrent-cli/recipe.toml +++ b/recipes/wip/net/bittorrent/webtorrent-cli/recipe.toml @@ -2,6 +2,7 @@ [source] git = "https://github.com/webtorrent/webtorrent-cli" rev = "v5.1.3" +shallow_clone = true [build] template = "custom" script = """ diff --git a/recipes/wip/net/email/thunderbird/recipe.toml b/recipes/wip/net/email/thunderbird/recipe.toml index bfb6dde04..a2b8ea3c2 100644 --- a/recipes/wip/net/email/thunderbird/recipe.toml +++ b/recipes/wip/net/email/thunderbird/recipe.toml @@ -1,14 +1,12 @@ #TODO missing cross-compilation variables and a command to move the executable to the package +#TODO determine minimum dependencies from mach log # build instructions - https://developer.thunderbird.net/thunderbird-development/building-thunderbird [source] -tar = "https://archive.mozilla.org/pub/thunderbird/releases/128.0.1esr/source/thunderbird-128.0.1esr.source.tar.xz" +tar = "https://archive.mozilla.org/pub/thunderbird/releases/140.7.0esr/source/thunderbird-140.7.0esr.source.tar.xz" [build] template = "custom" -dependencies = [ - "library1", -] script = """ -mkdir -pv "${COOKBOOK_STAGE}"/usr +mkdir -pv "${COOKBOOK_STAGE}"/usr/bin export MOZCONFIG="{COOKBOOK_RECIPE}/mozconfig" ./mach build """ diff --git a/recipes/wip/tools/flameshot/recipe.toml b/recipes/wip/tools/flameshot/recipe.toml index 607a3b1f2..ee4f02445 100644 --- a/recipes/wip/tools/flameshot/recipe.toml +++ b/recipes/wip/tools/flameshot/recipe.toml @@ -1,12 +1,18 @@ #TODO not compiled or tested +#TODO determine minimum dependencies from cmake log # build instructions: https://flameshot.org/docs/installation/source-code/#compilation [source] git = "https://github.com/flameshot-org/flameshot" -rev = "70be63d478a271da549597d69bd4868607c0a395" +branch = "v13.3.0" +shallow_clone = true [build] template = "cmake" -dependencies = [ - "qt5-base", - "qt5-tools", - "qt5-svg", +cmakeflags = [ + "-DDISABLE_UPDATE_CHECKER=ON", + "-DBUILD_STATIC_LIBS=OFF", ] +#dependencies = [ +# "qt5-base", +# "qt5-tools", +# "qt5-svg", +#] From 46ee1ce49516fb9c907ce8c6aa10f9b2495d8632 Mon Sep 17 00:00:00 2001 From: Benton60 Date: Fri, 16 Jan 2026 22:49:28 -0500 Subject: [PATCH 087/407] moved pls from recipes/wip/terminal to recipes/terminal --- recipes/{wip => }/terminal/pls/recipe.toml | 1 - 1 file changed, 1 deletion(-) rename recipes/{wip => }/terminal/pls/recipe.toml (71%) diff --git a/recipes/wip/terminal/pls/recipe.toml b/recipes/terminal/pls/recipe.toml similarity index 71% rename from recipes/wip/terminal/pls/recipe.toml rename to recipes/terminal/pls/recipe.toml index db04dd571..62ce57d05 100644 --- a/recipes/wip/terminal/pls/recipe.toml +++ b/recipes/terminal/pls/recipe.toml @@ -1,4 +1,3 @@ -#TODO not compiled or tested [source] git = "https://github.com/pls-rs/pls" [build] From 8c8cf41f33b33be0a37638802bf1da94061580ad Mon Sep 17 00:00:00 2001 From: Petr Hrdina Date: Sat, 17 Jan 2026 17:21:05 +0100 Subject: [PATCH 088/407] Move recipe hf from wip --- recipes/files/hf/recipe.toml | 4 ++++ recipes/wip/files/hf/recipe.toml | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 recipes/files/hf/recipe.toml diff --git a/recipes/files/hf/recipe.toml b/recipes/files/hf/recipe.toml new file mode 100644 index 000000000..a70567971 --- /dev/null +++ b/recipes/files/hf/recipe.toml @@ -0,0 +1,4 @@ +[source] +git = "https://github.com/sorairolake/hf" +[build] +template = "cargo" diff --git a/recipes/wip/files/hf/recipe.toml b/recipes/wip/files/hf/recipe.toml index 6943199a7..a70567971 100644 --- a/recipes/wip/files/hf/recipe.toml +++ b/recipes/wip/files/hf/recipe.toml @@ -1,4 +1,3 @@ -#TODO not compiled or tested [source] git = "https://github.com/sorairolake/hf" [build] From c76fb12c8803a4f12cd92501185f402aa0dce323 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 18 Jan 2026 16:48:39 +0700 Subject: [PATCH 089/407] Write stage tree files to a file instead of to build log --- src/bin/repo.rs | 17 ++++++----------- src/cook/cook_build.rs | 9 +++++++-- src/cook/tree.rs | 23 ++++++++++++----------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index f1eebf228..960cf2e59 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -591,19 +591,14 @@ fn handle_cook( if config.cook.clean_target { let stage_dirs = get_stage_dirs(&recipe.recipe.optional_packages, &target_dir); - if config.cook.verbose && stage_dirs.iter().any(|d| d.is_dir()) { - log_to_pty!(logger, "DEBUG: Listing stage files before removing them"); - } for stage_dir in stage_dirs { if stage_dir.is_dir() { - if config.cook.verbose { - if let Some(stage_name) = stage_dir.file_name() { - log_to_pty!(logger, "--- {}.pkgar:", stage_name.to_string_lossy()); - } - tree::walk_file_tree(&stage_dir, " ", logger)?; - } - fs::remove_dir_all(&stage_dir) - .map_err(|err| anyhow!("failed to remove stage dir: {:?}", err))?; + let mut stage_files_buf = format!("{}\n", recipe.name.without_host()); + tree::walk_file_tree(&stage_dir, " ", &mut stage_files_buf) + .context("failed to walk stage files tree")?; + fs::write(stage_dir.with_added_extension("files"), stage_files_buf) + .context("unable to write stage files")?; + fs::remove_dir_all(&stage_dir).context("failed to remove stage dir")?; } } } diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index 2ec252e02..183390d77 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -470,9 +470,14 @@ pub fn remove_stage_dir(stage_dir: &PathBuf) -> Result<(), String> { remove_all(&stage_file)?; } let stage_meta = stage_dir.with_added_extension("toml"); - Ok(if stage_meta.is_file() { + if stage_meta.is_file() { remove_all(&stage_meta)?; - }) + } + let stage_files = stage_dir.with_added_extension("files"); + if stage_files.is_file() { + remove_all(&stage_files)?; + } + Ok(()) } pub fn get_stage_dirs(features: &Vec, target_dir: &Path) -> Vec { diff --git a/src/cook/tree.rs b/src/cook/tree.rs index 0174a5cf3..9bb51281e 100644 --- a/src/cook/tree.rs +++ b/src/cook/tree.rs @@ -1,13 +1,13 @@ +use anyhow::Context; +use pkg::{Package, PackageName}; +use std::fmt::Write as _; use std::{ collections::{HashMap, HashSet}, fs::read_to_string, path::PathBuf, }; -use anyhow::Context; -use pkg::{Package, PackageName}; - -use crate::{cook::pty::PtyOut, log_to_pty, recipe::CookRecipe}; +use crate::recipe::CookRecipe; pub enum WalkTreeEntry<'a> { Built(&'a PathBuf, u64), @@ -123,11 +123,11 @@ pub fn display_pkg_fn( Ok(()) } -pub fn walk_file_tree(dir: &PathBuf, prefix: &str, logger: &PtyOut) -> std::io::Result { +pub fn walk_file_tree(dir: &PathBuf, prefix: &str, buffer: &mut String) -> std::io::Result { if !dir.is_dir() { return Ok(0); } - + let fmt_err = std::io::Error::other; let entries: Vec<_> = std::fs::read_dir(dir)?.filter_map(|e| e.ok()).collect(); let mut total_size = 0; for (index, entry) in entries.iter().enumerate() { @@ -142,20 +142,21 @@ pub fn walk_file_tree(dir: &PathBuf, prefix: &str, logger: &PtyOut) -> std::io:: .unwrap_or("Unknown"); if path.is_dir() { - log_to_pty!(logger, "{}{}{}/", prefix, line_prefix, file_name); + writeln!(buffer, "{}{}{}/", prefix, line_prefix, file_name).map_err(fmt_err)?; let new_prefix = format!("{}{}", prefix, if is_last { " " } else { "│ " }); - walk_file_tree(&path, &new_prefix, logger)?; + walk_file_tree(&path, &new_prefix, buffer)?; } else { let size = metadata.len(); total_size += size; - log_to_pty!( - logger, + writeln!( + buffer, "{}{}{} ({})", prefix, line_prefix, file_name, format_size(size) - ); + ) + .map_err(fmt_err)?; } } From 36d8ad208c4e75a769744e06ca55d254d029b1a9 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 18 Jan 2026 17:21:59 +0700 Subject: [PATCH 090/407] Unindent the file list --- src/bin/repo.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 960cf2e59..3b81c828c 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -593,8 +593,8 @@ fn handle_cook( let stage_dirs = get_stage_dirs(&recipe.recipe.optional_packages, &target_dir); for stage_dir in stage_dirs { if stage_dir.is_dir() { - let mut stage_files_buf = format!("{}\n", recipe.name.without_host()); - tree::walk_file_tree(&stage_dir, " ", &mut stage_files_buf) + let mut stage_files_buf = String::new(); + tree::walk_file_tree(&stage_dir, "", &mut stage_files_buf) .context("failed to walk stage files tree")?; fs::write(stage_dir.with_added_extension("files"), stage_files_buf) .context("unable to write stage files")?; From 997d484dab10d21c7d01404183d6c22697b624ce Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 19 Jan 2026 09:26:16 -0700 Subject: [PATCH 091/407] Remove wip hf recipe --- recipes/wip/files/hf/recipe.toml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 recipes/wip/files/hf/recipe.toml diff --git a/recipes/wip/files/hf/recipe.toml b/recipes/wip/files/hf/recipe.toml deleted file mode 100644 index a70567971..000000000 --- a/recipes/wip/files/hf/recipe.toml +++ /dev/null @@ -1,4 +0,0 @@ -[source] -git = "https://github.com/sorairolake/hf" -[build] -template = "cargo" From 524ce53768f8aa8d6e5319073a41aed7909047bf Mon Sep 17 00:00:00 2001 From: Ribbon Date: Mon, 19 Jan 2026 21:12:00 -0300 Subject: [PATCH 092/407] Some filesystem config and recipe improvements --- config/aarch64/ci.toml | 244 +++++++++++++++++- config/i586/ci.toml | 230 +++++++++++++++++ config/riscv64gc/ci.toml | 231 +++++++++++++++++ config/x86_64/ci.toml | 165 ++++++++---- .../cairodemo.c => cairo-demo/cairo-demo.c} | 0 .../{cairodemo => cairo-demo}/recipe.toml | 6 +- recipes/dev/cargo/recipe.toml | 33 --- recipes/dev/cargo/redox.patch | 37 --- .../{calculator => orbcalculator}/recipe.toml | 0 recipes/net/{ => download}/curl/recipe.toml | 0 10 files changed, 818 insertions(+), 128 deletions(-) rename recipes/demos/{cairodemo/cairodemo.c => cairo-demo/cairo-demo.c} (100%) mode change 100755 => 100644 rename recipes/demos/{cairodemo => cairo-demo}/recipe.toml (76%) mode change 100755 => 100644 delete mode 100644 recipes/dev/cargo/recipe.toml delete mode 100644 recipes/dev/cargo/redox.patch rename recipes/math/{calculator => orbcalculator}/recipe.toml (100%) rename recipes/net/{ => download}/curl/recipe.toml (100%) diff --git a/config/aarch64/ci.toml b/config/aarch64/ci.toml index 76fb84db1..2ce2e3607 100644 --- a/config/aarch64/ci.toml +++ b/config/aarch64/ci.toml @@ -7,6 +7,20 @@ prompt = false # Package settings [packages] + +# If you need to disable some broken package comment out instead of removal to not increase the maintenance cost +#TODO: commented out recipes need to be built and tested inside of Redox to verify if they returned to work + +# Meta-packages below + +# dev-essential = {} +# dev-redox = {} +# redox-tests = {} +# x11-minimal = {} +# x11-full = {} + +# Normal packages below + acid = {} base = {} base-initfs = {} @@ -32,8 +46,6 @@ freefont = {} freetype2 = {} gettext = {} git = {} -# gdbserver = {} # wrong libc type -# gnu-binutils = {} # bfd doesn't recognize redox gnu-make = {} hicolor-icon-theme = {} installer = {} @@ -52,9 +64,6 @@ libstdcxx = {} libvorbis = {} libxkbcommon = {} libxml2 = {} -# mesa = {} # libudev was not found -# mesa-glu = {} # depends on mesa -# mpc = {} # libmpfr not found nano = {} nasm = {} ncurses = {} @@ -71,16 +80,15 @@ orbutils-background = {} orbutils-launcher = {} orbutils-orblogin = {} patch = {} -pcre = {} patchelf = {} -pop-icon-theme = {} +pcre = {} pkgutils = {} +pop-icon-theme = {} redoxfs = {} relibc = {} resist = {} ripgrep = {} rustpython = {} -# strace = {} # unknown syscall sdl1 = {} sed = {} shared-mime-info = {} @@ -88,6 +96,224 @@ smith = {} terminfo = {} userutils = {} uutils = {} -xz = {} vim = {} +xz = {} zlib = {} +# #"gcc13.cxx" = {} +# #"llvm21.clang" = {} +# #"llvm21.clang-dev" = {} +# #"llvm21.dev" = {} +# #"llvm21.lld" = {} +# #"llvm21.lld-dev" = {} +# #"llvm21.runtime" = {} +# #"python312.dev" = {} +# #"rust.doc" = {} +# #atk = {} # depends on glib which does not build +# #benchmarks = {} +# #binutils-gdb = {} +# #book = {} +# #cairo-demo = {} # linking errors +# #classicube = {} +# #cmake = {} +# #cmatrix = {} # needs ncursesw now +# #cookbook = {} +# #cosmic-reader = {} +# #cosmic-settings = {} +# #cosmic-store = {} +# #devilutionx = {} +# #dynamic-example = {} +# #fal +# #fd = {} # ctrlc-3.1.1 +# #file = {} +# #flycast = {} +# #freeciv = {} +# #freeglut = {} +# #friar = {} # mio patch +# #game-2048 = {} # rustc-serialize +# #gawk = {} # langinfo.h +# #gigalomania = {} # old recipe format +# #gitoxide = {} +# #goaccess = {} +# #gstreamer = {} # conflict with thread local errno +# #harfbuzz = {} # depends on glib which does not build +# #helix = {} +# #hello-redox = {} +# #hematite = {} # needs crate patches for redox-unix +# #hf = {} +# #ibm-plex = {} +# #iced = {} +# #jansson = {} # needs config.sub update +# #jq = {} +# #libarchive = {} +# #libatomic = {} +# #libcosmic = {} +# #libflac = {} +# #libmodplug1 = {} +# #libmpfr = {} +# #libnettle = {} +# #libogg = {} +# #libpsl = {} +# #libssh2 = {} +# #libtool = {} +# #liburcu = {} +# #libuv = {} +# #lua-compat-53 = {} +# #luajit = {} +# #luarocks = {} +# #luv = {} +# #mdp = {} # gcc hangs +# #miniserve = {} # actix +# #mpc = {} +# #mupen64plus = {} +# #ncdu = {} # multiple definitions of symbols +# #newlib = {} # obsolete +# #newlibtest = {} # obsolete +# #noto-color-emoji = {} +# #nushell = {} # needs cargo update +# #openjk = {} +# #openposixtestsuite = {} +# #opentyrian = {} +# #orbcalculator = {} +# #ostest-bins = {} +# #pango = {} # undefined references to std::__throw_system_error(int) +# #pastel = {} # needs crate patches for redox-unix +# #pathfinder = {} # servo-fontconfig +# #pciids = {} +# #pcre2 = {} +# #pixman = {} # depends on glib which does not build +# #pkgar = {} # uses virtual Cargo.toml, needs recipe update +# #pls = {} +# #pop-wallpapers = {} +# #powerline = {} # dirs +# #qemu = {} # can be built, but not working +# #quakespasm = {} +# #redox-posix-tests = {} +# #redox-ssh = {} # does not compile +# #retroarch = {} # OS_TLSIndex not declared +# #rust-cairo = {} # linking errors +# #rust-cairo-demo = {} # linking errors +# #rvvm = {} +# #schismtracker = {} # uses system includes +# #sdl-player = {} # wctype_t +# #sdl2-gfx = {} +# #sm64ex = {} +# #spacecadetpinball = {} +# #termplay = {} # backtrace cannot find link.h +# #twin-commander = {} +# #ubuntu-wallpapers = {} +# #unibilium = {} +# #utf8proc = {} +# #vice = {} # linker errors +# #vvvvvv = {} # did not compile +# #webrender = {} # unwind +# #website = {} +# #wesnoth = {} +# #wget = {} +# autoconf = {} +# automake = {} +# binutils = {} +# bzip2 = {} +# cairo = {} +# cleye = {} +# composer = {} +# cpal = {} +# dosbox = {} +# duktape = {} +# eduke32 = {} +# exampled = {} +# expat = {} +# extrautils = {} +# ffmpeg6 = {} +# fontconfig = {} +# freedoom = {} +# freepats = {} +# fribidi = {} +# gcc13 = {} +# gdbserver = {} # wrong libc type +# gdk-pixbuf = {} +# gears = {} +# generaluser-gs = {} +# glib = {} +# glutin = {} +# gnu-binutils = {} # bfd doesn't recognize redox +# gnu-grep = {} +# htop = {} +# intel-one-mono = {} +# lci = {} +# libavif = {} +# libc-bench = {} +# libedit = {} +# libgmp = {} +# libicu = {} +# libonig = {} +# libsodium = {} +# libuuid = {} +# libwebp = {} +# llvm21 = {} +# lsd = {} +# lua54 = {} +# lz4 = {} +# mednafen = {} +# mesa = {} # libudev was not found +# mesa-glu = {} # depends on mesa +# mgba = {} +# mpc = {} # libmpfr not found +# ncursesw = {} +# neverball = {} +# nginx = {} +# onefetch = {} +# openjazz = {} +# openssh = {} +# openssl3 = {} +# openttd = {} +# openttd-opengfx = {} +# openttd-openmsx = {} +# openttd-opensfx = {} +# orbclient = {} +# osdemo = {} +# perg = {} +# periodictable = {} +# perl5 = {} +# php84 = {} +# pixelcannon = {} +# pkg-config = {} +# prboom = {} +# procedural-wallpapers-rs = {} +# python312 = {} +# readline = {} +# redox-fatfs = {} +# redox-games = {} +# relibc-tests = {} +# rodioplay = {} +# rs-nes = {} +# rsync = {} +# rust = {} +# rust64 = {} +# rustual-boy = {} +# scummvm = {} +# sdl-gfx = {} +# sdl1-image = {} +# sdl1-mixer = {} +# sdl1-ttf = {} +# sdl2 = {} +# sdl2-gears = {} +# sdl2-image = {} +# sdl2-mixer = {} +# sdl2-ttf = {} +# servo = {} +# shellharden = {} +# shellstorm = {} +# simple-http-server = {} +# sodium = {} +# sopwith = {} +# sqlite3 = {} +# strace = {} # unknown syscall +# syobonaction = {} +# timidity = {} +# tokei = {} +# ttf-hack = {} +# vttest = {} +# webkitgtk3 = {} +# winit = {} +# xxhash = {} +# zstd = {} diff --git a/config/i586/ci.toml b/config/i586/ci.toml index 8c6105c92..090d252bc 100644 --- a/config/i586/ci.toml +++ b/config/i586/ci.toml @@ -7,6 +7,20 @@ prompt = false # Package settings [packages] + +# If you need to disable some broken package comment out instead of removal to not increase the maintenance cost +#TODO: commented out recipes need to be built and tested inside of Redox to verify if they returned to work + +# Meta-packages below + +# dev-essential = {} +# dev-redox = {} +# redox-tests = {} +# x11-minimal = {} +# x11-full = {} + +# Normal packages below + acid = {} base = {} base-initfs = {} @@ -85,3 +99,219 @@ uutils = {} xz = {} #vim = {} # conflicting types zlib = {} + +# #"gcc13.cxx" = {} +# #"llvm21.clang" = {} +# #"llvm21.clang-dev" = {} +# #"llvm21.dev" = {} +# #"llvm21.lld" = {} +# #"llvm21.lld-dev" = {} +# #"llvm21.runtime" = {} +# #"python312.dev" = {} +# #"rust.doc" = {} +# #atk = {} # depends on glib which does not build +# #benchmarks = {} +# #binutils-gdb = {} +# #book = {} +# #cairo-demo = {} # linking errors +# #classicube = {} +# #cmake = {} +# #cmatrix = {} # needs ncursesw now +# #cookbook = {} +# #cosmic-reader = {} +# #cosmic-settings = {} +# #cosmic-store = {} +# #devilutionx = {} +# #dynamic-example = {} +# #fal +# #fd = {} # ctrlc-3.1.1 +# #file = {} +# #flycast = {} +# #freeciv = {} +# #freeglut = {} +# #friar = {} # mio patch +# #game-2048 = {} # rustc-serialize +# #gawk = {} # langinfo.h +# #gigalomania = {} # old recipe format +# #gitoxide = {} +# #goaccess = {} +# #gstreamer = {} # conflict with thread local errno +# #harfbuzz = {} # depends on glib which does not build +# #helix = {} +# #hello-redox = {} +# #hematite = {} # needs crate patches for redox-unix +# #hf = {} +# #ibm-plex = {} +# #iced = {} +# #jansson = {} # needs config.sub update +# #jq = {} +# #libarchive = {} +# #libatomic = {} +# #libcosmic = {} +# #libflac = {} +# #libmodplug1 = {} +# #libmpfr = {} +# #libnettle = {} +# #libogg = {} +# #libpsl = {} +# #libssh2 = {} +# #libtool = {} +# #liburcu = {} +# #libuv = {} +# #lua-compat-53 = {} +# #luajit = {} +# #luarocks = {} +# #luv = {} +# #mdp = {} # gcc hangs +# #miniserve = {} # actix +# #mpc = {} +# #mupen64plus = {} +# #ncdu = {} # multiple definitions of symbols +# #newlib = {} # obsolete +# #newlibtest = {} # obsolete +# #noto-color-emoji = {} +# #nushell = {} # needs cargo update +# #openjk = {} +# #openposixtestsuite = {} +# #opentyrian = {} +# #orbcalculator = {} +# #ostest-bins = {} +# #pango = {} # undefined references to std::__throw_system_error(int) +# #pastel = {} # needs crate patches for redox-unix +# #pathfinder = {} # servo-fontconfig +# #pciids = {} +# #pcre2 = {} +# #pixman = {} # depends on glib which does not build +# #pkgar = {} # uses virtual Cargo.toml, needs recipe update +# #pls = {} +# #pop-wallpapers = {} +# #powerline = {} # dirs +# #qemu = {} # can be built, but not working +# #quakespasm = {} +# #redox-posix-tests = {} +# #redox-ssh = {} # does not compile +# #retroarch = {} # OS_TLSIndex not declared +# #rust-cairo = {} # linking errors +# #rust-cairo-demo = {} # linking errors +# #rvvm = {} +# #schismtracker = {} # uses system includes +# #sdl-player = {} # wctype_t +# #sdl2-gfx = {} +# #sm64ex = {} +# #spacecadetpinball = {} +# #termplay = {} # backtrace cannot find link.h +# #twin-commander = {} +# #ubuntu-wallpapers = {} +# #unibilium = {} +# #utf8proc = {} +# #vice = {} # linker errors +# #vvvvvv = {} # did not compile +# #webrender = {} # unwind +# #website = {} +# #wesnoth = {} +# #wget = {} +# autoconf = {} +# automake = {} +# binutils = {} +# bzip2 = {} +# cairo = {} +# cleye = {} +# composer = {} +# cpal = {} +# dosbox = {} +# duktape = {} +# eduke32 = {} +# exampled = {} +# ffmpeg6 = {} +# fontconfig = {} +# freedoom = {} +# freepats = {} +# fribidi = {} +# gcc13 = {} +# gdbserver = {} +# gdk-pixbuf = {} +# gears = {} +# generaluser-gs = {} +# glib = {} +# glutin = {} +# gnu-binutils = {} +# gnu-grep = {} +# htop = {} +# intel-one-mono = {} +# lci = {} +# libavif = {} +# libc-bench = {} +# libedit = {} +# libgmp = {} +# libicu = {} +# libonig = {} +# libsodium = {} +# libuuid = {} +# libwebp = {} +# llvm21 = {} +# lsd = {} +# lua54 = {} +# lz4 = {} +# mednafen = {} +# mesa = {} +# mesa-glu = {} +# mgba = {} +# ncursesw = {} +# neverball = {} +# nginx = {} +# onefetch = {} +# openjazz = {} +# openssh = {} +# openssl3 = {} +# openttd = {} +# openttd-opengfx = {} +# openttd-openmsx = {} +# openttd-opensfx = {} +# orbclient = {} +# osdemo = {} +# perg = {} +# periodictable = {} +# perl5 = {} +# php84 = {} +# pixelcannon = {} +# pkg-config = {} +# prboom = {} +# procedural-wallpapers-rs = {} +# python312 = {} +# readline = {} +# redox-fatfs = {} +# redox-games = {} +# relibc-tests = {} +# rodioplay = {} +# rs-nes = {} +# rsync = {} +# rust = {} +# rust64 = {} +# rustual-boy = {} +# scummvm = {} +# sdl-gfx = {} +# sdl1-image = {} +# sdl1-mixer = {} +# sdl1-ttf = {} +# sdl2 = {} +# sdl2-gears = {} +# sdl2-image = {} +# sdl2-mixer = {} +# sdl2-ttf = {} +# servo = {} +# shellharden = {} +# shellstorm = {} +# simple-http-server = {} +# sodium = {} +# sopwith = {} +# sqlite3 = {} +# strace = {} +# syobonaction = {} +# timidity = {} +# tokei = {} +# ttf-hack = {} +# vttest = {} +# webkitgtk3 = {} +# winit = {} +# xxhash = {} +# zstd = {} diff --git a/config/riscv64gc/ci.toml b/config/riscv64gc/ci.toml index 6da302cbf..fbb986a24 100644 --- a/config/riscv64gc/ci.toml +++ b/config/riscv64gc/ci.toml @@ -7,6 +7,20 @@ prompt = false # Package settings [packages] + +# If you need to disable some broken package comment out instead of removal to not increase the maintenance cost +#TODO: commented out recipes need to be built and tested inside of Redox to verify if they returned to work + +# Meta-packages below + +# dev-essential = {} +# dev-redox = {} +# redox-tests = {} +# x11-minimal = {} +# x11-full = {} + +# Normal packages below + acid = {} base = {} base-initfs = {} @@ -85,3 +99,220 @@ uutils = {} xz = {} #vim = {} # error compiling ncurses zlib = {} + +# #"gcc13.cxx" = {} +# #"llvm21.clang" = {} +# #"llvm21.clang-dev" = {} +# #"llvm21.dev" = {} +# #"llvm21.lld" = {} +# #"llvm21.lld-dev" = {} +# #"llvm21.runtime" = {} +# #"python312.dev" = {} +# #"rust.doc" = {} +# #atk = {} # depends on glib which does not build +# #benchmarks = {} +# #binutils-gdb = {} +# #book = {} +# #cairo-demo = {} # linking errors +# #classicube = {} +# #cmake = {} +# #cmatrix = {} # needs ncursesw now +# #cookbook = {} +# #cosmic-reader = {} +# #cosmic-settings = {} +# #cosmic-store = {} +# #devilutionx = {} +# #dynamic-example = {} +# #fal +# #fd = {} # ctrlc-3.1.1 +# #file = {} +# #flycast = {} +# #freeciv = {} +# #freeglut = {} +# #friar = {} # mio patch +# #game-2048 = {} # rustc-serialize +# #gawk = {} # langinfo.h +# #gigalomania = {} # old recipe format +# #gitoxide = {} +# #goaccess = {} +# #gstreamer = {} # conflict with thread local errno +# #harfbuzz = {} # depends on glib which does not build +# #helix = {} +# #hello-redox = {} +# #hematite = {} # needs crate patches for redox-unix +# #hf = {} +# #ibm-plex = {} +# #iced = {} +# #jansson = {} # needs config.sub update +# #jq = {} +# #libarchive = {} +# #libatomic = {} +# #libcosmic = {} +# #libflac = {} +# #libmodplug1 = {} +# #libmpfr = {} +# #libnettle = {} +# #libogg = {} +# #libpsl = {} +# #libssh2 = {} +# #libtool = {} +# #liburcu = {} +# #libuv = {} +# #lua-compat-53 = {} +# #luajit = {} +# #luarocks = {} +# #luv = {} +# #mdp = {} # gcc hangs +# #miniserve = {} # actix +# #mpc = {} +# #mupen64plus = {} +# #ncdu = {} # multiple definitions of symbols +# #newlib = {} # obsolete +# #newlibtest = {} # obsolete +# #noto-color-emoji = {} +# #nushell = {} # needs cargo update +# #openjk = {} +# #openposixtestsuite = {} +# #opentyrian = {} +# #orbcalculator = {} +# #ostest-bins = {} +# #pango = {} # undefined references to std::__throw_system_error(int) +# #pastel = {} # needs crate patches for redox-unix +# #pathfinder = {} # servo-fontconfig +# #pciids = {} +# #pcre2 = {} +# #pixman = {} # depends on glib which does not build +# #pkgar = {} # uses virtual Cargo.toml, needs recipe update +# #pls = {} +# #pop-wallpapers = {} +# #powerline = {} # dirs +# #qemu = {} # can be built, but not working +# #quakespasm = {} +# #redox-posix-tests = {} +# #redox-ssh = {} # does not compile +# #retroarch = {} # OS_TLSIndex not declared +# #rust-cairo = {} # linking errors +# #rust-cairo-demo = {} # linking errors +# #rvvm = {} +# #schismtracker = {} # uses system includes +# #sdl-player = {} # wctype_t +# #sdl2-gfx = {} +# #sm64ex = {} +# #spacecadetpinball = {} +# #termplay = {} # backtrace cannot find link.h +# #twin-commander = {} +# #ubuntu-wallpapers = {} +# #unibilium = {} +# #utf8proc = {} +# #vice = {} # linker errors +# #vvvvvv = {} # did not compile +# #webrender = {} # unwind +# #website = {} +# #wesnoth = {} +# #wget = {} +# autoconf = {} +# automake = {} +# binutils = {} +# bzip2 = {} +# cairo = {} +# cleye = {} +# composer = {} +# cosmic-text = {} +# cpal = {} +# dosbox = {} +# duktape = {} +# eduke32 = {} +# exampled = {} +# ffmpeg6 = {} +# fontconfig = {} +# freedoom = {} +# freepats = {} +# fribidi = {} +# gcc13 = {} +# gdbserver = {} +# gdk-pixbuf = {} +# gears = {} +# generaluser-gs = {} +# glib = {} +# glutin = {} +# gnu-binutils = {} +# gnu-grep = {} +# htop = {} +# intel-one-mono = {} +# lci = {} +# libavif = {} +# libc-bench = {} +# libedit = {} +# libgmp = {} +# libicu = {} +# libonig = {} +# libsodium = {} +# libuuid = {} +# libwebp = {} +# llvm21 = {} +# lsd = {} +# lua54 = {} +# lz4 = {} +# mednafen = {} +# mesa = {} +# mesa-glu = {} +# mgba = {} +# ncursesw = {} +# neverball = {} +# nginx = {} +# onefetch = {} +# openjazz = {} +# openssh = {} +# openssl3 = {} +# openttd = {} +# openttd-opengfx = {} +# openttd-openmsx = {} +# openttd-opensfx = {} +# orbclient = {} +# osdemo = {} +# perg = {} +# periodictable = {} +# perl5 = {} +# php84 = {} +# pixelcannon = {} +# pkg-config = {} +# prboom = {} +# procedural-wallpapers-rs = {} +# python312 = {} +# readline = {} +# redox-fatfs = {} +# redox-games = {} +# relibc-tests = {} +# rodioplay = {} +# rs-nes = {} +# rsync = {} +# rust = {} +# rust64 = {} +# rustual-boy = {} +# scummvm = {} +# sdl-gfx = {} +# sdl1-image = {} +# sdl1-mixer = {} +# sdl1-ttf = {} +# sdl2 = {} +# sdl2-gears = {} +# sdl2-image = {} +# sdl2-mixer = {} +# sdl2-ttf = {} +# servo = {} +# shellharden = {} +# shellstorm = {} +# simple-http-server = {} +# sodium = {} +# sopwith = {} +# sqlite3 = {} +# strace = {} +# syobonaction = {} +# timidity = {} +# tokei = {} +# ttf-hack = {} +# vttest = {} +# webkitgtk3 = {} +# winit = {} +# xxhash = {} +# zstd = {} \ No newline at end of file diff --git a/config/x86_64/ci.toml b/config/x86_64/ci.toml index 7394289b2..22ca6e2c2 100644 --- a/config/x86_64/ci.toml +++ b/config/x86_64/ci.toml @@ -8,6 +8,9 @@ prompt = false # Package settings [packages] +# If you need to disable some broken package comment out instead of removal to not increase the maintenance cost +#TODO: commented out recipes need to be built and tested inside of Redox to verify if they returned to work + # Meta-packages below dev-essential = {} @@ -19,7 +22,6 @@ x11-full = {} # Normal packages below acid = {} -#atk = {} # depends on glib which does not build autoconf = {} automake = {} base = {} @@ -31,10 +33,7 @@ bottom = {} bzip2 = {} ca-certificates = {} cairo = {} -#cairodemo = {} # linking errors -#calculator = {} cleye = {} -#cmatrix = {} # needs ncursesw now composer = {} contain = {} coreutils = {} @@ -54,49 +53,37 @@ eduke32 = {} exampled = {} expat = {} extrautils = {} -#fal -#fd = {} # ctrlc-3.1.1 ffmpeg6 = {} findutils = {} fontconfig = {} -#freeciv = {} freedoom = {} freefont = {} -#freeglut = {} freepats = {} freetype2 = {} -#friar = {} # mio patch fribidi = {} -#game-2048 = {} # rustc-serialize -#gawk = {} # langinfo.h gcc13 = {} gdbserver = {} gdk-pixbuf = {} gears = {} generaluser-gs = {} gettext = {} -#gigalomania = {} # old recipe format git = {} glib = {} glutin = {} gnu-binutils = {} gnu-grep = {} gnu-make = {} -#gstreamer = {} # conflict with thread local errno -#harfbuzz = {} # depends on glib which does not build -#hematite = {} # needs crate patches for redox-unix hicolor-icon-theme = {} htop = {} installer = {} installer-gui = {} intel-one-mono = {} ion = {} -#jansson = {} # needs config.sub update kernel = {} kibi = {} lci = {} -libc-bench = {} libavif = {} +libc-bench = {} libedit = {} libffi = {} libgcc = {} @@ -108,37 +95,31 @@ libogg = {} libonig = {} liborbital = {} libpng = {} -libstdcxx = {} libsodium = {} +libstdcxx = {} +libuuid = {} libvorbis = {} libwebp = {} libxkbcommon = {} -libuuid = {} libxml2 = {} llvm21 = {} lsd = {} lua54 = {} lz4 = {} -#mdp = {} # gcc hangs mednafen = {} mesa = {} mesa-glu = {} mgba = {} -#miniserve = {} # actix nano = {} nasm = {} -#ncdu = {} # multiple definitions of symbols ncurses = {} ncursesw = {} netdb = {} netsurf = {} netutils = {} neverball = {} -#newlib = {} # obsolete -#newlibtest = {} # obsolete nghttp2 = {} nginx = {} -#nushell = {} # needs cargo update onefetch = {} openjazz = {} openssh = {} @@ -157,51 +138,37 @@ orbutils-background = {} orbutils-launcher = {} orbutils-orblogin = {} osdemo = {} -#pango = {} # undefined references to std::__throw_system_error(int) -#pastel = {} # needs crate patches for redox-unix patch = {} patchelf = {} -#pathfinder = {} # servo-fontconfig -#pciids = {} pcre = {} perg = {} periodictable = {} -php84 = {} perl5 = {} +php84 = {} pixelcannon = {} -#pixman = {} # depends on glib which does not build -#pkgar = {} # uses virtual Cargo.toml, needs recipe update pkg-config = {} pkgutils = {} pop-icon-theme = {} -#powerline = {} # dirs prboom = {} procedural-wallpapers-rs = {} python312 = {} -#qemu = {} # can be built, but not working readline = {} redox-fatfs = {} -redoxfs = {} redox-games = {} -#redox-ssh = {} # does not compile +redoxfs = {} relibc = {} relibc-tests = {} resist = {} -#retroarch = {} # OS_TLSIndex not declared ripgrep = {} rodioplay = {} rs-nes = {} rsync = {} rust = {} rust64 = {} -#rust-cairo = {} # linking errors -#rust-cairo-demo = {} # linking errors rustpython = {} rustual-boy = {} -#schismtracker = {} # uses system includes scummvm = {} sdl-gfx = {} -#sdl-player = {} # wctype_t sdl1 = {} sdl1-image = {} sdl1-mixer = {} @@ -224,21 +191,127 @@ sqlite3 = {} strace = {} syobonaction = {} terminfo = {} -#termplay = {} # backtrace cannot find link.h timidity = {} tokei = {} ttf-hack = {} userutils = {} uutils = {} -#vice = {} # linker errors vim = {} vttest = {} -#vvvvvv = {} # did not compile webkitgtk3 = {} -#webrender = {} # unwind -#wesnoth = {} winit = {} xxhash = {} xz = {} zlib = {} zstd = {} + +#"gcc13.cxx" = {} +#"llvm21.clang" = {} +#"llvm21.clang-dev" = {} +#"llvm21.dev" = {} +#"llvm21.lld" = {} +#"llvm21.lld-dev" = {} +#"llvm21.runtime" = {} +#"python312.dev" = {} +#"rust.doc" = {} +#atk = {} # depends on glib which does not build +#benchmarks = {} +#binutils-gdb = {} +#book = {} +#cairo-demo = {} # linking errors +#classicube = {} +#cmake = {} +#cmatrix = {} # needs ncursesw now +#cookbook = {} +#cosmic-reader = {} +#cosmic-settings = {} +#cosmic-store = {} +#devilutionx = {} +#dynamic-example = {} +#fal +#fd = {} # ctrlc-3.1.1 +#file = {} +#flycast = {} +#freeciv = {} +#freeglut = {} +#friar = {} # mio patch +#game-2048 = {} # rustc-serialize +#gawk = {} # langinfo.h +#gigalomania = {} # old recipe format +#gitoxide = {} +#goaccess = {} +#gstreamer = {} # conflict with thread local errno +#harfbuzz = {} # depends on glib which does not build +#helix = {} +#hello-redox = {} +#hematite = {} # needs crate patches for redox-unix +#hf = {} +#ibm-plex = {} +#iced = {} +#jansson = {} # needs config.sub update +#jq = {} +#libarchive = {} +#libatomic = {} +#libcosmic = {} +#libflac = {} +#libmodplug1 = {} +#libmpfr = {} +#libnettle = {} +#libogg = {} +#libpsl = {} +#libssh2 = {} +#libtool = {} +#liburcu = {} +#libuv = {} +#lua-compat-53 = {} +#luajit = {} +#luarocks = {} +#luv = {} +#mdp = {} # gcc hangs +#miniserve = {} # actix +#mpc = {} +#mupen64plus = {} +#ncdu = {} # multiple definitions of symbols +#newlib = {} # obsolete +#newlibtest = {} # obsolete +#noto-color-emoji = {} +#nushell = {} # needs cargo update +#openjk = {} +#openposixtestsuite = {} +#opentyrian = {} +#orbcalculator = {} +#ostest-bins = {} +#pango = {} # undefined references to std::__throw_system_error(int) +#pastel = {} # needs crate patches for redox-unix +#pathfinder = {} # servo-fontconfig +#pciids = {} +#pcre2 = {} +#pixman = {} # depends on glib which does not build +#pkgar = {} # uses virtual Cargo.toml, needs recipe update +#pls = {} +#pop-wallpapers = {} +#powerline = {} # dirs +#qemu = {} # can be built, but not working +#quakespasm = {} +#redox-posix-tests = {} +#redox-ssh = {} # does not compile +#retroarch = {} # OS_TLSIndex not declared +#rust-cairo = {} # linking errors +#rust-cairo-demo = {} # linking errors +#rvvm = {} +#schismtracker = {} # uses system includes +#sdl-player = {} # wctype_t +#sdl2-gfx = {} +#sm64ex = {} +#spacecadetpinball = {} +#termplay = {} # backtrace cannot find link.h +#twin-commander = {} +#ubuntu-wallpapers = {} +#unibilium = {} +#utf8proc = {} +#vice = {} # linker errors +#vvvvvv = {} # did not compile +#webrender = {} # unwind +#website = {} +#wesnoth = {} +#wget = {} diff --git a/recipes/demos/cairodemo/cairodemo.c b/recipes/demos/cairo-demo/cairo-demo.c old mode 100755 new mode 100644 similarity index 100% rename from recipes/demos/cairodemo/cairodemo.c rename to recipes/demos/cairo-demo/cairo-demo.c diff --git a/recipes/demos/cairodemo/recipe.toml b/recipes/demos/cairo-demo/recipe.toml old mode 100755 new mode 100644 similarity index 76% rename from recipes/demos/cairodemo/recipe.toml rename to recipes/demos/cairo-demo/recipe.toml index 6538f035d..41b171761 --- a/recipes/demos/cairodemo/recipe.toml +++ b/recipes/demos/cairo-demo/recipe.toml @@ -15,11 +15,11 @@ template = "custom" script = """ "${CXX}" \ $("${PKG_CONFIG}" --cflags cairo) \ - "${COOKBOOK_RECIPE}/cairodemo.c" \ - -o cairodemo \ + "${COOKBOOK_RECIPE}/cairo-demo.c" \ + -o cairo-demo \ -static \ $("${PKG_CONFIG}" --libs cairo) \ -lorbital mkdir -pv "${COOKBOOK_STAGE}/bin" -cp -v "cairodemo" "${COOKBOOK_STAGE}/bin/cairodemo" +cp -v "cairo-demo" "${COOKBOOK_STAGE}/bin/cairo-demo" """ diff --git a/recipes/dev/cargo/recipe.toml b/recipes/dev/cargo/recipe.toml deleted file mode 100644 index e07489624..000000000 --- a/recipes/dev/cargo/recipe.toml +++ /dev/null @@ -1,33 +0,0 @@ -[source] -git = "https://github.com/rust-lang/cargo.git" -rev = "d73d2caf9e41a39daf2a8d6ce60ec80bf354d2a7" # 0.86 -patches = [ - "redox.patch" -] - -[build] -template = "custom" -dependencies = [ - "curl", - "libssh2", - "nghttp2", - "openssl1", - "zlib", -] -script = """ -DYNAMIC_INIT -export LIBSSH2_SYS_USE_PKG_CONFIG=1 -export LIBZ_SYS_STATIC=1 -export DEP_NGHTTP2_ROOT="${COOKBOOK_SYSROOT}" -export DEP_OPENSSL_ROOT="${COOKBOOK_SYSROOT}" -export DEP_Z_ROOT="${COOKBOOK_SYSROOT}" -"${COOKBOOK_CARGO}" rustc \ - --manifest-path "${COOKBOOK_SOURCE}/Cargo.toml" \ - --release \ - --bin cargo \ - -- \ - -L "${COOKBOOK_SYSROOT}/lib" \ - -C link-arg=-Wl,-rpath-link,${COOKBOOK_SYSROOT}/lib -mkdir -pv "${COOKBOOK_STAGE}/usr/bin" -cp -v "target/${TARGET}/release/cargo" "${COOKBOOK_STAGE}/usr/bin/cargo" -""" diff --git a/recipes/dev/cargo/redox.patch b/recipes/dev/cargo/redox.patch deleted file mode 100644 index 4a32bfe05..000000000 --- a/recipes/dev/cargo/redox.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff --git a/crates/cargo-util/src/paths.rs b/crates/cargo-util/src/paths.rs -index 5d7e3c5a6..b7de5655f 100644 ---- a/crates/cargo-util/src/paths.rs -+++ b/crates/cargo-util/src/paths.rs -@@ -201,7 +201,7 @@ pub fn write_atomic, C: AsRef<[u8]>>(path: P, contents: C) -> Res - use std::os::unix::fs::PermissionsExt; - - // these constants are u16 on macOS -- let mask = u32::from(libc::S_IRWXU | libc::S_IRWXG | libc::S_IRWXO); -+ let mask = (libc::S_IRWXU | libc::S_IRWXG | libc::S_IRWXO) as u32; - let mode = meta.permissions().mode() & mask; - - std::fs::Permissions::from_mode(mode) -@@ -611,8 +611,6 @@ fn _link_or_copy(src: &Path, dst: &Path) -> Result<()> { - } - - let link_result = if src.is_dir() { -- #[cfg(target_os = "redox")] -- use std::os::redox::fs::symlink; - #[cfg(unix)] - use std::os::unix::fs::symlink; - #[cfg(windows)] -diff --git a/src/cargo/core/compiler/build_config.rs b/src/cargo/core/compiler/build_config.rs -index 80aa592dd..d40c2056b 100644 ---- a/src/cargo/core/compiler/build_config.rs -+++ b/src/cargo/core/compiler/build_config.rs -@@ -51,9 +51,7 @@ pub struct BuildConfig { - } - - fn default_parallelism() -> CargoResult { -- Ok(available_parallelism() -- .context("failed to determine the amount of parallelism available")? -- .get() as u32) -+ Ok(1) - } - - impl BuildConfig { diff --git a/recipes/math/calculator/recipe.toml b/recipes/math/orbcalculator/recipe.toml similarity index 100% rename from recipes/math/calculator/recipe.toml rename to recipes/math/orbcalculator/recipe.toml diff --git a/recipes/net/curl/recipe.toml b/recipes/net/download/curl/recipe.toml similarity index 100% rename from recipes/net/curl/recipe.toml rename to recipes/net/download/curl/recipe.toml From 58065ab67e5f495b4ff4fbe9b15b765746cf576c Mon Sep 17 00:00:00 2001 From: "Ibuki.O" Date: Tue, 20 Jan 2026 12:03:40 +0900 Subject: [PATCH 093/407] feat: Add login_schemes.toml to base config. --- config/base.toml | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/config/base.toml b/config/base.toml index 6fec395c0..94e7c1af9 100644 --- a/config/base.toml +++ b/config/base.toml @@ -38,6 +38,50 @@ data = """ pcid-spawner /etc/pcid.d/ """ +[[files]] +path = "/etc/login_schemes.toml" +data = """ +[user_schemes.root] +schemes = ["*"] +[user_schemes.user] +schemes = [ + # Kernel schemes + "debug", + "event", + "memory", + "pipe", + "serio", + "irq", + "time", + "sys", + # Base schemes + "rand", + "null", + "zero", + "log", + # Network schemes + "ip", + "icmp", + "tcp", + "udp", + # IPC schemes + "shm", + "chan", + "uds_stream", + "uds_dgram", + # File schemes + "file", + # Display schemes + "display.vesa", + "display*", + # Other schemes + "pty", + "sudo", + "audio", + "orbital", +] +""" + [[files]] path = "/etc/hostname" data = "redox" From db35189c87f657607d37587b8a13831a80dd3fc0 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 20 Jan 2026 10:29:17 -0700 Subject: [PATCH 094/407] Fix gigalomania recipe --- recipes/games/gigalomania/recipe.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/games/gigalomania/recipe.toml b/recipes/games/gigalomania/recipe.toml index 5a000cba2..95f26d361 100644 --- a/recipes/games/gigalomania/recipe.toml +++ b/recipes/games/gigalomania/recipe.toml @@ -22,9 +22,9 @@ rsync -av --delete "${COOKBOOK_SOURCE}/" ./ export CPPHOST="${TARGET}-g++" -"${REDOX_MAKE}" all -j"$(${NPROC})" +"${COOKBOOK_MAKE}" all -j"${COOKBOOK_MAKE_JOBS}" -"${REDOX_MAKE}" VERBOSE=1 DESTDIR="${COOKBOOK_STAGE}/usr" install +"${COOKBOOK_MAKE}" VERBOSE=1 DESTDIR="${COOKBOOK_STAGE}/usr" install rm -rf "${COOKBOOK_STAGE}/bundle" From 8bcb64689068b69f1aa4a1dc71d6b0b34df77ed5 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 20 Jan 2026 10:30:29 -0700 Subject: [PATCH 095/407] Fix mdp recipe --- recipes/tui/mdp/recipe.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/tui/mdp/recipe.toml b/recipes/tui/mdp/recipe.toml index ca3be43af..07cbe1a12 100644 --- a/recipes/tui/mdp/recipe.toml +++ b/recipes/tui/mdp/recipe.toml @@ -12,8 +12,8 @@ rsync -av --delete --exclude='.git' "${COOKBOOK_SOURCE}/" ./ export CFLAGS="${CFLAGS} -I${COOKBOOK_SYSROOT}/include/ncursesw" -"${COOKBOOK_MAKE}" -j"$(${NPROC})" +"${COOKBOOK_MAKE}" -j"${COOKBOOK_MAKE_JOBS}" # Install -"${REDOX_MAKE}" DESTDIR="${COOKBOOK_STAGE}" PREFIX="" install +"${COOKBOOK_MAKE}" DESTDIR="${COOKBOOK_STAGE}" PREFIX="" install """ \ No newline at end of file From 98ac58d3b9e009c5ba81fb5a87fd51629367c16a Mon Sep 17 00:00:00 2001 From: Benton60 Date: Tue, 20 Jan 2026 21:24:15 -0500 Subject: [PATCH 096/407] add pls to ci --- config/aarch64/ci.toml | 1 + config/x86_64/ci.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/config/aarch64/ci.toml b/config/aarch64/ci.toml index 2ce2e3607..5ea271a93 100644 --- a/config/aarch64/ci.toml +++ b/config/aarch64/ci.toml @@ -83,6 +83,7 @@ patch = {} patchelf = {} pcre = {} pkgutils = {} +pls = {} pop-icon-theme = {} redoxfs = {} relibc = {} diff --git a/config/x86_64/ci.toml b/config/x86_64/ci.toml index 22ca6e2c2..1351e18d2 100644 --- a/config/x86_64/ci.toml +++ b/config/x86_64/ci.toml @@ -148,6 +148,7 @@ php84 = {} pixelcannon = {} pkg-config = {} pkgutils = {} +pls = {} pop-icon-theme = {} prboom = {} procedural-wallpapers-rs = {} From d6c8e9f5ed2a9dae4be2f0c7579ee7c1cf98f629 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 21 Jan 2026 13:16:52 +0700 Subject: [PATCH 097/407] x11: Remove pid file on boot --- config/x11.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/x11.toml b/config/x11.toml index d2ff5cd2d..bfc6a9d34 100644 --- a/config/x11.toml +++ b/config/x11.toml @@ -46,6 +46,7 @@ export DBUS_DEBUG_OUTPUT=1 mkdir -p /var/lib/dbus dbus-uuidgen --ensure mkdir -p /run/dbus +rm -f /run/dbus/pid dbus-daemon --system """ From cdf6618cf59675fd60cf7797af2d92d01e4b5efd Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 22 Jan 2026 20:13:52 +0700 Subject: [PATCH 098/407] Patch uutils to fix i586 + aarch64 + add nproc --- recipes/core/uutils/recipe.toml | 7 ++ recipes/core/uutils/redox.patch | 120 ++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 recipes/core/uutils/redox.patch diff --git a/recipes/core/uutils/recipe.toml b/recipes/core/uutils/recipe.toml index 5e32d87ae..ef01db80f 100644 --- a/recipes/core/uutils/recipe.toml +++ b/recipes/core/uutils/recipe.toml @@ -1,6 +1,12 @@ # TODO Fix coreutils i18n/l10n behavior on Redox +# TODO waiting for rustix bump before removing patches +# TODO Fix locale init bug on aarch64 before removing patches [source] git = "https://github.com/uutils/coreutils" +rev = "aa218a30aca43fd1805841357ff885afbd9090c3" +patches = [ + "redox.patch" +] [build] template = "custom" @@ -51,6 +57,7 @@ BINS=( more mv nl + nproc numfmt od paste diff --git a/recipes/core/uutils/redox.patch b/recipes/core/uutils/redox.patch new file mode 100644 index 000000000..976e31d0f --- /dev/null +++ b/recipes/core/uutils/redox.patch @@ -0,0 +1,120 @@ +diff --git a/Cargo.lock b/Cargo.lock +index 49bf30262..37b5a89ec 100644 +--- a/Cargo.lock ++++ b/Cargo.lock +@@ -2476,9 +2476,9 @@ dependencies = [ + + [[package]] + name = "rustix" +-version = "1.1.3" ++version = "1.1.2" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" ++checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" + dependencies = [ + "bitflags 2.10.0", + "errno", +@@ -2786,9 +2786,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + + [[package]] + name = "tempfile" +-version = "3.24.0" ++version = "3.23.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" ++checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" + dependencies = [ + "fastrand", + "getrandom 0.3.4", +diff --git a/Cargo.toml b/Cargo.toml +index 3c8fea771..b04ac85a3 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -265,6 +265,7 @@ feat_os_unix_redox = [ + "feat_common_core", + # + "chmod", ++ "nproc", + "stat", + "uname", + ] +diff --git a/src/uucore/src/lib/features/fs.rs b/src/uucore/src/lib/features/fs.rs +index a783d04ea..33967f5de 100644 +--- a/src/uucore/src/lib/features/fs.rs ++++ b/src/uucore/src/lib/features/fs.rs +@@ -839,23 +839,39 @@ pub fn make_fifo(path: &Path) -> std::io::Result<()> { + } + + // Redox's libc appears not to include the following utilities ++// TODO: Waiting for rustix release that includes https://github.com/rust-lang/libc/commit/76e737e + +-#[cfg(target_os = "redox")] ++#[cfg(all(target_os = "redox", target_pointer_width = "64"))] + pub fn major(dev: libc::dev_t) -> libc::c_uint { + (((dev >> 8) & 0xFFF) | ((dev >> 32) & 0xFFFFF000)) as _ + } + +-#[cfg(target_os = "redox")] ++#[cfg(all(target_os = "redox", target_pointer_width = "64"))] + pub fn minor(dev: libc::dev_t) -> libc::c_uint { + ((dev & 0xFF) | ((dev >> 12) & 0xFFFFF00)) as _ + } + +-#[cfg(target_os = "redox")] ++#[cfg(all(target_os = "redox", target_pointer_width = "64"))] + pub fn makedev(maj: libc::c_uint, min: libc::c_uint) -> libc::dev_t { + let [maj, min] = [maj as libc::dev_t, min as libc::dev_t]; + (min & 0xff) | ((maj & 0xfff) << 8) | ((min & !0xff) << 12) | ((maj & !0xfff) << 32) + } + ++#[cfg(all(target_os = "redox", target_pointer_width = "32"))] ++pub fn major(_: libc::dev_t) -> libc::c_uint { ++ 0 ++} ++ ++#[cfg(all(target_os = "redox", target_pointer_width = "32"))] ++pub fn minor(_: libc::dev_t) -> libc::c_uint { ++ 0 ++} ++ ++#[cfg(all(target_os = "redox", target_pointer_width = "32"))] ++pub fn makedev(_: libc::c_uint, _: libc::c_uint) -> libc::dev_t { ++ 0 ++} ++ + #[cfg(test)] + mod tests { + // Note this useful idiom: importing names from outer (for mod tests) scope. +diff --git a/src/uucore/src/lib/mods/locale.rs b/src/uucore/src/lib/mods/locale.rs +index ec9a78b43..2faccec5c 100644 +--- a/src/uucore/src/lib/mods/locale.rs ++++ b/src/uucore/src/lib/mods/locale.rs +@@ -195,10 +195,11 @@ fn init_localization( + } + }; + +- LOCALIZER.with(|lock| { ++ // TODO: In aarch64 redox OS, this lock (once cell) is already initialized out of nothing ++ let _ = LOCALIZER.with(|lock| { + lock.set(loc) + .map_err(|_| LocalizationError::Bundle("Localizer already initialized".into())) +- })?; ++ }); + Ok(()) + } + +@@ -400,10 +401,12 @@ pub fn setup_localization(p: &str) -> Result<(), LocalizationError> { + let english_bundle = create_english_bundle_from_embedded(&default_locale, p)?; + let localizer = Localizer::new(english_bundle); + +- LOCALIZER.with(|lock| { ++ // TODO: In aarch64 redox OS, this lock (once cell) is already initialized out of nothing ++ // TODO: When this code is used? Patching for keep sake ++ let _ = LOCALIZER.with(|lock| { + lock.set(localizer) + .map_err(|_| LocalizationError::Bundle("Localizer already initialized".into())) +- })?; ++ }); + Ok(()) + } + } From 5c3df345086eb09685a62a300c27dc8eae8860b5 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 22 Jan 2026 09:48:19 -0700 Subject: [PATCH 099/407] cosmic-edit, cosmic-files, cosmic-term: use branch with winit updates --- recipes/tools/cosmic-edit/recipe.toml | 2 +- recipes/tools/cosmic-files/recipe.toml | 4 ++-- recipes/tools/cosmic-term/recipe.toml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/recipes/tools/cosmic-edit/recipe.toml b/recipes/tools/cosmic-edit/recipe.toml index bd7c4482f..2b565edfd 100644 --- a/recipes/tools/cosmic-edit/recipe.toml +++ b/recipes/tools/cosmic-edit/recipe.toml @@ -1,6 +1,6 @@ [source] git = "https://github.com/pop-os/cosmic-edit.git" -branch = "master" +branch = "epoch-update" [build] template = "custom" diff --git a/recipes/tools/cosmic-files/recipe.toml b/recipes/tools/cosmic-files/recipe.toml index f62a4eac3..cc16cd02a 100644 --- a/recipes/tools/cosmic-files/recipe.toml +++ b/recipes/tools/cosmic-files/recipe.toml @@ -1,6 +1,6 @@ [source] git = "https://github.com/pop-os/cosmic-files.git" -branch = "master" +branch = "epoch-update" [build] template = "custom" @@ -33,4 +33,4 @@ mkdir -pv "${COOKBOOK_STAGE}/usr/share/metainfo/" cp -v "${COOKBOOK_SOURCE}/res/${APPID}.metainfo.xml" "${COOKBOOK_STAGE}/usr/share/metainfo/" mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons/" cp -rv "${COOKBOOK_SOURCE}/res/icons/hicolor/" "${COOKBOOK_STAGE}/usr/share/icons/" -""" \ No newline at end of file +""" diff --git a/recipes/tools/cosmic-term/recipe.toml b/recipes/tools/cosmic-term/recipe.toml index f1232c534..3aed27769 100644 --- a/recipes/tools/cosmic-term/recipe.toml +++ b/recipes/tools/cosmic-term/recipe.toml @@ -1,6 +1,6 @@ [source] git = "https://github.com/pop-os/cosmic-term.git" -branch = "master" +branch = "epoch-update" [build] template = "custom" @@ -17,4 +17,4 @@ mkdir -pv "${COOKBOOK_STAGE}/usr/share/metainfo/" cp -v "${COOKBOOK_SOURCE}/res/${APPID}.metainfo.xml" "${COOKBOOK_STAGE}/usr/share/metainfo/" mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons/" cp -rv "${COOKBOOK_SOURCE}/res/icons/hicolor/" "${COOKBOOK_STAGE}/usr/share/icons/" -""" \ No newline at end of file +""" From da6b4b3b17b6e63e2cb0dcd26cfed1a90e642fa1 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 23 Jan 2026 08:02:48 +0700 Subject: [PATCH 100/407] Make disk mounting easier to verify --- mk/disk.mk | 10 ++++++---- mk/repo.mk | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/mk/disk.mk b/mk/disk.mk index d84d8069b..9f64a1789 100644 --- a/mk/disk.mk +++ b/mk/disk.mk @@ -5,8 +5,9 @@ ifeq ($(FSTOOLS_IN_PODMAN),1) $(PODMAN_RUN) make $@ else mkdir -p $(BUILD) - rm -rf $@ $@.partial + -$(FUMOUNT) $(MOUNT_DIR) || true -$(FUMOUNT) /tmp/redox_installer || true + rm -rf $@ $@.partial $(MOUNT_DIR) FILESYSTEM_SIZE=$(FILESYSTEM_SIZE) && \ if [ -z "$$FILESYSTEM_SIZE" ] ; then \ FILESYSTEM_SIZE=$(shell $(INSTALLER) --filesystem-size -c $(FILESYSTEM_CONFIG)); \ @@ -65,7 +66,7 @@ else @mkdir -p $(MOUNT_DIR) $(REDOXFS) $(BUILD)/harddrive.img $(MOUNT_DIR) @sleep 2 - @pgrep redoxfs + @echo "\033[1;36;49mharddrive.img mounted ($$(pgrep redoxfs))\033[0m" endif mount_extra: $(FSTOOLS) FORCE @@ -75,7 +76,7 @@ else @mkdir -p $(MOUNT_DIR) $(REDOXFS) $(BUILD)/extra.img $(MOUNT_DIR) @sleep 2 - @pgrep redoxfs + @echo "\033[1;36;49mextra.img mounted ($$(pgrep redoxfs))\033[0m" endif mount_live: $(FSTOOLS) FORCE @@ -85,7 +86,7 @@ else @mkdir -p $(MOUNT_DIR) $(REDOXFS) $(BUILD)/redox-live.iso $(MOUNT_DIR) @sleep 2 - @pgrep redoxfs + @echo "\033[1;36;49mredox-live.iso mounted ($$(pgrep redoxfs))\033[0m" endif unmount: FORCE @@ -96,4 +97,5 @@ else -$(FUMOUNT) $(MOUNT_DIR) @rm -rf $(MOUNT_DIR) @-$(FUMOUNT) /tmp/redox_installer 2>/dev/null || true + @echo "\033[1;36;49mFilesystem unmounted\033[0m" endif diff --git a/mk/repo.mk b/mk/repo.mk index fde29b408..646e9d9c9 100644 --- a/mk/repo.mk +++ b/mk/repo.mk @@ -96,8 +96,8 @@ else endif ifeq ($(ALLOW_FSTOOLS),1) @if [ -f $(MOUNTED_TAG) ]; then \ - $(MAKE) unmount && rm -f $(MOUNTED_TAG) && echo "Filesystem unmounted"; \ - else echo "Not unmounting by ourself, don't forget to do it"; \ + $(MAKE) unmount && rm -f $(MOUNTED_TAG); \ + else echo "\033[0;33;49mNot unmounting by ourself, don't forget to do it\033[0m"; \ fi endif @@ -121,8 +121,8 @@ else endif ifeq ($(ALLOW_FSTOOLS),1) @if [ -f $(MOUNTED_TAG) ]; then \ - $(MAKE) unmount && rm -f $(MOUNTED_TAG) && echo "Filesystem unmounted"; \ - else echo "Not unmounting by ourself, don't forget to do it"; \ + $(MAKE) unmount && rm -f $(MOUNTED_TAG); \ + else echo "\033[1;33;49mNot unmounting by ourself, don't forget to do it\033[0m"; \ fi endif From 9b79a537bcac15b9064c1a28b01ae80589d486f2 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 22 Jan 2026 18:41:14 -0700 Subject: [PATCH 101/407] Add make setenv that can be used in scripts to set the arch, board, and config_name variables --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 3cdef5c2c..e9a4fb9e3 100644 --- a/Makefile +++ b/Makefile @@ -106,6 +106,12 @@ else bash endif +setenv: FORCE + @echo export ARCH='$(ARCH)' + @echo export BOARD='$(BOARD)' + @echo export CONFIG_NAME='$(CONFIG_NAME)' + @echo BUILD='$(BUILD)' + export RUST_GDB=gdb-multiarch # Necessary when debugging for another architecture than the host GDB_KERNEL_FILE=recipes/core/kernel/target/$(TARGET)/build/kernel.sym gdb: FORCE From 3d17d2d8b6db263b4042d8ef33eab115982fb1d5 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 22 Jan 2026 18:46:23 -0700 Subject: [PATCH 102/407] Add network-boot script --- scripts/network-boot.sh | 51 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100755 scripts/network-boot.sh diff --git a/scripts/network-boot.sh b/scripts/network-boot.sh new file mode 100755 index 000000000..e652c7356 --- /dev/null +++ b/scripts/network-boot.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +# Your host must use the static IP ${NETWORK}.1 and subnet mask 255.255.255.0 +# 'Rx' in ascii is 82 and 120, adjust to taste +NETWORK=10.82.120 + +set -ex + +trap 'kill -HUP 0' EXIT + +eval $(make setenv) +make "${BUILD}/redox-live.iso" + +echo "Allowing packet forwarding" +echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward + +iface="$(route | grep '^default ' | grep -o '[^ ]*$' | head -n 1)" +echo "Forwarding packets to '$iface'" +if ! sudo iptables -t nat -C POSTROUTING -o "$iface" -j MASQUERADE +then + echo "Forwarding rule does not exist, adding" + sudo iptables -t nat -A POSTROUTING -o "$iface" -j MASQUERADE +else + echo "Forwarding rule already exists" +fi + +ARGS=( + "--no-daemon" + "--listen-address=${NETWORK}.1" + "--port=0" + "--dhcp-range=${NETWORK}.3,${NETWORK}.254,255.255.255.0,1h" + "--dhcp-option=6,1.1.1.1,1.0.0.1" + "--enable-tftp" + "--tftp-root=${BUILD}" + # BIOS + "--dhcp-match=set:bios,option:client-arch,0" + "--dhcp-boot=tag:!ipxe,tag:bios,undionly.kpxe" + # EFI x86_64 + "--dhcp-match=set:efi-x86_64,option:client-arch,7" + "--dhcp-match=set:efi-x86_64,option:client-arch,9" + "--dhcp-boot=tag:!ipxe,tag:efi-x86_64,ipxe-x86_64.efi" + # EFI aarch64 + "--dhcp-match=set:efi-aarch64,option:client-arch,11" + "--dhcp-boot=tag:!ipxe,tag:efi-aarch64,ipxe-aarch64.efi" + # IPXE + "--dhcp-userclass=set:ipxe,iPXE" + "--dhcp-boot=tag:ipxe,redox.ipxe" +) + +sudo dnsmasq "${ARGS[@]}"& +python3 -m http.server -b "${NETWORK}.1" -d "${BUILD}" "8080" From bd88ae9a8df9179c757d4476a0e4a0a6e1101e7c Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 22 Jan 2026 18:49:43 -0700 Subject: [PATCH 103/407] Fix dnsmasq tftp root --- scripts/network-boot.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/network-boot.sh b/scripts/network-boot.sh index e652c7356..e0f79cbce 100755 --- a/scripts/network-boot.sh +++ b/scripts/network-boot.sh @@ -31,7 +31,7 @@ ARGS=( "--dhcp-range=${NETWORK}.3,${NETWORK}.254,255.255.255.0,1h" "--dhcp-option=6,1.1.1.1,1.0.0.1" "--enable-tftp" - "--tftp-root=${BUILD}" + "--tftp-root=$(realpath "${BUILD}")" # BIOS "--dhcp-match=set:bios,option:client-arch,0" "--dhcp-boot=tag:!ipxe,tag:bios,undionly.kpxe" From f0683f437d3bc07d1af47398c5ddfd9a71b2bff3 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 22 Jan 2026 23:26:46 -0300 Subject: [PATCH 104/407] Add, improve and fix recipes --- recipes/emulators/mupen64plus/recipe.toml | 34 ------------------- recipes/wip/db/bobby/recipe.toml | 10 ++++++ recipes/wip/doc/brief/recipe.toml | 7 ++++ .../game-console/mupen64plus-core/recipe.toml | 28 +++++++++++++-- recipes/wip/net/analysis/ttl/recipe.toml | 5 +++ recipes/wip/text/tylax/recipe.toml | 5 +++ recipes/wip/text/typesetter/recipe.toml | 6 ++++ recipes/wip/tools/cfait/recipe.toml | 5 +++ recipes/wip/tools/planify/recipe.toml | 7 ++++ .../video/editors/video-trimmer/recipe.toml | 10 ++++++ .../wip/video/other/trimmeroni/recipe.toml | 2 +- 11 files changed, 81 insertions(+), 38 deletions(-) delete mode 100644 recipes/emulators/mupen64plus/recipe.toml create mode 100644 recipes/wip/db/bobby/recipe.toml create mode 100644 recipes/wip/doc/brief/recipe.toml create mode 100644 recipes/wip/net/analysis/ttl/recipe.toml create mode 100644 recipes/wip/text/tylax/recipe.toml create mode 100644 recipes/wip/text/typesetter/recipe.toml create mode 100644 recipes/wip/tools/cfait/recipe.toml create mode 100644 recipes/wip/tools/planify/recipe.toml create mode 100644 recipes/wip/video/editors/video-trimmer/recipe.toml diff --git a/recipes/emulators/mupen64plus/recipe.toml b/recipes/emulators/mupen64plus/recipe.toml deleted file mode 100644 index f1538f56f..000000000 --- a/recipes/emulators/mupen64plus/recipe.toml +++ /dev/null @@ -1,34 +0,0 @@ -[source] -tar = "https://github.com/mupen64plus/mupen64plus-core/releases/download/2.6.0/mupen64plus-core-src-2.6.0.tar.gz" -blake3 = "faef6f557b32165adf5ad7f12a22f1dfda98893f59cbf910b697a86e610652a9" - -[build] -template = "custom" -dependencies = [ - "freetype2", - "liborbital", - "libpng", - "mesa", - "mesa-glu", - "sdl2", - "zlib", -] -script = """ -rsync -av --delete "${COOKBOOK_SOURCE}/" ./ -#TODO: support Redox in UNAME -"${COOKBOOK_MAKE}" \ - CROSS_COMPILE="${TARGET}-" \ - GLES_LIB="" \ - GL_CFLAGS="$("${TARGET}-pkg-config" --cflags osmesa)" \ - GL_LDLIBS="$("${TARGET}-pkg-config" --libs osmesa)" \ - HOST_CPU="${TARGET%%-*}" \ - SDL_CFLAGS="$("${TARGET}-pkg-config" --cflags sdl2)" \ - SDL_LDFLAGS="$("${TARGET}-pkg-config" --libs sdl2)" \ - UNAME=Linux \ - USE_GLES=1 \ - V=1 \ - VULKAN=0 \ - -C projects/unix \ - -j "${COOKBOOK_MAKE_JOBS}" \ - all -""" diff --git a/recipes/wip/db/bobby/recipe.toml b/recipes/wip/db/bobby/recipe.toml new file mode 100644 index 000000000..493412b2c --- /dev/null +++ b/recipes/wip/db/bobby/recipe.toml @@ -0,0 +1,10 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/hbons/Bobby" +[build] +template = "meson" +dependencies = [ + "libadwaita", + "glib", + "gtk4", +] diff --git a/recipes/wip/doc/brief/recipe.toml b/recipes/wip/doc/brief/recipe.toml new file mode 100644 index 000000000..8c8bc247f --- /dev/null +++ b/recipes/wip/doc/brief/recipe.toml @@ -0,0 +1,7 @@ +#TODO not compiled or tested +#TODO discover minimum dependencies from meson log +[source] +git = "https://github.com/shonebinu/Brief" +rev = "v0.3.0" +[build] +template = "meson" diff --git a/recipes/wip/emu/game-console/mupen64plus-core/recipe.toml b/recipes/wip/emu/game-console/mupen64plus-core/recipe.toml index 9eefea697..c5a98cf09 100644 --- a/recipes/wip/emu/game-console/mupen64plus-core/recipe.toml +++ b/recipes/wip/emu/game-console/mupen64plus-core/recipe.toml @@ -1,11 +1,33 @@ -#TODO missing script for "make": https://github.com/mupen64plus/mupen64plus-core#2-building-from-source +#TODO not compiled or tested [source] tar = "https://github.com/mupen64plus/mupen64plus-core/releases/download/2.6.0/mupen64plus-bundle-src-2.6.0.tar.gz" [build] template = "custom" dependencies = [ - "sdl2", - "libpng", "freetype2", + "liborbital", + "libpng", + "mesa", + "mesa-glu", + "sdl2", "zlib", ] +script = """ +rsync -av --delete "${COOKBOOK_SOURCE}/" ./ +#TODO: support Redox in UNAME +"${COOKBOOK_MAKE}" \ + CROSS_COMPILE="${TARGET}-" \ + GLES_LIB="" \ + GL_CFLAGS="$("${TARGET}-pkg-config" --cflags osmesa)" \ + GL_LDLIBS="$("${TARGET}-pkg-config" --libs osmesa)" \ + HOST_CPU="${TARGET%%-*}" \ + SDL_CFLAGS="$("${TARGET}-pkg-config" --cflags sdl2)" \ + SDL_LDFLAGS="$("${TARGET}-pkg-config" --libs sdl2)" \ + UNAME=Linux \ + USE_GLES=1 \ + V=1 \ + VULKAN=0 \ + -C projects/unix \ + -j "${COOKBOOK_MAKE_JOBS}" \ + all +""" diff --git a/recipes/wip/net/analysis/ttl/recipe.toml b/recipes/wip/net/analysis/ttl/recipe.toml new file mode 100644 index 000000000..21e74b053 --- /dev/null +++ b/recipes/wip/net/analysis/ttl/recipe.toml @@ -0,0 +1,5 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/lance0/ttl" +[build] +template = "cargo" diff --git a/recipes/wip/text/tylax/recipe.toml b/recipes/wip/text/tylax/recipe.toml new file mode 100644 index 000000000..fe86c7287 --- /dev/null +++ b/recipes/wip/text/tylax/recipe.toml @@ -0,0 +1,5 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/scipenai/tylax" +[build] +template = "cargo" diff --git a/recipes/wip/text/typesetter/recipe.toml b/recipes/wip/text/typesetter/recipe.toml new file mode 100644 index 000000000..0b88f9844 --- /dev/null +++ b/recipes/wip/text/typesetter/recipe.toml @@ -0,0 +1,6 @@ +#TODO not compiled or tested +#TODO discover minimum dependencies from meson log +[source] +git = "https://codeberg.org/haydn/typesetter" +[build] +template = "meson" diff --git a/recipes/wip/tools/cfait/recipe.toml b/recipes/wip/tools/cfait/recipe.toml new file mode 100644 index 000000000..838b7a130 --- /dev/null +++ b/recipes/wip/tools/cfait/recipe.toml @@ -0,0 +1,5 @@ +#TODO not compiled or tested +[source] +git = "https://codeberg.org/trougnouf/cfait" +[build] +template = "cargo" diff --git a/recipes/wip/tools/planify/recipe.toml b/recipes/wip/tools/planify/recipe.toml new file mode 100644 index 000000000..f2cf7e6eb --- /dev/null +++ b/recipes/wip/tools/planify/recipe.toml @@ -0,0 +1,7 @@ +#TODO not compiled or tested +#TODO determine minimum dependencies from meson log +[source] +git = "https://github.com/alainm23/planify" +rev = "v4.17.0" +[build] +template = "meson" diff --git a/recipes/wip/video/editors/video-trimmer/recipe.toml b/recipes/wip/video/editors/video-trimmer/recipe.toml new file mode 100644 index 000000000..3c60d653d --- /dev/null +++ b/recipes/wip/video/editors/video-trimmer/recipe.toml @@ -0,0 +1,10 @@ +#TODO not compiled or tested +[source] +git = "https://gitlab.gnome.org/YaLTeR/video-trimmer" +[build] +template = "meson" +dependencies = [ + "gtk4", + "ffmpeg6", + "gstreamer", +] diff --git a/recipes/wip/video/other/trimmeroni/recipe.toml b/recipes/wip/video/other/trimmeroni/recipe.toml index 2666aa2d9..48244b7ab 100644 --- a/recipes/wip/video/other/trimmeroni/recipe.toml +++ b/recipes/wip/video/other/trimmeroni/recipe.toml @@ -1,5 +1,5 @@ #TODO compiled but not tested [source] -git = "https://github.com/outfrost/trimmeroni" +git = "https://codeberg.org/outfrost/trimmeroni" [build] template = "cargo" From 2d794f44ca1944394fa72b8a886dfd87ce200e03 Mon Sep 17 00:00:00 2001 From: David Campbell Date: Thu, 22 Jan 2026 21:57:33 -0500 Subject: [PATCH 105/407] Update the hnefatafl icon. --- recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml b/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml index 1e629209b..f33deaeca 100644 --- a/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml +++ b/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml @@ -26,7 +26,7 @@ cp -v "target/${TARGET}/release/hnefatafl-text-protocol" "${COOKBOOK_STAGE}/usr/ mkdir -pv "${COOKBOOK_STAGE}"/usr/games mkdir -pv "${COOKBOOK_STAGE}"/ui/apps mkdir -pv "${COOKBOOK_STAGE}"/ui/icons/apps -cp -rv "${COOKBOOK_SOURCE}"/icons/king_256x256.png "${COOKBOOK_STAGE}"/ui/icons/apps/hnefatafl-king_256x256.png +cp -rv "${COOKBOOK_SOURCE}"/src/bin/hnefatafl-client/helmet.png "${COOKBOOK_STAGE}"/ui/icons/apps/helmet.png cp -rv "${COOKBOOK_SOURCE}"/packages/redox/manifest "${COOKBOOK_STAGE}"/ui/apps/hnefatafl-client mv "${COOKBOOK_STAGE}"/usr/bin/hnefatafl-client "${COOKBOOK_STAGE}"/usr/games/hnefatafl-client """ From 49d6a869a89311190549bef5338ea34e1d8e0cf4 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Fri, 23 Jan 2026 19:03:04 -0300 Subject: [PATCH 106/407] Improve more recipes --- .../{mupen64plus-core => mupen64plus}/recipe.toml | 0 recipes/wip/services/coppwr/recipe.toml | 3 ++- recipes/wip/services/eudev/recipe.toml | 2 +- recipes/wip/services/hickory-dns/recipe.toml | 3 ++- recipes/wip/services/jack/recipe.toml | 8 ++++---- recipes/wip/services/lemurs/recipe.toml | 2 +- recipes/wip/services/pipewire/recipe.toml | 15 ++++++++++++++- recipes/wip/services/qpwgraph/recipe.toml | 7 ++++++- recipes/wip/services/wireplumber/recipe.toml | 12 ++++++------ recipes/wip/tools/planify/recipe.toml | 5 +++++ 10 files changed, 41 insertions(+), 16 deletions(-) rename recipes/wip/emu/game-console/{mupen64plus-core => mupen64plus}/recipe.toml (100%) diff --git a/recipes/wip/emu/game-console/mupen64plus-core/recipe.toml b/recipes/wip/emu/game-console/mupen64plus/recipe.toml similarity index 100% rename from recipes/wip/emu/game-console/mupen64plus-core/recipe.toml rename to recipes/wip/emu/game-console/mupen64plus/recipe.toml diff --git a/recipes/wip/services/coppwr/recipe.toml b/recipes/wip/services/coppwr/recipe.toml index ba04da96e..c6cd038b6 100644 --- a/recipes/wip/services/coppwr/recipe.toml +++ b/recipes/wip/services/coppwr/recipe.toml @@ -1,6 +1,7 @@ -#TODO make pipewire work +#TODO not compiled or tested [source] git = "https://github.com/dimtpap/coppwr" +shallow_clone = true [build] template = "cargo" dependencies = [ diff --git a/recipes/wip/services/eudev/recipe.toml b/recipes/wip/services/eudev/recipe.toml index bdc920c78..f52a1d9ce 100644 --- a/recipes/wip/services/eudev/recipe.toml +++ b/recipes/wip/services/eudev/recipe.toml @@ -1,4 +1,4 @@ -#TODO compilation error - POSIX header not found +#TODO compilation error: POSIX header not found [source] tar = "https://github.com/eudev-project/eudev/releases/download/v3.2.14/eudev-3.2.14.tar.gz" [build] diff --git a/recipes/wip/services/hickory-dns/recipe.toml b/recipes/wip/services/hickory-dns/recipe.toml index b7ab38fd5..098837998 100644 --- a/recipes/wip/services/hickory-dns/recipe.toml +++ b/recipes/wip/services/hickory-dns/recipe.toml @@ -4,9 +4,10 @@ git = "https://github.com/hickory-dns/hickory-dns" [build] template = "custom" dependencies = [ - "openssl1", + "openssl3", ] script = """ +DYNAMIC_INIT binary=hickory-dns "${COOKBOOK_CARGO}" build \ --manifest-path "${COOKBOOK_SOURCE}/Cargo.toml" \ diff --git a/recipes/wip/services/jack/recipe.toml b/recipes/wip/services/jack/recipe.toml index 1e5dccd8a..2ddc233d9 100644 --- a/recipes/wip/services/jack/recipe.toml +++ b/recipes/wip/services/jack/recipe.toml @@ -1,8 +1,8 @@ -#TODO missing script for waf -#TODO discover how to build -#TODO discover if it has external dependencies +#TODO missing cross-compilation script for waf +#TODO determine minimum dependencies [source] git = "https://github.com/jackaudio/jack2" -rev = "4f58969432339a250ce87fe855fb962c67d00ddb" +rev = "v1.9.22" +shallow_clone = true [build] template = "custom" diff --git a/recipes/wip/services/lemurs/recipe.toml b/recipes/wip/services/lemurs/recipe.toml index ca1aa08c2..0b4496df9 100644 --- a/recipes/wip/services/lemurs/recipe.toml +++ b/recipes/wip/services/lemurs/recipe.toml @@ -1,4 +1,4 @@ -#TODO missing script for configuration, see https://github.com/coastalwhite/lemurs#compiling-from-source +#TODO missing script for configuration: https://github.com/coastalwhite/lemurs#compiling-from-source [source] git = "https://github.com/coastalwhite/lemurs" rev = "37963b8ff6945ae8bdbabee658e5e36d0f67b84a" diff --git a/recipes/wip/services/pipewire/recipe.toml b/recipes/wip/services/pipewire/recipe.toml index 9e42dc400..ea85fd534 100644 --- a/recipes/wip/services/pipewire/recipe.toml +++ b/recipes/wip/services/pipewire/recipe.toml @@ -2,6 +2,19 @@ # build instructions: https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/INSTALL.md [source] git = "https://gitlab.freedesktop.org/pipewire/pipewire" -rev = "4debdcd40b055b3eaa83a8f4443aa990ea566bfe" +branch = "1.4" +shallow_clone = true [build] template = "meson" +mesonflags = [ + "-Dtests=disabled", + "-Dpipewire-jack=disabled", + "-Dpipewire-v4l2=disabled", + "-Dspa-plugins=disabled", + "-Ddbus=disabled", + "-Dflatpak=disabled", +] +dependencies = [ + "libpulse", + "sdl2", +] diff --git a/recipes/wip/services/qpwgraph/recipe.toml b/recipes/wip/services/qpwgraph/recipe.toml index 99df5ae37..05b70ef82 100644 --- a/recipes/wip/services/qpwgraph/recipe.toml +++ b/recipes/wip/services/qpwgraph/recipe.toml @@ -1,10 +1,15 @@ #TODO not compiled or tested +#TODO determine minimum dependencies from cmake log # build instructions: https://gitlab.freedesktop.org/rncbc/qpwgraph#building [source] git = "https://gitlab.freedesktop.org/rncbc/qpwgraph" -rev = "9fead6eff8c5831d66f618b2e8e195c94d5c22e6" +rev = "v0.9.8" [build] template = "cmake" +cmakeflags = [ + "-DCONFIG_ALSA_MIDI=0", + "-DCONFIG_SYSTEM_TRAY=0", +] dependencies = [ "qt6-base", "pipewire", diff --git a/recipes/wip/services/wireplumber/recipe.toml b/recipes/wip/services/wireplumber/recipe.toml index cbac08ad7..80a9c0a4c 100644 --- a/recipes/wip/services/wireplumber/recipe.toml +++ b/recipes/wip/services/wireplumber/recipe.toml @@ -1,12 +1,12 @@ #TODO not compiled or tested -# build instructions: https://pipewire.pages.freedesktop.org/wireplumber/installing-wireplumber.html +#TODO discover minimum dependencies from cmake log [source] git = "https://gitlab.freedesktop.org/pipewire/wireplumber" -rev = "d3eb77b292655cef333a8f4cab4e861415bc37c2" +rev = "0.5.13" +shallow_clone = true [build] template = "meson" -dependencies = [ - "pipewire", - "glib", - "lua54", +mesonflags = [ + "-Dtests=false", + "-Ddbus-tests=false", ] diff --git a/recipes/wip/tools/planify/recipe.toml b/recipes/wip/tools/planify/recipe.toml index f2cf7e6eb..d5cf28a63 100644 --- a/recipes/wip/tools/planify/recipe.toml +++ b/recipes/wip/tools/planify/recipe.toml @@ -5,3 +5,8 @@ git = "https://github.com/alainm23/planify" rev = "v4.17.0" [build] template = "meson" +mesonflags = [ + "-Dwebkit=false", + "-Dportal=false", + "-Devolution=false", +] From 87d454c6f5dfb89b6a36bf8f3542fee68e1c1d47 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 24 Jan 2026 23:37:45 +0700 Subject: [PATCH 107/407] Fix gnu-make duplicate getopt --- recipes/dev/gnu-make/redox.patch | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/recipes/dev/gnu-make/redox.patch b/recipes/dev/gnu-make/redox.patch index 1dba02da6..d73563858 100644 --- a/recipes/dev/gnu-make/redox.patch +++ b/recipes/dev/gnu-make/redox.patch @@ -10,3 +10,31 @@ diff -ruwN make-4.4/src/arscan.c source/src/arscan.c # include # else /* These platforms don't have but have archives in the same format +diff -ruwN make-4.4/src/getopt1.c source/src/getopt1.c +--- make-4.4/src/getopt1.c 2022-10-23 21:52:32.000000000 +0700 ++++ source/src/getopt1.c 2026-01-24 23:28:34.306706884 +0700 +@@ -48,6 +48,10 @@ + #endif + #endif + ++#ifdef __redox__ ++#define ELIDE_CODE ++#endif ++ + #ifndef ELIDE_CODE + + +diff -ruwN make-4.4/src/getopt.c source/src/getopt.c +--- make-4.4/src/getopt.c 2022-10-23 21:52:32.000000000 +0700 ++++ source/src/getopt.c 2026-01-24 23:21:09.488487860 +0700 +@@ -56,6 +56,10 @@ + # endif + #endif + ++#ifdef __redox__ ++#define ELIDE_CODE ++#endif ++ + #ifndef ELIDE_CODE + + From 53118f2e3b2d52f9b98f56aefb9e49a50d8f5f16 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 25 Jan 2026 01:00:07 +0700 Subject: [PATCH 108/407] Update servo deps --- recipes/wip/web/servo/recipe.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/recipes/wip/web/servo/recipe.toml b/recipes/wip/web/servo/recipe.toml index 0759eb455..7fd039967 100644 --- a/recipes/wip/web/servo/recipe.toml +++ b/recipes/wip/web/servo/recipe.toml @@ -9,10 +9,15 @@ dependencies = [ "fontconfig", "freetype2", "libpng", - "libstdcxx-v3", "mesa", "zlib", ] +dev-dependencies = [ + "llvm21.dev", + "host:llvm21.dev", + "host:llvm21.runtime", + "host:libarchive", # workaround for cmake error +] script = """ DYNAMIC_INIT From 1603570ba210344f3cc5cd1f22f2e04f30310efa Mon Sep 17 00:00:00 2001 From: Zhiwei Liang Date: Sun, 7 Dec 2025 19:08:35 +0000 Subject: [PATCH 109/407] Add help2man to the list of dependencies for Fedora --- native_bootstrap.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/native_bootstrap.sh b/native_bootstrap.sh index 3c89dc87b..bb868bd81 100755 --- a/native_bootstrap.sh +++ b/native_bootstrap.sh @@ -620,6 +620,7 @@ fedora() protobuf-compiler \ zstd \ lzip \ + help2man \ gdb ; do rpm -q $pkg > /dev/null || echo $pkg; done) # If the list of packages is not empty, install missing COUNT=$(echo $PKGS | wc -w) From c748bc6407c1383f676889e1efc4848d7bd27fb8 Mon Sep 17 00:00:00 2001 From: Ojus Chugh Date: Thu, 25 Dec 2025 20:38:31 +0530 Subject: [PATCH 110/407] Fix REPO_BINARY=1 source dependency propagation Signed-off-by: Ojus Chugh --- src/bin/repo.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 3b81c828c..afd4fa33f 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -370,6 +370,26 @@ fn publish_packages(recipe_names: &Vec, repo_path: &PathBuf) -> anyh run_command(command, &None).map_err(|e| anyhow!(e)) } +fn add_dependencies_recursive(recipe: &cookbook::recipe::Recipe, force_source: &mut HashSet) { + for dep in &recipe.build.dependencies { + if !force_source.contains(dep) { + force_source.insert(dep.clone()); + if let Ok(dep_recipe) = CookRecipe::from_name(dep.clone()) { + add_dependencies_recursive(&dep_recipe.recipe, force_source); + } + } + } + + for dep in &recipe.build.dev_dependencies { + if !force_source.contains(dep) { + force_source.insert(dep.clone()); + if let Ok(dep_recipe) = CookRecipe::from_name(dep.clone()) { + add_dependencies_recursive(&dep_recipe.recipe, force_source); + } + } + } +} + fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec)> { let mut config = CliConfig::new()?; let mut command: Option = None; @@ -512,11 +532,50 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = std::collections::HashSet::new(); + let mut force_binary_recipes: std::collections::HashSet = std::collections::HashSet::new(); + + // When repo_binary=1, collect "source" recipes and their dependencies + if repo_binary { + for recipe in recipes.iter() { + if let Some(conf) = conf.packages.get(recipe.name.as_str()) { + let rule = match conf { + PackageConfig::Build(rule) => rule.as_str(), + _ => "binary", + }; + if rule == "source" { + force_source_recipes.insert(recipe.name.clone()); + add_dependencies_recursive(&recipe.recipe, &mut force_source_recipes); + } + } + } + } else { + // When repo_binary=0 (default source), collect "binary" recipes and their dependencies + for recipe in recipes.iter() { + if let Some(conf) = conf.packages.get(recipe.name.as_str()) { + let rule = match conf { + PackageConfig::Build(rule) => rule.as_str(), + _ => "source", + }; + if rule == "binary" { + force_binary_recipes.insert(recipe.name.clone()); + add_dependencies_recursive(&recipe.recipe, &mut force_binary_recipes); + } + } + } + } + let mut last_rule = if repo_binary { "binary" } else { "source" }; let mut should_drop_host_packages = true; // Use rev() so recipes that don't listed in config is inherited from parent for recipe in recipes.iter_mut().rev() { - if let Some(conf) = conf.packages.get(recipe.name.as_str()) { + if force_source_recipes.contains(&recipe.name) { + last_rule = "source"; + } else if force_binary_recipes.contains(&recipe.name) { + last_rule = "binary"; + } else if let Some(conf) = conf.packages.get(recipe.name.as_str()) { last_rule = match conf { PackageConfig::Build(rule) => &rule, _ => { From 327603557c8c314f6d11806c511383dccfc2d578 Mon Sep 17 00:00:00 2001 From: Ojus Chugh Date: Sun, 25 Jan 2026 12:25:03 +0530 Subject: [PATCH 111/407] fixed reviewer feedback and comments Signed-off-by: Ojus Chugh --- src/bin/repo.rs | 63 ++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index afd4fa33f..0fabdd45c 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -533,9 +533,10 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = std::collections::HashSet::new(); - let mut force_binary_recipes: std::collections::HashSet = std::collections::HashSet::new(); + let force_binary_recipes: std::collections::HashSet = std::collections::HashSet::new(); + let mut should_drop_host_packages = true; // When repo_binary=1, collect "source" recipes and their dependencies if repo_binary { @@ -548,46 +549,38 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec rule.as_str(), - _ => "source", - }; - if rule == "binary" { - force_binary_recipes.insert(recipe.name.clone()); - add_dependencies_recursive(&recipe.recipe, &mut force_binary_recipes); + should_drop_host_packages = false; } } } } - let mut last_rule = if repo_binary { "binary" } else { "source" }; - let mut should_drop_host_packages = true; - // Use rev() so recipes that don't listed in config is inherited from parent - for recipe in recipes.iter_mut().rev() { - if force_source_recipes.contains(&recipe.name) { - last_rule = "source"; - } else if force_binary_recipes.contains(&recipe.name) { - last_rule = "binary"; - } else if let Some(conf) = conf.packages.get(recipe.name.as_str()) { - last_rule = match conf { - PackageConfig::Build(rule) => &rule, - _ => { - if repo_binary { - "binary" - } else { - "source" + for recipe in recipes.iter_mut() { + let last_rule = match (force_source_recipes.contains(&recipe.name), force_binary_recipes.contains(&recipe.name)) { + (true, true) => { + // both lists: flip logic + if repo_binary { "source" } else { "binary" } + }, + (true, false) => "source", + (false, true) => "binary", + (false, false) => { + // check config or use default + if let Some(conf) = conf.packages.get(recipe.name.as_str()) { + match conf { + PackageConfig::Build(rule) => { + let rule_str = rule.as_str(); + if should_drop_host_packages && (rule_str == "source" || rule_str == "local") { + should_drop_host_packages = false; + } + rule_str + }, + _ => { + if repo_binary { "binary" } else { "source" } + } } + } else { + if repo_binary { "binary" } else { "source" } } - }; - if should_drop_host_packages && (last_rule == "source" || last_rule == "local") { - should_drop_host_packages = false; } }; recipe From 945cc7803047c5de18df436dd1685bfd0fb22bdb Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 25 Jan 2026 19:40:24 +0100 Subject: [PATCH 112/407] Use source.same_as for orbutils recipes --- recipes/gui/orbutils-background/recipe.toml | 2 +- recipes/gui/orbutils-launcher/recipe.toml | 2 +- recipes/gui/orbutils-orblogin/recipe.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/recipes/gui/orbutils-background/recipe.toml b/recipes/gui/orbutils-background/recipe.toml index 9b13e8168..fff3fd56a 100644 --- a/recipes/gui/orbutils-background/recipe.toml +++ b/recipes/gui/orbutils-background/recipe.toml @@ -1,5 +1,5 @@ [source] -git = "https://gitlab.redox-os.org/redox-os/orbutils.git" +same_as = "../orbutils" [build] template = "cargo" diff --git a/recipes/gui/orbutils-launcher/recipe.toml b/recipes/gui/orbutils-launcher/recipe.toml index 78125ba93..30080a17b 100644 --- a/recipes/gui/orbutils-launcher/recipe.toml +++ b/recipes/gui/orbutils-launcher/recipe.toml @@ -1,5 +1,5 @@ [source] -git = "https://gitlab.redox-os.org/redox-os/orbutils.git" +same_as = "../orbutils" [build] template = "cargo" diff --git a/recipes/gui/orbutils-orblogin/recipe.toml b/recipes/gui/orbutils-orblogin/recipe.toml index 6871a92e6..3faa3ee7b 100644 --- a/recipes/gui/orbutils-orblogin/recipe.toml +++ b/recipes/gui/orbutils-orblogin/recipe.toml @@ -1,5 +1,5 @@ [source] -git = "https://gitlab.redox-os.org/redox-os/orbutils.git" +same_as = "../orbutils" [build] template = "cargo" From ef3d783216677ff982604512e5afcbb7b208556a Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 25 Jan 2026 20:57:38 +0100 Subject: [PATCH 113/407] Remove alxd from the base recipe --- recipes/core/base/recipe.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes/core/base/recipe.toml b/recipes/core/base/recipe.toml index 2afacf3a0..1dc3dff9c 100644 --- a/recipes/core/base/recipe.toml +++ b/recipes/core/base/recipe.toml @@ -23,7 +23,6 @@ cp -v \ # Drivers that are built on all architectures, and NOT in drivers-initfs BINS=( - alxd e1000d ihdad ihdgd From bf5c2256c4b1bdbe73f6d0ff2ac4746f1a345dd8 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 25 Jan 2026 21:05:42 +0100 Subject: [PATCH 114/407] Move /ui to /usr/share/ui And make /usr/share/fonts and /usr/share/icons the canonical locations for fonts and icons respectively. --- config/base.toml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/config/base.toml b/config/base.toml index 94e7c1af9..01af18300 100644 --- a/config/base.toml +++ b/config/base.toml @@ -168,10 +168,21 @@ path = "/share" data = "usr/share" symlink = true +[[files]] +path = "/ui" +data = "usr/share/ui" +symlink = true + ## legacy orbital font directory [[files]] -path = "/usr/share/fonts" -data = "../../ui/fonts" +path = "/usr/share/ui/fonts" +data = "/usr/share/fonts" +symlink = true + +## legacy orbital icon directory +[[files]] +path = "/usr/share/ui/icons" +data = "/usr/share/icons" symlink = true ## /var From ef59f95988a411b43b8ceafa3fd91b304a5aeb1e Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 25 Jan 2026 15:20:20 -0700 Subject: [PATCH 115/407] Adjuts font directory to /usr/share/fonts in all recipes --- recipes/fonts/dejavu/recipe.toml | 2 +- recipes/fonts/freefont/recipe.toml | 2 +- recipes/fonts/ibm-plex/recipe.toml | 2 +- recipes/fonts/intel-one-mono/recipe.toml | 2 +- recipes/fonts/noto-color-emoji/recipe.toml | 2 +- recipes/fonts/ttf-hack/recipe.toml | 2 +- recipes/web/netsurf/01_redox.patch | 2 +- recipes/wip/fonts/nerd-fonts/recipe.toml | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/recipes/fonts/dejavu/recipe.toml b/recipes/fonts/dejavu/recipe.toml index c97c6db17..f482a1f8e 100644 --- a/recipes/fonts/dejavu/recipe.toml +++ b/recipes/fonts/dejavu/recipe.toml @@ -8,7 +8,7 @@ script = """ #TODO: Mono style included in Sans directory for style in Sans Serif do - DEST="${COOKBOOK_STAGE}/ui/fonts/${style}/DejaVu" + DEST="${COOKBOOK_STAGE}/usr/share/fonts/${style}/DejaVu" mkdir -pv "${DEST}" cp -v "${COOKBOOK_SOURCE}/ttf/DejaVu${style}"*".ttf" "${DEST}" done diff --git a/recipes/fonts/freefont/recipe.toml b/recipes/fonts/freefont/recipe.toml index a9a67d20d..6d56fe8cf 100644 --- a/recipes/fonts/freefont/recipe.toml +++ b/recipes/fonts/freefont/recipe.toml @@ -7,7 +7,7 @@ template = "custom" script = """ for style in Mono Sans Serif do - DEST="${COOKBOOK_STAGE}/ui/fonts/${style}/FreeFont" + DEST="${COOKBOOK_STAGE}/usr/share/fonts/${style}/FreeFont" mkdir -pv "${DEST}" cp -v "${COOKBOOK_SOURCE}/Free${style}"*".otf" "${DEST}" done diff --git a/recipes/fonts/ibm-plex/recipe.toml b/recipes/fonts/ibm-plex/recipe.toml index 5f68ac6f4..6fa60f79f 100644 --- a/recipes/fonts/ibm-plex/recipe.toml +++ b/recipes/fonts/ibm-plex/recipe.toml @@ -7,7 +7,7 @@ template = "custom" script = """ for style in Mono Sans Serif do - DEST="${COOKBOOK_STAGE}/ui/fonts/${style}/IBM-Plex" + DEST="${COOKBOOK_STAGE}/usr/share/fonts/${style}/IBM-Plex" mkdir -pv "${DEST}" cp -v "${COOKBOOK_SOURCE}/IBM-Plex-${style}/fonts/complete/ttf/"*".ttf" "${DEST}" done diff --git a/recipes/fonts/intel-one-mono/recipe.toml b/recipes/fonts/intel-one-mono/recipe.toml index a6dab3aeb..8f216f7db 100644 --- a/recipes/fonts/intel-one-mono/recipe.toml +++ b/recipes/fonts/intel-one-mono/recipe.toml @@ -5,7 +5,7 @@ blake3="9caff71b0a9fe8627253c55889964612ea4ae144584a283cd2fe88b7a14a4140" [build] template = "custom" script = """ -DEST="${COOKBOOK_STAGE}/ui/fonts/Mono/Intel-One" +DEST="${COOKBOOK_STAGE}/usr/share/fonts/Mono/Intel-One" mkdir -pv "${DEST}" cp -v "${COOKBOOK_SOURCE}/fonts/ttf/"*".ttf" "${DEST}" """ diff --git a/recipes/fonts/noto-color-emoji/recipe.toml b/recipes/fonts/noto-color-emoji/recipe.toml index 7076bb1d4..66b3c3757 100644 --- a/recipes/fonts/noto-color-emoji/recipe.toml +++ b/recipes/fonts/noto-color-emoji/recipe.toml @@ -4,7 +4,7 @@ rev = "e8073ab740292f8d5f19b5de144087ac58044d06" [build] template = "custom" script = """ -DEST="${COOKBOOK_STAGE}/ui/fonts/Emoji/Noto" +DEST="${COOKBOOK_STAGE}/usr/share/fonts/Emoji/Noto" mkdir -pv "${DEST}" cp -v "${COOKBOOK_SOURCE}/fonts/NotoColorEmoji.ttf" "${DEST}" """ diff --git a/recipes/fonts/ttf-hack/recipe.toml b/recipes/fonts/ttf-hack/recipe.toml index 428dabd70..11b7e74c2 100644 --- a/recipes/fonts/ttf-hack/recipe.toml +++ b/recipes/fonts/ttf-hack/recipe.toml @@ -6,6 +6,6 @@ blake3 = "acd40f61f6f512b0808d4bf530ab4aeb5a8ec3aa1f65bf5a1d08964d1bc3d044" template = "custom" script = """ for file in "${COOKBOOK_SOURCE}"/*.ttf; do - install -D -m 644 "$file" "${COOKBOOK_STAGE}/ui/fonts/Mono/Hack/$(basename "$file")" + install -D -m 644 "$file" "${COOKBOOK_STAGE}/usr/share/fonts/Mono/Hack/$(basename "$file")" done """ \ No newline at end of file diff --git a/recipes/web/netsurf/01_redox.patch b/recipes/web/netsurf/01_redox.patch index 9330b42e7..2f72f8932 100644 --- a/recipes/web/netsurf/01_redox.patch +++ b/recipes/web/netsurf/01_redox.patch @@ -84,7 +84,7 @@ diff -ruwN source/netsurf/Makefile.config source-new/netsurf/Makefile.config +override NETSURF_USE_VIDEO := NO + +override NETSURF_FB_FONTLIB := freetype -+override NETSURF_FB_FONTPATH := /ui/fonts/ ++override NETSURF_FB_FONTPATH := /usr/share/fonts/ +override NETSURF_FB_FONT_SANS_SERIF := Sans/Fira/Regular.ttf +override NETSURF_FB_FONT_SANS_SERIF_BOLD := Sans/Fira/Bold.ttf +override NETSURF_FB_FONT_SANS_SERIF_ITALIC := Sans/Fira/Regular.ttf diff --git a/recipes/wip/fonts/nerd-fonts/recipe.toml b/recipes/wip/fonts/nerd-fonts/recipe.toml index bf4e07383..7c0e45c44 100644 --- a/recipes/wip/fonts/nerd-fonts/recipe.toml +++ b/recipes/wip/fonts/nerd-fonts/recipe.toml @@ -5,6 +5,6 @@ rev = "7b41c66a1ef0c4ac5884a4203cb53c0901217e32" [build] template = "custom" script = """ -mkdir -pv "${COOKBOOK_STAGE}"/ui/fonts -cp -rv "${COOKBOOK_SOURCE}"/patched-fonts/* "${COOKBOOK_STAGE}"/ui/fonts +mkdir -pv "${COOKBOOK_STAGE}"/usr/share/fonts +cp -rv "${COOKBOOK_SOURCE}"/patched-fonts/* "${COOKBOOK_STAGE}"/usr/share/fonts """ From 02d9da0a3cfbbfa6915e0382540f2d5e3b7f2aba Mon Sep 17 00:00:00 2001 From: Ribbon Date: Sun, 25 Jan 2026 23:30:22 -0300 Subject: [PATCH 116/407] Rename the "benchmarks" WIP recipe category to "bench" --- .../wip/{benchmarks => bench}/cargo/cargo-benchcmp/recipe.toml | 0 .../wip/{benchmarks => bench}/cargo/cargo-criterion/recipe.toml | 0 recipes/wip/{benchmarks => bench}/dacapo-benchmarks/recipe.toml | 0 recipes/wip/{benchmarks => bench}/hpc/hpcc/recipe.toml | 0 recipes/wip/{benchmarks => bench}/hpc/hpcg/recipe.toml | 0 recipes/wip/{benchmarks => bench}/hpc/minibude/recipe.toml | 0 recipes/wip/{benchmarks => bench}/hyperfine/recipe.toml | 0 recipes/wip/{benchmarks => bench}/io/blogbench/recipe.toml | 0 recipes/wip/{benchmarks => bench}/io/fio/recipe.toml | 0 .../{benchmarks => bench}/io/simple-disk-benchmark/recipe.toml | 0 recipes/wip/{benchmarks => bench}/rodinia/recipe.toml | 0 recipes/wip/{benchmarks => bench}/rpc-perf/recipe.toml | 0 recipes/wip/{benchmarks => bench}/stress-ng/recipe.toml | 0 .../{benchmarks => bench}/suite/phoronix-test-suite/recipe.toml | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename recipes/wip/{benchmarks => bench}/cargo/cargo-benchcmp/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/cargo/cargo-criterion/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/dacapo-benchmarks/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/hpc/hpcc/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/hpc/hpcg/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/hpc/minibude/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/hyperfine/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/io/blogbench/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/io/fio/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/io/simple-disk-benchmark/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/rodinia/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/rpc-perf/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/stress-ng/recipe.toml (100%) rename recipes/wip/{benchmarks => bench}/suite/phoronix-test-suite/recipe.toml (100%) diff --git a/recipes/wip/benchmarks/cargo/cargo-benchcmp/recipe.toml b/recipes/wip/bench/cargo/cargo-benchcmp/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/cargo/cargo-benchcmp/recipe.toml rename to recipes/wip/bench/cargo/cargo-benchcmp/recipe.toml diff --git a/recipes/wip/benchmarks/cargo/cargo-criterion/recipe.toml b/recipes/wip/bench/cargo/cargo-criterion/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/cargo/cargo-criterion/recipe.toml rename to recipes/wip/bench/cargo/cargo-criterion/recipe.toml diff --git a/recipes/wip/benchmarks/dacapo-benchmarks/recipe.toml b/recipes/wip/bench/dacapo-benchmarks/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/dacapo-benchmarks/recipe.toml rename to recipes/wip/bench/dacapo-benchmarks/recipe.toml diff --git a/recipes/wip/benchmarks/hpc/hpcc/recipe.toml b/recipes/wip/bench/hpc/hpcc/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/hpc/hpcc/recipe.toml rename to recipes/wip/bench/hpc/hpcc/recipe.toml diff --git a/recipes/wip/benchmarks/hpc/hpcg/recipe.toml b/recipes/wip/bench/hpc/hpcg/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/hpc/hpcg/recipe.toml rename to recipes/wip/bench/hpc/hpcg/recipe.toml diff --git a/recipes/wip/benchmarks/hpc/minibude/recipe.toml b/recipes/wip/bench/hpc/minibude/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/hpc/minibude/recipe.toml rename to recipes/wip/bench/hpc/minibude/recipe.toml diff --git a/recipes/wip/benchmarks/hyperfine/recipe.toml b/recipes/wip/bench/hyperfine/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/hyperfine/recipe.toml rename to recipes/wip/bench/hyperfine/recipe.toml diff --git a/recipes/wip/benchmarks/io/blogbench/recipe.toml b/recipes/wip/bench/io/blogbench/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/io/blogbench/recipe.toml rename to recipes/wip/bench/io/blogbench/recipe.toml diff --git a/recipes/wip/benchmarks/io/fio/recipe.toml b/recipes/wip/bench/io/fio/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/io/fio/recipe.toml rename to recipes/wip/bench/io/fio/recipe.toml diff --git a/recipes/wip/benchmarks/io/simple-disk-benchmark/recipe.toml b/recipes/wip/bench/io/simple-disk-benchmark/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/io/simple-disk-benchmark/recipe.toml rename to recipes/wip/bench/io/simple-disk-benchmark/recipe.toml diff --git a/recipes/wip/benchmarks/rodinia/recipe.toml b/recipes/wip/bench/rodinia/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/rodinia/recipe.toml rename to recipes/wip/bench/rodinia/recipe.toml diff --git a/recipes/wip/benchmarks/rpc-perf/recipe.toml b/recipes/wip/bench/rpc-perf/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/rpc-perf/recipe.toml rename to recipes/wip/bench/rpc-perf/recipe.toml diff --git a/recipes/wip/benchmarks/stress-ng/recipe.toml b/recipes/wip/bench/stress-ng/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/stress-ng/recipe.toml rename to recipes/wip/bench/stress-ng/recipe.toml diff --git a/recipes/wip/benchmarks/suite/phoronix-test-suite/recipe.toml b/recipes/wip/bench/suite/phoronix-test-suite/recipe.toml similarity index 100% rename from recipes/wip/benchmarks/suite/phoronix-test-suite/recipe.toml rename to recipes/wip/bench/suite/phoronix-test-suite/recipe.toml From 0ca6293c1bf9a044dc6b76182a254e3c7c2f2106 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 25 Jan 2026 20:10:48 -0700 Subject: [PATCH 117/407] Use make setenv in dual-boot script --- scripts/dual-boot.sh | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/scripts/dual-boot.sh b/scripts/dual-boot.sh index b067ad5f4..41459c482 100755 --- a/scripts/dual-boot.sh +++ b/scripts/dual-boot.sh @@ -18,17 +18,9 @@ then exit 1 fi -if [ -z "${ARCH}" ] -then - export ARCH="$(uname -m)" -fi +eval $(make setenv) -if [ -z "${CONFIG_NAME}" ] -then - export CONFIG_NAME=desktop -fi - -IMAGE="build/${ARCH}/${CONFIG_NAME}/filesystem.img" +IMAGE="${BUILD}/filesystem.img" set -x rm -f "${IMAGE}" make "${IMAGE}" From 82b965c753d51cf5add0c1e88b6ec0ac5adbb08b Mon Sep 17 00:00:00 2001 From: Ribbon Date: Mon, 26 Jan 2026 01:34:56 -0300 Subject: [PATCH 118/407] Add and improve recipes --- recipes/wip/dev/git-tools/keifu/recipe.toml | 9 +++++++++ recipes/wip/games/rpg/dcss/recipe.toml | 9 +++++---- recipes/wip/gnome/gnome-boxes/recipe.toml | 6 ++++++ recipes/wip/services/busd/recipe.toml | 2 +- recipes/wip/services/hickory-dns/recipe.toml | 1 + recipes/wip/services/lemurs/recipe.toml | 13 +++++++++++-- recipes/wip/services/limine/recipe.toml | 3 ++- recipes/wip/services/ntpd-rs/recipe.toml | 8 ++++++-- recipes/wip/services/qpwgraph/recipe.toml | 8 ++++---- recipes/wip/services/runst/recipe.toml | 7 ++----- recipes/wip/services/seatd/recipe.toml | 7 +++++-- 11 files changed, 52 insertions(+), 21 deletions(-) create mode 100644 recipes/wip/dev/git-tools/keifu/recipe.toml create mode 100644 recipes/wip/gnome/gnome-boxes/recipe.toml diff --git a/recipes/wip/dev/git-tools/keifu/recipe.toml b/recipes/wip/dev/git-tools/keifu/recipe.toml new file mode 100644 index 000000000..08898a9d9 --- /dev/null +++ b/recipes/wip/dev/git-tools/keifu/recipe.toml @@ -0,0 +1,9 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/trasta298/keifu" +[build] +template = "cargo" +[package] +dependencies = [ + "git", +] diff --git a/recipes/wip/games/rpg/dcss/recipe.toml b/recipes/wip/games/rpg/dcss/recipe.toml index 29895a7de..32744f339 100644 --- a/recipes/wip/games/rpg/dcss/recipe.toml +++ b/recipes/wip/games/rpg/dcss/recipe.toml @@ -1,7 +1,6 @@ -#TODO missing script for "make", see https://github.com/crawl/crawl/blob/master/crawl-ref/INSTALL.md#compiling -#TODO require DejaVu fonts +#TODO missing script for gnu make: https://github.com/crawl/crawl/blob/master/crawl-ref/INSTALL.md#compiling [source] -tar = "https://github.com/crawl/crawl/releases/download/0.30.0/stone_soup-0.30.0.tar.xz" +tar = "https://github.com/crawl/crawl/releases/download/0.33.1/stone_soup-0.33.1.tar.xz" [build] template = "custom" dependencies = [ @@ -14,5 +13,7 @@ dependencies = [ "libpng", ] script = """ -export CPPFLAGS="-I${COOKBOOK_SYSROOT}/include/ncurses" +DYNAMIC_INIT """ +[package] +dependencies = ["dejavu"] diff --git a/recipes/wip/gnome/gnome-boxes/recipe.toml b/recipes/wip/gnome/gnome-boxes/recipe.toml new file mode 100644 index 000000000..c76b93eab --- /dev/null +++ b/recipes/wip/gnome/gnome-boxes/recipe.toml @@ -0,0 +1,6 @@ +#TODO not compiled or tested +#TODO discover minimum dependencies from meson log +[source] +tar = "https://download.gnome.org/sources/gnome-boxes/49/gnome-boxes-49.1.tar.xz" +[build] +template = "meson" diff --git a/recipes/wip/services/busd/recipe.toml b/recipes/wip/services/busd/recipe.toml index 4976b0e8a..29c15e627 100644 --- a/recipes/wip/services/busd/recipe.toml +++ b/recipes/wip/services/busd/recipe.toml @@ -1,6 +1,6 @@ #TODO not compiled or tested [source] git = "https://github.com/jackpot51/busd" - +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/services/hickory-dns/recipe.toml b/recipes/wip/services/hickory-dns/recipe.toml index 098837998..90d6b11bb 100644 --- a/recipes/wip/services/hickory-dns/recipe.toml +++ b/recipes/wip/services/hickory-dns/recipe.toml @@ -1,6 +1,7 @@ #TODO compiled but not tested [source] git = "https://github.com/hickory-dns/hickory-dns" +shallow_clone = true [build] template = "custom" dependencies = [ diff --git a/recipes/wip/services/lemurs/recipe.toml b/recipes/wip/services/lemurs/recipe.toml index 0b4496df9..cd16956de 100644 --- a/recipes/wip/services/lemurs/recipe.toml +++ b/recipes/wip/services/lemurs/recipe.toml @@ -1,6 +1,15 @@ -#TODO missing script for configuration: https://github.com/coastalwhite/lemurs#compiling-from-source +#TODO not compiled or tested [source] git = "https://github.com/coastalwhite/lemurs" -rev = "37963b8ff6945ae8bdbabee658e5e36d0f67b84a" [build] template = "custom" +script = """ +DYNAMIC_INIT +cookbook_cargo +mkdir -pv "${COOKBOOK_STAGE}/etc/lemurs" +mkdir -pv "${COOKBOOK_STAGE}/etc/rustysd/system" +mkdir -pv "${COOKBOOK_STAGE}/etc/pam.d" +cp -rv "${COOKBOOK_SOURCE}"/extra/{config.toml,xsetup.sh} "${COOKBOOK_STAGE}/etc/lemurs" +cp -rv "${COOKBOOK_SOURCE}"/extra/lemurs.service "${COOKBOOK_STAGE}/etc/rustysd/system" +cp -rv "${COOKBOOK_SOURCE}"/extra/lemurs.pam "${COOKBOOK_STAGE}/etc/pam.d/lemurs" +""" diff --git a/recipes/wip/services/limine/recipe.toml b/recipes/wip/services/limine/recipe.toml index e1c428612..ca4084b24 100644 --- a/recipes/wip/services/limine/recipe.toml +++ b/recipes/wip/services/limine/recipe.toml @@ -1,4 +1,5 @@ -#TODO maybe wrong template, see https://github.com/limine-bootloader/limine#building-the-bootloader +#TODO not compiled or tested +# build instructions: https://github.com/limine-bootloader/limine#building-the-bootloader [source] tar = "https://github.com/limine-bootloader/limine/releases/download/v7.2.0/limine-7.2.0.tar.xz" [build] diff --git a/recipes/wip/services/ntpd-rs/recipe.toml b/recipes/wip/services/ntpd-rs/recipe.toml index 888a9392e..1ca8496ed 100644 --- a/recipes/wip/services/ntpd-rs/recipe.toml +++ b/recipes/wip/services/ntpd-rs/recipe.toml @@ -1,9 +1,13 @@ -#TODO program source code error -#TODO configure the service +#TODO not compiled or tested +#TODO configure the service: https://docs.ntpd-rs.pendulum-project.org/guide/installation/#running-as-a-system-service [source] git = "https://github.com/pendulum-project/ntpd-rs" +shallow_clone = true [build] template = "custom" script = """ +DYNAMIC_INIT cookbook_cargo_packages ntpd +mkdir -pv "${COOKBOOK_STAGE}/etc/ntpd-rs" +cp -rv "${COOKBOOK_SOURCE}"/docs/examples/conf/ntp.toml.default "${COOKBOOK_STAGE}/etc/ntpd-rs/ntp.toml" """ diff --git a/recipes/wip/services/qpwgraph/recipe.toml b/recipes/wip/services/qpwgraph/recipe.toml index 05b70ef82..b1dd08c4e 100644 --- a/recipes/wip/services/qpwgraph/recipe.toml +++ b/recipes/wip/services/qpwgraph/recipe.toml @@ -10,7 +10,7 @@ cmakeflags = [ "-DCONFIG_ALSA_MIDI=0", "-DCONFIG_SYSTEM_TRAY=0", ] -dependencies = [ - "qt6-base", - "pipewire", -] +#dependencies = [ +# "qt6-base", +# "pipewire", +#] diff --git a/recipes/wip/services/runst/recipe.toml b/recipes/wip/services/runst/recipe.toml index f57603ae5..82fcee951 100644 --- a/recipes/wip/services/runst/recipe.toml +++ b/recipes/wip/services/runst/recipe.toml @@ -1,13 +1,10 @@ #TODO not compiled or tested [source] git = "https://github.com/orhun/runst" +shallow_clone = true [build] -template = "custom" +template = "cargo" dependencies = [ "glib", "pango", ] -script = """ -DYNAMIC_INIT -cookbook_cargo -""" diff --git a/recipes/wip/services/seatd/recipe.toml b/recipes/wip/services/seatd/recipe.toml index 65b6f5cd0..834082cfe 100644 --- a/recipes/wip/services/seatd/recipe.toml +++ b/recipes/wip/services/seatd/recipe.toml @@ -1,7 +1,10 @@ #TODO not compiled or tested -# lacking build instructions [source] git = "https://git.sr.ht/~kennylevinsen/seatd" -rev = "3e9ef69f14f630a719dd464f3c90a7932f1c8296" +rev = "0.9.2" +shallow_clone = true [build] template = "meson" +mesonflags = [ + "-Dman-pages=disabled", +] From 505aabc026255e3e6aae1f0d8332d8221330a38f Mon Sep 17 00:00:00 2001 From: Akshit Gaur Date: Mon, 26 Jan 2026 14:53:19 +0530 Subject: [PATCH 119/407] Add iperf3 --- recipes/tests/benchmarks/recipe.toml | 5 +++++ recipes/tests/iperf3/recipe.toml | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 recipes/tests/iperf3/recipe.toml diff --git a/recipes/tests/benchmarks/recipe.toml b/recipes/tests/benchmarks/recipe.toml index 17e613527..6bd59dbab 100644 --- a/recipes/tests/benchmarks/recipe.toml +++ b/recipes/tests/benchmarks/recipe.toml @@ -7,3 +7,8 @@ script = """ mkdir -pv "${COOKBOOK_STAGE}"/usr/share/benchmarks cp -rv "${COOKBOOK_SOURCE}"/* "${COOKBOOK_STAGE}"/usr/share/benchmarks """ + +[package] +dependencies = [ + "iperf3" +] diff --git a/recipes/tests/iperf3/recipe.toml b/recipes/tests/iperf3/recipe.toml new file mode 100644 index 000000000..d126ce350 --- /dev/null +++ b/recipes/tests/iperf3/recipe.toml @@ -0,0 +1,5 @@ +[source] +tar = "https://downloads.es.net/pub/iperf/iperf-3.20.tar.gz" + +[build] +template = "configure" From 26cd514925de0005bf1e41070d5fc95776f625fd Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 26 Jan 2026 20:41:07 +0700 Subject: [PATCH 120/407] Improve binary recipe deps detection --- src/bin/repo.rs | 273 ++++++++++++++++++++++++------------------------ src/recipe.rs | 14 ++- 2 files changed, 145 insertions(+), 142 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 0fabdd45c..003834cc3 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -12,7 +12,6 @@ use cookbook::cook::tree::{self, WalkTreeEntry}; use cookbook::log_to_pty; use cookbook::recipe::{CookRecipe, recipes_flatten_package_names, recipes_mark_as_deps}; use pkg::PackageName; -use pkg::package::PackageError; use ratatui::Terminal; use ratatui::layout::{Constraint, Direction, Layout, Position, Rect}; use ratatui::prelude::TermionBackend; @@ -21,7 +20,7 @@ use ratatui::text::{Line, Span, Text}; use ratatui::widgets::{Block, Borders, Clear, List, ListItem, ListState, Paragraph, Wrap}; use redox_installer::PackageConfig; use std::borrow::Cow; -use std::collections::{HashMap, HashSet, VecDeque}; +use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::io::{Read, Write, stderr, stdin, stdout}; use std::path::PathBuf; use std::process::Command; @@ -370,26 +369,6 @@ fn publish_packages(recipe_names: &Vec, repo_path: &PathBuf) -> anyh run_command(command, &None).map_err(|e| anyhow!(e)) } -fn add_dependencies_recursive(recipe: &cookbook::recipe::Recipe, force_source: &mut HashSet) { - for dep in &recipe.build.dependencies { - if !force_source.contains(dep) { - force_source.insert(dep.clone()); - if let Ok(dep_recipe) = CookRecipe::from_name(dep.clone()) { - add_dependencies_recursive(&dep_recipe.recipe, force_source); - } - } - } - - for dep in &recipe.build.dev_dependencies { - if !force_source.contains(dep) { - force_source.insert(dep.clone()); - if let Ok(dep_recipe) = CookRecipe::from_name(dep.clone()) { - add_dependencies_recursive(&dep_recipe.recipe, force_source); - } - } - } -} - fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec)> { let mut config = CliConfig::new()?; let mut command: Option = None; @@ -460,47 +439,57 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec pkg::recipes::list(""), - Some(prefix) => pkg::recipes::list("") - .into_iter() - .filter(|p| p.starts_with(prefix)) - .collect(), - } - .iter() - // TODO: Allow selecting recipes from category as host? - .map(|f| CookRecipe::from_path(f, !command.is_cleaning(), false)) - .collect::, PackageError>>()? - } else { - if recipe_names.is_empty() { + if command.is_informational() { + // avoid extra data that clobber stdout + config.cook.verbose = false; + } + + // 1. Get the list of packages + // 2. Put them into list to build or download + // 3. Expand with package deps for both list + // 4. Expand build deps for things to build + // 5. Merge both list + + // early overrides for "ignore" and "local", also preloaded for recipes when doing all clean + let mut preloaded_recipes: BTreeMap = BTreeMap::new(); + + if recipe_names.is_empty() { + if config.all || config.category.is_some() { + if !recipe_names.is_empty() { + bail!("Do not specify recipe names when using the --all or --category flag."); + } + if config.all && config.category.is_some() { + bail!("Do not specify both --all and --category flag."); + } + if config.all && !command.is_cleaning() { + // because read_recipe is false by logic below + // some recipes on wip folders are invalid anyway + bail!( + "Refusing to run an unrealistic command to {} all recipes", + command.to_string() + ); + } + let all_recipes_path = match &config.category { + None => pkg::recipes::list(""), + Some(prefix) => pkg::recipes::list("") + .into_iter() + .filter(|p| p.starts_with(prefix)) + .collect(), + }; + + for path in all_recipes_path { + // TODO: Allow selecting recipes from category as host? + let recipe = CookRecipe::from_path(&path, !command.is_cleaning(), false)?; + let recipe_name = recipe.name.clone(); + preloaded_recipes.insert(recipe_name.clone(), recipe); + recipe_names.push(recipe_name); + } + } else { if let Some(conf) = config.filesystem.as_ref() { recipe_names = conf .packages - .iter() - .filter_map(|(f, v)| { - match v { - PackageConfig::Build(rule) if rule == "ignore" => { - return None; - } - _ => {} - } - PackageName::new(f).ok() - }) + .keys() + .filter_map(|k| PackageName::new(k.to_string()).ok()) .collect(); } else { bail!( @@ -508,95 +497,101 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = std::collections::HashSet::new(); - let force_binary_recipes: std::collections::HashSet = std::collections::HashSet::new(); - let mut should_drop_host_packages = true; - - // When repo_binary=1, collect "source" recipes and their dependencies - if repo_binary { - for recipe in recipes.iter() { - if let Some(conf) = conf.packages.get(recipe.name.as_str()) { - let rule = match conf { - PackageConfig::Build(rule) => rule.as_str(), - _ => "binary", - }; - if rule == "source" { - force_source_recipes.insert(recipe.name.clone()); - add_dependencies_recursive(&recipe.recipe, &mut force_source_recipes); - should_drop_host_packages = false; - } - } - } - } - - for recipe in recipes.iter_mut() { - let last_rule = match (force_source_recipes.contains(&recipe.name), force_binary_recipes.contains(&recipe.name)) { - (true, true) => { - // both lists: flip logic - if repo_binary { "source" } else { "binary" } - }, - (true, false) => "source", - (false, true) => "binary", - (false, false) => { - // check config or use default - if let Some(conf) = conf.packages.get(recipe.name.as_str()) { - match conf { - PackageConfig::Build(rule) => { - let rule_str = rule.as_str(); - if should_drop_host_packages && (rule_str == "source" || rule_str == "local") { - should_drop_host_packages = false; - } - rule_str - }, - _ => { - if repo_binary { "binary" } else { "source" } - } - } + + // Derive "source" + "local" and "binary" + "ignore" + let mut source_recipe_names: Vec = Vec::new(); + let mut binary_recipe_names: Vec = Vec::new(); + + for recipe_name in recipe_names.iter() { + let rule = match conf.packages.get(recipe_name.as_str()) { + Some(PackageConfig::Build(rule)) => rule.as_str(), + _ => { + if repo_binary { + "binary" } else { - if repo_binary { "binary" } else { "source" } + "source" } } }; - recipe - .apply_filesystem_config(last_rule) - .map_err(|e| anyhow!(e))?; - } - // If there's no building from source, drop all host toolchain - // TODO: This is more of a hack to make CI passing - if should_drop_host_packages && config.with_package_deps { - recipes = recipes.into_iter().filter(|p| !p.name.is_host()).collect(); - } - } - if command.is_informational() { - // avoid extra data that clobber stdout - config.cook.verbose = false; + if rule == "source" || rule == "local" { + source_recipe_names.push(recipe_name.clone()); + } else { + binary_recipe_names.push(recipe_name.clone()); + } + if rule == "local" || rule == "ignore" { + // these don't inherit into their deps + let mut recipe = CookRecipe::from_name(recipe_name.clone())?; + recipe.apply_filesystem_config(rule)?; + preloaded_recipes.insert(recipe_name.clone(), recipe); + } + } + if config.with_package_deps { + source_recipe_names = + CookRecipe::get_package_deps_recursive(&source_recipe_names, true)?; + binary_recipe_names = + CookRecipe::get_package_deps_recursive(&binary_recipe_names, true)?; + } + + let mut recipes = if command.is_building() { + CookRecipe::get_build_deps_recursive(&source_recipe_names, true)? + } else { + CookRecipe::from_list(source_recipe_names.clone())? + }; + + recipes.extend(CookRecipe::from_list(binary_recipe_names.clone())?); + recipes = recipes_flatten_package_names(recipes); + + for recipe in recipes.iter_mut() { + if let Some(preloaded) = preloaded_recipes.remove(&recipe.name) { + // can come from --category flag, which doesn't have specific rule + if !preloaded.rule.is_empty() { + recipe.apply_filesystem_config(&preloaded.rule)?; + continue; + } + } + let rule = match ( + source_recipe_names.contains(&recipe.name), + binary_recipe_names.contains(&recipe.name), + ) { + (true, true) => { + // both lists: flip logic + if repo_binary { "source" } else { "binary" } + } + (true, false) => "source", + (false, true) => "binary", + (false, false) => { + // should not be possible to go here + if repo_binary { "binary" } else { "source" } + } + }; + recipe.apply_filesystem_config(rule)?; + } + recipes + } else { + CookRecipe::from_list(recipe_names.clone())? + }; + + if command.is_pushing() || !config.with_package_deps { + // In CliCommand::Cook, is_deps==true will make it skip checking source + recipes_mark_as_deps(&recipe_names, &mut recipes); } Ok((config, command, recipes)) diff --git a/src/recipe.rs b/src/recipe.rs index 006f75051..7ae97e872 100644 --- a/src/recipe.rs +++ b/src/recipe.rs @@ -267,6 +267,14 @@ impl CookRecipe { Self::new(name, dir.to_path_buf(), recipe) } + pub fn from_list(names: Vec) -> Result, PackageError> { + let mut packages = Vec::new(); + for name in names { + packages.push(Self::from_name(name)?); + } + Ok(packages) + } + pub fn from_path(dir: &Path, read_recipe: bool, is_host: bool) -> Result { let file = dir.join("recipe.toml"); let mut name: PackageName = dir.file_name().unwrap().try_into()?; @@ -438,7 +446,7 @@ impl CookRecipe { self.dir.join("target").join(self.target) } - pub fn apply_filesystem_config(&mut self, rule: &str) -> Result<(), String> { + pub fn apply_filesystem_config(&mut self, rule: &str) -> Result<(), anyhow::Error> { match rule { // build from source as usual "source" => {} @@ -457,12 +465,12 @@ impl CookRecipe { self.recipe.build.set_as_none(); } rule => { - return Err(format!( + anyhow::bail!( // Fail fast because we could risk losing local changes if "local" was typo'ed "Invalid pkg config {} = \"{}\"\nExpecting either 'source', 'local', 'binary' or 'ignore'", self.name.as_str(), rule - )); + ); } } self.rule = rule.to_string(); From 7bd5e1e087d64bc1cba8ed66a0b608e1b327e6c7 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 26 Jan 2026 21:36:53 +0700 Subject: [PATCH 121/407] Build filesystem complete map --- src/bin/repo.rs | 84 +++++++++++++++++++++++++++++++------------------ src/recipe.rs | 10 ++++++ 2 files changed, 64 insertions(+), 30 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 003834cc3..b6267ef2f 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -516,33 +516,46 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = Vec::new(); - let mut binary_recipe_names: Vec = Vec::new(); - - for recipe_name in recipe_names.iter() { - let rule = match conf.packages.get(recipe_name.as_str()) { - Some(PackageConfig::Build(rule)) => rule.as_str(), - _ => { - if repo_binary { - "binary" - } else { - "source" - } - } + // This is the complete map from filesystem config + let mut source_names: Vec = Vec::new(); + let mut binary_names: Vec = Vec::new(); + let mut special_rules: HashMap = HashMap::new(); + let default_rule = if repo_binary { "binary" } else { "source" }; + for (recipe_name_str, recipe_config) in conf.packages.iter() { + let Ok(recipe_name) = PackageName::new(recipe_name_str) else { + continue; + }; + let rule = match recipe_config { + PackageConfig::Build(rule) => rule, + _ => default_rule, }; if rule == "source" || rule == "local" { - source_recipe_names.push(recipe_name.clone()); + source_names.push(recipe_name.clone()); } else { - binary_recipe_names.push(recipe_name.clone()); + binary_names.push(recipe_name.clone()); } if rule == "local" || rule == "ignore" { - // these don't inherit into their deps - let mut recipe = CookRecipe::from_name(recipe_name.clone())?; - recipe.apply_filesystem_config(rule)?; - preloaded_recipes.insert(recipe_name.clone(), recipe); + special_rules.insert(recipe_name, rule.to_string()); } } + source_names = CookRecipe::get_all_deps_names_recursive(&source_names, true)?; + binary_names = CookRecipe::get_all_deps_names_recursive(&binary_names, false)?; + let source_names: HashSet = source_names.into_iter().collect(); + let binary_names: HashSet = binary_names.into_iter().collect(); + + // These are list that derived from recipe_names + let mut source_recipe_names: Vec = Vec::new(); + let mut binary_recipe_names: Vec = Vec::new(); + for recipe_name in recipe_names.iter() { + if source_names.contains(recipe_name) { + source_recipe_names.push(recipe_name.clone()); + } + if binary_names.contains(recipe_name) { + binary_recipe_names.push(recipe_name.clone()); + } + } + if config.with_package_deps { source_recipe_names = CookRecipe::get_package_deps_recursive(&source_recipe_names, true)?; @@ -556,20 +569,23 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec { // both lists: flip logic @@ -579,14 +595,22 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec "binary", (false, false) => { // should not be possible to go here - if repo_binary { "binary" } else { "source" } + default_rule } }; recipe.apply_filesystem_config(rule)?; } + recipes } else { - CookRecipe::from_list(recipe_names.clone())? + if config.with_package_deps { + recipe_names = CookRecipe::get_package_deps_recursive(&recipe_names, true)?; + } + if command.is_building() { + CookRecipe::get_build_deps_recursive(&recipe_names, true)? + } else { + CookRecipe::from_list(recipe_names.clone())? + } }; if command.is_pushing() || !config.with_package_deps { diff --git a/src/recipe.rs b/src/recipe.rs index 7ae97e872..63fc5a09e 100644 --- a/src/recipe.rs +++ b/src/recipe.rs @@ -427,6 +427,16 @@ impl CookRecipe { Ok(packages.into_iter().map(|p| p.name).collect()) } + pub fn get_all_deps_names_recursive( + names: &[PackageName], + include_dev: bool, + ) -> Result, PackageError> { + let packages = + Self::new_recursive(names, true, include_dev, true, true, true, true, WALK_DEPTH)?; + + Ok(packages.into_iter().map(|p| p.name).collect()) + } + pub fn reload_recipe(&mut self) -> Result<(), PackageError> { self.recipe = Self::from_path(&self.dir, true, self.name.is_host())?.recipe; let _ = self.apply_filesystem_config(&self.rule.clone()); From 1a3ac0293762e6e525f54676aa020912a62e8626 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 26 Jan 2026 23:00:10 +0700 Subject: [PATCH 122/407] Handle ignore separately --- src/bin/repo.rs | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index b6267ef2f..913e885d9 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -444,13 +444,6 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = BTreeMap::new(); if recipe_names.is_empty() { @@ -501,10 +494,7 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = Vec::new(); let mut binary_names: Vec = Vec::new(); @@ -532,10 +522,10 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = Vec::new(); let mut binary_recipe_names: Vec = Vec::new(); + let mut ignore_recipe_names: Vec = Vec::new(); for recipe_name in recipe_names.iter() { if source_names.contains(recipe_name) { source_recipe_names.push(recipe_name.clone()); - } - if binary_names.contains(recipe_name) { + } else if binary_names.contains(recipe_name) { binary_recipe_names.push(recipe_name.clone()); + } else { + if special_rules + .get(recipe_name) + .is_some_and(|s| s == "ignore") + { + ignore_recipe_names.push(recipe_name.clone()); + } else if repo_binary { + binary_recipe_names.push(recipe_name.clone()); + } else { + source_recipe_names.push(recipe_name.clone()); + } } } @@ -575,7 +576,10 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec "source", (false, true) => "binary", - (false, false) => { - // should not be possible to go here - default_rule - } + (false, false) => default_rule, }; recipe.apply_filesystem_config(rule)?; } From b8e74ce094e60ca7faf304bed076b291b8756331 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Mon, 26 Jan 2026 20:01:20 +0100 Subject: [PATCH 123/407] Update two recipe for ui dir move Forgot to commit them in my previous MR. --- recipes/games/opentyrian/recipe.toml | 2 +- .../wip/games/strategy/hnefatafl-copenhagen/recipe.toml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/recipes/games/opentyrian/recipe.toml b/recipes/games/opentyrian/recipe.toml index 84fc86159..3f9fbfb5e 100644 --- a/recipes/games/opentyrian/recipe.toml +++ b/recipes/games/opentyrian/recipe.toml @@ -34,7 +34,7 @@ export WITH_NETWORK=false export REDOX_OVERRIDE=true export prefix="/usr" export bindir="${prefix}/games" -export icondir="/ui/icons/apps" +export icondir="/usr/share/icons/apps" export gamesdir="${prefix}/share/games" if [ "${COOKBOOK_DYNAMIC}" == "1" ]; then diff --git a/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml b/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml index f33deaeca..3180b5e1a 100644 --- a/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml +++ b/recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml @@ -24,10 +24,10 @@ cp -v "target/${TARGET}/release/hnefatafl-server" "${COOKBOOK_STAGE}/usr/bin/hne cp -v "target/${TARGET}/release/hnefatafl-text-protocol" "${COOKBOOK_STAGE}/usr/bin/hnefatafl-text-protocol" mkdir -pv "${COOKBOOK_STAGE}"/usr/games -mkdir -pv "${COOKBOOK_STAGE}"/ui/apps -mkdir -pv "${COOKBOOK_STAGE}"/ui/icons/apps -cp -rv "${COOKBOOK_SOURCE}"/src/bin/hnefatafl-client/helmet.png "${COOKBOOK_STAGE}"/ui/icons/apps/helmet.png -cp -rv "${COOKBOOK_SOURCE}"/packages/redox/manifest "${COOKBOOK_STAGE}"/ui/apps/hnefatafl-client +mkdir -pv "${COOKBOOK_STAGE}"/usr/share/ui/apps +mkdir -pv "${COOKBOOK_STAGE}"/usr/share/icons/apps +cp -rv "${COOKBOOK_SOURCE}"/src/bin/hnefatafl-client/helmet.png "${COOKBOOK_STAGE}"/usr/share/icons/apps/helmet.png +cp -rv "${COOKBOOK_SOURCE}"/packages/redox/manifest "${COOKBOOK_STAGE}"/usr/share/ui/apps/hnefatafl-client mv "${COOKBOOK_STAGE}"/usr/bin/hnefatafl-client "${COOKBOOK_STAGE}"/usr/games/hnefatafl-client """ From 0d770b5cc1859198fb31b7331befd5fe3449f80e Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Mon, 26 Jan 2026 21:51:57 +0100 Subject: [PATCH 124/407] Mark services as notify where necessary --- config/base.toml | 4 ++-- config/desktop.toml | 2 +- config/net.toml | 2 +- config/redoxer.toml | 2 +- config/resist.toml | 2 +- config/wayland.toml | 2 +- config/x11.toml | 2 +- config/x86_64/desktop-contain.toml | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/config/base.toml b/config/base.toml index 01af18300..15bb01767 100644 --- a/config/base.toml +++ b/config/base.toml @@ -27,8 +27,8 @@ data = """ rm -rf /tmp mkdir -m a=rwxt /tmp -ipcd -ptyd +notify ipcd +notify ptyd nowait sudo --daemon """ diff --git a/config/desktop.toml b/config/desktop.toml index 3c7bd1411..c2b7f21f9 100644 --- a/config/desktop.toml +++ b/config/desktop.toml @@ -29,7 +29,7 @@ shared-mime-info = {} [[files]] path = "/usr/lib/init.d/20_orbital" data = """ -audiod +notify audiod export BROWSER /bin/netsurf-fb export VT 3 nowait orbital orblogin launcher diff --git a/config/net.toml b/config/net.toml index 05f6f5a40..e4c26eaf6 100644 --- a/config/net.toml +++ b/config/net.toml @@ -12,7 +12,7 @@ netutils = {} [[files]] path = "/usr/lib/init.d/10_net" data = """ -smolnetd +notify smolnetd nowait dhcpd """ diff --git a/config/redoxer.toml b/config/redoxer.toml index ad112df79..54e1e2ff1 100644 --- a/config/redoxer.toml +++ b/config/redoxer.toml @@ -20,7 +20,7 @@ sed = {} [[files]] path = "/usr/lib/init.d/10_net" data = """ -smolnetd +notify smolnetd dhcpd """ diff --git a/config/resist.toml b/config/resist.toml index 521e7d55b..a7ece5707 100644 --- a/config/resist.toml +++ b/config/resist.toml @@ -24,7 +24,7 @@ resist = {} [[files]] path = "/usr/lib/init.d/10_net" data = """ -smolnetd +notify smolnetd dhcpd """ diff --git a/config/wayland.toml b/config/wayland.toml index f39d4c5ab..956ee9916 100644 --- a/config/wayland.toml +++ b/config/wayland.toml @@ -36,7 +36,7 @@ glib-compile-schemas /usr/share/glib-2.0/schemas/ [[files]] path = "/usr/lib/init.d/20_orbital" data = """ -audiod +notify audiod export BROWSER /bin/netsurf-fb export VT 3 nowait orbital orbital-wayland diff --git a/config/x11.toml b/config/x11.toml index bfc6a9d34..dbbccc55e 100644 --- a/config/x11.toml +++ b/config/x11.toml @@ -61,7 +61,7 @@ glib-compile-schemas /usr/share/glib-2.0/schemas/ [[files]] path = "/usr/lib/init.d/20_orbital" data = """ -audiod +notify audiod export BROWSER /bin/netsurf-fb export VT 3 nowait orbital orbital-x11 diff --git a/config/x86_64/desktop-contain.toml b/config/x86_64/desktop-contain.toml index 9aea34b7f..ea56fd4bc 100644 --- a/config/x86_64/desktop-contain.toml +++ b/config/x86_64/desktop-contain.toml @@ -17,7 +17,7 @@ include = ["../desktop.toml"] [[files]] path = "/usr/lib/init.d/20_orbital" data = """ -audiod +notify audiod export VT 3 nowait orbital contain_orblogin launcher unset VT From 0690bf5668534fefa3592e0c75a9fb5499f1cc3e Mon Sep 17 00:00:00 2001 From: Ribbon Date: Mon, 26 Jan 2026 19:53:00 -0300 Subject: [PATCH 125/407] Fix RISC-V firmware location in Fedora --- mk/qemu.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mk/qemu.mk b/mk/qemu.mk index f61145723..73dbc3ff3 100644 --- a/mk/qemu.mk +++ b/mk/qemu.mk @@ -107,11 +107,13 @@ else ifeq ($(ARCH),riscv64gc) disk?=nvme PFLASH0=$(firstword \ $(wildcard /usr/share/qemu-efi-riscv64/RISCV_VIRT_CODE.fd) \ + $(wildcard /usr/share/edk2/riscv/RISCV_VIRT_CODE.fd) \ $(wildcard /usr/share/qemu/edk2-riscv-code.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-code.fd) \ ) PFLASH1=$(firstword \ $(wildcard /usr/share/qemu-efi-riscv64/RISCV_VIRT_VARS.fd) \ + $(wildcard /usr/share/edk2/riscv/RISCV_VIRT_VARS.fd) \ $(wildcard /usr/share/qemu/edk2-riscv-vars.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-vars.fd) \ ) From 3d3cfd513bed968d569686a13cd1f2a3a22e6a5e Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Tue, 27 Jan 2026 11:52:07 +1100 Subject: [PATCH 126/407] fix(recipes/gawk): compilation Signed-off-by: Anhad Singh --- recipes/wip/dev/lang/gawk/recipe.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/recipes/wip/dev/lang/gawk/recipe.toml b/recipes/wip/dev/lang/gawk/recipe.toml index 098055aea..22479989d 100644 --- a/recipes/wip/dev/lang/gawk/recipe.toml +++ b/recipes/wip/dev/lang/gawk/recipe.toml @@ -1,12 +1,16 @@ -#TODO: langinfo.h [source] git = "https://gitlab.redox-os.org/redox-os/gawk.git" upstream = "https://git.savannah.gnu.org/git/gawk.git" branch = "redox" +script = """ +DYNAMIC_INIT +autotools_recursive_regenerate +""" [build] template = "custom" script = """ +DYNAMIC_INIT COOKBOOK_CONFIGURE_FLAGS+=( ac_cv_func_gethostbyname=no ac_cv_func_connect=no From fa08df15546e648cd1d4591026d847671ca22642 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Tue, 27 Jan 2026 11:58:20 +1100 Subject: [PATCH 127/407] misc(recipes/gawk): move out of wip Works as expected. Signed-off-by: Anhad Singh --- recipes/{wip => }/dev/lang/gawk/recipe.toml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename recipes/{wip => }/dev/lang/gawk/recipe.toml (100%) diff --git a/recipes/wip/dev/lang/gawk/recipe.toml b/recipes/dev/lang/gawk/recipe.toml similarity index 100% rename from recipes/wip/dev/lang/gawk/recipe.toml rename to recipes/dev/lang/gawk/recipe.toml From 8727e6b25dea21c9ab89aa9f21f950e5c6b033d7 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Mon, 26 Jan 2026 22:50:46 -0300 Subject: [PATCH 128/407] Add and improve recipes --- recipes/wip/analysis/tmmpr/recipe.toml | 6 +++ recipes/wip/dev/other/putzen/recipe.toml | 6 +++ recipes/wip/games/other/rustorio/recipe.toml | 10 +++++ recipes/wip/sound/audacity/recipe.toml | 11 +++-- recipes/wip/sound/glicol/recipe.toml | 4 +- recipes/wip/sound/libpulse/recipe.toml | 6 ++- recipes/wip/sound/lmms/recipe.toml | 43 +++++++++++++++----- recipes/wip/sound/sonusmix/recipe.toml | 17 ++++++++ 8 files changed, 85 insertions(+), 18 deletions(-) create mode 100644 recipes/wip/analysis/tmmpr/recipe.toml create mode 100644 recipes/wip/dev/other/putzen/recipe.toml create mode 100644 recipes/wip/games/other/rustorio/recipe.toml create mode 100644 recipes/wip/sound/sonusmix/recipe.toml diff --git a/recipes/wip/analysis/tmmpr/recipe.toml b/recipes/wip/analysis/tmmpr/recipe.toml new file mode 100644 index 000000000..21974edfd --- /dev/null +++ b/recipes/wip/analysis/tmmpr/recipe.toml @@ -0,0 +1,6 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/tanciaku/tmmpr" +shallow_clone = true +[build] +template = "cargo" diff --git a/recipes/wip/dev/other/putzen/recipe.toml b/recipes/wip/dev/other/putzen/recipe.toml new file mode 100644 index 000000000..e372dd606 --- /dev/null +++ b/recipes/wip/dev/other/putzen/recipe.toml @@ -0,0 +1,6 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/sassman/putzen-rs" +shallow_clone = true +[build] +template = "cargo" diff --git a/recipes/wip/games/other/rustorio/recipe.toml b/recipes/wip/games/other/rustorio/recipe.toml new file mode 100644 index 000000000..e7207ed9d --- /dev/null +++ b/recipes/wip/games/other/rustorio/recipe.toml @@ -0,0 +1,10 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/albertsgarde/rustorio" +shallow_clone = true +[build] +template = "custom" +script = """ +DYNAMIC_INIT +cookbook_cargo_packages rustorio +""" diff --git a/recipes/wip/sound/audacity/recipe.toml b/recipes/wip/sound/audacity/recipe.toml index 22ed13cfa..9e5b6fa68 100644 --- a/recipes/wip/sound/audacity/recipe.toml +++ b/recipes/wip/sound/audacity/recipe.toml @@ -1,11 +1,10 @@ #TODO not compiled or tested +#TODO determine minimum dependencies from cmake log # build instructions: https://github.com/audacity/audacity/blob/master/BUILDING.md -# use the GTK2 or wxWidgets frontend? [source] -tar = "https://github.com/audacity/audacity/releases/download/Audacity-3.7.5/audacity-sources-3.7.5.tar.gz" +tar = "https://github.com/audacity/audacity/releases/download/Audacity-3.7.7/audacity-sources-3.7.7.tar.gz" [build] template = "cmake" -dependencies = [ - "gtk2", - "libuuid", -] +#dependencies = [ +# "libuuid", +#] diff --git a/recipes/wip/sound/glicol/recipe.toml b/recipes/wip/sound/glicol/recipe.toml index e034e74a2..b256b1895 100644 --- a/recipes/wip/sound/glicol/recipe.toml +++ b/recipes/wip/sound/glicol/recipe.toml @@ -1,10 +1,12 @@ #TODO failed to find output device [source] git = "https://github.com/glicol/glicol-cli" +shallow_clone = true [build] template = "custom" script = """ +DYNAMIC_INIT cookbook_cargo mkdir -pv "${COOKBOOK_STAGE}"/usr/share/glicol -cp -rv "${COOKBOOK_SOURCE}"/{test.glicol,test2.glicol} "${COOKBOOK_STAGE}"/usr/share/glicol +cp -rv "${COOKBOOK_SOURCE}"/*.glicol "${COOKBOOK_STAGE}"/usr/share/glicol """ diff --git a/recipes/wip/sound/libpulse/recipe.toml b/recipes/wip/sound/libpulse/recipe.toml index 40a962cd1..59048a407 100644 --- a/recipes/wip/sound/libpulse/recipe.toml +++ b/recipes/wip/sound/libpulse/recipe.toml @@ -5,7 +5,11 @@ tar = "https://freedesktop.org/software/pulseaudio/releases/pulseaudio-17.0.tar. [build] template = "meson" mesonflags = [ - "-Ddaemon=false" + "-Ddaemon=false", + "-Ddoxygen=disabled", + "-Dman=false", + "-Dtests=disabled", + "-Drunning-from-build-tree=false", ] dependencies = [ "libsndfile", diff --git a/recipes/wip/sound/lmms/recipe.toml b/recipes/wip/sound/lmms/recipe.toml index 7f3328818..5542c5e2a 100644 --- a/recipes/wip/sound/lmms/recipe.toml +++ b/recipes/wip/sound/lmms/recipe.toml @@ -1,17 +1,40 @@ #TODO not compiled or tested +#TODO determine minimum dependencies from cmake log # build instructions: https://github.com/LMMS/lmms/wiki/Compiling#build-environment [source] git = "https://github.com/LMMS/lmms" -rev = "807751dc4dce53583ecf4140b67a5dc343c789a7" +shallow_clone = true [build] template = "cmake" -dependencies = [ - "qt5-base", - "libsamplerate", - "libvorbis", - "libogg", - "sdl2", - "fftw", - "libstk", - "fltk", +cmakeflags = [ + "-DWANT_ALSA=OFF", + "-DWANT_OSS=OFF", + "-DWANT_CALF=OFF", + "-DWANT_CAPS=OFF", + "-DWANT_CARLA=OFF", + "-DWANT_CMT=OFF", + "-DWANT_JACK=OFF", + "-DWANT_LV2=OFF", + "-DWANT_SUIL=OFF", + "-DWANT_PULSEAUDIO=OFF", + "-DWANT_PORTAUDIO=OFF", + "-DWANT_SNDIO=OFF", + "-DWANT_SOUNDIO=OFF", + "-DWANT_SF2=OFF", + "-DWANT_GIG=OFF", + "-DWANT_SID=OFF", + "-DWANT_STK=OFF", + "-DWANT_SWH=OFF", + "-DWANT_TAP=OFF", + "-DWANT_VST=OFF", ] +#dependencies = [ +# "qt5-base", +# "libsamplerate", +# "libvorbis", +# "libogg", +# "sdl2", +# "fftw", +# "libstk", +# "fltk", +#] diff --git a/recipes/wip/sound/sonusmix/recipe.toml b/recipes/wip/sound/sonusmix/recipe.toml new file mode 100644 index 000000000..ae069220c --- /dev/null +++ b/recipes/wip/sound/sonusmix/recipe.toml @@ -0,0 +1,17 @@ +#TODO not compiled or tested +# build instructions: https://codeberg.org/sonusmix/sonusmix#building-from-source +[source] +git = "https://codeberg.org/sonusmix/sonusmix" +shallow_clone = true +[build] +template = "custom" +dependencies = [ + "gtk4", +] +script = """ +DYNAMIC_INIT +cookbook_cargo +mkdir -pv "${COOKBOOK_STAGE}/usr/share/{applications,icons}/" +cp -v "${COOKBOOK_SOURCE}/assets/org.sonusmix.Sonusmix.desktop" "${COOKBOOK_STAGE}/usr/share/applications/" +cp -v "${COOKBOOK_SOURCE}/assets/sonusmix.svg" "${COOKBOOK_STAGE}/usr/share/icons/" +""" From abbae7e405d8740a59209cd67b589fc03d9abc65 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 27 Jan 2026 12:00:11 +0700 Subject: [PATCH 129/407] Update cosmic apps branch to master --- recipes/tools/cosmic-edit/recipe.toml | 2 +- recipes/tools/cosmic-files/recipe.toml | 2 +- recipes/tools/cosmic-term/recipe.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/recipes/tools/cosmic-edit/recipe.toml b/recipes/tools/cosmic-edit/recipe.toml index 2b565edfd..bd7c4482f 100644 --- a/recipes/tools/cosmic-edit/recipe.toml +++ b/recipes/tools/cosmic-edit/recipe.toml @@ -1,6 +1,6 @@ [source] git = "https://github.com/pop-os/cosmic-edit.git" -branch = "epoch-update" +branch = "master" [build] template = "custom" diff --git a/recipes/tools/cosmic-files/recipe.toml b/recipes/tools/cosmic-files/recipe.toml index cc16cd02a..93295747e 100644 --- a/recipes/tools/cosmic-files/recipe.toml +++ b/recipes/tools/cosmic-files/recipe.toml @@ -1,6 +1,6 @@ [source] git = "https://github.com/pop-os/cosmic-files.git" -branch = "epoch-update" +branch = "master" [build] template = "custom" diff --git a/recipes/tools/cosmic-term/recipe.toml b/recipes/tools/cosmic-term/recipe.toml index 3aed27769..338b04fac 100644 --- a/recipes/tools/cosmic-term/recipe.toml +++ b/recipes/tools/cosmic-term/recipe.toml @@ -1,6 +1,6 @@ [source] git = "https://github.com/pop-os/cosmic-term.git" -branch = "epoch-update" +branch = "master" [build] template = "custom" From c64b32ba02e77a79688896d019f72710b6c4a387 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 27 Jan 2026 15:38:31 +0700 Subject: [PATCH 130/407] Port Firefox --- recipes/wip/net/other/nspr/recipe.toml | 24 ++++++- recipes/wip/web/firefox-esr/mozconfig | 25 ++++++- recipes/wip/web/firefox-esr/recipe.toml | 75 +++++++++++++++------ recipes/wip/web/firefox-esr/redox.patch | 86 +++++++++++++++++++++++++ 4 files changed, 188 insertions(+), 22 deletions(-) create mode 100644 recipes/wip/web/firefox-esr/redox.patch diff --git a/recipes/wip/net/other/nspr/recipe.toml b/recipes/wip/net/other/nspr/recipe.toml index 1d29eda4e..361c6c939 100644 --- a/recipes/wip/net/other/nspr/recipe.toml +++ b/recipes/wip/net/other/nspr/recipe.toml @@ -1,5 +1,25 @@ -#TODO missing script for building +# TODO: Using patched mozjs from servo, maybe move patcehs into to upstream patches? [source] -tar = "https://ftp.mozilla.org/pub/nspr/releases/v4.9.6/src/nspr-4.9.6.tar.gz" +# tar = "https://ftp.mozilla.org/pub/nspr/releases/v4.9.6/src/nspr-4.9.6.tar.gz" +git = "https://github.com/willnode/mozjs" +branch = "redox" +shallow_clone = true [build] template = "custom" +script = """ +export HOST_CC="cc" +export CC="$GNU_TARGET-gcc" +export CXX="$GNU_TARGET-g++" +export LDFLAGS="-shared" +export CFLAGS="-fPIC" +COOKBOOK_CONFIGURE_FLAGS+=( + --enable-optimize + --disable-debug + --enable-64bit + --with-pthreads + ac_cv_path_LD="$LD" +) +COOKBOOK_MAKE_JOBS=1 +COOKBOOK_CONFIGURE="$COOKBOOK_SOURCE/mozjs-sys/mozjs/nsprpub/configure" +cookbook_configure +""" diff --git a/recipes/wip/web/firefox-esr/mozconfig b/recipes/wip/web/firefox-esr/mozconfig index 8d2ce92d5..d5e1c48da 100644 --- a/recipes/wip/web/firefox-esr/mozconfig +++ b/recipes/wip/web/firefox-esr/mozconfig @@ -1,3 +1,24 @@ +mk_add_options MOZ_OBJDIR=COOKBOOK_BUILD +ac_add_options --target=TARGET +ac_add_options --disable-debug ac_add_options --disable-tests -ac_add_options --target="{TARGET}" -ac_add_options --enable-bootstrap +ac_add_options --disable-audio-backends +ac_add_options --disable-crashreporter +ac_add_options --disable-updater +ac_add_options --disable-dbus +ac_add_options --disable-gecko-profiler +ac_add_options --disable-profiling +ac_add_options --disable-dmd # dark matter detector +ac_add_options --without-wasm-sandboxed-libraries # need clang wasi + +# TODO: cairo-gtk3-x11-wayland or separate cairo-gtk3-wayland-only +ac_add_options --enable-default-toolkit=cairo-gtk3-x11-only +ac_add_options --enable-bootstrap=-clang # only use our clang +ac_add_options --enable-optimize +ac_add_options --with-system-nspr +ac_add_options --with-gl-provider=EGL + +export MOZ_REQUIRE_SIGNING= +export MOZ_TELEMETRY_REPORTING= +export CC="TARGET_CC" +export CXX="TARGET_CXX" diff --git a/recipes/wip/web/firefox-esr/recipe.toml b/recipes/wip/web/firefox-esr/recipe.toml index f27ac5e12..a9bb6c04b 100644 --- a/recipes/wip/web/firefox-esr/recipe.toml +++ b/recipes/wip/web/firefox-esr/recipe.toml @@ -1,31 +1,70 @@ -#TODO missing script for mach: https://firefox-source-docs.mozilla.org/setup/linux_build.html +#TODO wrong compilation on gecko-profiler (bindgen/clang-sys) +# mach: https://firefox-source-docs.mozilla.org/setup/linux_build.html # dependencies: https://packages.gentoo.org/packages/www-client/firefox/dependencies # feature flags: https://wiki.gentoo.org/wiki/Firefox#USE_flags [source] -tar = "https://ftp.mozilla.org/pub/firefox/releases/115.13.0esr/source/firefox-115.13.0esr.source.tar.xz" +tar = "https://ftp.mozilla.org/pub/firefox/releases/140.7.0esr/source/firefox-140.7.0esr.source.tar.xz" [build] template = "custom" dependencies = [ - "fontconfig", - "atk", - "cairo", + # "fontconfig", + # "atk", + # "cairo", "dbus", - "libffi", - "freetype2", - "gdk-pixbuf", - "glib", + # "libffi", + # "freetype2", + # "gdk-pixbuf", + # "glib", "gtk3", "pango", - "sqlite3", - "nss-nspr", - "startup-notification", - "zlib", - "ffmpeg6", - "expat", - "libepoxy", - "pipewire", + "libxkbcommon-x11", + "libice", + "mesa-x11", + "x11proto-kb", + "xcb-proto", + "xextproto", + "nspr", + "libxrandr", + "libsm", +# TODO: Should separate clang library and runtime + "llvm21.clang" + # "sqlite3", + # "nss-nspr", + # "startup-notification", + # "zlib", + # "ffmpeg6", + # "expat", + # "libepoxy", + # "pipewire", +] +dev-dependencies = [ + "host:llvm21", + "host:llvm21.dev", + "host:llvm21.runtime", + "host:llvm21.clang", ] script = """ DYNAMIC_INIT -export MOZCONFIG="${COOKBOOK_RECIPE}/mozconfig" + +cat ${COOKBOOK_RECIPE}/mozconfig > mozconfig +sed -i "s|COOKBOOK_BUILD|${COOKBOOK_BUILD}|g" mozconfig +sed -i "s|TARGET_CC|${CC}|g" mozconfig +sed -i "s|TARGET_CXX|${CXX}|g" mozconfig +sed -i "s|TARGET|${TARGET}|g" mozconfig +export MOZCONFIG="${COOKBOOK_BUILD}/mozconfig" +export PYTHONDONTWRITEBYTECODE=1 +if [[ -z "$CI" ]]; then export MACH_NO_TERMINAL_FOOTER=1; fi; + +# clang-sys specifics +PREFIX_INCLUDE="$COOKBOOK_HOST_SYSROOT/$TARGET/include" +export CLANGFLAGS="-I $PREFIX_INCLUDE/c++/13.2.0 -I $PREFIX_INCLUDE/c++/13.2.0/$TARGET -I $PREFIX_INCLUDE/c++/13.2.0/backward" +export CLANGFLAGS="$CLANGFLAGS -I $PREFIX_INCLUDE -I $COOKBOOK_SYSROOT/lib/clang/21/include -D__redox__" +export BINDGEN_EXTRA_CLANG_ARGS_x86_64_unknown_redox="-target x86_64-unknown-redox -nostdinc $CLANGFLAGS" +export LLVM_CONFIG_PATH="$COOKBOOK_TOOLCHAIN/bin/llvm-config" + +# Don't poison the stage1 compiler (host -> host) +unset AR AS CC CXX LD LDFLAGS NM OBJCOPY OBJDUMP RANLIB READELF RUSTFLAGS STRIP + +(cd ${COOKBOOK_SOURCE} && ./mach build) +rsync -a ./dist ${COOKBOOK_STAGE} """ diff --git a/recipes/wip/web/firefox-esr/redox.patch b/recipes/wip/web/firefox-esr/redox.patch new file mode 100644 index 000000000..a36b32c90 --- /dev/null +++ b/recipes/wip/web/firefox-esr/redox.patch @@ -0,0 +1,86 @@ +diff --color -ruwN source/build/moz.configure/init.configure source-new/build/moz.configure/init.configure +--- source/build/moz.configure/init.configure 2026-01-07 04:09:42.000000000 +0700 ++++ source-new/build/moz.configure/init.configure 2026-01-27 12:48:28.508789372 +0700 +@@ -511,6 +511,8 @@ + canonical_os = canonical_kernel = "NetBSD" + elif os.startswith("openbsd"): + canonical_os = canonical_kernel = "OpenBSD" ++ elif os.startswith("redox"): ++ canonical_os = canonical_kernel = "Redox" + elif os.startswith("solaris"): + canonical_os = canonical_kernel = "SunOS" + elif os.startswith("wasi") and allow_wasi: +@@ -934,6 +936,14 @@ + + set_define("XP_FREEBSD", target_is_freebsd) + ++@depends(target) ++def target_is_redox(target): ++ if target.kernel == "Redox": ++ return True ++ ++ ++set_define("XP_REDOX", target_is_redox) ++ + + @depends(target) + def target_is_solaris(target): +diff --color -ruwN source/mozglue/misc/PlatformMutex.h source-new/mozglue/misc/PlatformMutex.h +--- source/mozglue/misc/PlatformMutex.h 2026-01-07 04:09:50.000000000 +0700 ++++ source-new/mozglue/misc/PlatformMutex.h 2026-01-27 13:12:16.262181670 +0700 +@@ -48,7 +48,7 @@ + + PlatformData* platformData(); + +-#if !defined(XP_WIN) && !defined(__wasi__) ++#if !defined(XP_WIN) && !defined(__wasi__) && !defined(__redox__) + void* platformData_[sizeof(pthread_mutex_t) / sizeof(void*)]; + static_assert(sizeof(pthread_mutex_t) / sizeof(void*) != 0 && + sizeof(pthread_mutex_t) % sizeof(void*) == 0, +diff --color -ruwN source/python/mozbuild/mozbuild/configure/constants.py source-new/python/mozbuild/mozbuild/configure/constants.py +--- source/python/mozbuild/mozbuild/configure/constants.py 2026-01-07 04:09:50.000000000 +0700 ++++ source-new/python/mozbuild/mozbuild/configure/constants.py 2026-01-27 09:16:48.349211711 +0700 +@@ -40,6 +40,7 @@ + "NetBSD", + "OpenBSD", + "OSX", ++ "Redox", + "SunOS", + "WINNT", + "WASI", +@@ -55,6 +56,7 @@ + "Linux", + "NetBSD", + "OpenBSD", ++ "Redox", + "SunOS", + "WINNT", + "WASI", +@@ -146,6 +148,7 @@ + "Linux": "__linux__", + "NetBSD": "__NetBSD__", + "OpenBSD": "__OpenBSD__", ++ "Redox": "__redox__", + "SunOS": "__sun__", + "WINNT": "_WIN32 || __CYGWIN__", + "WASI": "__wasi__", +diff --color -ruwN source/xpcom/build/BinaryPath.h source-new/xpcom/build/BinaryPath.h +--- source/xpcom/build/BinaryPath.h 2026-01-07 04:09:59.000000000 +0700 ++++ source-new/xpcom/build/BinaryPath.h 2026-01-27 12:51:20.922621049 +0700 +@@ -133,11 +133,15 @@ + return rv; + } + +-#elif defined(ANDROID) ++#elif defined(ANDROID) || defined(XP_REDOX) + static nsresult Get(char aResult[MAXPATHLEN]) { + // On Android, we use the MOZ_ANDROID_LIBDIR variable that is set by the + // Java bootstrap code. ++#if defined(XP_REDOX) ++ const char* libDir = getenv("MOZ_REDOX_LIBDIR"); ++#else + const char* libDir = getenv("MOZ_ANDROID_LIBDIR"); ++#endif + if (!libDir) { + return NS_ERROR_FAILURE; + } From 16dc488a03f670d31f1f71219236455165ccdf11 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Tue, 27 Jan 2026 12:55:13 +0100 Subject: [PATCH 131/407] Add kill to uutils. --- recipes/core/uutils/recipe.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/recipes/core/uutils/recipe.toml b/recipes/core/uutils/recipe.toml index ef01db80f..3080a4cca 100644 --- a/recipes/core/uutils/recipe.toml +++ b/recipes/core/uutils/recipe.toml @@ -12,7 +12,8 @@ patches = [ template = "custom" script = """ DYNAMIC_INIT -CARGO_PROFILE_RELEASE_LTO=thin cookbook_cargo --no-default-features --features feat_os_unix_redox --bin coreutils +# TODO: upstream changes, consider using feat_require_unix_core if relibc is ready? +CARGO_PROFILE_RELEASE_LTO=thin cookbook_cargo --no-default-features --features feat_os_unix_redox,kill --bin coreutils BINS=( '[' @@ -48,6 +49,7 @@ BINS=( head join install + kill link ln ls From 995e240d6b9af1cb9bc3e9c4a7b260c8d8764503 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 27 Jan 2026 19:55:54 +0700 Subject: [PATCH 132/407] More patches for rust in firefox --- recipes/wip/web/firefox-esr/recipe.toml | 3 +- recipes/wip/web/firefox-esr/redox.patch | 209 ++++++++++++++++++++++++ 2 files changed, 211 insertions(+), 1 deletion(-) diff --git a/recipes/wip/web/firefox-esr/recipe.toml b/recipes/wip/web/firefox-esr/recipe.toml index a9bb6c04b..84e98394f 100644 --- a/recipes/wip/web/firefox-esr/recipe.toml +++ b/recipes/wip/web/firefox-esr/recipe.toml @@ -1,4 +1,4 @@ -#TODO wrong compilation on gecko-profiler (bindgen/clang-sys) +#TODO patches for quinn-udp crate, switch into git fork # mach: https://firefox-source-docs.mozilla.org/setup/linux_build.html # dependencies: https://packages.gentoo.org/packages/www-client/firefox/dependencies # feature flags: https://wiki.gentoo.org/wiki/Firefox#USE_flags @@ -53,6 +53,7 @@ sed -i "s|TARGET_CXX|${CXX}|g" mozconfig sed -i "s|TARGET|${TARGET}|g" mozconfig export MOZCONFIG="${COOKBOOK_BUILD}/mozconfig" export PYTHONDONTWRITEBYTECODE=1 +unset CC_WRAPPER if [[ -z "$CI" ]]; then export MACH_NO_TERMINAL_FOOTER=1; fi; # clang-sys specifics diff --git a/recipes/wip/web/firefox-esr/redox.patch b/recipes/wip/web/firefox-esr/redox.patch index a36b32c90..d71240c3f 100644 --- a/recipes/wip/web/firefox-esr/redox.patch +++ b/recipes/wip/web/firefox-esr/redox.patch @@ -84,3 +84,212 @@ diff --color -ruwN source/xpcom/build/BinaryPath.h source-new/xpcom/build/Binary if (!libDir) { return NS_ERROR_FAILURE; } +diff --color -ruwN source/Cargo.lock source-new/Cargo.lock +--- source/Cargo.lock 2026-01-07 04:09:41.000000000 +0700 ++++ source-new/Cargo.lock 2026-01-27 19:15:51.024103229 +0700 +@@ -3724,6 +3724,16 @@ + checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" + + [[package]] ++name = "libredox" ++version = "0.1.12" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" ++dependencies = [ ++ "bitflags 2.9.0", ++ "libc", ++] ++ ++[[package]] + name = "libsqlite3-sys" + version = "0.31.0" + source = "registry+https://github.com/rust-lang/crates.io-index" +@@ -5586,11 +5596,23 @@ + + [[package]] + name = "redox_syscall" +-version = "0.5.999" ++version = "0.5.18" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" ++dependencies = [ ++ "bitflags 2.9.0", ++] + + [[package]] + name = "redox_users" +-version = "0.4.999" ++version = "0.4.6" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" ++dependencies = [ ++ "getrandom 0.2.999", ++ "libredox", ++ "thiserror 1.999.999", ++] + + [[package]] + name = "regex" +diff --color -ruwN source/Cargo.toml source-new/Cargo.toml +--- source/Cargo.toml 2026-01-07 04:09:40.000000000 +0700 ++++ source-new/Cargo.toml 2026-01-27 19:14:06.467281854 +0700 +@@ -134,12 +134,6 @@ + # Patch r-efi to an empty crate + r-efi = { path = "build/rust/r-efi" } + +-# Patch redox_users to an empty crate +-redox_users = { path = "build/rust/redox_users" } +- +-# Patch redox_syscall to an empty crate +-redox_syscall = { path = "build/rust/redox_syscall" } +- + # Patch hermit-abi to an empty crate + hermit-abi = { path = "build/rust/hermit-abi" } + +diff --color -ruwN source/ipc/chromium/src/base/platform_thread.h source-new/ipc/chromium/src/base/platform_thread.h +--- source/ipc/chromium/src/base/platform_thread.h 2026-01-07 04:09:45.000000000 +0700 ++++ source-new/ipc/chromium/src/base/platform_thread.h 2026-01-27 18:12:57.887138642 +0700 +@@ -24,7 +24,7 @@ + #else + # include + typedef pthread_t PlatformThreadHandle; +-# if defined(XP_LINUX) || defined(XP_OPENBSD) || defined(XP_SOLARIS) || \ ++# if defined(XP_LINUX) || defined(XP_OPENBSD) || defined(XP_REDOX) || defined(XP_SOLARIS) || \ + defined(__GLIBC__) + # include + typedef pid_t PlatformThreadId; +diff --color -ruwN source/mozglue/misc/TimeStamp_posix.cpp source-new/mozglue/misc/TimeStamp_posix.cpp +--- source/mozglue/misc/TimeStamp_posix.cpp 2026-01-07 04:09:50.000000000 +0700 ++++ source-new/mozglue/misc/TimeStamp_posix.cpp 2026-01-27 17:59:05.200260121 +0700 +@@ -13,7 +13,10 @@ + // obtained with this API; see TimeDuration::Resolution; + // + ++ ++#if !defined(__redox__) + #include ++#endif + #include + #include + #include +diff --color -ruwN source/supply-chain/audits.toml source-new/supply-chain/audits.toml +--- source/supply-chain/audits.toml 2026-01-07 04:09:51.000000000 +0700 ++++ source-new/supply-chain/audits.toml 2026-01-27 19:29:15.927403772 +0700 +@@ -3235,6 +3235,11 @@ + version = "0.2.6" + notes = "This crate uses unsafe block, but this doesn't have network and file access. I audited code." + ++[[audits.libredox]] ++who = "Wildan M " ++criteria = "safe-to-deploy" ++version = "0.1.12" ++ + [[audits.libsqlite3-sys]] + who = "Ben Dean-Kawamura " + criteria = "safe-to-deploy" +@@ -4560,10 +4565,20 @@ + delta = "1.10.1 -> 1.10.2" + + [[audits.redox_syscall]] ++who = "Wildan M " ++criteria = "safe-to-deploy" ++version = "0.5.18" ++ ++[[audits.redox_syscall]] + who = "Mike Hommey " + criteria = "safe-to-deploy" + delta = "0.2.13 -> 0.2.16" + ++[[audits.redox_users]] ++who = "Wildan M " ++criteria = "safe-to-deploy" ++version = "0.4.6" ++ + [[audits.regex]] + who = "Mike Hommey " + criteria = "safe-to-deploy" +@@ -4676,7 +4691,7 @@ + the `regex` developers in the same repository. + + This crate is explicitly designed for FFI use, and should not be used directly +-by Rust code. The exported `extern \"C\"` functions are not marked as `unsafe`, ++by Rust code. The exported `extern "C"` functions are not marked as `unsafe`, + meaning that it is technically incorrect to use them from within Rust code, + however they are reasonable to use from C code. + +@@ -6463,7 +6478,7 @@ + who = "Makoto Kato " + criteria = "safe-to-deploy" + version = "0.1.2" +-notes = "This crate is zero-copy version of \"From\". This has no unsafe code and uses no ambient capabilities." ++notes = 'This crate is zero-copy version of "From". This has no unsafe code and uses no ambient capabilities.' + + [[audits.zerofrom]] + who = "Makoto Kato " +diff --color -ruwN source/supply-chain/imports.lock source-new/supply-chain/imports.lock +--- source/supply-chain/imports.lock 2026-01-07 04:09:52.000000000 +0700 ++++ source-new/supply-chain/imports.lock 2026-01-27 19:29:15.929403788 +0700 +@@ -1592,7 +1592,7 @@ + criteria = "safe-to-deploy" + version = "1.6.0" + notes = """ +-Grepped for \"unsafe\", \"crypt\", \"cipher\", \"fs\", \"net\" - there were no ++Grepped for "unsafe", "crypt", "cipher", "fs", "net" - there were no + hits except for 8 occurrences of `unsafe`. Additional `unsafe` review comments + can be found in https://crrev.com/c/5445719. + """ +@@ -1902,7 +1902,7 @@ + * Using `unsafe` in a string: + + ``` +- src/constfn.rs: \"unsafe\" => Qualifiers::Unsafe, ++ src/constfn.rs: "unsafe" => Qualifiers::Unsafe, + ``` + + * Using `std::fs` in `build/build.rs` to write `${OUT_DIR}/version.expr` +@@ -2104,6 +2104,7 @@ + user-id = 213776 # divviup-github-automation + start = "2020-09-28" + end = "2026-01-07" ++renew = false + + [[audits.isrg.audits.base64]] + who = "Tim Geoghegan " +diff --color -ruwN source/build/rust/redox_syscall/Cargo.toml source-new/build/rust/redox_syscall/Cargo.toml +--- source/build/rust/redox_syscall/Cargo.toml 2026-01-07 04:09:41.000000000 +0700 ++++ source-new/build/rust/redox_syscall/Cargo.toml 1970-01-01 07:00:00.000000000 +0700 +@@ -1,8 +0,0 @@ +-[package] +-name = "redox_syscall" +-version = "0.5.999" +-edition = "2018" +-license = "MPL-2.0" +- +-[lib] +-path = "lib.rs" +diff --color -ruwN source/build/rust/redox_syscall/lib.rs source-new/build/rust/redox_syscall/lib.rs +--- source/build/rust/redox_syscall/lib.rs 2026-01-07 04:09:41.000000000 +0700 ++++ source-new/build/rust/redox_syscall/lib.rs 1970-01-01 07:00:00.000000000 +0700 +@@ -1,3 +0,0 @@ +-/* This Source Code Form is subject to the terms of the Mozilla Public +- * License, v. 2.0. If a copy of the MPL was not distributed with this +- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +diff --color -ruwN source/build/rust/redox_users/Cargo.toml source-new/build/rust/redox_users/Cargo.toml +--- source/build/rust/redox_users/Cargo.toml 2026-01-07 04:09:41.000000000 +0700 ++++ source-new/build/rust/redox_users/Cargo.toml 1970-01-01 07:00:00.000000000 +0700 +@@ -1,8 +0,0 @@ +-[package] +-name = "redox_users" +-version = "0.4.999" +-edition = "2018" +-license = "MPL-2.0" +- +-[lib] +-path = "lib.rs" +diff --color -ruwN source/build/rust/redox_users/lib.rs source-new/build/rust/redox_users/lib.rs +--- source/build/rust/redox_users/lib.rs 2026-01-07 04:09:41.000000000 +0700 ++++ source-new/build/rust/redox_users/lib.rs 1970-01-01 07:00:00.000000000 +0700 +@@ -1,3 +0,0 @@ +-/* This Source Code Form is subject to the terms of the Mozilla Public +- * License, v. 2.0. If a copy of the MPL was not distributed with this +- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ From 7835e93c4327e26219bff72540e8ce1bc7b95b5e Mon Sep 17 00:00:00 2001 From: auronandace Date: Tue, 27 Jan 2026 14:56:17 +0000 Subject: [PATCH 133/407] add make json to os-test-bins --- recipes/tests/os-test-bins/recipe.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml index a44692acf..9bbdb5ff6 100644 --- a/recipes/tests/os-test-bins/recipe.toml +++ b/recipes/tests/os-test-bins/recipe.toml @@ -59,6 +59,7 @@ find out -type f -exec touch '{}' ';' make test make html +make json EOF chmod +x "${COOKBOOK_STAGE}/usr/bin/os-test-runner" """ From 3be4beaabb2fb0cd3c549d3dd469150dfb2f7e07 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 29 Jan 2026 05:25:12 +0700 Subject: [PATCH 134/407] Move all ui dir --- recipes/demos/pixelcannon/recipe.toml | 4 ++-- recipes/emulators/dosbox/recipe.toml | 8 ++++---- recipes/games/classicube/recipe.toml | 8 ++++---- recipes/games/eduke32/recipe.toml | 8 ++++---- recipes/games/freedoom/recipe.toml | 12 ++++++------ recipes/games/gigalomania/recipe.toml | 8 ++++---- recipes/games/neverball/recipe.toml | 6 +++--- recipes/games/openjazz/recipe.toml | 2 +- recipes/games/sm64ex/recipe.toml | 8 ++++---- recipes/gui/installer-gui/recipe.toml | 4 ++-- recipes/gui/orbterm/recipe.toml | 4 ++-- recipes/gui/orbutils/recipe.toml | 4 ++-- recipes/libs/ffmpeg6/recipe.toml | 4 ++-- recipes/tools/cosmic-edit/recipe.toml | 4 ++-- recipes/tools/cosmic-files/recipe.toml | 4 ++-- recipes/tools/cosmic-reader/recipe.toml | 4 ++-- recipes/tools/cosmic-term/recipe.toml | 4 ++-- recipes/tools/periodictable/recipe.toml | 8 ++++---- recipes/tools/sodium/recipe.toml | 8 ++++---- .../games/data/openjazz-shareware-data/recipe.toml | 2 +- recipes/wip/players/cosmic-player/recipe.toml | 4 ++-- 21 files changed, 59 insertions(+), 59 deletions(-) diff --git a/recipes/demos/pixelcannon/recipe.toml b/recipes/demos/pixelcannon/recipe.toml index 709e3d977..be0f75b8d 100644 --- a/recipes/demos/pixelcannon/recipe.toml +++ b/recipes/demos/pixelcannon/recipe.toml @@ -9,8 +9,8 @@ cookbook_cargo mkdir -pv "${COOKBOOK_STAGE}/apps/pixelcannon" cp -Rv "${COOKBOOK_SOURCE}/assets" "${COOKBOOK_STAGE}/apps/pixelcannon" -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_SOURCE}/manifest" "${COOKBOOK_STAGE}/ui/apps/pixelcannon" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_SOURCE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/pixelcannon" """ [package] diff --git a/recipes/emulators/dosbox/recipe.toml b/recipes/emulators/dosbox/recipe.toml index 61e31fc94..02801a6fd 100644 --- a/recipes/emulators/dosbox/recipe.toml +++ b/recipes/emulators/dosbox/recipe.toml @@ -25,9 +25,9 @@ COOKBOOK_CONFIGURE_FLAGS+=( ) cookbook_configure -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/dosbox" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/dosbox" -mkdir -pv "${COOKBOOK_STAGE}/ui/icons/apps" -cp -v "${COOKBOOK_RECIPE}/icon.png" "${COOKBOOK_STAGE}/ui/icons/apps/dosbox.png" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons/apps" +cp -v "${COOKBOOK_RECIPE}/icon.png" "${COOKBOOK_STAGE}/usr/share/icons/apps/dosbox.png" """ diff --git a/recipes/games/classicube/recipe.toml b/recipes/games/classicube/recipe.toml index 083f334be..f2153f12f 100644 --- a/recipes/games/classicube/recipe.toml +++ b/recipes/games/classicube/recipe.toml @@ -17,9 +17,9 @@ rsync -av --delete "${COOKBOOK_SOURCE}/" ./ mkdir -pv "${COOKBOOK_STAGE}/usr/games/classicube" cp -v "src/ClassiCube" "${COOKBOOK_STAGE}/usr/games/classicube" -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/classicube" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/classicube" -mkdir -pv "${COOKBOOK_STAGE}/ui/icons/apps" -cp -v "${COOKBOOK_SOURCE}/misc/CCicon.png" "${COOKBOOK_STAGE}/ui/icons/apps/classicube.png" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons/apps" +cp -v "${COOKBOOK_SOURCE}/misc/CCicon.png" "${COOKBOOK_STAGE}/usr/share/icons/apps/classicube.png" """ diff --git a/recipes/games/eduke32/recipe.toml b/recipes/games/eduke32/recipe.toml index 9f2562990..0905b62cb 100644 --- a/recipes/games/eduke32/recipe.toml +++ b/recipes/games/eduke32/recipe.toml @@ -28,9 +28,9 @@ mkdir -pv "${COOKBOOK_STAGE}/usr/games" cp -v ./eduke32 "${COOKBOOK_STAGE}/usr/games/eduke32" cp -v ./mapster32 "${COOKBOOK_STAGE}/usr/games/mapster32" -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/eduke32" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/eduke32" -mkdir -pv "${COOKBOOK_STAGE}/ui/icons/apps" -cp -v "${COOKBOOK_RECIPE}/icon.png" "${COOKBOOK_STAGE}/ui/icons/apps/eduke32.png" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons/apps" +cp -v "${COOKBOOK_RECIPE}/icon.png" "${COOKBOOK_STAGE}/usr/share/icons/apps/eduke32.png" """ diff --git a/recipes/games/freedoom/recipe.toml b/recipes/games/freedoom/recipe.toml index fdba3bed0..af59f6f67 100644 --- a/recipes/games/freedoom/recipe.toml +++ b/recipes/games/freedoom/recipe.toml @@ -4,7 +4,7 @@ git = "https://gitlab.redox-os.org/redox-os/freedoom.git" [build] template = "custom" script = """ -mkdir -pv "${COOKBOOK_STAGE}/usr/games" "${COOKBOOK_STAGE}/share/games/doom" "${COOKBOOK_STAGE}/ui/apps" "${COOKBOOK_STAGE}/ui/icons/apps" +mkdir -pv "${COOKBOOK_STAGE}/usr/games" "${COOKBOOK_STAGE}/share/games/doom" "${COOKBOOK_STAGE}/usr/share/ui/apps" "${COOKBOOK_STAGE}/usr/share/icons/apps" for file in "${COOKBOOK_SOURCE}/"*.wad do game="$(basename "$file" .wad)" @@ -17,12 +17,12 @@ do echo "/usr/games/prboom -geom 800x600 -vidmode 32 -iwad $wad" >> "${COOKBOOK_STAGE}$bin" chmod +x "${COOKBOOK_STAGE}$bin" - echo "name=$game" | sed 's/freedoom/FreeDOOM: Phase /' | sed 's/doom1/DOOM (Shareware)/' > "${COOKBOOK_STAGE}/ui/apps/$game" - echo "category=Games" >> "${COOKBOOK_STAGE}/ui/apps/$game" - echo "binary=/usr/games/$game" >> "${COOKBOOK_STAGE}/ui/apps/$game" - echo "icon=/ui/icons/apps/$game.png" >> "${COOKBOOK_STAGE}/ui/apps/$game" + echo "name=$game" | sed 's/freedoom/FreeDOOM: Phase /' | sed 's/doom1/DOOM (Shareware)/' > "${COOKBOOK_STAGE}/usr/share/ui/apps/$game" + echo "category=Games" >> "${COOKBOOK_STAGE}/usr/share/ui/apps/$game" + echo "binary=/usr/games/$game" >> "${COOKBOOK_STAGE}/usr/share/ui/apps/$game" + echo "icon=/ui/icons/apps/$game.png" >> "${COOKBOOK_STAGE}/usr/share/ui/apps/$game" - cp -v "${COOKBOOK_SOURCE}/$game.png" "${COOKBOOK_STAGE}/ui/icons/apps/$game.png" + cp -v "${COOKBOOK_SOURCE}/$game.png" "${COOKBOOK_STAGE}/usr/share/icons/apps/$game.png" done """ diff --git a/recipes/games/gigalomania/recipe.toml b/recipes/games/gigalomania/recipe.toml index 95f26d361..591d7a4ab 100644 --- a/recipes/games/gigalomania/recipe.toml +++ b/recipes/games/gigalomania/recipe.toml @@ -28,9 +28,9 @@ export CPPHOST="${TARGET}-g++" rm -rf "${COOKBOOK_STAGE}/bundle" -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/gigalomania" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/gigalomania" -mkdir -pv "${COOKBOOK_STAGE}/ui/icons/apps" -cp -v "gigalomania64.png" "${COOKBOOK_STAGE}/ui/icons/apps/gigalomania.png" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons/apps" +cp -v "gigalomania64.png" "${COOKBOOK_STAGE}/usr/share/icons/apps/gigalomania.png" """ \ No newline at end of file diff --git a/recipes/games/neverball/recipe.toml b/recipes/games/neverball/recipe.toml index 7a525e40a..bf6da23ea 100644 --- a/recipes/games/neverball/recipe.toml +++ b/recipes/games/neverball/recipe.toml @@ -34,7 +34,7 @@ env -i \ "${COOKBOOK_MAKE}" -j"${COOKBOOK_MAKE_JOBS}" ENABLE_FS=stdio ENABLE_NLS=0 neverball neverputt # Create install directories -mkdir -pv "${COOKBOOK_STAGE}/usr/games/neverball" "${COOKBOOK_STAGE}/ui/apps" "${COOKBOOK_STAGE}/ui/icons/apps" +mkdir -pv "${COOKBOOK_STAGE}/usr/games/neverball" "${COOKBOOK_STAGE}/usr/share/ui/apps" "${COOKBOOK_STAGE}/usr/share/icons/apps" # Copy assets cp -rv data "${COOKBOOK_STAGE}/usr/games/neverball" @@ -46,9 +46,9 @@ do "${STRIP}" -v "${bin}" -o "${COOKBOOK_STAGE}/usr/games/neverball/${bin}" # Install manifest - cp -v "${COOKBOOK_RECIPE}/manifest-${bin}" "${COOKBOOK_STAGE}/ui/apps/${bin}" + cp -v "${COOKBOOK_RECIPE}/manifest-${bin}" "${COOKBOOK_STAGE}/usr/share/ui/apps/${bin}" # Install icon - cp -v "dist/${bin}_64.png" "${COOKBOOK_STAGE}/ui/icons/apps/${bin}.png" + cp -v "dist/${bin}_64.png" "${COOKBOOK_STAGE}/usr/share/icons/apps/${bin}.png" done """ diff --git a/recipes/games/openjazz/recipe.toml b/recipes/games/openjazz/recipe.toml index 676b85c69..85d2b4950 100644 --- a/recipes/games/openjazz/recipe.toml +++ b/recipes/games/openjazz/recipe.toml @@ -33,7 +33,7 @@ cookbook_configure ASSETS_DIR="${COOKBOOK_STAGE}${DATAPATH}" INSTALL_DIR="${COOKBOOK_STAGE}/usr/games" -ICON_DIR="${COOKBOOK_STAGE}/ui/icons/apps" +ICON_DIR="${COOKBOOK_STAGE}/usr/share/icons/apps" MAN_ROOT="${COOKBOOK_STAGE}/usr/share/man" mkdir -p "${ASSETS_DIR}" "${INSTALL_DIR}" "${ICON_DIR}" "${MAN_ROOT}" diff --git a/recipes/games/sm64ex/recipe.toml b/recipes/games/sm64ex/recipe.toml index 10992c486..56147a71a 100644 --- a/recipes/games/sm64ex/recipe.toml +++ b/recipes/games/sm64ex/recipe.toml @@ -28,9 +28,9 @@ export CROSS="${TARGET}-" mkdir -p "${COOKBOOK_STAGE}/bin" cp -v build/us_pc/sm64.us.f3dex2e "${COOKBOOK_STAGE}/bin/sm64" -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/sm64ex" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/sm64ex" -mkdir -pv "${COOKBOOK_STAGE}/ui/icons/apps" -wget -O "${COOKBOOK_STAGE}/ui/icons/apps/sm64ex.png" https://evilgames.eu/texture-packs/thumb/sm64-reloaded.png +mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons/apps" +wget -O "${COOKBOOK_STAGE}/usr/share/icons/apps/sm64ex.png" https://evilgames.eu/texture-packs/thumb/sm64-reloaded.png """ diff --git a/recipes/gui/installer-gui/recipe.toml b/recipes/gui/installer-gui/recipe.toml index 4f95b53d6..a825566d8 100644 --- a/recipes/gui/installer-gui/recipe.toml +++ b/recipes/gui/installer-gui/recipe.toml @@ -7,6 +7,6 @@ script = """ DYNAMIC_INIT cookbook_cargo -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/redox-installer-gui" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/redox-installer-gui" """ diff --git a/recipes/gui/orbterm/recipe.toml b/recipes/gui/orbterm/recipe.toml index e67f2a1c6..8fad2c424 100644 --- a/recipes/gui/orbterm/recipe.toml +++ b/recipes/gui/orbterm/recipe.toml @@ -5,8 +5,8 @@ git = "https://gitlab.redox-os.org/redox-os/orbterm.git" template = "custom" script = """ DYNAMIC_INIT -mkdir -pv "${COOKBOOK_STAGE}/ui" -cp -rv "${COOKBOOK_SOURCE}/apps" "${COOKBOOK_STAGE}/ui/apps" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui" +cp -rv "${COOKBOOK_SOURCE}/apps" "${COOKBOOK_STAGE}/usr/share/ui/apps" "${COOKBOOK_CARGO}" install \ --path "${COOKBOOK_SOURCE}" \ diff --git a/recipes/gui/orbutils/recipe.toml b/recipes/gui/orbutils/recipe.toml index bc506edfe..d9d8062d1 100644 --- a/recipes/gui/orbutils/recipe.toml +++ b/recipes/gui/orbutils/recipe.toml @@ -5,8 +5,8 @@ git = "https://gitlab.redox-os.org/redox-os/orbutils.git" template = "custom" script = """ DYNAMIC_INIT -mkdir -pv "${COOKBOOK_STAGE}/ui" -cp -rv "${COOKBOOK_SOURCE}/apps" "${COOKBOOK_STAGE}/ui/apps" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui" +cp -rv "${COOKBOOK_SOURCE}/apps" "${COOKBOOK_STAGE}/usr/share/ui/apps" for project in orbutils calculator launcher do diff --git a/recipes/libs/ffmpeg6/recipe.toml b/recipes/libs/ffmpeg6/recipe.toml index 8f15ca3a4..09f828343 100644 --- a/recipes/libs/ffmpeg6/recipe.toml +++ b/recipes/libs/ffmpeg6/recipe.toml @@ -35,6 +35,6 @@ COOKBOOK_CONFIGURE_FLAGS=( --enable-decoder=png ) cookbook_configure -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/ffplay" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/ffplay" """ diff --git a/recipes/tools/cosmic-edit/recipe.toml b/recipes/tools/cosmic-edit/recipe.toml index bd7c4482f..e8885eebc 100644 --- a/recipes/tools/cosmic-edit/recipe.toml +++ b/recipes/tools/cosmic-edit/recipe.toml @@ -6,8 +6,8 @@ branch = "master" template = "custom" script = """ cookbook_cargo --no-default-features -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/30_cosmic-edit" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/30_cosmic-edit" #TODO: install with just? APPID="com.system76.CosmicEdit" mkdir -pv "${COOKBOOK_STAGE}/usr/share/applications/" diff --git a/recipes/tools/cosmic-files/recipe.toml b/recipes/tools/cosmic-files/recipe.toml index 93295747e..6ecb0649a 100644 --- a/recipes/tools/cosmic-files/recipe.toml +++ b/recipes/tools/cosmic-files/recipe.toml @@ -23,8 +23,8 @@ export GETTEXT_DIR="${COOKBOOK_SYSROOT}" -C link-arg="-liconv" mkdir -pv "${COOKBOOK_STAGE}/usr/bin/" cp -v "target/${TARGET}/release/cosmic-files" "${COOKBOOK_STAGE}/usr/bin/" -mkdir -pv "${COOKBOOK_STAGE}/ui/apps/" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/20_cosmic-files" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps/" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/20_cosmic-files" #TODO: install with just? APPID="com.system76.CosmicFiles" mkdir -pv "${COOKBOOK_STAGE}/usr/share/applications/" diff --git a/recipes/tools/cosmic-reader/recipe.toml b/recipes/tools/cosmic-reader/recipe.toml index 01619a800..34e39227e 100644 --- a/recipes/tools/cosmic-reader/recipe.toml +++ b/recipes/tools/cosmic-reader/recipe.toml @@ -24,8 +24,8 @@ export BINDGEN_EXTRA_CLANG_ARGS="--sysroot=${COOKBOOK_HOST_SYSROOT}/${GNU_TARGET -C link-args="-lpng -lexpat" mkdir -pv "${COOKBOOK_STAGE}/usr/bin/" cp -v "target/${TARGET}/release/cosmic-reader" "${COOKBOOK_STAGE}/usr/bin/" -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/40_cosmic-reader" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/40_cosmic-reader" #TODO: install with just? APPID="com.system76.CosmicReader" mkdir -pv "${COOKBOOK_STAGE}/usr/share/applications/" diff --git a/recipes/tools/cosmic-term/recipe.toml b/recipes/tools/cosmic-term/recipe.toml index 338b04fac..692963974 100644 --- a/recipes/tools/cosmic-term/recipe.toml +++ b/recipes/tools/cosmic-term/recipe.toml @@ -7,8 +7,8 @@ template = "custom" script = """ DYNAMIC_INIT cookbook_cargo --no-default-features -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/10_cosmic-term" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/10_cosmic-term" #TODO: install with just? APPID="com.system76.CosmicTerm" mkdir -pv "${COOKBOOK_STAGE}/usr/share/applications/" diff --git a/recipes/tools/periodictable/recipe.toml b/recipes/tools/periodictable/recipe.toml index 109b3d42c..89183b0b2 100644 --- a/recipes/tools/periodictable/recipe.toml +++ b/recipes/tools/periodictable/recipe.toml @@ -6,10 +6,10 @@ template = "custom" script = """ DYNAMIC_INIT cookbook_cargo -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v "${COOKBOOK_SOURCE}/pkg/manifest" "${COOKBOOK_STAGE}/ui/apps/periodictable" -mkdir -pv "${COOKBOOK_STAGE}/ui/icons" -cp -v "${COOKBOOK_SOURCE}/pkg/icon.png" "${COOKBOOK_STAGE}/ui/icons/periodictable.png" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v "${COOKBOOK_SOURCE}/pkg/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/periodictable" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons" +cp -v "${COOKBOOK_SOURCE}/pkg/icon.png" "${COOKBOOK_STAGE}/usr/share/icons/periodictable.png" """ [package] diff --git a/recipes/tools/sodium/recipe.toml b/recipes/tools/sodium/recipe.toml index 66fe407fb..f4282493e 100644 --- a/recipes/tools/sodium/recipe.toml +++ b/recipes/tools/sodium/recipe.toml @@ -12,8 +12,8 @@ DYNAMIC_INIT --no-track \ --features orbital -mkdir -pv "${COOKBOOK_STAGE}/ui/apps" -cp -v ${COOKBOOK_SOURCE}/manifest "${COOKBOOK_STAGE}/ui/apps/sodium" -mkdir -pv "${COOKBOOK_STAGE}/ui/icons" -cp -v ${COOKBOOK_SOURCE}/icon.png "${COOKBOOK_STAGE}/ui/icons/sodium.png" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps" +cp -v ${COOKBOOK_SOURCE}/manifest "${COOKBOOK_STAGE}/usr/share/ui/apps/sodium" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons" +cp -v ${COOKBOOK_SOURCE}/icon.png "${COOKBOOK_STAGE}/usr/share/icons/sodium.png" """ diff --git a/recipes/wip/games/data/openjazz-shareware-data/recipe.toml b/recipes/wip/games/data/openjazz-shareware-data/recipe.toml index 3fca5d816..3e7fe3fd8 100644 --- a/recipes/wip/games/data/openjazz-shareware-data/recipe.toml +++ b/recipes/wip/games/data/openjazz-shareware-data/recipe.toml @@ -4,7 +4,7 @@ template = "custom" script = """ ASSETS_DIR="${COOKBOOK_STAGE}/usr/share/games/openjazz/" -APP_DIR="${COOKBOOK_STAGE}/ui/apps" +APP_DIR="${COOKBOOK_STAGE}/usr/share/ui/apps" curl -vJL https://archive.org/download/jazz-jackrabbit/Jazz%20Jackrabbit.rar -o jazzdemo.rar sha256sum -c "${COOKBOOK_RECIPE}/jazzdemo.rar.sha" diff --git a/recipes/wip/players/cosmic-player/recipe.toml b/recipes/wip/players/cosmic-player/recipe.toml index c876bf143..db1b55046 100644 --- a/recipes/wip/players/cosmic-player/recipe.toml +++ b/recipes/wip/players/cosmic-player/recipe.toml @@ -25,8 +25,8 @@ DYNAMIC_INIT -C link-args="-lgmodule-2.0 -lffi -liconv -lpcre2-8 -lz" mkdir -pv "${COOKBOOK_STAGE}/usr/bin/" cp -v "target/${TARGET}/release/cosmic-player" "${COOKBOOK_STAGE}/usr/bin/" -mkdir -pv "${COOKBOOK_STAGE}/ui/apps/" -cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/ui/apps/cosmic-player" +mkdir -pv "${COOKBOOK_STAGE}/usr/share/ui/apps/" +cp -v "${COOKBOOK_RECIPE}/manifest" "${COOKBOOK_STAGE}/usr/share/ui/apps/cosmic-player" #TODO: install with just? APPID="com.system76.CosmicPlayer" mkdir -pv "${COOKBOOK_STAGE}/usr/share/applications/" From 7d128ee762cfdffb058cc97065a7ff552068ab0e Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 29 Jan 2026 13:03:05 +0700 Subject: [PATCH 135/407] Apply check_source logic to fetch --- src/bin/repo.rs | 18 +++++------------- src/cook/fetch.rs | 45 +++++++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 913e885d9..9e1d1546a 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -293,7 +293,7 @@ fn repo_inner( let is_cook = *command == CliCommand::Cook; let source_dir = handle_fetch(recipe, config, is_cook, logger)?; if is_cook { - handle_cook(recipe, config, source_dir, recipe.is_deps, logger)?; + handle_cook(recipe, config, source_dir, logger)?; } Ok(()) }; @@ -628,9 +628,9 @@ fn handle_fetch( allow_offline: bool, logger: &PtyOut, ) -> anyhow::Result { - let source_dir = match config.cook.offline && allow_offline { + let source_dir = match (config.cook.offline) && allow_offline { true => fetch_offline(&recipe, logger), - false => fetch(&recipe, logger), + false => fetch(&recipe, !recipe.is_deps, logger), } .map_err(|e| anyhow!("failed to fetch: {:?}", e))?; @@ -641,7 +641,6 @@ fn handle_cook( recipe: &CookRecipe, config: &CliConfig, source_dir: PathBuf, - is_deps: bool, logger: &PtyOut, ) -> anyhow::Result<()> { let recipe_dir = &recipe.dir; @@ -653,7 +652,7 @@ fn handle_cook( &recipe.name, &recipe.recipe, &config.cook, - !is_deps, + !recipe.is_deps, logger, ) .map_err(|err| anyhow!("failed to build: {:?}", err))?; @@ -1099,7 +1098,6 @@ fn run_tui_cook( let cooker_handle = thread::spawn(move || { 'done: for (mut recipe, source_dir) in work_rx { let name = recipe.name.clone(); - let is_deps = recipe.is_deps; let (mut stdout_writer, mut stderr_writer) = setup_logger(&cooker_status_tx, &name); let mut logger = Some((&mut stdout_writer, &mut stderr_writer)); 'again: loop { @@ -1107,13 +1105,7 @@ fn run_tui_cook( .send(StatusUpdate::StartCook(name.clone())) .unwrap(); let _ = recipe.reload_recipe(); // reread recipe.toml in case we're retrying - let handler = handle_cook( - &recipe, - &cooker_config, - source_dir.clone(), - is_deps, - &logger, - ); + let handler = handle_cook(&recipe, &cooker_config, source_dir.clone(), &logger); if let Some(log_path) = cooker_config.logs_dir.as_ref() { if let Err(err_ctx) = &handler { log_to_pty!(&logger, "\n{:?}", err_ctx) diff --git a/src/cook/fetch.rs b/src/cook/fetch.rs index f17dc100b..ecfb77e42 100644 --- a/src/cook/fetch.rs +++ b/src/cook/fetch.rs @@ -52,7 +52,7 @@ pub fn fetch_offline(recipe: &CookRecipe, logger: &PtyOut) -> Result { - fetch(recipe, logger)?; + fetch(recipe, true, logger)?; "local_source".to_string() } Some(SourceRecipe::SameAs { same_as }) => { @@ -114,7 +114,7 @@ pub fn fetch_offline(recipe: &CookRecipe, logger: &PtyOut) -> Result Result { +pub fn fetch(recipe: &CookRecipe, check_source: bool, logger: &PtyOut) -> Result { let recipe_dir = &recipe.dir; let source_dir = recipe_dir.join("source"); match recipe.recipe.build.kind { @@ -134,7 +134,7 @@ pub fn fetch(recipe: &CookRecipe, logger: &PtyOut) -> Result { Some(SourceRecipe::SameAs { same_as }) => { let recipe = fetch_resolve_canon(recipe_dir, &same_as, recipe.name.is_host())?; // recursively fetch - fetch(&recipe, logger)?; + fetch(&recipe, check_source, logger)?; fetch_make_symlink(&source_dir, &same_as)?; fetch_get_source_info(&recipe)?.source_identifier } @@ -195,6 +195,8 @@ pub fn fetch(recipe: &CookRecipe, logger: &PtyOut) -> Result { rename(&source_dir_tmp, &source_dir)?; false + } else if !check_source { + true } else { if !source_dir.join(".git").is_dir() { return Err(format!( @@ -323,28 +325,30 @@ pub fn fetch(recipe: &CookRecipe, logger: &PtyOut) -> Result { }) => { let source_tar = recipe_dir.join("source.tar"); let mut tar_updated = false; - while { + loop { if !source_tar.is_file() { tar_updated = true; download_wget(&tar, &source_tar, logger)?; + continue; + } + if !check_source { + break; } let source_tar_blake3 = get_blake3(&source_tar, tar_updated && logger.is_none())?; if let Some(blake3) = blake3 { - if source_tar_blake3 != *blake3 { - if tar_updated { - return Err(format!( - "The downloaded tar blake3 '{source_tar_blake3}' is not equal to blake3 in recipe.toml" - )); - } else { - log_to_pty!( - logger, - "DEBUG: source tar blake3 is different and need redownload" - ); - remove_all(&source_tar)?; - } - true + if source_tar_blake3 == *blake3 { + break; + } + if tar_updated { + return Err(format!( + "The downloaded tar blake3 '{source_tar_blake3}' is not equal to blake3 in recipe.toml" + )); } else { - false + log_to_pty!( + logger, + "DEBUG: source tar blake3 is different and need redownload" + ); + remove_all(&source_tar)?; } } else { //TODO: set blake3 hash on the recipe with something like "cook fix" @@ -354,9 +358,9 @@ pub fn fetch(recipe: &CookRecipe, logger: &PtyOut) -> Result { source_tar.display(), source_tar_blake3 ); - false + break; } - } {} + } if source_dir.is_dir() { if tar_updated || fetch_is_patches_newer(recipe_dir, patches, &source_dir)? { log_to_pty!( @@ -396,6 +400,7 @@ pub fn fetch(recipe: &CookRecipe, logger: &PtyOut) -> Result { package_path, cargoflags: _, } = &recipe.recipe.build.kind + && check_source { fetch_cargo(&source_dir, package_path.as_ref(), logger)?; } From e80b936954578d0767e4512c5e87ae375d8390b3 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 29 Jan 2026 13:04:04 +0700 Subject: [PATCH 136/407] Check build against stage pkgar instead of dir --- src/cook/cook_build.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index 183390d77..5468451a3 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -180,6 +180,10 @@ pub fn build( let sysroot_dir = target_dir.join("sysroot"); let toolchain_dir = target_dir.join("toolchain"); let stage_dirs = get_stage_dirs(&recipe.optional_packages, target_dir); + let stage_pkgars: Vec = stage_dirs + .iter() + .map(|p| p.with_added_extension("pkgar")) + .collect(); let cli_verbose = cook_config.verbose; let cli_jobs = cook_config.jobs; if recipe.build.kind == BuildKind::None { @@ -218,7 +222,7 @@ pub fn build( }; } - if !check_source && stage_dirs.iter().all(|dir| dir.exists()) { + if !check_source && stage_pkgars.iter().all(|file| file.is_file()) { if cli_verbose { log_to_pty!(logger, "DEBUG: using cached build, not checking source"); } @@ -245,14 +249,7 @@ pub fn build( .unwrap_or(Ok(SystemTime::UNIX_EPOCH))?; // check stage dir modified against pkgar files, any files missing will result in UNIX_EPOCH - let stage_modified = modified_all( - &stage_dirs - .iter() - .map(|p| p.with_added_extension("pkgar")) - .collect(), - modified, - ) - .unwrap_or(SystemTime::UNIX_EPOCH); + let stage_modified = modified_all(&stage_pkgars, modified).unwrap_or(SystemTime::UNIX_EPOCH); // Rebuild stage if source is newer if stage_modified < source_modified || stage_modified < deps_modified From aa3435155366321f7114327dfbac3842093cc846 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 29 Jan 2026 13:20:57 +0700 Subject: [PATCH 137/407] Reduce pty flush wait --- src/cook/pty.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cook/pty.rs b/src/cook/pty.rs index aec8869b0..1371cbddf 100644 --- a/src/cook/pty.rs +++ b/src/cook/pty.rs @@ -62,9 +62,8 @@ pub fn flush_pty(logger: &mut PtyOut) { }; // Not sure if flush actually working let _ = pty.flush(); - std::thread::sleep(Duration::from_millis(100)); + std::thread::sleep(Duration::from_millis(10)); let _ = file.flush(); - std::thread::sleep(Duration::from_millis(100)); } pub fn spawn_to_pipe(command: &mut Command, stdout_pipe: &PtyOut) -> Result { From 9089d46f8c764f4c28d4eedb81f8c7e3adda3f7a Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 29 Jan 2026 13:44:48 +0700 Subject: [PATCH 138/407] Some logic correction --- src/bin/repo.rs | 2 +- src/cook/fetch.rs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 9e1d1546a..b51755e03 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -628,7 +628,7 @@ fn handle_fetch( allow_offline: bool, logger: &PtyOut, ) -> anyhow::Result { - let source_dir = match (config.cook.offline) && allow_offline { + let source_dir = match config.cook.offline && allow_offline { true => fetch_offline(&recipe, logger), false => fetch(&recipe, !recipe.is_deps, logger), } diff --git a/src/cook/fetch.rs b/src/cook/fetch.rs index ecfb77e42..4c7154d12 100644 --- a/src/cook/fetch.rs +++ b/src/cook/fetch.rs @@ -329,7 +329,6 @@ pub fn fetch(recipe: &CookRecipe, check_source: bool, logger: &PtyOut) -> Result if !source_tar.is_file() { tar_updated = true; download_wget(&tar, &source_tar, logger)?; - continue; } if !check_source { break; @@ -400,8 +399,8 @@ pub fn fetch(recipe: &CookRecipe, check_source: bool, logger: &PtyOut) -> Result package_path, cargoflags: _, } = &recipe.recipe.build.kind - && check_source { + // TODO: No need to fetch if !check_source and already fetched? fetch_cargo(&source_dir, package_path.as_ref(), logger)?; } From 5a125d0cbb1104911a7a16c2d77901b23d0d3b3b Mon Sep 17 00:00:00 2001 From: Wildan M Date: Thu, 29 Jan 2026 17:18:20 +0700 Subject: [PATCH 139/407] Rename live disk in CI --- mk/ci.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mk/ci.mk b/mk/ci.mk index e1faf617f..84dc2aa35 100644 --- a/mk/ci.mk +++ b/mk/ci.mk @@ -19,7 +19,7 @@ server desktop demo: FORCE $(MAKE) CONFIG_NAME=$@ build/$(ARCH)/$@/harddrive.img build/$(ARCH)/$@/redox-live.iso mkdir -p $(IMG_DIR) cp "build/$(ARCH)/$@/harddrive.img" "$(IMG_DIR)/redox_$(@)$(IMG_SEPARATOR)$(IMG_TAG)_harddrive.img" - cp "build/$(ARCH)/$@/redox-live.iso" "$(IMG_DIR)/redox_$(@)$(IMG_SEPARATOR)$(IMG_TAG)_redox-live.iso" + cp "build/$(ARCH)/$@/redox-live.iso" "$(IMG_DIR)/redox_$(@)$(IMG_SEPARATOR)$(IMG_TAG)_livedisk.iso" # CI packaging target ci-pkg: prefix $(FSTOOLS_TAG) $(CONTAINER_TAG) FORCE From a72130de9742b7677d69bdd462f832fb35f2c824 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 29 Jan 2026 09:23:31 -0300 Subject: [PATCH 140/407] Add and improve recipes --- recipes/wip/a11y/orca/recipe.toml | 6 +----- recipes/wip/ai/nnx/recipe.toml | 4 +++- recipes/wip/ai/rustgpt/recipe.toml | 1 + recipes/wip/ai/tgs/recipe.toml | 1 + recipes/wip/analysis/binsider/recipe.toml | 1 + recipes/wip/analysis/cutter/recipe.toml | 15 ++++++++------- recipes/wip/analysis/email-sleuth/recipe.toml | 1 + recipes/wip/analysis/flowgger/recipe.toml | 1 + recipes/wip/analysis/netdata/recipe.toml | 13 ++++++++----- recipes/wip/analysis/rizin/recipe.toml | 6 +++++- recipes/wip/sound/audacity/recipe.toml | 7 +++++++ recipes/wip/text/t/recipe.toml | 6 ++++++ 12 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 recipes/wip/text/t/recipe.toml diff --git a/recipes/wip/a11y/orca/recipe.toml b/recipes/wip/a11y/orca/recipe.toml index 4048dc4af..27663df42 100644 --- a/recipes/wip/a11y/orca/recipe.toml +++ b/recipes/wip/a11y/orca/recipe.toml @@ -3,13 +3,9 @@ [source] tar = "https://download.gnome.org/sources/orca/48/orca-48.6.tar.xz" [build] -template = "custom" +template = "meson" dependencies = [ "atk", "at-spi2-core", "gtk3", ] -script = """ -DYNAMIC_INIT -cookbook_meson -""" diff --git a/recipes/wip/ai/nnx/recipe.toml b/recipes/wip/ai/nnx/recipe.toml index ca9318b4d..0136434ce 100644 --- a/recipes/wip/ai/nnx/recipe.toml +++ b/recipes/wip/ai/nnx/recipe.toml @@ -1,11 +1,13 @@ #TODO fs2 crate error [source] git = "https://github.com/webonnx/wonnx" +shallow_clone = true [build] template = "custom" dependencies = [ - "openssl1", + "openssl3", ] script = """ +DYNAMIC_INIT cookbook_cargo_packages wonnx-cli """ diff --git a/recipes/wip/ai/rustgpt/recipe.toml b/recipes/wip/ai/rustgpt/recipe.toml index 5f3f5588a..365df971e 100644 --- a/recipes/wip/ai/rustgpt/recipe.toml +++ b/recipes/wip/ai/rustgpt/recipe.toml @@ -1,5 +1,6 @@ #TODO not compiled or tested [source] git = "https://github.com/tekaratzas/RustGPT" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/ai/tgs/recipe.toml b/recipes/wip/ai/tgs/recipe.toml index 4a05776a9..04771275f 100644 --- a/recipes/wip/ai/tgs/recipe.toml +++ b/recipes/wip/ai/tgs/recipe.toml @@ -1,6 +1,7 @@ #TODO make libtorch work [source] git = "https://github.com/warpy-ai/tgs" +shallow_clone = true [build] template = "cargo" dependencies = [ diff --git a/recipes/wip/analysis/binsider/recipe.toml b/recipes/wip/analysis/binsider/recipe.toml index b7f70805f..5ae452ec2 100644 --- a/recipes/wip/analysis/binsider/recipe.toml +++ b/recipes/wip/analysis/binsider/recipe.toml @@ -1,5 +1,6 @@ #TODO async-io and rustix crates error [source] git = "https://github.com/orhun/binsider" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/analysis/cutter/recipe.toml b/recipes/wip/analysis/cutter/recipe.toml index 33fc1fcf9..e90cf181f 100644 --- a/recipes/wip/analysis/cutter/recipe.toml +++ b/recipes/wip/analysis/cutter/recipe.toml @@ -1,12 +1,13 @@ #TODO not compiled or tested +#TODO determine minimum dependencies from cmake log # build instructions: https://cutter.re/docs/building.html [source] -tar = "https://github.com/rizinorg/cutter/releases/download/v2.3.4/Cutter-v2.3.4-src.tar.gz" +tar = "https://github.com/rizinorg/cutter/releases/download/v2.4.1/Cutter-v2.4.1-src.tar.gz" [build] template = "cmake" -dependencies = [ - "libzip", - "zlib", - "qt5-base", - "qt5-svg", -] +#dependencies = [ +# "libzip", +# "zlib", +# "qt6-base", +# "qt6-svg", +#] diff --git a/recipes/wip/analysis/email-sleuth/recipe.toml b/recipes/wip/analysis/email-sleuth/recipe.toml index 36bdabc62..e06b0ab8a 100644 --- a/recipes/wip/analysis/email-sleuth/recipe.toml +++ b/recipes/wip/analysis/email-sleuth/recipe.toml @@ -1,5 +1,6 @@ #TODO openssl-sys crate error [source] git = "https://github.com/tokenizer-decode/email-sleuth" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/analysis/flowgger/recipe.toml b/recipes/wip/analysis/flowgger/recipe.toml index efcaed09d..6580d5b2b 100644 --- a/recipes/wip/analysis/flowgger/recipe.toml +++ b/recipes/wip/analysis/flowgger/recipe.toml @@ -2,5 +2,6 @@ # build instructions: https://github.com/awslabs/flowgger/wiki/Installation [source] git = "https://github.com/awslabs/flowgger" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/analysis/netdata/recipe.toml b/recipes/wip/analysis/netdata/recipe.toml index fc4f14ddb..632558adb 100644 --- a/recipes/wip/analysis/netdata/recipe.toml +++ b/recipes/wip/analysis/netdata/recipe.toml @@ -1,11 +1,14 @@ #TODO not compiled or tested # build instructions: https://learn.netdata.cloud/docs/developer-and-contributor-corner/build-the-netdata-agent-yourself/compile-from-source-code#building-netdata [source] -tar = "https://github.com/netdata/netdata/releases/download/v1.46.1/netdata-v1.46.1.tar.gz" +tar = "https://github.com/netdata/netdata/releases/download/v2.8.5/netdata-v2.8.5.tar.gz" [build] template = "cmake" -dependencies = [ - "zlib", - "libuv", - "libuuid", +cmakeflags = [ + "-DDEFAULT_FEATURE_STATE=False", ] +#dependencies = [ +# "zlib", +# "libuv", +# "libuuid", +#] diff --git a/recipes/wip/analysis/rizin/recipe.toml b/recipes/wip/analysis/rizin/recipe.toml index 385be03bd..f19402467 100644 --- a/recipes/wip/analysis/rizin/recipe.toml +++ b/recipes/wip/analysis/rizin/recipe.toml @@ -1,6 +1,10 @@ #TODO not compiled or tested # build instructions: https://github.com/rizinorg/rizin/blob/dev/BUILDING.md [source] -tar = "https://github.com/rizinorg/rizin/releases/download/v0.7.3/rizin-src-v0.7.3.tar.xz" +tar = "https://github.com/rizinorg/rizin/releases/download/v0.8.1/rizin-src-v0.8.1.tar.xz" [build] template = "meson" +mesonflags = [ + "-Denable_tests=false", + "-Denable_rz_test=false", +] diff --git a/recipes/wip/sound/audacity/recipe.toml b/recipes/wip/sound/audacity/recipe.toml index 9e5b6fa68..bceea2740 100644 --- a/recipes/wip/sound/audacity/recipe.toml +++ b/recipes/wip/sound/audacity/recipe.toml @@ -5,6 +5,13 @@ tar = "https://github.com/audacity/audacity/releases/download/Audacity-3.7.7/audacity-sources-3.7.7.tar.gz" [build] template = "cmake" +cmakeflags = [ + "-Daudacity_conan_enabled=Off", + "-Daudacity_has_tests=Off", + "-Daudacity_has_updates_check=Off", + "-Daudacity_has_vst3=Off", + "-Daudacity_has_crashreports=Off", +] #dependencies = [ # "libuuid", #] diff --git a/recipes/wip/text/t/recipe.toml b/recipes/wip/text/t/recipe.toml new file mode 100644 index 000000000..945186a78 --- /dev/null +++ b/recipes/wip/text/t/recipe.toml @@ -0,0 +1,6 @@ +#TODO not compiled or tested +[source] +git = "https://github.com/alecthomas/t" +shallow_clone = true +[build] +template = "cargo" From de26f022c95c369589eb8134d06eb8b9fe3e11ec Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 29 Jan 2026 10:51:51 -0300 Subject: [PATCH 141/407] Improve and fix many recipes --- recipes/wip/archives/7-zip/recipe.toml | 2 +- recipes/wip/archives/mlar/recipe.toml | 2 ++ recipes/wip/archives/orz/recipe.toml | 1 + recipes/wip/archives/ouch/recipe.toml | 1 + recipes/wip/archives/unzrip/recipe.toml | 1 + recipes/wip/backup/borg/recipe.toml | 4 +-- recipes/wip/backup/partclone/recipe.toml | 1 + recipes/wip/backup/vorta/recipe.toml | 5 +-- .../bench/cargo/cargo-benchcmp/recipe.toml | 1 + .../bench/cargo/cargo-criterion/recipe.toml | 1 + .../wip/bench/dacapo-benchmarks/recipe.toml | 2 +- recipes/wip/bench/hpc/hpcc/recipe.toml | 6 ++-- recipes/wip/bench/hpc/hpcg/recipe.toml | 5 +-- recipes/wip/bench/hpc/minibude/recipe.toml | 3 +- recipes/wip/bench/hyperfine/recipe.toml | 1 + recipes/wip/bench/io/blogbench/recipe.toml | 9 +++-- recipes/wip/bench/io/fio/recipe.toml | 3 +- .../io/simple-disk-benchmark/recipe.toml | 1 + recipes/wip/bench/rodinia/recipe.toml | 4 +-- recipes/wip/bench/rpc-perf/recipe.toml | 3 +- recipes/wip/bench/stress-ng/recipe.toml | 33 ++++++++++--------- .../suite/phoronix-test-suite/recipe.toml | 7 +++- 22 files changed, 62 insertions(+), 34 deletions(-) diff --git a/recipes/wip/archives/7-zip/recipe.toml b/recipes/wip/archives/7-zip/recipe.toml index 4930f7e03..773f48ae5 100644 --- a/recipes/wip/archives/7-zip/recipe.toml +++ b/recipes/wip/archives/7-zip/recipe.toml @@ -1,4 +1,4 @@ -#TODO missing script for "make", see https://github.com/mcmilk/7-Zip/tree/master/DOC#readme +#TODO missing script for gnu make: https://github.com/mcmilk/7-Zip/tree/master/DOC#readme [source] tar = "https://7-zip.org/a/7z2301-src.tar.xz" [build] diff --git a/recipes/wip/archives/mlar/recipe.toml b/recipes/wip/archives/mlar/recipe.toml index 5fd0cc565..2a9bcd001 100644 --- a/recipes/wip/archives/mlar/recipe.toml +++ b/recipes/wip/archives/mlar/recipe.toml @@ -1,8 +1,10 @@ #TODO compiled but not tested [source] git = "https://github.com/ANSSI-FR/MLA" +shallow_clone = true [build] template = "custom" script = """ +DYNAMIC_INIT cookbook_cargo_packages mlar """ diff --git a/recipes/wip/archives/orz/recipe.toml b/recipes/wip/archives/orz/recipe.toml index 758d96655..cf82b62ae 100644 --- a/recipes/wip/archives/orz/recipe.toml +++ b/recipes/wip/archives/orz/recipe.toml @@ -1,5 +1,6 @@ #TODO don't run [source] git = "https://github.com/richox/orz" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/archives/ouch/recipe.toml b/recipes/wip/archives/ouch/recipe.toml index 851597f28..9bc40883a 100644 --- a/recipes/wip/archives/ouch/recipe.toml +++ b/recipes/wip/archives/ouch/recipe.toml @@ -1,6 +1,7 @@ #TODO compilation error [source] git = "https://github.com/ouch-org/ouch" +shallow_clone = true [build] template = "cargo" dependencies = [ diff --git a/recipes/wip/archives/unzrip/recipe.toml b/recipes/wip/archives/unzrip/recipe.toml index e31e1140d..61d5cc2ea 100644 --- a/recipes/wip/archives/unzrip/recipe.toml +++ b/recipes/wip/archives/unzrip/recipe.toml @@ -1,6 +1,7 @@ #TODO make zstd work (after cargo update) [source] git = "https://github.com/quininer/unzrip" +shallow_clone = true [build] template = "cargo" dependencies = [ diff --git a/recipes/wip/backup/borg/recipe.toml b/recipes/wip/backup/borg/recipe.toml index 6df0b093c..40efef0b4 100644 --- a/recipes/wip/backup/borg/recipe.toml +++ b/recipes/wip/backup/borg/recipe.toml @@ -1,11 +1,11 @@ #TODO missing script for pip -# build instructions - https://borgbackup.readthedocs.io/en/stable/installation.html#source-install +# build instructions: https://borgbackup.readthedocs.io/en/stable/installation.html#source-install [source] tar = "https://github.com/borgbackup/borg/releases/download/1.4.1/borgbackup-1.4.1.tar.gz" [build] template = "custom" dependencies = [ - "openssl1", + "openssl3", "libacl", "libattr", "xxhash", diff --git a/recipes/wip/backup/partclone/recipe.toml b/recipes/wip/backup/partclone/recipe.toml index 96d8c8e37..a20ecf79f 100644 --- a/recipes/wip/backup/partclone/recipe.toml +++ b/recipes/wip/backup/partclone/recipe.toml @@ -2,6 +2,7 @@ [source] git = "https://github.com/Thomas-Tsai/partclone" rev = "0.3.40" +shallow_clone = true script = """ DYNAMIC_INIT autotools_recursive_regenerate diff --git a/recipes/wip/backup/vorta/recipe.toml b/recipes/wip/backup/vorta/recipe.toml index 830541fed..ebda5b6ff 100644 --- a/recipes/wip/backup/vorta/recipe.toml +++ b/recipes/wip/backup/vorta/recipe.toml @@ -1,7 +1,8 @@ #TODO missing script for pip -# build instructions - https://vorta.borgbase.com/install/linux/#install-from-source +# build instructions: https://vorta.borgbase.com/install/linux/#install-from-source [source] git = "https://github.com/borgbase/vorta" -rev = "f2b42742f9a56f15a46f2b287825122032fcdb90" +rev = "v0.11.3" +shallow_clone = true [build] template = "custom" diff --git a/recipes/wip/bench/cargo/cargo-benchcmp/recipe.toml b/recipes/wip/bench/cargo/cargo-benchcmp/recipe.toml index a9fbc1c1f..f6e377622 100644 --- a/recipes/wip/bench/cargo/cargo-benchcmp/recipe.toml +++ b/recipes/wip/bench/cargo/cargo-benchcmp/recipe.toml @@ -1,5 +1,6 @@ #TODO compiled but not tested [source] git = "https://github.com/BurntSushi/cargo-benchcmp" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/bench/cargo/cargo-criterion/recipe.toml b/recipes/wip/bench/cargo/cargo-criterion/recipe.toml index 6ba7cb273..ed9af8804 100644 --- a/recipes/wip/bench/cargo/cargo-criterion/recipe.toml +++ b/recipes/wip/bench/cargo/cargo-criterion/recipe.toml @@ -1,5 +1,6 @@ #TODO compiled but not tested (after cargo update) [source] git = "https://github.com/bheisler/cargo-criterion" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/bench/dacapo-benchmarks/recipe.toml b/recipes/wip/bench/dacapo-benchmarks/recipe.toml index 0fc1315ba..4e3d04216 100644 --- a/recipes/wip/bench/dacapo-benchmarks/recipe.toml +++ b/recipes/wip/bench/dacapo-benchmarks/recipe.toml @@ -1,5 +1,5 @@ #TODO missing data type to download the Java bytecode -# download link - https://download.dacapobench.org/chopin/dacapo-23.11-chopin.zip +# download link: https://download.dacapobench.org/chopin/dacapo-23.11-chopin.zip [source] [build] diff --git a/recipes/wip/bench/hpc/hpcc/recipe.toml b/recipes/wip/bench/hpc/hpcc/recipe.toml index 6cc31de23..cb211c794 100644 --- a/recipes/wip/bench/hpc/hpcc/recipe.toml +++ b/recipes/wip/bench/hpc/hpcc/recipe.toml @@ -1,5 +1,7 @@ -#TODO missing script for building, check the tarball +#TODO missing script for gnu make or python script: https://github.com/icl-utk-edu/hpcc#compiling [source] -tar = "https://hpcchallenge.org/projectsfiles/hpcc/download/hpcc-1.5.0.tar.gz" +git = "https://github.com/icl-utk-edu/hpcc" +rev = "1.5.0" +shallow_clone = true [build] template = "custom" diff --git a/recipes/wip/bench/hpc/hpcg/recipe.toml b/recipes/wip/bench/hpc/hpcg/recipe.toml index fe63ce86e..ce49a0c58 100644 --- a/recipes/wip/bench/hpc/hpcg/recipe.toml +++ b/recipes/wip/bench/hpc/hpcg/recipe.toml @@ -1,5 +1,6 @@ -#TODO missing script for building, see https://github.com/hpcg-benchmark/hpcg/blob/master/INSTALL +#TODO not compiled or tested [source] git = "https://github.com/hpcg-benchmark/hpcg" +shallow_clone = true [build] -template = "custom" +template = "cmake" diff --git a/recipes/wip/bench/hpc/minibude/recipe.toml b/recipes/wip/bench/hpc/minibude/recipe.toml index b641cd416..b63b712dc 100644 --- a/recipes/wip/bench/hpc/minibude/recipe.toml +++ b/recipes/wip/bench/hpc/minibude/recipe.toml @@ -1,5 +1,6 @@ -#TODO missing script for "make", see https://github.com/UoB-HPC/miniBUDE#building +#TODO missing script for gnu make: https://github.com/UoB-HPC/miniBUDE#building [source] git = "https://github.com/UoB-HPC/miniBUDE" +shallow_clone = true [build] template = "custom" diff --git a/recipes/wip/bench/hyperfine/recipe.toml b/recipes/wip/bench/hyperfine/recipe.toml index a51d22b58..4b963663f 100644 --- a/recipes/wip/bench/hyperfine/recipe.toml +++ b/recipes/wip/bench/hyperfine/recipe.toml @@ -1,5 +1,6 @@ #TODO libc::RUSAGE_CHILDREN [source] git = "https://github.com/sharkdp/hyperfine" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/bench/io/blogbench/recipe.toml b/recipes/wip/bench/io/blogbench/recipe.toml index b6c2aff2f..5bf1657a8 100644 --- a/recipes/wip/bench/io/blogbench/recipe.toml +++ b/recipes/wip/bench/io/blogbench/recipe.toml @@ -1,5 +1,10 @@ -#TODO missing script for building, see https://github.com/jedisct1/Blogbench#readme +#TODO not compiled or tested +# build instructions: https://github.com/jedisct1/Blogbench/blob/master/README#L18 [source] tar = "https://github.com/jedisct1/Blogbench/releases/download/1.2/blogbench-1.2.tar.bz2" +script = """ +DYNAMIC_INIT +autotools_recursive_regenerate +""" [build] -template = "custom" +template = "configure" diff --git a/recipes/wip/bench/io/fio/recipe.toml b/recipes/wip/bench/io/fio/recipe.toml index 80c3bd768..eb41050c4 100644 --- a/recipes/wip/bench/io/fio/recipe.toml +++ b/recipes/wip/bench/io/fio/recipe.toml @@ -1,6 +1,7 @@ #TODO configuration problem [source] git = "https://github.com/axboe/fio" -rev = "624e263f6acb1563471a83601ce19dfb77ac5694" +rev = "fio-3.41" +shallow_clone = true [build] template = "configure" diff --git a/recipes/wip/bench/io/simple-disk-benchmark/recipe.toml b/recipes/wip/bench/io/simple-disk-benchmark/recipe.toml index 64101a1eb..4fe40d717 100644 --- a/recipes/wip/bench/io/simple-disk-benchmark/recipe.toml +++ b/recipes/wip/bench/io/simple-disk-benchmark/recipe.toml @@ -1,5 +1,6 @@ #TODO source code error [source] git = "https://github.com/schwa/simple-disk-benchmark-rs" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/bench/rodinia/recipe.toml b/recipes/wip/bench/rodinia/recipe.toml index ae1b0752d..460e2dfd2 100644 --- a/recipes/wip/bench/rodinia/recipe.toml +++ b/recipes/wip/bench/rodinia/recipe.toml @@ -1,5 +1,5 @@ -#TODO missing script for building, lacking build instructions +#TODO missing script for gnu make, build the openmp (cpu backend?) or opencl implementation [source] -tar = "http://www.cs.virginia.edu/~skadron/lava/Rodinia/Packages/rodinia_3.1.tar.bz2" +tar = "http://www.cs.virginia.edu/~skadron/lava/rodinia/Packages/rodinia_3.1.tar.bz2" [build] template = "custom" diff --git a/recipes/wip/bench/rpc-perf/recipe.toml b/recipes/wip/bench/rpc-perf/recipe.toml index be0a4045b..85678820c 100644 --- a/recipes/wip/bench/rpc-perf/recipe.toml +++ b/recipes/wip/bench/rpc-perf/recipe.toml @@ -1,6 +1,7 @@ -#TODO make zstd work +#TODO not compiled or tested [source] git = "https://github.com/iopsystems/rpc-perf" +shallow_clone = true [build] template = "cargo" dependencies = [ diff --git a/recipes/wip/bench/stress-ng/recipe.toml b/recipes/wip/bench/stress-ng/recipe.toml index 18e673540..eba47cd9c 100644 --- a/recipes/wip/bench/stress-ng/recipe.toml +++ b/recipes/wip/bench/stress-ng/recipe.toml @@ -1,20 +1,21 @@ -#TODO missing script for "make", see https://github.com/ColinIanKing/stress-ng#building-stress-ng -#TODO missing dependencies +#TODO missing script for gnu make: https://github.com/ColinIanKing/stress-ng#building-stress-ng +#TODO determine minimum dependencies [source] git = "https://github.com/ColinIanKing/stress-ng" -rev = "8c39f5a2d9b199189456f414afd9e536dae69d1b" +rev = "V0.20.00" +shallow_clone = true [build] template = "custom" -dependencies = [ - "libbsd", - "libaio", - "libcap", - "libcap", - "libgcrypt", - "libjpeg", - "libmd", - "libmpfr", - "xxhash", - "zlib", - "mesa", -] +#dependencies = [ +# "libbsd", +# "libaio", +# "libcap", +# "libcap", +# "libgcrypt", +# "libjpeg", +# "libmd", +# "libmpfr", +# "xxhash", +# "zlib", +# "mesa", +#] diff --git a/recipes/wip/bench/suite/phoronix-test-suite/recipe.toml b/recipes/wip/bench/suite/phoronix-test-suite/recipe.toml index 19495073d..caa72ed1f 100644 --- a/recipes/wip/bench/suite/phoronix-test-suite/recipe.toml +++ b/recipes/wip/bench/suite/phoronix-test-suite/recipe.toml @@ -1,5 +1,10 @@ #TODO figure out the installation script - https://github.com/phoronix-test-suite/phoronix-test-suite [source] -tar = "https://phoronix-test-suite.com/releases/phoronix-test-suite-10.8.4.tar.gz" +git = "https://github.com/phoronix-test-suite/phoronix-test-suite" +shallow_clone = true [build] template = "custom" +script = """ +mkdir -pv "${COOKBOOK_STAGE}/home/user/pts" +cp -rv "${COOKBOOK_SOURCE}"/* "${COOKBOOK_STAGE}/home/user/pts" +""" From 092c8e5dd85a5d008980b919a39146aff873b20b Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 29 Jan 2026 10:54:53 -0300 Subject: [PATCH 142/407] Rename "phoronix-test-suite" recipe to "pts" --- recipes/wip/bench/suite/{phoronix-test-suite => pts}/recipe.toml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename recipes/wip/bench/suite/{phoronix-test-suite => pts}/recipe.toml (100%) diff --git a/recipes/wip/bench/suite/phoronix-test-suite/recipe.toml b/recipes/wip/bench/suite/pts/recipe.toml similarity index 100% rename from recipes/wip/bench/suite/phoronix-test-suite/recipe.toml rename to recipes/wip/bench/suite/pts/recipe.toml From acb624b6d77d14b11567e458c73976e066014543 Mon Sep 17 00:00:00 2001 From: Ribbon Date: Thu, 29 Jan 2026 11:43:04 -0300 Subject: [PATCH 143/407] Improve more recipes --- recipes/wip/bench/suite/pts/recipe.toml | 2 ++ recipes/wip/codecs/dav1d/recipe.toml | 7 +++++-- recipes/wip/codecs/faad2/recipe.toml | 2 +- recipes/wip/codecs/rav1e/recipe.toml | 1 + recipes/wip/codecs/svt-av1/recipe.toml | 8 +++++--- recipes/wip/codecs/svt-hevc/recipe.toml | 2 +- recipes/wip/codecs/svt-vp9/recipe.toml | 2 ++ recipes/wip/codecs/uvg266/recipe.toml | 6 +++++- recipes/wip/codecs/vvenc/recipe.toml | 3 ++- recipes/wip/codecs/wavpack/recipe.toml | 4 ++-- recipes/wip/codecs/x264/recipe.toml | 2 ++ recipes/wip/codecs/x265/recipe.toml | 9 +++++++-- 12 files changed, 35 insertions(+), 13 deletions(-) diff --git a/recipes/wip/bench/suite/pts/recipe.toml b/recipes/wip/bench/suite/pts/recipe.toml index caa72ed1f..854a2e92b 100644 --- a/recipes/wip/bench/suite/pts/recipe.toml +++ b/recipes/wip/bench/suite/pts/recipe.toml @@ -8,3 +8,5 @@ script = """ mkdir -pv "${COOKBOOK_STAGE}/home/user/pts" cp -rv "${COOKBOOK_SOURCE}"/* "${COOKBOOK_STAGE}/home/user/pts" """ +[package] +dependencies = ["php84"] diff --git a/recipes/wip/codecs/dav1d/recipe.toml b/recipes/wip/codecs/dav1d/recipe.toml index 2384fba7b..0d8cdf87c 100644 --- a/recipes/wip/codecs/dav1d/recipe.toml +++ b/recipes/wip/codecs/dav1d/recipe.toml @@ -1,7 +1,10 @@ #TODO not compiled or tested # build instructions: https://code.videolan.org/videolan/dav1d#compile [source] -git = "https://code.videolan.org/videolan/dav1d" -rev = "48035599cdd4e4415732e408c407e0c1cd1c7444" +tar = "https://downloads.videolan.org/videolan/dav1d/1.5.3/dav1d-1.5.3.tar.xz" +shallow_clone = true [build] template = "meson" +mesonflags = [ + "-Denable_tests=false", +] \ No newline at end of file diff --git a/recipes/wip/codecs/faad2/recipe.toml b/recipes/wip/codecs/faad2/recipe.toml index 1fcb64152..c0f485d96 100644 --- a/recipes/wip/codecs/faad2/recipe.toml +++ b/recipes/wip/codecs/faad2/recipe.toml @@ -1,7 +1,7 @@ #TODO not compiled or tested -# lacking build instructions [source] git = "https://github.com/knik0/faad2" rev = "2.11.2" +shallow_clone = true [build] template = "cmake" diff --git a/recipes/wip/codecs/rav1e/recipe.toml b/recipes/wip/codecs/rav1e/recipe.toml index 3ee7f5376..54b874985 100644 --- a/recipes/wip/codecs/rav1e/recipe.toml +++ b/recipes/wip/codecs/rav1e/recipe.toml @@ -1,5 +1,6 @@ #TODO "malloc(): invalid size (unsorted)" error [source] git = "https://github.com/xiph/rav1e" +shallow_clone = true [build] template = "cargo" diff --git a/recipes/wip/codecs/svt-av1/recipe.toml b/recipes/wip/codecs/svt-av1/recipe.toml index 8d0875f99..feef47d06 100644 --- a/recipes/wip/codecs/svt-av1/recipe.toml +++ b/recipes/wip/codecs/svt-av1/recipe.toml @@ -1,6 +1,8 @@ -#TODO missing script for building, see https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/Build-Guide.md#linux-operating-systems-64-bit +#TODO not compiled or tested +# build instructions: https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/Build-Guide.md#linux-operating-systems-64-bit [source] git = "https://gitlab.com/AOMediaCodec/SVT-AV1" -rev = "59645eea34e2815b627b8293aa3af254eddd0d69" +rev = "v4.0.1" +shallow_clone = true [build] -template = "custom" +template = "cmake" diff --git a/recipes/wip/codecs/svt-hevc/recipe.toml b/recipes/wip/codecs/svt-hevc/recipe.toml index 78c54ef7c..ab3b0118e 100644 --- a/recipes/wip/codecs/svt-hevc/recipe.toml +++ b/recipes/wip/codecs/svt-hevc/recipe.toml @@ -2,6 +2,6 @@ # build instructions: https://github.com/OpenVisualCloud/SVT-HEVC#linux-operating-systems-64-bit [source] git = "https://github.com/OpenVisualCloud/SVT-HEVC" -rev = "b65eba07e6dee37407631cc441561960838b0333" +shallow_clone = true [build] template = "cmake" diff --git a/recipes/wip/codecs/svt-vp9/recipe.toml b/recipes/wip/codecs/svt-vp9/recipe.toml index 47574a5fd..cb9a98d43 100644 --- a/recipes/wip/codecs/svt-vp9/recipe.toml +++ b/recipes/wip/codecs/svt-vp9/recipe.toml @@ -2,5 +2,7 @@ # build instructions: https://github.com/OpenVisualCloud/SVT-VP9#linux-operating-systems-64-bit [source] git = "https://github.com/OpenVisualCloud/SVT-VP9" +rev = "v0.3.1" +shallow_clone = true [build] template = "cmake" diff --git a/recipes/wip/codecs/uvg266/recipe.toml b/recipes/wip/codecs/uvg266/recipe.toml index 4005e380b..13ff22f0a 100644 --- a/recipes/wip/codecs/uvg266/recipe.toml +++ b/recipes/wip/codecs/uvg266/recipe.toml @@ -2,6 +2,10 @@ # build instructions: https://github.com/ultravideo/uvg266#compiling-uvg266 [source] git = "https://github.com/ultravideo/uvg266" -rev = "9add13b7053a6ba3f6b22bf82728e01fc437a447" +rev = "v0.8.1" +shallow_clone = true [build] template = "cmake" +cmakeflags = [ + "-DBUILD_TESTS=OFF" +] \ No newline at end of file diff --git a/recipes/wip/codecs/vvenc/recipe.toml b/recipes/wip/codecs/vvenc/recipe.toml index 0a2eb4172..4543bbd96 100644 --- a/recipes/wip/codecs/vvenc/recipe.toml +++ b/recipes/wip/codecs/vvenc/recipe.toml @@ -2,6 +2,7 @@ # build instructions: https://github.com/fraunhoferhhi/vvenc/wiki/Build#build-using-plain-cmake [source] git = "https://github.com/fraunhoferhhi/vvenc" -rev = "eea6fce28c8e822a0ece7a343a10fd5d6dd0e7bb" +rev = "v1.14.0" +shallow_clone = true [build] template = "cmake" diff --git a/recipes/wip/codecs/wavpack/recipe.toml b/recipes/wip/codecs/wavpack/recipe.toml index 3f4a28a84..865767897 100644 --- a/recipes/wip/codecs/wavpack/recipe.toml +++ b/recipes/wip/codecs/wavpack/recipe.toml @@ -1,6 +1,6 @@ -#TODO compilation error - missing header +#TODO compilation error: missing header [source] -tar = "https://github.com/dbry/WavPack/releases/download/5.7.0/wavpack-5.7.0.tar.xz" +tar = "https://github.com/dbry/WavPack/releases/download/5.9.0/wavpack-5.9.0.tar.xz" [build] template = "configure" dependencies = [ diff --git a/recipes/wip/codecs/x264/recipe.toml b/recipes/wip/codecs/x264/recipe.toml index 2bf5be8b0..84f19bb0e 100644 --- a/recipes/wip/codecs/x264/recipe.toml +++ b/recipes/wip/codecs/x264/recipe.toml @@ -1,5 +1,7 @@ #TODO the redox target is not supported on the configure script [source] git = "https://code.videolan.org/videolan/x264" +branch = "stable" +shallow_clone = true [build] template = "configure" diff --git a/recipes/wip/codecs/x265/recipe.toml b/recipes/wip/codecs/x265/recipe.toml index ce61981df..d2e8cd054 100644 --- a/recipes/wip/codecs/x265/recipe.toml +++ b/recipes/wip/codecs/x265/recipe.toml @@ -1,6 +1,11 @@ #TODO not compiled or tested # build instructions: https://bitbucket.org/multicoreware/x265_git/src/master/build/README.txt#lines-68 [source] -tar = "https://bitbucket.org/multicoreware/x265_git/downloads/x265_3.5.tar.gz" +tar = "https://bitbucket.org/multicoreware/x265_git/downloads/x265_4.1.tar.gz" [build] -template = "cmake" +template = "custom" +script = """ +COOKBOOK_SOURCE="${COOKBOOK_SOURCE}/source" +DYNAMIC_INIT +cookbook_cmake +""" From 58bdc32eb99959ec22f5b0707d3918748a2668e2 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 29 Jan 2026 09:56:40 -0700 Subject: [PATCH 144/407] quakespasm: fix icon path --- recipes/games/quakespasm/redox.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/games/quakespasm/redox.patch b/recipes/games/quakespasm/redox.patch index c3ff6a46e..754776dc9 100644 --- a/recipes/games/quakespasm/redox.patch +++ b/recipes/games/quakespasm/redox.patch @@ -9,7 +9,7 @@ diff '--color=auto' -rupwN source/Makefile source-new/Makefile +DESTDIR ?= "/" +INSTALLDIR = "${DESTDIR}/usr/games/" +DATADIR = "${DESTDIR}/usr/share/games/quake1/id1/" -+ICODIR = "${DESTDIR}/ui/icons/apps/" ++ICODIR = "${DESTDIR}/usr/share/icons/apps/" + # Enable/Disable user directories support -DO_USERDIRS=0 From 2ee6f8a18dece159de061fc0d29fa113a7be15cd Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 29 Jan 2026 13:46:14 -0700 Subject: [PATCH 145/407] vvvvvv: fix source directory --- recipes/wip/games/other/vvvvvv/recipe.toml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/recipes/wip/games/other/vvvvvv/recipe.toml b/recipes/wip/games/other/vvvvvv/recipe.toml index a15bc5eb4..872ace7d9 100644 --- a/recipes/wip/games/other/vvvvvv/recipe.toml +++ b/recipes/wip/games/other/vvvvvv/recipe.toml @@ -5,11 +5,6 @@ upstream = "https://github.com/TerryCavanagh/VVVVVV" branch = "redox" script = "COOKBOOK_SOURCE=${COOKBOOK_SOURCE}/desktop_version" [build] -template = "cmake" -cmakeflags = [ - "-DSDL2_INCLUDE_DIRS=${COOKBOOK_SYSROOT}/include/SDL2", - "-DSDL2_LIBRARIES="-lSDL2main -lSDL2_mixer -lSDL2 $(${TARGET}-pkg-config --libs glu) -lorbital -lz -lvorbisfile -lvorbis -logg" .", -] dependencies = [ "sdl2-image", "sdl2-mixer", @@ -21,3 +16,10 @@ dependencies = [ "libogg", "libvorbis", ] +template = "custom" +script = """ +COOKBOOK_SOURCE="${COOKBOOK_SOURCE}/desktop_version" +cookbook_cmake \ + -DSDL2_INCLUDE_DIRS="${COOKBOOK_SYSROOT}/include/SDL2" \ + -DSDL2_LIBRARIES="-lSDL2main -lSDL2_mixer -lSDL2 $(${TARGET}-pkg-config --libs glu) -lorbital -lz -lvorbisfile -lvorbis -logg" +""" \ No newline at end of file From 33f73ad1c52a7908b61dcc04683585b2b5180914 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 29 Jan 2026 15:27:08 -0700 Subject: [PATCH 146/407] cosmic-settings: fix compilation --- recipes/tools/cosmic-settings/recipe.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/recipes/tools/cosmic-settings/recipe.toml b/recipes/tools/cosmic-settings/recipe.toml index f2a3f372d..d2f96703f 100644 --- a/recipes/tools/cosmic-settings/recipe.toml +++ b/recipes/tools/cosmic-settings/recipe.toml @@ -7,6 +7,7 @@ template = "custom" dependencies = [ "gettext", "libiconv", + "libxkbcommon", ] script = """ DYNAMIC_INIT @@ -25,11 +26,11 @@ cp -v "target/${TARGET}/release/cosmic-settings" "${COOKBOOK_STAGE}/usr/bin/" #TODO: install with just? APPID="com.system76.CosmicSettings" mkdir -pv "${COOKBOOK_STAGE}/usr/share/applications/" -sed 's/Categories=COSMIC/Categories=Settings/' "${COOKBOOK_SOURCE}/resources/${APPID}.desktop" > "${COOKBOOK_STAGE}/usr/share/applications/${APPID}.desktop" +sed 's/Categories=COSMIC/Categories=Settings/' "${COOKBOOK_SOURCE}/resources/applications/${APPID}.desktop" > "${COOKBOOK_STAGE}/usr/share/applications/${APPID}.desktop" mkdir -pv "${COOKBOOK_STAGE}/usr/share/metainfo/" cp -v "${COOKBOOK_SOURCE}/resources/${APPID}.metainfo.xml" "${COOKBOOK_STAGE}/usr/share/metainfo/" mkdir -pv "${COOKBOOK_STAGE}/usr/share/" cp -rv "${COOKBOOK_SOURCE}/resources/default_schema/" "${COOKBOOK_STAGE}/usr/share/cosmic/" mkdir -pv "${COOKBOOK_STAGE}/usr/share/icons/" cp -rv "${COOKBOOK_SOURCE}/resources/icons/" "${COOKBOOK_STAGE}/usr/share/icons/hicolor/" -""" \ No newline at end of file +""" From 512a1aaf817add93b84678d74b703e26bd244a87 Mon Sep 17 00:00:00 2001 From: Matthias Vogler Date: Fri, 30 Jan 2026 17:03:08 +0100 Subject: [PATCH 147/407] fix unclosed quote in redox() package list --- native_bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native_bootstrap.sh b/native_bootstrap.sh index c832431a2..b756a2f5a 100755 --- a/native_bootstrap.sh +++ b/native_bootstrap.sh @@ -914,7 +914,7 @@ redox() # Core development packages that are likely available on Redox # This list is conservative and only includes essentials - packages=""autoconf \ + packages="autoconf \ automake \ expat \ gcc13 \ From b2222554130edf7f5ff3ca09df0ea3212d0f7d53 Mon Sep 17 00:00:00 2001 From: auronandace Date: Fri, 30 Jan 2026 21:19:41 +0000 Subject: [PATCH 148/407] add newly hanging os-test tests to os-test-bins recipe --- recipes/tests/os-test-bins/recipe.toml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/recipes/tests/os-test-bins/recipe.toml b/recipes/tests/os-test-bins/recipe.toml index 9bbdb5ff6..c8e02a571 100644 --- a/recipes/tests/os-test-bins/recipe.toml +++ b/recipes/tests/os-test-bins/recipe.toml @@ -32,6 +32,16 @@ make OS=Redox \ skips=( # These tests hang + basic/pthread/pthread_barrierattr_setpshared + basic/pthread/pthread_cancel + basic/pthread/pthread_cleanup_pop + basic/pthread/pthread_cleanup_push + basic/pthread/pthread_condattr_setpshared + basic/pthread/pthread_mutex_consistent + basic/pthread/pthread_rwlock_timedrdlock + basic/pthread/pthread_rwlock_timedrwlock + basic/pthread/pthread_setcanceltype + basic/pthread/pthread_testcancel signal/ppoll-block-sleep-raise-write signal/ppoll-block-sleep-write-raise ) From 56d2512d2f5c26dae38b1c82cc4b730aee8e09d1 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 30 Jan 2026 18:54:33 -0700 Subject: [PATCH 149/407] network-boot: only bind requested interface --- scripts/network-boot.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/network-boot.sh b/scripts/network-boot.sh index e0f79cbce..0b9c09da7 100755 --- a/scripts/network-boot.sh +++ b/scripts/network-boot.sh @@ -26,6 +26,7 @@ fi ARGS=( "--no-daemon" + "--bind-interfaces" "--listen-address=${NETWORK}.1" "--port=0" "--dhcp-range=${NETWORK}.3,${NETWORK}.254,255.255.255.0,1h" From 776eed07f3adfed460800a4eeecbd4080a6db310 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 31 Jan 2026 10:46:41 +0700 Subject: [PATCH 150/407] Split clang out of LLVM --- recipes/dev/clang/native.cmake | 2 + recipes/dev/clang/recipe.toml | 81 +++++++++++++++++++++++++ recipes/dev/llvm21/recipe.toml | 57 +++-------------- recipes/wip/dev/lang/zig/recipe.toml | 8 +-- recipes/wip/web/firefox-esr/recipe.toml | 4 +- 5 files changed, 96 insertions(+), 56 deletions(-) create mode 100644 recipes/dev/clang/native.cmake create mode 100644 recipes/dev/clang/recipe.toml diff --git a/recipes/dev/clang/native.cmake b/recipes/dev/clang/native.cmake new file mode 100644 index 000000000..4b0abbfa3 --- /dev/null +++ b/recipes/dev/clang/native.cmake @@ -0,0 +1,2 @@ +set(CMAKE_C_COMPILER cc) +set(CMAKE_CXX_COMPILER c++) diff --git a/recipes/dev/clang/recipe.toml b/recipes/dev/clang/recipe.toml new file mode 100644 index 000000000..ed315c422 --- /dev/null +++ b/recipes/dev/clang/recipe.toml @@ -0,0 +1,81 @@ +[source] +same_as = "../llvm21" + +[build] +template = "custom" +dependencies = [ +] +dev-dependencies = [ + "host:xz", + "host:libarchive", # workaround for cmake error +] +script = """ +DYNAMIC_INIT + +COOKBOOK_CMAKE_FLAGS+=( + -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" + -DLIBCLANG_BUILD_STATIC=On + -DLLVM_INCLUDE_BENCHMARKS=Off + -DLLVM_INCLUDE_DOCS=Off + +# the rest of options should be exact with llvm21 + -DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$(realpath "${COOKBOOK_RECIPE}/native.cmake")" + -DCMAKE_CXX_FLAGS="--std=gnu++11" + -DBUILD_SHARED_LIBS=False + -DLLVM_LINK_LLVM_DYLIB=On + -DLLVM_BUILD_EXAMPLES=Off + -DLLVM_BUILD_TESTS=Off + -DLLVM_DEFAULT_TARGET_TRIPLE="${TARGET}" + -DLLVM_ENABLE_LTO=Off + -DLLVM_ENABLE_RTTI=On + -DLLVM_ENABLE_THREADS=On + -DLLVM_INCLUDE_EXAMPLES=Off + -DLLVM_INCLUDE_TESTS=Off + -DLLVM_OPTIMIZED_TABLEGEN=On + -DLLVM_TARGET_ARCH="$(echo "${TARGET}" | cut -d - -f1)" + -DLLVM_TARGETS_TO_BUILD="X86" + -DLLVM_TOOL_LLVM_COV_BUILD=Off + -DLLVM_TOOL_LLVM_PROFDATA_BUILD=Off + -DLLVM_TOOLS_INSTALL_DIR=bin + -DLLVM_UTILS_INSTALL_DIR=bin + -DUNIX=1 +) + +# Native tablegen build fails with too many jobs, limit to 16 +COOKBOOK_MAKE_JOBS="$(( ${COOKBOOK_MAKE_JOBS} > 16 ? 16 : ${COOKBOOK_MAKE_JOBS} ))" +COOKBOOK_SOURCE="$COOKBOOK_SOURCE/llvm" +cookbook_cmake + +# Redundant LLVM packages +rm -rf ${COOKBOOK_STAGE}/usr/include/llvm* \ + ${COOKBOOK_STAGE}/usr/lib/libLLVM*.a \ + ${COOKBOOK_STAGE}/usr/lib/cmake/llvm \ + ${COOKBOOK_STAGE}/usr/bin/llvm-* \ +""" + +# lld runtime (no library) +[[optional-packages]] +name = "lld" +dependencies = [ ".runtime" ] +files = [ + "usr/bin/*.lld", + "usr/bin/*-ld", + "usr/bin/lld*", +] + +[[optional-packages]] +name = "dev" +files = [ + "usr/include/clang*/**", + "usr/lib/libclang*.a", + "usr/lib/cmake/clang/**", +] + +[[optional-packages]] +name = "lld-dev" +dependencies = [ ".lld" ] +files = [ + "usr/include/lld*/**", + "usr/lib/liblld*.a", + "usr/lib/cmake/lld/**", +] diff --git a/recipes/dev/llvm21/recipe.toml b/recipes/dev/llvm21/recipe.toml index ddd1b793a..21261c821 100644 --- a/recipes/dev/llvm21/recipe.toml +++ b/recipes/dev/llvm21/recipe.toml @@ -19,30 +19,30 @@ script = """ DYNAMIC_INIT COOKBOOK_CMAKE_FLAGS+=( + -DLLVM_BUILD_UTILS=On + -DLLVM_TOOL_LLVM_COV_BUILD=On + -DLLVM_TOOL_LLVM_PROFDATA_BUILD=On + -DLLVM_INSTALL_UTILS=On + +# the rest of options that shared to clang -DCMAKE_CXX_FLAGS="--std=gnu++11" -DBUILD_SHARED_LIBS=False -DLLVM_LINK_LLVM_DYLIB=On -DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$(realpath "${COOKBOOK_RECIPE}/native.cmake")" -DLLVM_BUILD_EXAMPLES=Off -DLLVM_BUILD_TESTS=Off - -DLLVM_BUILD_UTILS=On -DLLVM_DEFAULT_TARGET_TRIPLE="${TARGET}" -DLLVM_ENABLE_LTO=Off -DLLVM_ENABLE_RTTI=On -DLLVM_ENABLE_THREADS=On -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_INCLUDE_TESTS=Off - -DLLVM_INSTALL_UTILS=On -DLLVM_OPTIMIZED_TABLEGEN=On -DLLVM_TARGET_ARCH="$(echo "${TARGET}" | cut -d - -f1)" - -DLLVM_TARGETS_TO_BUILD="X86;AArch64" - -DLLVM_TOOL_LLVM_COV_BUILD=On - -DLLVM_TOOL_LLVM_PROFDATA_BUILD=On + -DLLVM_TARGETS_TO_BUILD="X86" -DLLVM_TOOLS_INSTALL_DIR=bin -DLLVM_UTILS_INSTALL_DIR=bin - -DLIBCLANG_BUILD_STATIC=On -DUNIX=1 - -DLLVM_ENABLE_PROJECTS="llvm;clang;clang-tools-extra;lld" ) # Native tablegen build fails with too many jobs, limit to 16 @@ -51,31 +51,6 @@ COOKBOOK_SOURCE="$COOKBOOK_SOURCE/llvm" cookbook_cmake """ -# clang library and runtime -[[optional-packages]] -name = "clang" -dependencies = [ ".runtime" ] -files = [ - "usr/bin/clang*", - "usr/libexec/**", - "usr/lib/libclang-cpp.so*", - "usr/lib/libclang.so*", - "usr/lib/clang/**", - "usr/lib/libear/**", - "usr/lib/libscanbuild/**", - "usr/share/clang*/**", -] - -# lld runtime (no library) -[[optional-packages]] -name = "lld" -dependencies = [ ".runtime" ] -files = [ - "usr/bin/*.lld", - "usr/bin/*-ld", - "usr/bin/lld*", -] - # llvm runtime [[optional-packages]] name = "runtime" @@ -83,24 +58,6 @@ files = [ "usr/bin/**", ] -[[optional-packages]] -name = "clang-dev" -dependencies = [ ".clang" ] -files = [ - "usr/include/clang*/**", - "usr/lib/libclang*.a", - "usr/lib/cmake/clang/**", -] - -[[optional-packages]] -name = "lld-dev" -dependencies = [ ".lld" ] -files = [ - "usr/include/lld*/**", - "usr/lib/liblld*.a", - "usr/lib/cmake/lld/**", -] - [[optional-packages]] name = "dev" dependencies = [ ".runtime" ] diff --git a/recipes/wip/dev/lang/zig/recipe.toml b/recipes/wip/dev/lang/zig/recipe.toml index da18502d0..4b74a3044 100644 --- a/recipes/wip/dev/lang/zig/recipe.toml +++ b/recipes/wip/dev/lang/zig/recipe.toml @@ -13,10 +13,10 @@ dependencies = [ dev-dependencies = [ "llvm21.dev", "llvm21.runtime", - "llvm21.clang", - "llvm21.clang-dev", - "llvm21.lld-dev", - "llvm21.lld", + "clang", + "clang.dev", + "clang.lld-dev", + "clang.lld", "host:libarchive", "host:zig", ] diff --git a/recipes/wip/web/firefox-esr/recipe.toml b/recipes/wip/web/firefox-esr/recipe.toml index 84e98394f..336228f3c 100644 --- a/recipes/wip/web/firefox-esr/recipe.toml +++ b/recipes/wip/web/firefox-esr/recipe.toml @@ -27,7 +27,7 @@ dependencies = [ "libxrandr", "libsm", # TODO: Should separate clang library and runtime - "llvm21.clang" + "clang" # "sqlite3", # "nss-nspr", # "startup-notification", @@ -41,7 +41,7 @@ dev-dependencies = [ "host:llvm21", "host:llvm21.dev", "host:llvm21.runtime", - "host:llvm21.clang", + "host:clang", ] script = """ DYNAMIC_INIT From 0f0bae3dccb058cbd2e8df27eed011f1dd225831 Mon Sep 17 00:00:00 2001 From: Bendeguz Pisch Date: Fri, 2 Jan 2026 11:16:51 +0100 Subject: [PATCH 151/407] Add espeak-ng recipe --- .../wip/a11y/espeak-ng/espeak-ng-data/af_dict | Bin 0 -> 121473 bytes .../wip/a11y/espeak-ng/espeak-ng-data/am_dict | Bin 0 -> 63878 bytes .../wip/a11y/espeak-ng/espeak-ng-data/an_dict | Bin 0 -> 6691 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ar_dict | Bin 0 -> 478165 bytes .../wip/a11y/espeak-ng/espeak-ng-data/as_dict | Bin 0 -> 5005 bytes .../wip/a11y/espeak-ng/espeak-ng-data/az_dict | Bin 0 -> 43773 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ba_dict | Bin 0 -> 2098 bytes .../wip/a11y/espeak-ng/espeak-ng-data/be_dict | Bin 0 -> 2652 bytes .../wip/a11y/espeak-ng/espeak-ng-data/bg_dict | Bin 0 -> 87051 bytes .../wip/a11y/espeak-ng/espeak-ng-data/bn_dict | Bin 0 -> 89979 bytes .../a11y/espeak-ng/espeak-ng-data/bpy_dict | Bin 0 -> 5226 bytes .../wip/a11y/espeak-ng/espeak-ng-data/bs_dict | Bin 0 -> 47068 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ca_dict | Bin 0 -> 310331 bytes .../a11y/espeak-ng/espeak-ng-data/chr_dict | Bin 0 -> 2859 bytes .../a11y/espeak-ng/espeak-ng-data/cmn_dict | Bin 0 -> 1566347 bytes .../a11y/espeak-ng/espeak-ng-data/crh_dict | Bin 0 -> 9156 bytes .../wip/a11y/espeak-ng/espeak-ng-data/cs_dict | Bin 0 -> 50455 bytes .../wip/a11y/espeak-ng/espeak-ng-data/cv_dict | Bin 0 -> 1344 bytes .../wip/a11y/espeak-ng/espeak-ng-data/cy_dict | Bin 0 -> 43130 bytes .../wip/a11y/espeak-ng/espeak-ng-data/da_dict | Bin 0 -> 245287 bytes .../wip/a11y/espeak-ng/espeak-ng-data/de_dict | Bin 0 -> 69277 bytes .../wip/a11y/espeak-ng/espeak-ng-data/el_dict | Bin 0 -> 72841 bytes .../wip/a11y/espeak-ng/espeak-ng-data/en_dict | Bin 0 -> 168208 bytes .../wip/a11y/espeak-ng/espeak-ng-data/eo_dict | Bin 0 -> 4666 bytes .../wip/a11y/espeak-ng/espeak-ng-data/es_dict | Bin 0 -> 49285 bytes .../wip/a11y/espeak-ng/espeak-ng-data/et_dict | Bin 0 -> 44263 bytes .../wip/a11y/espeak-ng/espeak-ng-data/eu_dict | Bin 0 -> 48841 bytes .../wip/a11y/espeak-ng/espeak-ng-data/fa_dict | Bin 0 -> 318802 bytes .../wip/a11y/espeak-ng/espeak-ng-data/fi_dict | Bin 0 -> 43928 bytes .../wip/a11y/espeak-ng/espeak-ng-data/fr_dict | Bin 0 -> 63727 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ga_dict | Bin 0 -> 52673 bytes .../wip/a11y/espeak-ng/espeak-ng-data/gd_dict | Bin 0 -> 49121 bytes .../wip/a11y/espeak-ng/espeak-ng-data/gn_dict | Bin 0 -> 3248 bytes .../a11y/espeak-ng/espeak-ng-data/grc_dict | Bin 0 -> 3433 bytes .../wip/a11y/espeak-ng/espeak-ng-data/gu_dict | Bin 0 -> 82480 bytes .../a11y/espeak-ng/espeak-ng-data/hak_dict | Bin 0 -> 3335 bytes .../a11y/espeak-ng/espeak-ng-data/haw_dict | Bin 0 -> 2443 bytes .../wip/a11y/espeak-ng/espeak-ng-data/he_dict | Bin 0 -> 10697 bytes .../wip/a11y/espeak-ng/espeak-ng-data/hi_dict | Bin 0 -> 92143 bytes .../wip/a11y/espeak-ng/espeak-ng-data/hr_dict | Bin 0 -> 49388 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ht_dict | Bin 0 -> 1803 bytes .../wip/a11y/espeak-ng/espeak-ng-data/hu_dict | Bin 0 -> 181339 bytes .../wip/a11y/espeak-ng/espeak-ng-data/hy_dict | Bin 0 -> 62263 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ia_dict | Bin 0 -> 331275 bytes .../wip/a11y/espeak-ng/espeak-ng-data/id_dict | Bin 0 -> 43458 bytes .../a11y/espeak-ng/espeak-ng-data/intonations | Bin 0 -> 2312 bytes .../wip/a11y/espeak-ng/espeak-ng-data/io_dict | Bin 0 -> 2165 bytes .../wip/a11y/espeak-ng/espeak-ng-data/is_dict | Bin 0 -> 44354 bytes .../wip/a11y/espeak-ng/espeak-ng-data/it_dict | Bin 0 -> 154408 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ja_dict | Bin 0 -> 47652 bytes .../a11y/espeak-ng/espeak-ng-data/jbo_dict | Bin 0 -> 2243 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ka_dict | Bin 0 -> 87775 bytes .../wip/a11y/espeak-ng/espeak-ng-data/kk_dict | Bin 0 -> 1859 bytes .../wip/a11y/espeak-ng/espeak-ng-data/kl_dict | Bin 0 -> 2838 bytes .../wip/a11y/espeak-ng/espeak-ng-data/kn_dict | Bin 0 -> 87828 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ko_dict | Bin 0 -> 47523 bytes .../a11y/espeak-ng/espeak-ng-data/kok_dict | Bin 0 -> 6394 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ku_dict | Bin 0 -> 2265 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ky_dict | Bin 0 -> 64977 bytes .../wip/a11y/espeak-ng/espeak-ng-data/la_dict | Bin 0 -> 3806 bytes .../a11y/espeak-ng/espeak-ng-data/lang/aav/vi | 8 + .../espeak-ng-data/lang/aav/vi-VN-x-central | 9 + .../espeak-ng-data/lang/aav/vi-VN-x-south | 9 + .../a11y/espeak-ng/espeak-ng-data/lang/art/eo | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/art/ia | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/art/io | 5 + .../espeak-ng/espeak-ng-data/lang/art/jbo | 4 + .../espeak-ng/espeak-ng-data/lang/art/lfn | 8 + .../espeak-ng/espeak-ng-data/lang/art/piqd | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/art/py | 7 + .../espeak-ng/espeak-ng-data/lang/art/qdb | 6 + .../espeak-ng/espeak-ng-data/lang/art/qya | 4 + .../espeak-ng/espeak-ng-data/lang/art/sjn | 4 + .../espeak-ng/espeak-ng-data/lang/art/xex | 10 + .../espeak-ng/espeak-ng-data/lang/azc/nci | 6 + .../a11y/espeak-ng/espeak-ng-data/lang/bat/lt | 2 + .../espeak-ng/espeak-ng-data/lang/bat/ltg | 12 + .../a11y/espeak-ng/espeak-ng-data/lang/bat/lv | 9 + .../a11y/espeak-ng/espeak-ng-data/lang/bnt/sw | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/bnt/tn | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/ccs/ka | 3 + .../a11y/espeak-ng/espeak-ng-data/lang/cel/cy | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/cel/ga | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/cel/gd | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/cus/om | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/dra/kn | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/dra/ml | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/dra/ta | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/dra/te | 7 + .../a11y/espeak-ng/espeak-ng-data/lang/esx/kl | 3 + .../wip/a11y/espeak-ng/espeak-ng-data/lang/eu | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/gmq/da | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/gmq/fo | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/gmq/is | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/gmq/nb | 7 + .../a11y/espeak-ng/espeak-ng-data/lang/gmq/sv | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/gmw/af | 8 + .../a11y/espeak-ng/espeak-ng-data/lang/gmw/de | 3 + .../a11y/espeak-ng/espeak-ng-data/lang/gmw/en | 8 + .../espeak-ng/espeak-ng-data/lang/gmw/en-029 | 20 + .../espeak-ng-data/lang/gmw/en-GB-scotland | 17 + .../espeak-ng-data/lang/gmw/en-GB-x-gbclan | 14 + .../espeak-ng-data/lang/gmw/en-GB-x-gbcwmd | 12 + .../espeak-ng-data/lang/gmw/en-GB-x-rp | 15 + .../espeak-ng/espeak-ng-data/lang/gmw/en-Shaw | 5 + .../espeak-ng/espeak-ng-data/lang/gmw/en-US | 15 + .../espeak-ng-data/lang/gmw/en-US-nyc | 14 + .../a11y/espeak-ng/espeak-ng-data/lang/gmw/lb | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/gmw/nl | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/grk/el | 2 + .../espeak-ng/espeak-ng-data/lang/grk/grc | 6 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/as | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/bn | 2 + .../espeak-ng/espeak-ng-data/lang/inc/bpy | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/gu | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/hi | 2 + .../espeak-ng/espeak-ng-data/lang/inc/kok | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/mr | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/ne | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/or | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/pa | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/sd | 3 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/si | 6 + .../a11y/espeak-ng/espeak-ng-data/lang/inc/ur | 7 + .../a11y/espeak-ng/espeak-ng-data/lang/ine/hy | 3 + .../espeak-ng/espeak-ng-data/lang/ine/hyw | 24 + .../a11y/espeak-ng/espeak-ng-data/lang/ine/sq | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/ira/fa | 4 + .../espeak-ng/espeak-ng-data/lang/ira/fa-Latn | 8 + .../a11y/espeak-ng/espeak-ng-data/lang/ira/ku | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/ira/ps | 4 + .../espeak-ng/espeak-ng-data/lang/iro/chr | 27 + .../a11y/espeak-ng/espeak-ng-data/lang/itc/la | 12 + .../a11y/espeak-ng/espeak-ng-data/lang/jpx/ja | 5 + .../wip/a11y/espeak-ng/espeak-ng-data/lang/ko | 5 + .../espeak-ng/espeak-ng-data/lang/map/haw | 3 + .../espeak-ng/espeak-ng-data/lang/miz/mto | 8 + .../espeak-ng/espeak-ng-data/lang/myn/quc | 6 + .../a11y/espeak-ng/espeak-ng-data/lang/poz/id | 7 + .../a11y/espeak-ng/espeak-ng-data/lang/poz/mi | 21 + .../a11y/espeak-ng/espeak-ng-data/lang/poz/ms | 14 + .../wip/a11y/espeak-ng/espeak-ng-data/lang/qu | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/roa/an | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/roa/ca | 4 + .../espeak-ng/espeak-ng-data/lang/roa/ca-ba | 7 + .../espeak-ng/espeak-ng-data/lang/roa/ca-nw | 6 + .../espeak-ng/espeak-ng-data/lang/roa/ca-va | 7 + .../a11y/espeak-ng/espeak-ng-data/lang/roa/es | 4 + .../espeak-ng/espeak-ng-data/lang/roa/es-419 | 11 + .../a11y/espeak-ng/espeak-ng-data/lang/roa/fr | 6 + .../espeak-ng/espeak-ng-data/lang/roa/fr-BE | 8 + .../espeak-ng/espeak-ng-data/lang/roa/fr-CH | 6 + .../a11y/espeak-ng/espeak-ng-data/lang/roa/ht | 8 + .../a11y/espeak-ng/espeak-ng-data/lang/roa/it | 7 + .../espeak-ng/espeak-ng-data/lang/roa/pap | 7 + .../a11y/espeak-ng/espeak-ng-data/lang/roa/pt | 7 + .../espeak-ng/espeak-ng-data/lang/roa/pt-BR | 7 + .../a11y/espeak-ng/espeak-ng-data/lang/roa/ro | 2 + .../espeak-ng/espeak-ng-data/lang/roa/rup | 6 + .../a11y/espeak-ng/espeak-ng-data/lang/sai/gn | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/sem/am | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/sem/ar | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/sem/he | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/sem/mt | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/sem/ti | 5 + .../espeak-ng/espeak-ng-data/lang/sit/cmn | 36 + .../espeak-ng-data/lang/sit/cmn-Latn-pinyin | 11 + .../espeak-ng/espeak-ng-data/lang/sit/hak | 6 + .../a11y/espeak-ng/espeak-ng-data/lang/sit/my | 3 + .../espeak-ng/espeak-ng-data/lang/sit/yue | 13 + .../espeak-ng-data/lang/sit/yue-Latn-jyutping | 13 + .../espeak-ng/espeak-ng-data/lang/tai/shn | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/tai/th | 3 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/az | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/ba | 2 + .../espeak-ng/espeak-ng-data/lang/trk/crh | 6 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/cv | 3 + .../espeak-ng/espeak-ng-data/lang/trk/kaa | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/kk | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/ky | 4 + .../espeak-ng/espeak-ng-data/lang/trk/nog | 3 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/tk | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/tr | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/tt | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/ug | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/trk/uz | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/urj/et | 10 + .../a11y/espeak-ng/espeak-ng-data/lang/urj/fi | 11 + .../a11y/espeak-ng/espeak-ng-data/lang/urj/hu | 7 + .../espeak-ng/espeak-ng-data/lang/urj/smj | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/xgn/mn | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/zle/be | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/zle/ru | 4 + .../espeak-ng/espeak-ng-data/lang/zle/ru-LV | 16 + .../espeak-ng/espeak-ng-data/lang/zle/ru-cl | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/zle/uk | 7 + .../a11y/espeak-ng/espeak-ng-data/lang/zls/bg | 5 + .../a11y/espeak-ng/espeak-ng-data/lang/zls/bs | 14 + .../a11y/espeak-ng/espeak-ng-data/lang/zls/hr | 15 + .../a11y/espeak-ng/espeak-ng-data/lang/zls/mk | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/zls/sl | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/zls/sr | 13 + .../a11y/espeak-ng/espeak-ng-data/lang/zlw/cs | 2 + .../a11y/espeak-ng/espeak-ng-data/lang/zlw/pl | 4 + .../a11y/espeak-ng/espeak-ng-data/lang/zlw/sk | 2 + .../wip/a11y/espeak-ng/espeak-ng-data/lb_dict | Bin 0 -> 687931 bytes .../a11y/espeak-ng/espeak-ng-data/lfn_dict | Bin 0 -> 2793 bytes .../wip/a11y/espeak-ng/espeak-ng-data/lt_dict | Bin 0 -> 49890 bytes .../wip/a11y/espeak-ng/espeak-ng-data/lv_dict | Bin 0 -> 66337 bytes .../wip/a11y/espeak-ng/espeak-ng-data/mi_dict | Bin 0 -> 1346 bytes .../wip/a11y/espeak-ng/espeak-ng-data/mk_dict | Bin 0 -> 63859 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ml_dict | Bin 0 -> 92345 bytes .../wip/a11y/espeak-ng/espeak-ng-data/mn_dict | Bin 0 -> 15707 bytes .../wip/a11y/espeak-ng/espeak-ng-data/mr_dict | Bin 0 -> 87391 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ms_dict | Bin 0 -> 53541 bytes .../wip/a11y/espeak-ng/espeak-ng-data/mt_dict | Bin 0 -> 4384 bytes .../a11y/espeak-ng/espeak-ng-data/mto_dict | Bin 0 -> 3960 bytes .../a11y/espeak-ng/espeak-ng-data/nci_dict | Bin 0 -> 1534 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ne_dict | Bin 0 -> 95377 bytes .../wip/a11y/espeak-ng/espeak-ng-data/nl_dict | Bin 0 -> 65396 bytes .../wip/a11y/espeak-ng/espeak-ng-data/no_dict | Bin 0 -> 4178 bytes .../a11y/espeak-ng/espeak-ng-data/nog_dict | Bin 0 -> 3294 bytes .../wip/a11y/espeak-ng/espeak-ng-data/om_dict | Bin 0 -> 2302 bytes .../wip/a11y/espeak-ng/espeak-ng-data/or_dict | Bin 0 -> 89246 bytes .../wip/a11y/espeak-ng/espeak-ng-data/pa_dict | Bin 0 -> 79953 bytes .../a11y/espeak-ng/espeak-ng-data/pap_dict | Bin 0 -> 2128 bytes .../a11y/espeak-ng/espeak-ng-data/phondata | Bin 0 -> 554740 bytes .../espeak-ng-data/phondata-manifest | 989 ++++++++++++++++++ .../a11y/espeak-ng/espeak-ng-data/phonindex | Bin 0 -> 46782 bytes .../wip/a11y/espeak-ng/espeak-ng-data/phontab | Bin 0 -> 61228 bytes .../a11y/espeak-ng/espeak-ng-data/piqd_dict | Bin 0 -> 1710 bytes .../wip/a11y/espeak-ng/espeak-ng-data/pl_dict | Bin 0 -> 76620 bytes .../wip/a11y/espeak-ng/espeak-ng-data/pt_dict | Bin 0 -> 76389 bytes .../wip/a11y/espeak-ng/espeak-ng-data/py_dict | Bin 0 -> 2409 bytes .../a11y/espeak-ng/espeak-ng-data/qdb_dict | Bin 0 -> 3028 bytes .../wip/a11y/espeak-ng/espeak-ng-data/qu_dict | Bin 0 -> 1919 bytes .../a11y/espeak-ng/espeak-ng-data/quc_dict | Bin 0 -> 1450 bytes .../a11y/espeak-ng/espeak-ng-data/qya_dict | Bin 0 -> 1939 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ro_dict | Bin 0 -> 68538 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ru_dict | Bin 0 -> 8733078 bytes .../a11y/espeak-ng/espeak-ng-data/rup_dict | Bin 0 -> 3475 bytes .../wip/a11y/espeak-ng/espeak-ng-data/sd_dict | Bin 0 -> 59928 bytes .../a11y/espeak-ng/espeak-ng-data/shn_dict | Bin 0 -> 88172 bytes .../wip/a11y/espeak-ng/espeak-ng-data/si_dict | Bin 0 -> 85384 bytes .../a11y/espeak-ng/espeak-ng-data/sjn_dict | Bin 0 -> 1783 bytes .../wip/a11y/espeak-ng/espeak-ng-data/sk_dict | Bin 0 -> 50002 bytes .../wip/a11y/espeak-ng/espeak-ng-data/sl_dict | Bin 0 -> 45047 bytes .../a11y/espeak-ng/espeak-ng-data/smj_dict | Bin 0 -> 35095 bytes .../wip/a11y/espeak-ng/espeak-ng-data/sq_dict | Bin 0 -> 45003 bytes .../wip/a11y/espeak-ng/espeak-ng-data/sr_dict | Bin 0 -> 46832 bytes .../wip/a11y/espeak-ng/espeak-ng-data/sv_dict | Bin 0 -> 47836 bytes .../wip/a11y/espeak-ng/espeak-ng-data/sw_dict | Bin 0 -> 47804 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ta_dict | Bin 0 -> 209553 bytes .../wip/a11y/espeak-ng/espeak-ng-data/te_dict | Bin 0 -> 94837 bytes .../wip/a11y/espeak-ng/espeak-ng-data/th_dict | Bin 0 -> 2301 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ti_dict | Bin 0 -> 57920 bytes .../wip/a11y/espeak-ng/espeak-ng-data/tk_dict | Bin 0 -> 20868 bytes .../wip/a11y/espeak-ng/espeak-ng-data/tn_dict | Bin 0 -> 3072 bytes .../wip/a11y/espeak-ng/espeak-ng-data/tr_dict | Bin 0 -> 46793 bytes .../wip/a11y/espeak-ng/espeak-ng-data/tt_dict | Bin 0 -> 2121 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ug_dict | Bin 0 -> 2070 bytes .../wip/a11y/espeak-ng/espeak-ng-data/uk_dict | Bin 0 -> 3492 bytes .../wip/a11y/espeak-ng/espeak-ng-data/ur_dict | Bin 0 -> 133556 bytes .../wip/a11y/espeak-ng/espeak-ng-data/uz_dict | Bin 0 -> 2540 bytes .../wip/a11y/espeak-ng/espeak-ng-data/vi_dict | Bin 0 -> 52608 bytes .../espeak-ng/espeak-ng-data/voices/!v/Alex | 10 + .../espeak-ng/espeak-ng-data/voices/!v/Alicia | 22 + .../espeak-ng/espeak-ng-data/voices/!v/Andrea | 20 + .../espeak-ng/espeak-ng-data/voices/!v/Andy | 19 + .../espeak-ng/espeak-ng-data/voices/!v/Annie | 17 + .../espeak-ng-data/voices/!v/AnxiousAndy | 19 + .../espeak-ng-data/voices/!v/Demonic | 65 ++ .../espeak-ng/espeak-ng-data/voices/!v/Denis | 19 + .../espeak-ng/espeak-ng-data/voices/!v/Diogo | 22 + .../espeak-ng/espeak-ng-data/voices/!v/Gene | 17 + .../espeak-ng/espeak-ng-data/voices/!v/Gene2 | 17 + .../espeak-ng-data/voices/!v/Henrique | 22 + .../espeak-ng/espeak-ng-data/voices/!v/Hugo | 22 + .../espeak-ng/espeak-ng-data/voices/!v/Jacky | 17 + .../espeak-ng/espeak-ng-data/voices/!v/Lee | 20 + .../espeak-ng/espeak-ng-data/voices/!v/Marco | 23 + .../espeak-ng/espeak-ng-data/voices/!v/Mario | 17 + .../espeak-ng-data/voices/!v/Michael | 17 + .../espeak-ng/espeak-ng-data/voices/!v/Mike | 7 + .../espeak-ng-data/voices/!v/Mr serious | 50 + .../espeak-ng/espeak-ng-data/voices/!v/Nguyen | 16 + .../espeak-ng/espeak-ng-data/voices/!v/Reed | 15 + .../espeak-ng-data/voices/!v/RicishayMax | 16 + .../espeak-ng-data/voices/!v/RicishayMax2 | 25 + .../espeak-ng-data/voices/!v/RicishayMax3 | 25 + .../espeak-ng/espeak-ng-data/voices/!v/Storm | 23 + .../espeak-ng/espeak-ng-data/voices/!v/Tweaky | 50 + .../espeak-ng-data/voices/!v/UniRobot | 19 + .../espeak-ng/espeak-ng-data/voices/!v/adam | 6 + .../espeak-ng/espeak-ng-data/voices/!v/anika | 25 + .../espeak-ng-data/voices/!v/anikaRobot | 26 + .../espeak-ng-data/voices/!v/announcer | 17 + .../espeak-ng-data/voices/!v/antonio | 21 + .../espeak-ng/espeak-ng-data/voices/!v/aunty | 19 + .../espeak-ng-data/voices/!v/belinda | 20 + .../espeak-ng-data/voices/!v/benjamin | 11 + .../espeak-ng/espeak-ng-data/voices/!v/boris | 15 + .../espeak-ng/espeak-ng-data/voices/!v/caleb | 5 + .../espeak-ng/espeak-ng-data/voices/!v/croak | 11 + .../espeak-ng/espeak-ng-data/voices/!v/david | 8 + .../espeak-ng/espeak-ng-data/voices/!v/ed | 17 + .../espeak-ng/espeak-ng-data/voices/!v/edward | 10 + .../espeak-ng-data/voices/!v/edward2 | 10 + .../espeak-ng/espeak-ng-data/voices/!v/f1 | 18 + .../espeak-ng/espeak-ng-data/voices/!v/f2 | 21 + .../espeak-ng/espeak-ng-data/voices/!v/f3 | 22 + .../espeak-ng/espeak-ng-data/voices/!v/f4 | 18 + .../espeak-ng/espeak-ng-data/voices/!v/f5 | 23 + .../espeak-ng/espeak-ng-data/voices/!v/fast | 7 + .../espeak-ng-data/voices/!v/grandma | 17 + .../espeak-ng-data/voices/!v/grandpa | 14 + .../espeak-ng-data/voices/!v/gustave | 17 + .../espeak-ng/espeak-ng-data/voices/!v/ian | 51 + .../espeak-ng/espeak-ng-data/voices/!v/iven | 14 + .../espeak-ng/espeak-ng-data/voices/!v/iven2 | 15 + .../espeak-ng/espeak-ng-data/voices/!v/iven3 | 14 + .../espeak-ng/espeak-ng-data/voices/!v/iven4 | 14 + .../espeak-ng/espeak-ng-data/voices/!v/john | 50 + .../espeak-ng-data/voices/!v/kaukovalta | 16 + .../espeak-ng/espeak-ng-data/voices/!v/klatt | 4 + .../espeak-ng/espeak-ng-data/voices/!v/klatt2 | 4 + .../espeak-ng/espeak-ng-data/voices/!v/klatt3 | 4 + .../espeak-ng/espeak-ng-data/voices/!v/klatt4 | 4 + .../espeak-ng/espeak-ng-data/voices/!v/klatt5 | 4 + .../espeak-ng/espeak-ng-data/voices/!v/klatt6 | 4 + .../espeak-ng/espeak-ng-data/voices/!v/linda | 20 + .../espeak-ng/espeak-ng-data/voices/!v/m1 | 20 + .../espeak-ng/espeak-ng-data/voices/!v/m2 | 15 + .../espeak-ng/espeak-ng-data/voices/!v/m3 | 17 + .../espeak-ng/espeak-ng-data/voices/!v/m4 | 17 + .../espeak-ng/espeak-ng-data/voices/!v/m5 | 15 + .../espeak-ng/espeak-ng-data/voices/!v/m6 | 13 + .../espeak-ng/espeak-ng-data/voices/!v/m7 | 17 + .../espeak-ng/espeak-ng-data/voices/!v/m8 | 16 + .../espeak-ng-data/voices/!v/marcelo | 17 + .../espeak-ng/espeak-ng-data/voices/!v/max | 15 + .../espeak-ng/espeak-ng-data/voices/!v/michel | 22 + .../espeak-ng/espeak-ng-data/voices/!v/miguel | 22 + .../espeak-ng/espeak-ng-data/voices/!v/mike2 | 12 + .../espeak-ng-data/voices/!v/norbert | 50 + .../espeak-ng/espeak-ng-data/voices/!v/pablo | 52 + .../espeak-ng/espeak-ng-data/voices/!v/paul | 17 + .../espeak-ng/espeak-ng-data/voices/!v/pedro | 23 + .../espeak-ng/espeak-ng-data/voices/!v/quincy | 20 + .../espeak-ng/espeak-ng-data/voices/!v/rob | 17 + .../espeak-ng/espeak-ng-data/voices/!v/robert | 17 + .../espeak-ng-data/voices/!v/robosoft | 26 + .../espeak-ng-data/voices/!v/robosoft2 | 26 + .../espeak-ng-data/voices/!v/robosoft3 | 26 + .../espeak-ng-data/voices/!v/robosoft4 | 25 + .../espeak-ng-data/voices/!v/robosoft5 | 25 + .../espeak-ng-data/voices/!v/robosoft6 | 15 + .../espeak-ng-data/voices/!v/robosoft7 | 25 + .../espeak-ng-data/voices/!v/robosoft8 | 16 + .../espeak-ng/espeak-ng-data/voices/!v/sandro | 25 + .../espeak-ng/espeak-ng-data/voices/!v/shelby | 18 + .../espeak-ng/espeak-ng-data/voices/!v/steph | 21 + .../espeak-ng/espeak-ng-data/voices/!v/steph2 | 21 + .../espeak-ng/espeak-ng-data/voices/!v/steph3 | 22 + .../espeak-ng/espeak-ng-data/voices/!v/travis | 23 + .../espeak-ng/espeak-ng-data/voices/!v/victor | 16 + .../espeak-ng-data/voices/!v/whisper | 13 + .../espeak-ng-data/voices/!v/whisperf | 24 + .../espeak-ng/espeak-ng-data/voices/!v/zac | 15 + .../a11y/espeak-ng/espeak-ng-data/yue_dict | Bin 0 -> 563571 bytes recipes/wip/a11y/espeak-ng/recipe.toml | 16 + 371 files changed, 3964 insertions(+) create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/af_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/am_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/an_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ar_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/as_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/az_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ba_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/be_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/bg_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/bn_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/bpy_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/bs_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ca_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/chr_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/cmn_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/crh_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/cs_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/cv_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/cy_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/da_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/de_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/el_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/en_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/eo_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/es_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/et_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/eu_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/fa_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/fi_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/fr_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ga_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/gd_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/gn_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/grc_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/gu_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/hak_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/haw_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/he_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/hi_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/hr_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ht_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/hu_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/hy_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ia_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/id_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/intonations create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/io_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/is_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/it_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ja_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/jbo_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ka_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/kk_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/kl_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/kn_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ko_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/kok_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ku_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ky_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/la_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/aav/vi create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/aav/vi-VN-x-central create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/aav/vi-VN-x-south create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/eo create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/ia create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/io create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/jbo create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/lfn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/piqd create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/py create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/qdb create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/qya create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/sjn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/art/xex create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/azc/nci create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/bat/lt create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/bat/ltg create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/bat/lv create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/bnt/sw create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/bnt/tn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/ccs/ka create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/cel/cy create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/cel/ga create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/cel/gd create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/cus/om create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/dra/kn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/dra/ml create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/dra/ta create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/dra/te create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/esx/kl create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/eu create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmq/da create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmq/fo create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmq/is create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmq/nb create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmq/sv create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/af create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/de create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/en create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/en-029 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/en-GB-scotland create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/en-GB-x-gbclan create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/en-GB-x-gbcwmd create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/en-GB-x-rp create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/en-Shaw create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/en-US create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/en-US-nyc create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/lb create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/gmw/nl create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/grk/el create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/grk/grc create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/as create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/bn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/bpy create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/gu create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/hi create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/kok create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/mr create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/ne create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/or create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/pa create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/sd create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/si create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/inc/ur create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/ine/hy create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/ine/hyw create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/ine/sq create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/ira/fa create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/ira/fa-Latn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/ira/ku create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/ira/ps create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/iro/chr create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/itc/la create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/jpx/ja create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/ko create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/map/haw create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/miz/mto create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/myn/quc create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/poz/id create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/poz/mi create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/poz/ms create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/qu create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/an create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/ca create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/ca-ba create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/ca-nw create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/ca-va create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/es create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/es-419 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/fr create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/fr-BE create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/fr-CH create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/ht create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/it create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/pap create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/pt create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/pt-BR create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/ro create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/roa/rup create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sai/gn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sem/am create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sem/ar create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sem/he create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sem/mt create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sem/ti create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sit/cmn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sit/cmn-Latn-pinyin create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sit/hak create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sit/my create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sit/yue create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/sit/yue-Latn-jyutping create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/tai/shn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/tai/th create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/az create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/ba create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/crh create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/cv create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/kaa create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/kk create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/ky create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/nog create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/tk create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/tr create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/tt create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/ug create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/trk/uz create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/urj/et create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/urj/fi create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/urj/hu create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/urj/smj create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/xgn/mn create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zle/be create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zle/ru create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zle/ru-LV create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zle/ru-cl create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zle/uk create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zls/bg create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zls/bs create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zls/hr create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zls/mk create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zls/sl create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zls/sr create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zlw/cs create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zlw/pl create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lang/zlw/sk create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lb_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lfn_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lt_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/lv_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/mi_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/mk_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ml_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/mn_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/mr_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ms_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/mt_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/mto_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/nci_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ne_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/nl_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/no_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/nog_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/om_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/or_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/pa_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/pap_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/phondata create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/phondata-manifest create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/phonindex create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/phontab create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/piqd_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/pl_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/pt_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/py_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/qdb_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/qu_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/quc_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/qya_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ro_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ru_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/rup_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/sd_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/shn_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/si_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/sjn_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/sk_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/sl_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/smj_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/sq_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/sr_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/sv_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/sw_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ta_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/te_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/th_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ti_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/tk_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/tn_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/tr_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/tt_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ug_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/uk_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/ur_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/uz_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/vi_dict create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Alex create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Alicia create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Andrea create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Andy create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Annie create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/AnxiousAndy create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Demonic create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Denis create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Diogo create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Gene create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Gene2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Henrique create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Hugo create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Jacky create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Lee create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Marco create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Mario create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Michael create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Mike create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Mr serious create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Nguyen create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Reed create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/RicishayMax create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/RicishayMax2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/RicishayMax3 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Storm create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/Tweaky create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/UniRobot create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/adam create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/anika create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/anikaRobot create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/announcer create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/antonio create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/aunty create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/belinda create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/benjamin create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/boris create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/caleb create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/croak create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/david create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/ed create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/edward create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/edward2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/f1 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/f2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/f3 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/f4 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/f5 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/fast create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/grandma create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/grandpa create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/gustave create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/ian create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/iven create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/iven2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/iven3 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/iven4 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/john create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/kaukovalta create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/klatt create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/klatt2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/klatt3 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/klatt4 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/klatt5 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/klatt6 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/linda create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/m1 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/m2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/m3 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/m4 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/m5 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/m6 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/m7 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/m8 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/marcelo create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/max create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/michel create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/miguel create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/mike2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/norbert create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/pablo create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/paul create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/pedro create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/quincy create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/rob create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/robert create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/robosoft create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/robosoft2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/robosoft3 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/robosoft4 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/robosoft5 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/robosoft6 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/robosoft7 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/robosoft8 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/sandro create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/shelby create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/steph create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/steph2 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/steph3 create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/travis create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/victor create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/whisper create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/whisperf create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/voices/!v/zac create mode 100644 recipes/wip/a11y/espeak-ng/espeak-ng-data/yue_dict create mode 100644 recipes/wip/a11y/espeak-ng/recipe.toml diff --git a/recipes/wip/a11y/espeak-ng/espeak-ng-data/af_dict b/recipes/wip/a11y/espeak-ng/espeak-ng-data/af_dict new file mode 100644 index 0000000000000000000000000000000000000000..b6259eff5157e3f14491217ab8838d70be760ddb GIT binary patch literal 121473 zcmZ_1Yjj)XwKlpOBq2MJEn89ut+V%vWKp*y=z`gDIL@~v*^-wU*~roo4cgv=%2;uP zWl8Ab5OTh+b`ler_%0iA<5Hm9DfbrI(%LZ&ZP&i>VICAe!V;t&m~g#@}t>w zVTb(xBk@Eo5$EG6UiypM_TT9KSEM`S|J-o@NG!F3m;UdjyZ?Q|-SQy5?`~-bH^2P$ zpSt>LY<rZ-YS}#}k>5j95yWCz|C)aWF1YeSd`_lJJFc&YRXnOQt zd2-)NobS80IzH*{dpAr@Ce00Ru9D{Z_p&j6FHy_yt=@U#TmQEWZ4GikXxZ{VuBC1~WV8gH98u9)*^O^+q)|^*-*}K0a?)JF4RBpA9=Qv|`A0IS2B5hU^MwgFTG-(epR;*V;=3Uv}k&i+sbYAyYxp5Uw>{1yKH8MU+Ym792PvH z(buLMcihc+%!1j8S##VL!EOGl(W8vmY^GL^DsQ#ik&a@J{d%=xwZ@}zYoZvBw#%^G ztFSm#Ift3!>b-{8cur~{m zc&ehH^glA#srBt$nrQd9jL8^hZS>WOOZXwQnpCY0zlGB%9vsZ%RkpOlO7Ge$K4r+@ zA(2dxQ@Ra!QKPR_zu4cjyvyvc-m5a(Ih{|}sI)CC`*VJ+bHt99*L&}M!7I!;(pUiy zUFX}o{*^jBAr?$R-l4@4G-Dyl-EOTMgqKV$M{ch2`BjOj+wy{4HPznz3{6zPcK- zBL%v0KjiLdl%?&Zr(cw1ZYGBP@i2t)NIcK)m;Sz&Jw2Pd6kU^soF8kbt+Cj&rYKn6iWh5r#)&4wS7Aoi zEkfYxXNrq|-y4jk`pw>us#Oz7a`iQL+-COJGNvflgj1|!?gUNtilwb#g@}V<#%aZY z+xgzHe}+ZVgd=*d3Uh4`BKP?G!EYiq_Gp#6br+`0sXGIUW7yZVH9v`3Gno3Vp9J&^ zYAv^8>kSlGI4%<+mySbQZJhXKUw=u{qIcmrT5n)1)N!FdW2$#RY^bk(({TZZ>uT<_ zIaSzzKjd^?UYrmvyOSnWQe$f68odfvcgtn7UzH13?%4Dw7H5Z@7N@r6F1A&E2>D=m z|F4P*?nb;vZCG_hv`%-%S?|G$S)*1{-bRnb=1Ro;s=U+6$gXnRNDTbz<_c5Klt`c^ z6T@*nmoE&)Q+aNirfaWwcu>@ughLReJ67&<8JiS#=K+lkBESS0(Bw0$Gzg6i8K*yG zQsw-Qa+=Pz2qcmukLtb6;a~0z{)g6))I{iNf5~ezoHQK*M_~&d!a}I~l>HHSzfG?C6*eBXSr>)=XmkBO&4}UzxVfrcAV|q;c4pDg}ySJ z?QQla?WVjFy1&V1w0Gap$yuVRe9@xOI&pQgSX6E|20Rd~f%REeH07vE*_cB3`!1Wi z-rKJC?y@;@9<3va&DR*7G1~lT2gHWb-9h{E>~2n|Q?2&vLTYWz?mEa<)ggNw?F(;U z+;7wMTQtyUTwQ0|717gb<#%mV$^^6{1@1)*6>^s1|c|*}&qp9tF=> zUguN%W84gz>am7 z=dSv0UN;#u)^;$4Z}9CHdtgxSvYU6Q%-E7bzu~i%i;_SlTO^&gshBOIatD$iP3^hh z)fq+SGPtaV>*gbdmZ)u$Ih3?+f;jR8#4mzJmZRDzw2-xxWSuSixpI30grx&Eq#uW{ z<$_jhxh)%p{rba&efz+H+_ud=&EZZ(j%@<4G~{3Z`sV>RUb}Z)Cw`}ND_2B;ulEU| zUZYoOf=DGZ$>)l68?JG-wB|n^#T$&B+r2t>&YHJk@cBBf?_R5w=WegPbb13fG8H`# zOLE&(?!6)g)C|g>oUU>m4~FJ3s#H$m)sqt&&mGM1DWX1O@;_A1$f_e92gBjU7CiLS z2RED^h-ZiPCF1#9_8=_{aqX%1Z@6Z|c_XpJ8R`5;Jf0m%z>Z*h=B^DH8uTK)2L)8sNDS#GJCdP_n69is!!SK-)25*6H7Wh zS2U#rCoD9-3i_1nPuu!Y!?$bB6#Ned)J?rtEq-IP39wwD$ZmE2JZY!R}id1 zd~>Jm>asHxt%Kti&^k#$^^w9(#&bNkRekx{WAEbMA4Ze0p?mqBSTc4X0g39}#=E!v zylBda4cJno_xiH&L<%-6cYFDskL7zHQxd~zZriQy{SPGl(zbb#oLXp+k#u}84h0Zr z5ejY_W11Q1++bpOAU-UgxQ*8QH`V2Vu@%d3+qUBH{9Dz-aegpH+mCk0%gr- ztK`MDm8f-6qV8dty6pHC%vdHaF|ABnBDqXkI+~M7OS?}dZH2=(P?l^2nX;ABGGW4$B^9nqJTxo$T?r6&LKL5wJdp z!dbBKW~Xl6zeD@e$$e$(f-&YF!OS0(m+xRYpNB-gt^EGViDW*;ZR0BI{k!rFg=`|9 zD1d(q-NH4c5I$-!wZe?U7VsmS0XuckAL>$gG~GSnnYg3NK$cm{bz`g05dC-?nmWEd>~!Xn@(p3clN}x ziC8MWGoDDo?!y2z=XH@#PuI9&Md_*c2CvmdY}P_QnUGv%U4K&^L^hvDB_1hkoY!me z`*V4EAb4Kb#tVvXzEME`mP~_rlp&hU?Z}=A-{eoks(%q^=|4Zu5_CPivvzy68mXO`Q`7FACrUx zWDlnYyeS?1Sv+c4iM&X$la)T(AJrDt0;N_-xU&v zjrybN1jY0aL~w;9^0a$mgR!AlZkYT7jUtx&QQjQYS~=l1I7LeVM@{oZm(whyqX_2} z9Tw=ER&h-o=620WTZIATGvJ%t{#Y_u;Tw(={mUn+BA8FW zY)J=VPMgMy@P+hmPi^%#2?xZ zF9@Cx*+GpSW$@7ko9Yo0*O!SUvb>?&6|QY}c@%K%v5{3d0YavmUz`m*-=lC_Os)MY z3u0ap7t&ZV?o*mG;GN6c@~52&RAqI}dV%iAH+otMZ(4567@cD>`02+>=fYrVrpT^g$?Dy7$DXsK9t2EO*G5b@b4w*jh*pAK1P%5i6;{X zH{%^Xh?_{;GHkDLyyGWjvb-+c;LAc+#rbd{0n38IGTm{o1&OMP7?H1J^9N%>D8b#S z`5)F1C&V~K1vK{uIxa-DFvd8o;=z1!(5hnRa7ul@*KZRJ!E%$lzFB66pLi|@JDcna z8iYIxqMJMmG0XS_DwOXmr1oPLj5NQgUa=>Zr(IZ~tb8MemmVhTiEU_FJo!W*mWCdZ ztSvhHvNZcZVjz}EV?Iy{<}dEKM=AJC1&C1u;pl(0=XPd#dqQE4WZKaPWz$ZKB@PfH zvjMzaJ-#O$KM+qq6LbGUg#Hl!WW!D-AI0}^pSEjvO|LFxtD}gc^mMvbHkHDOER$)B zHEFo=aSWFoXX1k1Dj(kyizUeBsPHu6!ulCXM`$^NV4L^p#4ioYPK)T*MkylK;EQxk zXePK(t0_~&`kD>@h9;j1ABa6B3oUkvMj@Zt6MHN+EbVWJmH&Wq zvXK&wjij-RjHl>n<-=gRonctD6lFtmF}(7PN3Rw)mT`9_{${tfI*kIs!w`5fxOAaa>E8@ny3GJeEof z#s+D#i0OeC34A6qXn689;nf$?I61QVDqR)KuD+RiD3QV5s4R?pVF3D-^t41tnuBZv z1qzSGM+OR6FuA@Pfmj91GXViIYfiF(6#8Ry$Yb;)+!S!AJ3`AWT>fB z9kDPPOTx6SkWoJFP4eMba#S)&7)#O+0kg@Ylt}wAPRi!ao^&of3Kn40qXEdr#q@AI83WBLBalyo zlMvx-Y-}IU2+C)&2|f@@4TFdc-ZsNx%LR`rXR;y`=vwa2Xo{wwyH; zMM$7MqTl^U01>NbAp#-S)ZMJ>)kW5ti?r7$!H1Z(eo3OpGx38D?MFr$>(0~(4M#rJn}`>7?uo&vlI{P^p9T7q zes`_mLMJ9~sO@tHD6u_aMZTe`ykzU9EY6YjG#X4l`Pu_AA;ny_Z)gItArn5p3=Kx< z-&PNYR$m3*kyd6}p9Uu1z?eclOiLpl-UG7IX7lYh+hdsL?9LI-Axgh(Gk@N=xLhx)aw27nF__hZa$` zsJ(1={|UFtmJeBWJKg)T36e*A*(fQWj6wG%cDl1M$*`#GLiv1eY(zFW*qmupvSRZV zvgu45mSY5=e~g;(5Us6jSwSB`s%$Vx^xZn+`9`v^auF@OE;6w+T|xb^4y)N)Y{lO@ z){k}AQ{E7Q*ma%3^^?{|F+nK+CM6wCEy2iPM(SXC7|9Ug^_}5To3XYzXiqz$5VKZj z7fy>zPta(R^0(T~wr|HgBk)g6z%H;z7J*GJoqDqTuxxyYJ&aABC@0%^(Zt9=Y~TQ9 z$JUBCR6Y}e?KcQ=>U{sX_^ENbD{?4Wgkl2|1w!BK-tO`=`kGhIDpp)YX90OFBo1rO z>Hf*i)FT&Y>~p)K_B0$%1lq$B_$39}>yaFzUqCrf*!?!Y8iD2f8m-(u#po<`oUO4&&aZPj^de=ZynRfI!8{&}mUB8X9C3yp2;a2yJaVh0UA zVg0;IESdhh4T6F*3a&^~$Hjn6XUkhntqz7;kt}AKdYMh**#nFhAqduwD<5$oUusuj zNwHE)Nzk=2kAw<2=}pWUr*X(9dJ|+UK|oyn#%SR@suY}X0AK)NC>6LaJ;swZLX(<2dm*s0(wwB(61&J+G)i$udUw6z!I6hj9$-gI@Q6Uy z;JQ-Kms*0>6hheW7NZs-Hk!YNS9Zu+XJYzmhf&{OIu5N8jc6TqWN){b|EpLu zwMJBkmg{_h@Wc*17eyA-PBHKXpY56_AdWd7we{2D`(1|v3U|PD*ez-S4a4e*mOCI1 zbiQ`Om&TT5hZ&|nmbn4RoQB;k%QnhgB7@P{+V?ofQTJ)BNet?rFnFLirI2B}6fuNj ztL;);Y${^peiI_(prOVvYr{=IP^{MQo6JtaHuyUFYTe>;!Edoa*fZ&GggmWCe@itX zb&BOf*-p+D5+nKeC~~eWaj^Nbo<{<<@KME=ofx`mIJWv$Hf=Z8sSsEo;0=G}XNF}r zNJ80B zkWmWQj(E)Ib^&-$Bv1hTK8no@{05@Ov}KVOh+s48eBRJcce`D7OHq}wCP4r^TsQ9$ z8ho1Z&K+W@CuwI6F6L~QGF(LT)dZLiL_LB|3jMUv^p}>mJ$0R1=anqx2Dr%4JAsWd ztn?VZtFZ->POS%Spp0zVkkUT2FaYm-@Bn;eDWqQSwTHTPbIxB_DWlJX*~=$yi0h2N zj)2M4;L!!y+xi|ZWaGT9@^fG8p?sRB(|#?mXPnTNjPYvrleE2wE4_xmh=!1Jq#xlYiJu$Xy#_%WbpWveA69v`c23ZD zw_aUy9qv`^0=__m+hB%0%}37nxv;c4Pb1C8`ro;}d^(Zm_0n$}0{vWHCL51G#y81_ zoVX^FOs5a>x6zT-2AdQ4RJb4+BykW*C9N&t4T4xraH1_K81Ar0{ zu%^I#IH-#PgMvh$8Bh|JVLTYL!B~Q2KoFR3CUilM*4q)eUkIi(5o~jyER7J+4#=rd z_Oq>NNv-oBUEd0`xxvdD$J=#oGa)@8G$7{soBq;qWh|1jI}0MPlxp3iZGCc1Kn&bT zCfOa3IXkMNZt>*`WMCwnC-sya&KD9xz?uxg#UX1^Tv7^OiiXa*PlMs~!W zOI~EanPp1Bzje3LB@{e45)ZZKg!Q9_Fy}$$_3Gh{t4D#q+dKE?K*U0s+NSQ>kZ7z4 z>4aZcwJ=9;ht?-t{d#v~8M_Ri1E{UT0pxJS5vSIM8|u7!=f2s^lT>f)R-f%|HwJ=& zbEN2alwJnu?lrb46>nQKcSLO#4Pq(VD`91x*N8#TZN*a; z>8Z&?YM8kZSQ?5&8gb$&I+2R;bci2-Ykun|JJuHsZp{5!I1mJXV(weIf@2Tw5o{ZatdnwWEtM_1SB zT0d$#MlsBKZ(C^zEU9&jl40v@YpiJt0`aQKdGM>{;&@w7>kxrDgMioQy=~h=L6VIg zfl>?gUd6zgfMMFnjIQfcug^;9sWqK0)UH$W>b2nix-Y21){Q^(d3zARYYH}dT}Rf` zLD8atWUBW93eysFS{V1$dv(ECLFd;B1;`iV7-&Zl;Og?TPrZU>3=P5&mgu{0Y?U|Irn(`7OHTrbHrJjFt;Zdzn6B?RypftgT2ipQnXmW!K^*(#> zE2GElY_$Ucrs*dOL$NY-r?#^>JcVGJmLioHakKs?KNo@}1rzu7p9U^^MLuANP3(v| z4gfV>XAu=in0`K8xK=Aen8C^#!}<2hKu(c<#9nBrikJC~uwLR?2_a9$HLn}r8CrI$ zfX23`?Z~$VY$2P`&;o0zy>G(r5nCKd*gkO12|2z25jS53z|%INXG)lNozEZov(eOT zN<%1XiyVSFOPs*#yA5ZBQz;IMlxs+ z=WFoYGq)sUInN;}4d3vW9=CVLk-zK0NBK~f$Jp5;8ltU$R649lN@at?plhJ>0P+@u zI+RpC{N~JUIg4Pn^~q9)}tN zW`+JMXdOA?28~zS+Q}nQknATOQ?HLpQ>a6|z`|gG2HEHnA`Qa)9^eiEVE~Lp;|0dC zJXan9;nnK|3iJ#~7bYDj>9%)$OGhN-jKGvuts2%RFjL^x8E9RxGIuA((IZ~FUZ%*; zkc1XsVpk{HUEQ5V!SJsztuBtj;#y}54gV?-9uHofh-yi(lO*J}S9i_A?<+&e$A?nDRHhN2Z|nwc zzpbg)(4X@l!N5#5rOnraWVtyCQ-gARh+F%~{_8xqHOw&sFa>uDwjEZxmhaU$5BV(u zu{#!C=ZkFW-PZXzF!5fB{$lw8eP`OAbCLOKc0fXaH6|9V_bT#!FdK3+m^v}n<0r3M zf;3nMu@0t5PHbFX`GmeZ5F7`@qa7BS85SwAYQ0ZWDk&oz<{vF^oAI8KpI(6%5Y+E0 zFguB5B&}_4Q@+{>4T%BUjLK&Hn3KXNcnTN+#c+EJ3znzc+HJpz`P|8a1L=C#mXX>O6MnC@XxSeRcYLp#X@x^!tMuJH6Alp zd&{N6Z;X*^2Q1=0{@M=g|KlA`);9YYoJ$EnLESO>xZ-H}MevHa0P(lN% z0fhVrfW=IOi1pp-YoX@w`2gdF247paw#Vjz`!^DW(uBP<`yu1(0l00$mAkNe_Wr*b zcot$o>ttzDh}f$~Y4N+Z@uGqWOP$|1_V*sgeeH|O?Dws!{a23){N^qpqE?vlWarSr z{tnR65tw;9D^IWQuKmg9d`V$2BK2*h8Gkn+eEqGv!PmTgpPzRXvA8fKfIAHKHu5f5 z859gLQ^mtTcGRv)nWTyb+P-6d7%U77#FMgykadHmyE(jQ3%iNR*ffe2Hb7D}es zCR??E_>aHOz*QIQi-+d|4VXw*8Vh3XZwRIX&4!>))N!ctfqC=P(pI{OZhcYity zWFRqVz1Pw-;M3dQ_g{2jHjHc4w`Gm={HBy$)PyJ9iK}j^3~O$%|H7F zQiLfuPUXFb=#MARGwOA7CY*f>xV1P;_kDbocd8FSaoC!&ZHepTet>I#J(|wK_qy>V z+i>dD9MVxq9v7fAB^|Fm0UHmoYNZXq>JWgxKlIl2_3pL__a+?#20e({4*)?E*?5j; z9Q?X8*z0(#0flLkh{Q#-5iQmI&`@5J-UsiuFtp)ikYVdasjh2t7xYblLUAw=x&qfG z1UTOao@=~{uR7&IBFLF@l27Pqsq;1)^|f>0G6Zw>=oY`W+)~>vPPS*DU$izS0kuph z9Kq{CAo z=5436MYZ1GIEs}JEr9f_^V&+aiVGM#bWtg|`<7)$Ra?PUpaej{zM@!Yfc3@8iinY4kz# zTU@SPt%$i(<(g_$>G?16Kp-LU{Ob%*YN(D?dO{^_9z8eu`7j0 zt>Nde$t)s-d|SjA&@0=p0aT+=vs0=w3SQHhq*{3w6_DeTx2(bDowuDrZ3t`zTACx;RuQ_RL{5*@Ny;iHAfsEbP&z#w5{l!ybiR zn|dXOQX2>~_>jn_&~w^U035PA>ppF{xVCrwRzs(ztG^T+ym!Q7v#{lJs-mb6mX@#K zFR1N;J=Rkbu$7LvNgW)+?v@to-&9eAv1mU3ieY?w0CCL`r0WVJ!vF@R_)*{i$dV?B z-*)x5VHx`YB?#E|xcU#d1ArRI*H^E^d`f4MaR7O<{0MV`6R^SI{{E!4i$|goOJ)?5 z{AVqH>oOv2Rw;dz;nWv#g1Kw8fxn^7+iJ1^yNz;Yav>Be&)vysRoVTk@2BF- zio-|^vG5&TV-}Gr$|+dg2&%mebndrrw)mOggTNYBG6jCs> z+O-6WNUy$?i@THMDnzc{-=mmp&wnHNnq-hXvxK4mK9ekfGnn@e%ks9u{+N)5&JC}=M*b`9n354YgN)XvkLF;67e3)UQ2NF~p03G~B5a7-ShM#eCm=YGi&%)K4SrsK zG$<~%&b!>0Gpqkqo^96&YL6|54E|j-w0kf#Xa*XZzI(@dQ2gXP3Whx>;d3G`K{h)o z9dm0sfq;ia)W&MM+KpXBM+!C3gpJLnh7gBkU~sM1*0-W`IkiO=9(K`H_^L8Bnm>m{F1oZ9X3WRP|&AffbQs9Ed> z*Rt5J^V^(2#G_BdEf4-11UU2w4ZhK5e5AK88(?~f3=dK<|9Il$P<($pG4g%loM}*X zU$1~$5HJG0gq924?O}g=1|gQBBagr-9@`k1Xm4Eek7D51bVQ}*u)=V5kD-X-Z4B0q zV=(^~C$wG(olXvdpng?+$zrM$!w27K$=sV*&aB%}02X98ekQG&I(2 zw_G|oJ%ZrdATdWaK7d^UEllS3sl}luPbI-~*If>0=)}?CG%DW+ zvZARSN6=HMq~5~#Po?mkY3OP@q)b_h8XLKe`qGnL=hU90g1uXG!N z)>iO0dUy2UZ%-b7>kt+rMFafIz_U~2%S zxaGlJX=bW|5pegyejqlp6j9D3Fc#P%C!ffJWQb1=-SnKpIp8Vq29UPS+f&-oqJvgO z$|9m~3Bo1Dc7y!;zryW0$Dt@?<{&N4Je`c?4-%Z6Ek0&Tg673+I-Mvti(o@P4fenw z;NK0Qc8_NOCiQCTHJ5M~4~XU!@HE~9Q(m{GLuwCf2s{N+dl0#|JlGEX0~4BdQQfCo zOXIf1ZxFL$)_|c8JqdiqvA;wd_c8Cj(YJm1x*$Ah=hO4hFC)yiCPh&mD#kCBi6bAk zQ^Hl#}=6C$TupnMJz4qM2&X ziI;r4&0b*oZ2F_{q^Wu}8aafVC>Cz7>}0Ts;svv8%@~;_H3F`ehY8pH^bA3Lh6b}S zl;v(@3Ds&F;$##BdghlKVwV^tV$G+E#FY{$0CJ!*aI6cf_`?P4T?>*~l8L7>1u}Ix zu-?;4M7Zl|0LDKvO;L6htH=#!48mXs1XGE0ytzZIHT+c6DCDUi4IYQ8ni}y`e`)ms3thb#5vBW4F3c2m`@gP9eTv* zkJ%cPf#(E7M-bgqA%&q>c?BRBT>r!<1Tnc9mFuZ_&)@ehg(KQ1nyFCnTZ30zLrEH9 zj;u)!G-WP73~ZDNZAIuICtgZt^Jyf&t9zTAf!TI0yY&;70SRPH*Vd~zgs>!#rhseB8GsnIB^&$}4I&bKSc(yt z2pHFg2Xmyr@{k*t*{Qctp~YfzCtrd82mwrLpat)JZaAHRhGmU*s>+p)fX!LZ5r%0n zh(S<69e^0@yoJKnEDG>wwv=-|>=Bj}3gY6f!C zf}j2fslr?uTbDXOur>nNj;G#%2bPWP11g=wCh0TG;p9tbI)gn&6^W40mrnl{LHpI$ z$zG%xzCQ}l0+RvMZ$QN*09RIcG6c$O@CNk8U=Yy}cuoWlaT$)IJP?SG#uexlGv&-_ zaP8>c6hx8^?JV#MW?K*jAe9wF>1*66HgyFm_yJIsCOp8fI+|kOaXiU^t=10lCDd9uj;EkWc$AQ;-^akP3cX5~t<6@$i!`45Lb&HB+ej z6p;v980^DX_HAk;ATh&pIV?Y9Fa|^h(+TMo6!r>jhGU{QiM)R31J8@p!8>K` zO<)Sz_^4J(k#(kC+fll&{W7e@fI-J!j+$*^D>GwGK1+N!3`+|f*VOI0rrRwpw4kAk zO|o>bbI!aEIZkSTGz?(t7|CMgJ;WzWa|~t+)M|}rhZ&z(B0lD!m{QEoK*OB&V|Q$9 znA70fDlRBZgac$5E!wTG!O9`-g0eaD9$re3iQyQ%7MzFU7|f~X$gs=}7oZ71rMk`s zw(k*5$oXiyIxczzG~Ge$;4ZDN!nCDC2kN@cqoyD!-S}nV&#oHnFV)d zAN7`jLyDX-2&_ZOB8<3|32_dm1uizSRm(P0p+Q7K!~?;(FO9-oUgtBS+Ou?w)qBEC zxOEi?BB72Tay47mk3ow8waL&HV4af-=!y}~-fT%==gm#(E;|83L!T22cPxaSYW+DG zH7MAcdbin@;9DI+#TV7~H+Y*}y@9tw^@!a@?QpVh=fg%GSBR!V4i>!Sr(?)Q zk6h7N2rm#FSpd5*EaD={r?88V z3=eB8v5*u}YDY*3kys=NZ9NXeQvouAD@9)NE9B)u6d(z4a*o;^fU_t{cij-`I<;XJ zQ)dnIguB@j@Ftj|n8r!g0)VV)VxBmfCNQ_T>KSRgEtkZW%j^ME{m{^MISM)GDRAs@ zc9mcC3j|Z~IGD2+*X#?+ZcL~-vSvFMEo!bFr(Sx(7DL+u|tZsT6+Eu=!O6880p-wh=bBd9BtGD*}u z4|@vOatLGizi@VIyV~d1Y&1S?H^2TVz#|4Xu#200&81C9z|je4_7fitLOhSiHPm3% ztF^}M-S$=+u*fJTVrI!l?CDHk%bjchJXj7Y&911^Y^yVy>WM^Hkw2nlD?x}q_}3%` zNp1ZJW&?F{froRuzxhgy?aS`q{Bkj6tus4;9xoyZkD>D6g+UsTL2&)EH-LUXI@|y5 zAmAiLD+wM2j6ARI+;%_ZGZ1f3LmGe@029=A?l3^@+pMZX4nohsd^q|0{e<6Va;C!X z$c}7X+tU{ew*-Of&@E~@zQmt?B#R1gec)wMf>?>BrahgrJSmsb_G^BqQ% zyn>ow!aokA_c3)%viH}cSpeoMFEaY~UI`e!BXJ|PqIlfuMwt#1TyH@p?tB;y1iA&C zy$9iox=-60KT)joDmpdYZQ)J3#TnKef_dE^=MXc3N@sX}vWZ@!O(Fr65X(kL0P>GX zb;IH~q&mx3Kwt>h42FwgQwltWm>cz1J0h+ig-Q>7<8j$J832Y(+a;_|An8se5V+3p zK1Kc92H*aYM`2le08nKCsH(bqlX&P(aj8u|W^YA*O9)L`>o<V%A1-(G-9f|Fy7FRrTbs;)qq@-#U51I$#4D&$|AKi0%l$M$R!o-jm zcw~dG)%eBk?cArJekg=48LoQuJXF9H!F)^71N%i9U8+<~3 zfUriCVg7-??dpUrQUiMoISusp1pLy5VFOS>H+^u^O@!6F%}N(FjY}L0cmHL zjMxb40t*~5yU2N?&8dx8V2;;)s(9opW7~Oy=T^@nHj3D4u^2~YA4bV28J`Fs7yy{- zZKgPuly$ueaOie@O>q7*>;VT<7a?u13835lxuUc=Q)u-H)?8BnWMV^}6*Y{JaU1aQ zMXhMYj-fy$AO~nB>sA#+Sq2(~0Fc{}^X(bbvQabC2y`rZ|6NUu6s$Yf zG5F_>^)ZhcPbk%O;F{Vl?cyYfQ>{-q(A^Ha5TSg)vO2>=o8OGeH!MAji=Iw&g+mV- z*n67u?ZKrTjrEhZP!}#l53S}9jEE3~l)p{+r+Mq}%*(3BRbz!9m zbqdTqsOuuL1V#zs$!*vCww0jx9p`Cvq9%s)Dh&NMPD?MoG2H?ZEj9hOyT{N`1d<19 z05d6|2gHb$qsy>1$x2omfXx>zwju+x6EiC=^+eEx*FxQ?ux#q9e^ww7Sof*Y+oX6O ztchG~P_!WlMk)0+@#_|xg+sCn>`J;*gR6xCW!UfJS|I^Q^zm2j2V`3f zt9|z^XjFk_pXb`Ie53dl6$_|OyXDfGOVVU0u2l9ZK*D?E=684|Jdro&$YGH(mn5m> z-j*bL5ikykJ&%O_zd+!Lu^zBxy3aa1=AK7s?_Cp7BMlZH@nIBraUpK+wb%ejP#uE2 zfsUizg0s5P7&Kn1A8s;8j6GO9JdFMjgbLtuF>-+*5z$uBfK!hzAdZr(9s^!!Rk_W) z3?DEV0uXKMPhHn;;rmK`<}cc8sh$y_{!nQNExv_rF2VcEOVJGJkFOYw=-KlRB{v{I*r6vO(kr7U5cO9r zE{ivWjy6C_@YhxZ()p4~DQg8)~9hjJdHpc%{eKwg%%H@&d*k@MLqJ0kGjg zmk97MQduVr?Rr-Ph&rnS9T+7F&BO*a5F30-un^p+2y?VrQqke>QQRk&7~hY2_s0q- zoP=)*3QznoUA_G$sLktBVvj{31)PwdtVd~3hM?7VS?-C7s3mIEJkW~KwJ-bydk&F( z+H+Jd9+Gya#>Wzj%SP_U$nnrS{YC6cn#y=-bmdxZD!RWP9TX5_ zB0Gp2?rtEM5ND!R0YGb9r68vr&6`=W2XLstNsWHIlN7_OtpvqjLhOwYAX1e%JzFk7 zzd!5-035vokZ9S^$cpjOsZkc#lePjXV@euS2SrAps31;&B@x%)92U|3h_Y1GC(DKW z9(1Mpo+q0y_sO|Y>Yqiaf$xD9=!wTqmI*R1WWj8wch19bq(a31-&dYYXSP@0z+U;z1~&T1ZGLg-R^#0b!SKW{ ztZ)*Y0GC5$>$`=e3BSDt7F2{<7}ECA`r6h@Es>CO?N&{^x(;Z=8^kD5iXAya(Wi35Vy!rGSZWdAqyZS0w~c$N$%kIebxgoh3SSVK#GB`#PMdj_$a$L zgIr{e2lMk3ePf$f84CsGU8q1qY?Uz0dly%l=UpUHaz!ADd_DJ5(Rj4=0Z2F!e<&KC zcfkQ^j}j5NaEC^CH)I0zqo(`Qy9b2Y)HlX*ZpH(F0qU^@nFPojpDjKadzoqoW`= z2%C)!>qrLk#ePCo5hf$VLL&|9G(0P`U1noq0;+`AJ_O4!f!%Oi^8IN$72iXu|9hBD zz3J?)c0mO&J8`y1i5*D>qNi#)o@YS?4ep;AgO84s0bBJGc;P@C5xImU8_AfPnj@kO zq?1gz4HHi!50bWJrqk>s7JlGh<&iX`nQ_WE$H_ehop^+fur)w%w(=+G6%^5+)t;J9 z6|hJwkWsto>% zgc>H$&P;Dyv)^Dw2tlI>Ru#M_ZA^W)x};X#F{uD#9D&RzT%RUi$HkiV_m^Rb%Lr50 z5Z~1Z;xh1W0r5$gG{9wwFlp+%M)O1unQc0+#TB^2MTjORD~o09Hw#jMdq7&6>5Po- zq3+@&e5aoURne=K0{FuR(WV&8#}@i2NR{tj=-(2ZZk~kZe9t3dP<)~z4AeIx-PCnW zMA_Sqf}e7Tw#v@I^clqCWLi-Og%NPE%JvlkG7ft`2e0Dh7aKR7{WSvi&_3B1mI@3; zYmCYy^rl5a2!tJw9%G$qMM!k|sb)3Sb-Y|-t?{a_{mjS1N@|5yF`#gJ=;r z2L7Ebsf6*iphg*n@v)4U{`f%-x0lbuz+pzr$t|`7Hr3`Og#HLMW zUq#LiGO-LqZ1SmB|7x^^1t)!q$3)>QTvLr_6AfmM%1gIlg&8+30=h$O?8-|%H8m1X z0{aW)R_Co17n#k8=luqtVKX(lmORMW3Dh@a^YHy+$%o70X(^L<>@he}WOPqWZ=57@ zOX*B(XH4!^1ipCdPNuZx8Hiwi8b(_k?wUKC21Q9U&z^$jVWtPaA20*ty>M`50qM$g z604b`UCfsHHBxRwT09iVEV_68_yJP3BpC_PAl*B6gr%Pb&@i72LRz2M(=aB`83IxZ zLK|x&>BAWc1`Nj0H3AiBEUrI7kSfL*ujdd1Ov6rLA{N2P+RnXmt_TEa-KMi2cr11* zdAozgP^_eVG29A%g~f-Z1n_2DH8+-}^fd|h*%LHR%!5r7k(JaS>}Cl=$tL;=Wd8{1 zY$m*(19?~po20f`^u;JN2Nyct={54`#Ahnt`#2CZTLcv8H5>k{F#6NqvnM5wf;ehso@CDOK_E8(zd%1R44ui0SJAf@!~~6* z4f;zAZ3MEHjj+C3Gk(9Yt_(`<5nV7p0|kI6Qz|ixxzQ8m9>=bs?Ih8B_L&sKEqb>m z<9sGYGM5N2^W;b(naBfxO5Y5UxsXUYP3|okV&TuJmtg;HfCw>#E`yLZD<3pN?GUB` zEB7`yo8sxTCFW;owc=n6!hPVt+_C*oQPS9EpCt-NJ7n4vgR_7}N#Thox(B0qnDR7|ywAs)i8i(pX6n4NHXzp{t7a+hQ zn!nA$n*eLn72r+)8c~{v@{SRQ7PUW!U|tdT_qpt?XzW23H?J?L=UpMKqm>HuAszmR zqCnt1DBHl+bXr=|ff%z|iG~wo#mQUyX?YIizG`&K^qV;(39g&Xud1_wrlycCn++0i zR~pb`9=$I83ZRN8_JkHeh^!-}sBraw%kepmO{>2J>Ll+(wIm`yMA^gey^w~*pR)@G zbNkuWf>kg~ah089lgL}|iQ#l=AF0=h$vFLd8Xq*020wMGY{AL-N9GRwj;u5u9guT7 zZgyO4S6ww8=aK^aJo6i10D-jW*?EO2DsK=;} zq=0LcMmAf@#~{0aHv&vXGUsQG|Zrl{| z-^B>3`$h`ugJ|#GDGhL(m3`BQX6L1amMnppNeGbqL9+E}doyE%8P-7BqTje=U`?Ie zFe+wIeFRy1W5`M}s8JJQRJW|uP%|uaMuvxI#!KfP|6aLTM*a{HW}hT|51*INE!7AN zX|I`?hhr2%fwUuNj_kL+lq0Ak<-EXtU1D4#%B^~RhmsYyvMl}2dUpu{gPcdgMe|3YI%JP#c99|@5=97I$ufrYq?xHIFb%>TgCGqs z{bH59hGJQK-3cm(vHY2vU5brlLYK4U&<(x4l)gG;%^*J{B(a%k|Ka7Kcq-e58&5ucE zl%61WZy(|37`UB|EgS|(V5FcSIpSy1s?DFG<_O??hU;VI$3l#h9J9AxqqeMoeZ%lz zbz{s7c^-IC*nols#Jq00Fh3z%-PCMRAaabec5sa=D(otFPIAF7Yt^Ct)Jk%1Jn8Vzf1o-l==9`X9@t1vkCf!XDuG70s|eH2gvHh(7fsGf=fbVugc#L}w)qs-C@>h3JbiG7Cx1 zuksMJz>;~W`h<;4MC>OsQS}1GMKrW|iHoGCl0K=h5s|VqL-8^8`54(EUwE7;oDuj= zvREWS&Od_$2gyZjUbc~+9A(xzMR{g_4aJqfW+T6~68U41nwNlkrd^K3B;h>`oDtx0 zQt&N<6=Tc`@18k3k|8wp8%7;0FOwPw!GzX!x!4CmDS0Veo5LV~d-{ahg1KbuP(l%(YRvt^>o6QwE4Jw+2mpg@+0vu~9Z zI75~a1Ja{rUWNfGVK_HeJ{w0$Q-ct}xy(T( zaOudx(PScn49Gr6d+EvZXUJn8pj3Oh+{(zQe@}$mO#diXUA^(JE8jKvK5trwJmAZMR_} zjJ6Z07$U>u$uqO^X*L7KI!pVRRX|tGzA1l^PnJQyB1}Ftae%4@c3)NoACrP%B5)+0 zBa42N2~Uz7Qy&Zil21l7i*%LX2W0r<>T3uuNFTalPTvC4jUXI&oGt1TAkJ`lFacUH zA@e*{WMc*8KmjA+DOe-Jhz`@r(^#k99f%F{!xY1ypHr{p)38ehAzA^8zot;StSLWQ zYDzhc5@kUKa|hX|3AQV3oB7f}mR?FjpF4g4-T%qhXPfASGGF1#F!E?*qMU|_M#Tzo zR_Y11AT2ok9>$8P<4fn*brk=CSt-$a>UAX1AWD74wkBiS7e34-rGoKlyN+Xvdgy zM$&!s_v}lOh9VA`d1hZCIYNE`X&LF->ED2-u^e>m)UWgG^D``FT{;H+MPFP&paIu1 z{(lM#CsTShOPM1Y`s~Z;{7AXji_P&_xx9@upq$cWy!YD!2N8oP2P&rCLR1fVc<`Ry zr$FPorLbH+!@glk11=qv84zfi0bIuhu{cOiVDp?pM7zMwVj+|NGZ%G#cvE z8x*uE`y#{|rHLvTnG#>h@7y1!dK$K#)2y^ip69RjKlZ36Ddaq$Va0whMA)VQgp}CakNB!aRBm+0t$;q zDE60wFg*x+1r7-1^C|vyFo_|sy>c234|Fwpd}2?M=dn=2J#ZLF)Iv*12`y5o^RGiO zGnq(j|Hvv~o0=bu!D5nQo^vli$HSN|Yg-VNLQb@wXMaxy8I2+d*MUAjOG`WR-Y`;L zur{$497U`b#~=gX2}qR8Z|JZ?yiqzaki^T0pb~`^=BUnx1Sey=R~Y7pk@LBVoyH^| zy=?YF7D#6=qibf~9zn54x`3Px^KLkb9WPB%wueT%I4&=0rSP3rp>#40yYFGjmeC++ z^%v&9@4Mp?`_I2h8bKoV+%G9Bj7&P1QI5rYL{L@G3))dOt7qOBNF*Ny;i7v$Is8FWhC?oAL#AXLE7IFYtCsmqS=~=J~q@v7-PgN6Z6-HzOeTyks z#$%HIM~gf6G73ozq4^+unpWdh?UZQ_l)Q`(axf=g$JwV;Nji7cQR8T$yyg$fmDZ_mF$ zrP1_>cSPB5+Kj}hb1zDpQ5K~vWcdeq@owCUEKc!0HWzF}psJWoAPzt&snS>z3PkOB zw5_BtEzG=S$6?qi=b zU|{Uh0y7mP>9O!chAbu;@ci>^43M-3%35OX6!Z!OXyC?>ZOyp-H3GF#!vG4|6D_8G zw;vzGz$KW`t)J{&H=tKLuaCt(Y&q4vY zN`;W^dN)e?=!0ALx9IRal?c^r0*{Omd0y-7vvlEO1_)6B4vy|!fi_m_!|bBDLCWrf z87l4(k$V9FU&4oEAxCAUJpbH&$esQ8V3_0z(#DuOft=7j+$`C}vn(>eIsh>CeWm(+ zb~qfQ&q!KKeFzZ)k%XBb8B41v1rg?nh(tIDNRn56f0|J(?Ccdw}R?K zrPX|rY-4FPiRcS6D2FNQcY5;tOHyxLrqP~}Z3EykNPp1eW_~?Ni2^Jz=F2j}M5n1g z0xW_!9E=n2pg28~G6<0%MrBkif*^&<>+VO#O*UZs}W2{lo`N@UskT2ryX4g4jNf(+3xjCf!yjh|b>yH)|R@F?Q^=yUQhKsjcc(1EO*_($GxLOeTrU?;9- zFN}rC9P82@5O;F-%T=u(_TAsz+t^ogKarC`+p5d+N{(kgfXeb2)mh^3dfb29+%3*) zI8H;dAm-Bs2TxuJB$e+2DT@TywkSWs#I`0tOVfDjEp(?a5CU=m)5(`iobp7b;a4PJ z9{SQctb*Ik40`%P2}6+YgWg|U5X`%N$iltw%%}Aumr>ZO$IVZU3lSOD{8P|d#UJP- z7)_$BkwDwGJTx$zcrW~G4*CZ68n%=9HI5e{HtbFDEt?u!qNj&W#yATXREEQ&9iQ%w zt~PZo5Y4gGq|3CuuA`jKKeVbGRRj{EpK8CgS_^mGs)N6zKU+S#Qt!NUbEuq%Hw4qT z!|IpMtUMrD8clRAV>$>(An#v%cjdOdFA505YCBv|&m;3|I)s-EY=KuT=`88_HT}}f zHQF`ZzU(y%%b4{X$oPTdP6!a;%Pn4`2s@%fmvYY%|o}1 z=xk`xek1Y|YEuadRJYD!4kiYHiBU6)r+mIW#~du+;9{S*@4;WW*5{uvgHjqM*Fo^9 zH{qy@gd&=CNy9z)BDmduKhU&YTywZNPQPnG%n1&DH_Q zs=5pJja4YI)7Bl7xK}?0Chh8w1C!MjJ_aWOYY!)`jq3nKU+{pkdUp+^m@#3^Nx{xk zA!~vI6>SR-Dn|`eTo{2?l(npdPx@}I{+;M6*oAGUsAT}SO`>q;lSuTF>yb0~iCv^pW( z0H+sHCx@4X=PEt%`32UH1)B!wUJ0HbR48O{>Ya}-*dfd#Zv9WbihZTBll1UeLa$ad zR(utH2lmW8e0pB}a#%(>s>N@wl@bvZz*5Fa{75cCK*2QW7N^!cpOT| z0NZd10+EF$Gvu6d%5)>Z7sy1FUKRX|>v&nC(7zS?iYDbG47^6+?npEo&k^FTJQt#x zkN$La+R~yqVe}-@r*%T?_u|}jb7&IV7s( zw4pb!;5m$#FFQe!`p$ng%xR|4sOXp&LhQj(?4u_BZ0pJP`du zK0-J}+4ufT5utGnseBYD2Ox7LX;mwSxp-`NIiG}=0@MVe^FP4ZP@0=Hsy9~8*)CxTkeT``#-Yb2g{rADRXU%pRU6<%aUa5*@9_PoKpF z#MWN3wfLA=F}I{zX)WEta!RMhI}u}EwyF|i5XWwNUPS)X>ubC@%(tAiHT3+vJhXi8 zY(M=BvE_rK=V?y)bgH(TR6ZSIcAW?4*#~Wd%y7VDRuf@8Tm&Io4{iA$VM=C7UO36?guJjmcQAE#cW zOOh!4d_5<>NIzd{=h1iIrzf3yJJ?LcdEy_)qdTLF9xNM112HU#-)G|-`ZS*qv`)HdvHf7|-!H%|nX}>q%pgr8X z8jxUx&d+~ahvdk02qh*_76e9_3#YU>=e}vfvd_y)3EeLU6h5m=q@Y({{;1NA!x-9` zNh7=D!bv3Ken_sgU*p#pXikx}g*6r*zrOE~8g*PC zxbTMSv%Nown=ADK!TA?}C}-$3N9Xg8Rf72RVJ7{rc<9_i*Ui=H6q<)Q`bqP=5pp{H zyfiFst`?UG?JKOX;kGe;HanbhAiXDp~7TjXf*$ zroDu#xo&=UZ8v=qm@lcDC;lh8DM^D2rIvhDIP2{9K^`l!YrQ*7hzX?2frl6KFDc^3 z4Qt_@ilH0Sc@R7*Ym!jF{Htz5t@gVPbHlnso*=&d&3Vz}ApV8muUGX9tgR0{{qrZ) z$w+kmk;-tzpcpt^hokjon7$C z;Oh;OXB2;e>CCgUPm0x+;Oxqa7vNoP-)x+d)LRQL&raik0)oioCL|JRx6D6-Oo5tG zdIqDXKb1#_?LLK@kVH?(onbh4et4QqLmDxiN{EljVpF?J5w+L$B)&5t-RvEkjx{xr zp1Ex(q$IK7Dlp~od+b-{$C;$5xXQO}#c zULkmb)%oWobtA5kEf5~np^%e5gRiAFHB%9ijekEczvb2`^MTO_PG8nXof^;yn2SG9 zHX>R6h>jvU287J~IRR9&wD6ke=yCk3EZ6)`WUzp>M-6BT@-A9HJlT=RVW9y{B99+! z=49`n>p$;|>mZf)$^O~=`yfK>ft2uQ0P8J1kwpxhKcPJPYzi}QljgZDh&%a?Gy=}^9vklbH3{LuS?3>g z;42&{N+d8gd!ODq^9apO!b^FKaQdQ6pUGhcLf?Z`&f?QhC|Q^E?S)q=TTPjc^wj*b zvh;F%q3@4@(%X3Mtbh^+ZZ3SM{evqp^H{m?9qdFxi=vKBH>Pd5bljYF5sAG8`P{;4 z*Vj@f1E-hGrUd^l3(uNN2s>*3c+WZ{k$5MOA&4R_ykqH`XdXBOp7p2G!Wie~mB-SO zf>p4s?cBE{yE{{_v1>0~pB!iPOLf~jKRmIMY35?nfG(PUl+O(Zv=-SeQ5`Bv^BJO1sR?@33w=EZ{>rs5uAO>FP@z}Svj9i z%X<0^aI&p_{!nV%sY4cDs5o@l`4dDDtz=ZQIED+4jaS^!mLAIFDsI@ql;=3315D$z z=Vk#C_Bi{zsr^9;oP4Q#&_JTPwfMTpvD$=X#16};3M(!F`@*AMm&Jh+c-Y9<_aN#A zaq!}omI#bA-)~!GtX>4+mpSUGGRp=%uesK}d&Nro7)npqIbD|dJYD#%^DW0EO8Z{J zSUTanRI@8S<~F#~Y$O7|!O0cu$+KrJS@?@Q4{&{9`Nb40zG`Etq$omf_s46dw^KV8 zR(KkuEt^W)8Or5cnM)hiVxA$AG5BNOyXb(`ON0Jc^UQLMu3U*Bh{y0o{}j?duZ{Q zLJA6tsP2_yKQ-Ik>NGSBk_L@*EE!_&Eg66f{hRrutSyDoIGO+TZkIar?d!O+RfKR| zwJ~i%JB!3t5*(@nE&wDWac>o;O9V!OQ|e;(x+uOIhjt#lhckKC-EOY7vOQinHZD&n z6P6xcor4*OyBUTge4Kp(HkNh_Gd@l5r6stL5aLM9{F@bLaUolIuiFB_1LB@?^^OmZ z#_L*ZL-+lqsYkSo7mi*>I@JN0sm{$^H@MX?JJQF%vU?hRo21hPD!Ii^K-$N#=Ec#S|r1fUkG;H+x3JUNNASaPv`f_P+ ztz|Q;7!~*#IL;I&E;7wxO3yv|DMP{H@0>=BRd{WsXp8t0;_@NK&Q(hgHUBPs%DZ+q z4Bq|Q0kXwqV~rfhh+c2Y!oy@aB_54@ZWgBAUVJRRXK%+`4?Y+?anoSyM^&FC52~_R zlF3r1x_q|n+O|D=V>b;pjh?u(Z!bq;D3u$x9DzD9o}3c1EG459KTcRa_uWq!jA^Y% zFDtc)fud28SHa|EFapq_xmQ^@%jW-T7B_3{gVJJ;# zqRX*x;lWBzoQ+VcC7SJgYHZmY?45o^bW7G7Yzk=l9GXR%qj8(lXU)OXf8I96+p&ODYHk=D?bwm{%r=r*?!D_U zE7$bLSoo%GF+SPZn;Gz*T$8kD{_Tq7=>3f=8bh_bbV{M)c=I!8!=q1_FuxX$s#9lP ztl%maNUWoDkK&UQe1UaZJQ@#LS0&Z?pH{xN=J;04@6t&vui2k8BV;W{Wi?$P59SiI zbk@(c&CfEY`8n%g%1Hl9CNr4r+Cw`|jw@$_L;Jx1dgZ zS{B>yU*s=a@;ml(>S=j%++|wEio>SU3@n{?T`~pFCBeR8_7Q8O^}q>I?tIt7v5@cC zcV-KRl?#IXkLCs=14yy1zloEVnEx9Fo11@kTgy6eU7`CpV@+oD&7an_r>^fB>*Sc2 zrNuS#c0JHbRy}vo0jfjdn9Oy&1MIuRW&_!`@k*G^ZAQIeI%Yw@Q>$i)ug zq~dmXCF+sm$4Bdihog;MoXSHtIMq%EoBb0QsV|OlfdwNj2o;E-RI7)!?j{{Lq57t*^ponq9H+9;-fE|6cb)y`X*!}^5VgLn_eI@*GrTkReW1ezJSJ<*4i(E2k^If)PqZ(QXYu9qL@ zDw!2KKF=9#mL6k;5wj%O8jk%Tp^0)sUc)@{hMoK8`S?e*ScXaTnRDiHyJj<4KhfBP z?&HWm#(YB%EbZ{X2yWcfmX^X*!^pd0D zK6k>U=P90cz_HR{N0*nLkjj-%HGnVptR&8JFRsF!qX>8saQG0a5;plwqtR%oOBqv` zj{lVtD(5^wFhG7>WEuMwrdZctry4{BU%@;TDxj5KD^hbvB|7iKm7a71T5lbB*&f?T zGRTf0Ha59UTXwYn{$JOnc7;j#c^84dc49U?_+RECI<@|0WgHeTFDZK_8|jY;k=AyUwSFy$X|1B`=APETU!6~eK-ATXCIxoyPG`w zz7xWuO9W=XKqB8u*1fJZgN0WsYR?LxH9zqSq=NLv&7hP}M5+POMTuSxkPIYVSzR4? zQU!Ec`eNKpYfb3B@T6X_Y&1rrLHlX!y~^mNvyvE*aRbjFHlU5M#+U+q>cWqdhGYVd z0LS1jEhRbP0QLn$g2l14$>tz zk%YQs_z!G&U_j}U|6=`}3Q|1&H7p7ctqsMs^IV3bE_K&xoJYVl8^;V zS9amz+FltG{XJ^Xy?`cc_dRR!=~_Ilp`Uph^`kq+%;GHBV>_BgPHbuZPV*4nm?WGe zkqJ4cKCII@i{wasNoR>zvZWYt0f|M=QUDkd9KgL|GvaD=tmi`<>&XG+ShDWec!I+nIBnH)oG+uv zDT>ikz9%rGt>iNxVyAZR78v~WI!>=*$S~gX6XJAz|LB+85selNxAfx)3+np3+PVIO zjqBP0j2)?Pr0MAj=PWT@Zf0KF^5%6f{Tc6pn>fC5r1?LpIKGm@E_yhypuWF*56XMPe!Nq@HTMe$yK?^!FaAukhBsZ3}~ zKbg{77#KNP$84%JSBdB}Wby8*++1l8Eyv)!ZP!jkb|fO54a9EDp_}RaLx1Z6X-qlL zdXC)tHCH>Lj}qjlUcXA95otB8YZ9xLo};U4yaR1@->I~2fC1((FLLI_={FcFWHEH# z*Q5&A5a-MSr-HB#yn?bL?{~3Axb&<(;ANh-uWR@aCU~%~JFA7g>W`zp`!^pyj-K$$ zP3z*ny%NQ`i6<7gm_r(yzteqEd#`Dz_M^SGjr?loscp_YR@dLU_X=5*z&*P-3wqPQ z*ldKX=j^l)&*){UGP0o8AMU+1R>%*cO}K4#5~1Z$!Y9#!a~ zdAqJgv531IO8mMd3TqjK;cFUbIsWs}XqtoN%NzuYtHio3H+4i~wbyRB`Ww>TW904s zmyRgs>y?%JzUJyJH(gQUSyDtQKV;ydKbFXNl1ic5F_-k3(0yo|f{s;L?Xl-7J@FCq zFvIYE9@{UyWzjHen`q_`icNFB-aR+Rv70p|9B(^N3e>f|f5$Hr!GtOrHHC|{AX|VR zr4k#fO+)u@Qj7odYOfl8r87Bt63wTB?Lo`x`;R??V#V~(f3f~=K8@u6jTnM2ecIhG z>F$s!Lc5W_9vxIa?%w zoKD%IgHk+P`nFtA<(I)m)JCoEzbSIT?F?=BOC-6(+Zu7eC1kAYZ+_(p0EZzfeD(im z>#gS;D@RZ+;n^f}!pfsI!b^`$_~^I5QW;-fO%&gkor0^7N2nOoE|KPphqa1C(F?z!Eza+m3DWP}vH4bh|EZqHX z?#wGPIJZ>oe0*C^sI9A}ZC@LxP8CO2D@fBl{6DsCV}o~-@s0D5eo>qFZep9brNKR4 zB&uzwOKwPVPUP^GO%Jv73~a3pZc#SNP-L-^W>zQ{|+1%oyQp zWj!Mhx%7xn-3y``c`QD%$T3%CQkN?$%(mvHmfLqm+fZccGy>4YpFU{8Owz@nC$}fU zdm}o#I=HR!B}D7w)LpH8lXOAacotCLaq0M>15A7BunXKLPgG>2?}mTk=+fb)-A%(W zj^jCy+|T3@wh1ev)_%f2e|Eu;BO#80l~zPW*uQ+}(vK^JFYaO@WM z><~mtBz)VZy6EsWa@jWO$coD7)!(Px=!ddI_98uBeTL0i>9W7q$Gw7rqeWaU9fQ&W z`IsX%t;-ika^73Aoai_7xBvVa=eyqvW7k%h4S!a`J!HajzNQ1y5;+;`?Uj%CNBW8! zq@Y}qmCS>-vyQ?`kudW^#R5WE8<;KY zLsKMtUD;ru>hdfMa;34?RvLqVu7HTI1sL%?knk=l0+DFG0v~H9i;MHSM2v2VxH{hC zY@>f4+S+&1j&)nE)&AqaEu3Z?*S-ttuI^h1;&tR*?+>@X*B0lTsk&b@d^jJD4aA^k zM~uFAM{?wV7TaUcqh)%<^(&_18#c381~^|SrjWAm{DIj<$5t7-e-_+8HdMb|9#mQ= zi63i@^?2mn3gIB01Y8_Z1KN|7Jn4$3Gf>@aHX{ECb;m!UjtF8j`pdZHryc$iS90ls zxn?V4ts_Vm7i7^_qPnyRM)YM%<%2J|(cNRZPtv8KNr3ZlkN^uSM+I0tPQ~zRqAvJ% z96)hY28+Lf9sRvN5UE>v_2}|9rH1kO+zpg*tA3it z2HXFy_qTk|$0-2WSdTlowRZ2dp{SiiLQmAp<)gTN(u_#prE_`9*5jDkizinb6}Xsf zPo7j#_1t7x5jl?tbS`d;)@<2dWkx+B9F!O8=3#U+6@(z#a`_<=FBhDd$Y{+EXJj+9 z_*gl6TwLSz;Cw#hAt0m{y6+#1M_Ywz+im)y$BD!Ej5+Lb`CIr=(M=3ubb7HU#N`u+o)zuZrSH#7ADVUt14y-e zQBkPgNCERKi4C*_@Xt>)Z@)rBrCP!NQ5KTM zfvwHIT{ql=40b;}@}5Y4Yx9GIes|32Kv9z8M(OGeM7!Ht%ik};YuD5n#$#4ShUIPuo~ig=~QwSM`z_kx@pIjO`L%?uocFWlMyko zkZ$5L+qd>TKw@%K1C^#dl^#wK>yg~NdpcF#yrT@<@C^ax@=_M^3$m6z z5*r|T=?@>|bV1zE=oM!Gal}kdUG%*Xj@#>yGS^LkFq%JnnVRrNR^jQYs#^npMmU;+eW1zY4fU>W8Fn=R44AiA~GOkJLrERw=;Rsmi{_{eyroEJVJkL{)($y=wQjN7zh=c_xL zMykk5kt3-HIsmtkmd|IHB{ra@;qoaU*`n8Nq;Lo%0KhYp6&1n0h(BnysMJ4xdu-eh zA3gyf#W{0Ik)}9etV$l=eYrw_IGW4ZbeGRnJVh!|7&-ETDRRbzE*Pabxsp><#Y<12 z3oAXKr7=YG`0Cc)pF1?3JG|MY4y(O3oOtjvSk#GUY-}G0_QfzEI*$5j=Ja{DOST`x znnFyz2jCw*fSXOlkXv19$ek2b0F3 zAu)3CqmT-2j(=(0uJD!Jw>8D0vM%5~Eaj4e)o1C5KLcuq{FphfSOiMj?WxsULprF* z(qU*3mVZ#nAv1t%`K*E0nZ)M3srx;Q|HN{ETUG+W{Kdo{}hXv%0U5c|^1W7y)XHRnw?^^$3oRBrS9%2^rXyzi-Z>MnzA9 z3=mwqrWUweCn3_D?g0j>^jTyZ2!5&b4lCjTMrl+n+@= zqjBxN?1MCueUdkW_vlV%2K9V-!-c1DEp4`VVi$D&`k61?~cGI zqh3yL?z5u+*vF~Xy%%_t)C+*3Z7(*t!{7jtzo`I; zzp2Vy417#q9Y(|G*7{v6VM z>)z@8tcjSw<+Bx9qs>)G7vRw5<;P$id0z5?k^f~>{iRBL*u@{RCnh)Jmb>|2uDlrn z4jqNof4(vhFMy2bjKE=p42&Rb>s`~|;5b9&Of(Mo6}sjh{0i92D?c6N!yHkwF zR9418T+*qWSdzuV8hs+fQ;M`Qz{}yOi@$4$3~+dAR|yX&_TJT@oi7dauVRE3DiA#5 zRX3el0_}S*1#i#EI}HQX$IzMK2aUo%*PlbdFm5nq-6!F>7FAX$G?td=Qr)}!$RRAu zq!VB`f}u+nE#J0{lOR5<362NT*e-t0aGmq@t{=E#ONJzf*w-+szt@uOH!DZy?;L&NIZ^7dS0p^{kSMFDt4+1Sg29 zAKFzO2;(V@*Az4ct^2p@WDj4%3o8iDKfePXLz^(`v*z62aC5G0W_Q##f9D=4$W2FT zoXd}ipG!^3joEW9Kf?a6onZ3cTeu<-$zS15O>TQhoC^V)d3RP|hJ;btdC-cJ|I|Jb z#8%lT56?UFIfoBcCd%LHKY&E!pl+Qz8c4o~*M1S>At33v2~C=Z zJl2OZ+%T$)^o_Losb8Tz{+aDi$_!+lIb30S{H=a0H7h7q`(yd3mE#X=yF700tmC|@ zIl1@(6C@?Sk9My6Mf(T;oLIaPfy)V0cHT3J|svk%ox!IpeQ&sMqf03tNr zjGQO$NY|yGDdmy!x=4{?)A+h#E}evUGd7@m<*qd`n_O zF208G4?{vL`kW$S56~0*X92Sm$L~0daP@>1ePwD*8hsAg7&Pu%eMjn`jC0O5*5p-? zu#A9s6-$R-du^AFZNjUm(zGX+eTA~}1{jO_?1c83I(6yoG&$q|8_-)hb5NfVqsnRP zSUptO{`rwhTjvz$T@l@%gx&R4aSCXY7`Q#6*R=UNeQOT8 z62L7JjR;bZC%mQaFdk$nUx~E8_+uOjD?Pm7mpYdDi`VYxZ(r4idud<@7bS;WD@e!R zh$D|n+Oj>Pj`;eoi1=m;hgk}ZeEA9QY$%(#DV>b%I8Rg+^Dm3<#ivEBA+%m_G`n)J zS)UV}dFKD`R&<&poO zX@ue&W@aW?q0qAMUV7m=tM{sm`b9XkO0qn;V_tk}^&ax2<##2A#SCOzIc_)Y7+#nf zJ~p#+^-Nln;tNhGUO%ug@jFLkOfnI*Sa$nib>Q%q@Mbo%1{ce#56Q%W{s(BawOR-B4ki~<o^9Jpwm)q^-$#^j3F3tWF1<={Q>FsZwjSP(N19==CU#D&)X`3%+C(xGBS$+u)iU9Q-Wte~890281pB0+5tD3^-YfXO5g6!uD`$j@&#o@KStar5V{+YR z>Ib%tc*BQL&Y!w`{VM^Emn}>XNaB0MvwrxSEt~3Y8|DNlJ9m|Q%m3-i+nV;`E7X2v zcT=>;5r{%6hUQP(;+(JB zd*j$>k@FZ$!MFTIDTTvw$}NaSdiezdLf0xzxx>5Ke^2mVJ-!74$ckH9w#SYSc^v%= zK;+dpgODQOQf+_1mamRs4*(RUV_W`NHu*rZ0P{{F5U7ANo!j7FmrFi_?{7&wc2uXv z8Rw(cy>4cZlQ8TNyP@{|jaa!*#wOw@%<{W4s5HP5;k{jdh`SJGB$-Vx64YX0qGTRHh6R+EnPV1itKbz|ZRq1-Eb z+N&gD<+R83YGL_p=nOPRIQ25DFWNhc%yjL#)2cNduM=QA$jQmpK{71+9r&^j)T!+B z=Xu)8*k6VmOJ}k&AYUKD z8b(NyVKf#mcE`ZSb~@lekKSH{FNS82>eVtk7?1L%f~c|BNbKtm4;*dlN_5IV&MIm4 z@Gu79Af6=iGJ|5>a^m5|Hx4D;c_wcD1uLGrmpR2@TO)DmkiUbH2y?$pjP2>yl}`;D zfIL`R;#-;@T6cS*wF##_9dBYbYeVX4!3&7@U{!TCdVDZy8od@LaLg+y)qt0pzD$g}H+HpZ zt7+W+)*!U+DglxegYODl`uj0N(pek4lm^SMqz@C#g9x_fkc*3NBizbHC-!M@^h<+7 z!@qMH`4tHBGEYogzL+PsnbbosaeNsD!HBzYtm>b?u}kL=R4iO8?fIKAnYu)r>b6Hm ze{WbjnIA)df zdak;n>RTbbzJ6pHw>BnqW!S!+hLU!J&DgYe-$;-sMuehC6?4l+{gKv0=RP5<6~&6@ zweQisw{@0H4yUfTd32GE`L@3sh|e7nSv3A!T!Ckzo%FgnCVLRNCxZ@+*5B?&=DoU{ ztO&#!tiKZ@O&&53YeNFyf85aWjh$`1eVx|J+SQ)@)Nwuc;JDrj>mwbn^*{~zd$C-Z z`~;gT9lv3_4kXZV1l}D$o%LKX>JMm~DQ(n8Uwe;<0jm-{;E$!>JLXt=Gk*L`AZQ4@mhUYs+$O*T(qT&>PBsN5q3cTlv zeST&%yAeCVcW>WKY$~R^9*a$F*xufLZEHsyOpf7v zXkBDv_@i}%S+sFDT2~G3e!b!#ZXVhg*?kA+q7w8L$@Fw{GHR!yddwGTbH~um*eye~ zqYcf+cF{J{YHvqFnwS&h9H;~5v9GJX79Yb(*B0%hYW>f{AM6VEHEeHAjx?7Nh`}VM zt-WdY&X+gb{q^_}tS`Og1bBRC%btfh;-UGykytum-AOc>weT}TyYjnlODybb+B?i#o!zVXUf*K9Wt446~5;k3=cy||e*4Q_1Jy`f0a z?%lY(^-tHreVt>@RcFIs!$L!QVqq*puwqFkevYguvQzEuXr{MA$>ba3wI4p(K6)%V z4AN@sZ|)yC(%3VUjWOL)sQ)(n-nQ7r!KRJx$NRQ%=4^cyR#0v3!ElP6SUmgDAwsk^w)y~{%GN(_t0i?^eB1nc zTTkt7XBU!V2RWIEW4T7Y5^s7Kf2LSEmW{N>>B8^6Rd#wEt_gvT2IJ= zmyg8B7lf~LORq96HtdLV&eit!P1(L_N5g{;?~3hi?vC&Ymb3@pbyZ=jl3lIt7kfq? z-gzGV)nDI6ZtGV#6H@0w{)m6C^Y2;yz05z4@BgbTSR#qxYwO~ty~B7*yzchx%^$q? zr64ZusHeLv#_YDl8=9LE(O+%-1GdM`UHW_{tYYhjtVvz}9Sf|~=Lw|T-np=ALR60b znz8*a{_WRyw`2S7%8t6keH#YuZr$G5RF2oQb!qZ%LD3NV+uQ%C{R0mCjK#B&y=t2E zLbLzJe+fssv)f7K$Vj&>K9(45Ze~$B8){HEHE#dg)}74+tQP?^oC^N97f4qY|C@Gf zJ^6l=M|(QDiCo~(8@D%|+#MdW+<|wXMTubz8I&E1@DZ|@x=GqN_|?lJefbJ9W{U z0)ciF*&e;(v&?_&6~6c9-soEMM&(6`+I+;lf!c4)2cl~pS0K2$w)SzeYpi+RRIl;( zhAba??~x$r{^X!8`v&yx+Ag}h_|`%Hsmtz**T100)J6CB+79{|s676$8F0^kVaR{^TnII^yFtm9rWh&K=2 z@o&RB_x^i)B!tuJJO{x}TD$#XnGcYp^jRt#4+)Y)TIGX46h zQcN|Okn9w^7Na?Jw)K{3QS5LQ{b8t8*Z2wqR$}~8m(HkC92K9KO4Wv1Zan(n3Du!7 zq9PS)utJHa)qq^1m_~ou7*rR7!bEMTP%Y0iUFCFDuc@D^ws}_`>|4|wn>2Unr_Bl) zt6j|M_|k&jMA2X7sG??(JIhe$Bifc|3Z{z`n6;e~v z>H!2dACTH96WZ8Eu@noYs~^xur0S}EV1RF!HaYCddpZIuuCGBX4p(jL4=FykI@Hz^ z)Y1ZfIKD0wWNSmomH6( z)%|oJzcvk_Rb_}+h{WDWt_OlCW(cWT*Np+@SgYN8TutCI9HM_G2IfMYy}?vk!?t2? zC`hUU)nT$9231ou+oI7WXQ~-)C!HY*t*V7Wm#C!5`BYU4kNFx#K-DyLl^Tt})r5dl zJ=Phm=?IDkbFz7W>CROa^@!sMneYHv=qv?DI{awM|?V%zq?S?P+ z9`4q|0Dov&aG*9ot?7ehyS#HYz&qW&+*hVPoeJ4^d(&KF;J2sbImAHxtvf@VJ?TJV zqi*&U1+}MNE5%WZSydX2LQc1c+v(6cnd{vf_+x!97URWgi&p=mmC*xzd50 z-RjiVky(pPtVg?G-ZUp0`wT|oz}pbr%c-m3w%%+2P=U;=iBw&unY)%VuH~d9tozcu27*6FqL5bs2xCv#q8E)7}54}+}$>QvxP`mL^w zH;!?X2g{&+3i@X{h3;!ZQ(C)I2M1DWzAqgOCJu%4>d;-mM2hz&b)DzBa7ZKLIxh* z|0el&fPWeO6@!_XPy@@XHhBh!H<}ZOa`dxr?Ixa7!kyLe5{sT{g{tuikd|ads054( zRX7h!U=-l0csM9ncY!;%#HB1d&Y;kZ1JDBqi&e?#39TH(G3cXEQmG3P8U_m8j2aBO zk`Z<;1sDQT7DhW-Pl#c0v?{Lsz}^6fO^2og4mkDj5c3KE*hMc_vv!r>N^FsC^U*^< z0ThEGnsN%bMd`#%Z0-U%iwz8{P>XP9N!4p?= zL9$#Ozdx9UD~lfqi0l~fH@li_GoTnKg5w7 z8cFCPL6K~_kiRR84%#6MUC%c8jZagfa-0Xk<7F6XSDFn} zNVNpT+E6~Hx-mg5K5UG6NSG|0=j;(YE>!AGpfmbh4yqKIQHG6>P;t%Mv;pM`k=~m%&zD0V7DhWUXVkq%}`h522RmLK~Ky z&eT>9txuClA|Ry&T(U|7qEX?h`cM`C1!@5-SS3a=qe~*JNSWSA)p4UH~^s%&{CbgN2mIMdL6feG3l*enhd)Ma@r(5Y)8 zv{(Yw3OoofS60vBvt8P_CABb`ria#{bQJI=Oa|OgJ(R{c$edV_?Un8(P&_U1gif_k zM&Za*axu^iZ5U^V4uOw_Ckq)6Ws7>3kK7m&)@AO&wrn)a6;-L!A-eDlX=f?chHix> z!WnAUu$vhg2T5de`i6-;s>tPLLoIB6qHlEYc|Lmmo;YE>9D(Ff=07D|xA zki-v3z$}RU&MK;zt;_6Y+{IxPp{M%cPmsNxO&6!=q| z(I14vsxrM-C@aL07rOcg>`7OZx$X_B*_!2YHK%ZjSW6x&HFSUp3ssZFYHR!e4a~IY zkD8K5tM#G z)z7+z4!QXg>1G0JI$+C<C+@Z%_E|v zdw8I`H-x?$Qc%lMst%@uC4}}OwUv6Zkr*;o3WU$*MT|qlYK%fu!zB-UHHw&a1;{eJ zr5=!^T1*3Uh_Wk<1z^Z277j{K3m zt_Oc?>~F0Gm2lOnKNHN1zu;$Mf4#6rVJfJ?GbT3C!9#s*)Hy1V;4s(1HWZJ*X;jVdO$v=cs;a2Z8%WyYg2*spqu{`v zkub?gDLlk)y6i6UdB|NL=TredRD;IGP>n|d)mTHiE_i{vv8Tu^?@xtbvsw&d=s|VI zfCrzdLcSW#Z=hR(P*s}G%4LB`Te*h4VM9RY)AmxB9RM;G6yF0=Vi@Pfa$`SRZ4C>1!)xCL3)OzgVT1;f#8PKAX?6$i=Ed25uRk zjY=kBeGO+ipmG9J)Xu>$n^@9Xy%+pfg~KHmNG*j__1DlsF}ZMBeC2C8$t1{$cF&28 z5pTdom=j}AD2K)ocjmx*p`4hyWICr(45z!P%xH<5i@!a5Xr6Rj|nwizebAp~4EvwME>e zcuw~0oM05UI444?SR7JW4|3_An@-)TVkt-;hDaOZ!kGm%N1)S<0cZ$FA>0fSLtbr& z%3P!Iud~Lh&NU|Bpg3PIbch>fHD_q<74))pXOh2~kH%53FvAoQXi?Et&j4qxag2xY zBu9n7s8!OK(=3Co$5=?cNNG;IuFBlCB1UE5$37?7&cTo7;79n2t4W9>F45pgbf})Q zJ&~aeY`#G;Uzw8hSd@}|mP@{xcLP%aKohjikmhV8)r zD{b_GvZT8zn4m+*xlF0p&V~TD7|mKq5N!i7sbjhXrWp-;s^ zkejr=l^_}ndYtugDmr%W+3;1hq%7I&ADa;B>Lfb{}0fLhZmP(e=^UBvQ36d!iKdtjv9lC_XE9BEC9zDfyrR*4LWW57 ztv4P$`e3z)Gu|yW-Xq*tUxW8%7>l6sHyvQ|eL$zmDG46R$&+IKzgbNq?DAl53B-Ak{ z4ZdM(E6WNXt%M345Iquwik<5`nFRTEYrUmQx$(4kOQXce#q9tEkDbNij3AUm(n+=m&qp zFlb(9aeL?)x<3#o*zLK<5qWnRKUEFpoe}{uW)-%|2^yIdR#8xFD$(kUAUc=gw;saI zCIcU2dcc3^0fojhJwtcV8jPLIBt@gpGukSdp0PCg>Zwq%Iy1m7B7sdQSz8_MZX**C zvTAO2BB@PQ(=FY(05^-WNQ#*dp|L1?a2k_Q1d@=~rUJsGTmlTGpadA@htAJoK$3H_ zr|BtzqWahe!Q=u2mE{MhwZG_dARamWK{PO$UGVBxq1&kQPS+xNmonX)P#Z zb%p9LR!RHw z#WFINZjH@?Tk~#bs+_g=>=xFiWKLJz#k-^p0EO6xfmkgG;ywQBw&Qt5tTG2ahGfEq z0?9<9S~0cg9$KwX4zhg6EZ^ZYPugTcWVIMs(b{o6h7X*b!D=(pE4d?rb}@yTPIsAF zmC)INJzP1_Tl^a20Zo;wA&!mRtaPFnf_MZqO(c!p5Jck39T=)6Q_yVPPSA4-Ze=hd zvZf$^Zjg9I8oyBXAXY2N()R`Mhpegl(irPOY`bf9409rx0IUmR`3U^A$z=#%ynA?$ zriU{&Av^|gCwlNq64oOGOaL7Q1~5M2^H{0$bvQhA1WB0S7JUXomg$R_Pdv@V<0DdX z%gW+ijI>vC%oAH+mPys$f@>1dS74+M;RA`rjBrtqopffhg|lY2s=$h+asC7ulmD%) z55W~kO)DjVDq_;*P%3~c0_C4mB|K%l79f<=kg1Vyqy+&Mbxp5Tas^aoI-H12)<&9- zJ4swKfo&XZ8~QM&n^u(anUcIi>tzJs8ya@HivBU^UIa>Epl;>e3)3)H{)1Gjbt-7u z=DWJvX1ZROEGL#93oYx>3B8n+R++;1lf_c26x{lYkcP6Ge>yT2eyI#0z4{vX2ZOzA zxtWZR5zE>FgMN_n(O_XhFJ%) z9MG#lhNQ`-CKl=tfz818L48z#O_I&UxqD&>RAD?phV%n4VJaKiQizuu5AhcQIL>zD zE)*493;nmTgDVcHjcf#_zl%5^YQ+v%73PU>p~N(B_S}@!;1WU^G(Hg!Nx=LYUd8DX z+*B5A&{NUSEa*=M*4ax@?5mif3=~56V+t!l9mQ1ZX|R;M9yq#I(}X*x5WlK8^l+tO z43i#pISpy$u}++-?a4e{v>x*^=++e3wfBf%zv&OU!g|CHcO-6-U4+}RkS6g5!fL7WW?OSgxM29J2HeA9^*S* zZnH71D?LxMHeh%neD#VjJlUhztLzi^ofwiyB~gz6&{L5tVqA}@SeSXe8k3Ni$&^94 zt~eXOWTJkz5<&rNlp}c@eWW)PBTxXu-Tg6CL@PH{lc%rvMVcvWKwzHblxFpa6Wp?6Ak;h$u5R*-) z*#Sf@X$%Bq<_-$%WJCY3I}73@rGZkB=0REI%BvyxYVL2x?|AuE)^NJ9reE*Oin#Qai)EGuIjD46B} zT7C*3=L!A^2{VbM2h>6hbdZ=BU4o^iu|Bd^DuhfCC{H6us45_~fDa94tO(i?+i4ted4})wtX35k&)i|G+}JC|qcD}^!}f+yE`yk6W3;HED};W)1S=s`s}bkN2+*nO zzTE~gaF)%gLa?!)(ANyAepejAucqU3sy;BCoV6jL8-`g)Bl%Cme%pt-CCus23!6ZZ zLohYF%vxblO^?A3oRroY1_uxf&6M>Kox(0%hthQSbJ;X6E@c$qR-Nfrj zsKN~dt3e2J)r{@{NVyP`U~P=?wf!l+FSD|4HV&}`sleN#QtlDtaR4)Z5qhEvXx6rr zeP8^X>g0xkp#ZS7QZYhriVQOAW>p%5DSg7`7~KG*9FCu7wa@@8;AgL*U`CJW9Qbrs z8(dC9G5j>$>K#PZ)C?Ez1j91JD#OTwFMQpRF8FfrfOsLQfUCn0_9RF4QamDGt0N8f zB6G{5CMI4G0b87;uKBq9(W*g-vT!g0ElT4)vI!u8!1qZ9bGma;f4#SH40k6yR>+Akq8@w(cl~@3BahloW>h53R*<~hoQ0ZY{TbdlSMTEMnSMrrJVHm zEJUxMCBxVOFTtk3#cuxrRRFZuY$@V_YL(((<)~P>7b;7r;l95CBA-ARpR(o<@{A8d zg=(FGHZmN8ga`Hj;IlLuag!v%b+!PJmZwqy8f^$Hjc0S<60v64&>!T`u>WP%cS zLa~!G2nifUrxM$vo85_D={Qq{-8)i_vzQgqC`~YySna%yV+|P01cI3!;_QmxT2Qp6 z5*H|=GC&(j9fUziL{b-ty#d0IJYmh9f&r+27XadoU(sUr&;*-+6%j+D#Rdq_l~gtq zMT01b(C#g^HkA+pqyJVX_-19S8uMM~pf)&PavU|U)&>j`^jX> z-c_@*+QOVdoG6Glox=aB2>sW1`IpV%5>aF?>jbwVk{5ive(i)h2%3am(KVc4_%){w zmUcQTF-wb_fz0xjlicZ%eFi?pDN6LsZt43B{fdGJYqKU=pR7QSYq(5$EXE)s#6ss~ zcCivLN$1JjlBcNN zCk#whWEqc~u1(x3mhL#}~{z(*P^njMA$rYIEP?joF&tm+Eh05X>9GNV4 zvD=e6-^P)xvS1p6E2=xx2Rz!t(^)7dd&C#z+T>OZA%!)OIAfeynZZ-cR5&%2V*$jJ zvDf@>B1hP`V(W#9NsmB|G{{JGtg{Oz2_i}{DxpT;BbsU8i-Bdel}OCS`=~S|=;QrW z(86YWI=XnS=#>KGghXKkg9s>0=?|O3fYl1n)G?za#A`hszZDZDz=go*tv|<7YfE;HM6lGoScM*C0`f# zm#TWyjDf0<)+f;1v%2F@6zb5Zx$@$Mce)m@Xb*m`tl zmffyjlz*Is?(UJs*Sw%LX0RH!Nkqa%v;l77*whZy!6V?6Xmub+!WT$%(Yi>>#}a)MwRX93*nDwHNcU|B&*?T&;|<5`%-~Z=yxb5 zLc$AjT7Yd)#i+O)S0?bNa>e>*W!rsKHFcX6Q?-i1Mw4}smP zw-M^PkI@~jlDrDk~@XjzE- zvVB0GCsCF0BX3ImD65u!3uF!8H%%-RdQTW8e#qGgIGGK4D%H}^V1`f04;ZB@d>h68 zj_sR)@I?>iikrJtV{;L7t#+wx!p!Mfk#2}%_QGh*5p-CHB$x(orH0J#?0j$syB>&` z#j7#JwNkto%P8Kch=Ex^(lb`W)3&UX<(wkBtwvv>%qmpY16JczWFg2&DkflU`Y{~O2svQf; zfK*w&8qR$8_Z3GkaaiNkI$)SUCH~3piQpu<&03RosHOU$0qeI4t@Ka7WOArnp$c(z zMSf?K0Jok`NVSrKP=asLhw<_R`h|K(PYZrgrg>S^L~V3|+Ew*%rK;C~^RlOL#zBT3 zB~nK_D`Ko#3<6^Lxl)!J{g5zEJd&w(^#jV$51KY>4tZBkqoCoB4tF~+=F*cFJoepwW|$YTVv3&iyaJV%9ilJJoHf;cQ(L8eC7M5@SLgu}bL za*o_o9@3;(BxPAZrc1oa?6(MYr)!;kzfX)a}?ht2+LStD~tY_p>CgJz-}aUAA-Z;ktH?$!$3EjhXhE!N&cbY zOA9RL!D1GD3+j!6#|T|S62J)?Aqg#!s5uA=IARu3*>U}#t|WL!ZV+@D9|*EJ3$cM$ z_)7$dOppv++Kmo3V*Gg7!;p20;HfPEDkO5FM0O+x*;jbU9$H|)`G^&ZK zB!yMjQck-9NXtt0mnt0xg8Ln&cMv;9X#1g;jDoVrHG3Xtr!W>pR0@c>02+wb1S^Kc z=QECg4&JIiS}}2`Ko+Beb7XK0y6y=i3zwrE#AuXRCoaYH=aYzGVp_w|wn!VmFqP9L zLaQ%qT4sd+3Pk-DK7waf7b4!z!1}Y>n$p2B2jU{ zFybHTUVd9+od3%JZMj{Wa!tz82ptrP&Z{aqX-7hW1%cq zRZ*^gE?uk2XpPBOLU19nc*!c#Y(S82P6ebDCInwt8RIfm!?@WvW;M|R7$(vx*t?QT zQOiS+xrMT9ObSa7hT`6>iW1JUxNEx-PGbJ6*fPyYjrUM|X|tvENK9}aCM!OQ6>C(+ zcw_|?CI9915VR7pgRNl$G_j+Ef{6vT8AYB(zYD-2loWPO`t}PAsy-z1J!n!v)e&4m~f8bo$FEY!E13VhE1iA($zpW z5W-hT6{^x+ge>6*`vzOI03wKfBZ9FXAFU_@{2bX^YVz6;Nrbj2(mtRDZ>bkTX*4W& zHPc@=S(I^oV1?ut!fpD=0!a(0frm5JuXH9>U59v;)cQKm=D~-IA-@y zRKRX3+<#K{5VaZOlwC3ul%VdCJ%p+W1QM0OPoxIRgcY=bQ1qjWb2p{wFIcp;9-S*o z$VScwR`osk7Q2E5D_}E?io#-8bqkS^KOTPhbQSH6oi!%)nw$aHnBr*o#VrX6fX*JQ zAd5CMl`}Mig9VoAYMw{<6=wyXmoz_i?$Oy)RbCpdRMlZQ*A_D9Yq)`039L##sxXtb zszwx+B345^#udU;(O=?p;IA-s=?cF;y_1kP0k&#u66-q}d`d;Th3_RZC5-|Pj!D^S zCDirokV+jI68x`FJhP=6NneB(OPV;q+cxM_mAsAN1yBy+L5SXPrwb(`4amQl- zRk}(F(*GJ2*2z8JEPRsMhpe46g~=fdCsdQjH6TKo*cP)}BErNn_(eGqS^~E)M3%O`3*I z#RLjg1`a-Si<1TAArNC|aZRuoXs-|iG7Z zj_^z~o;ZLp6{8x2)1X;-jF?+<0+zZ|56o#I*)sAyv&A7EQ>;{3@6!_zVr)3FngV99 zP&SK=UEhL>5~j}Ex|`Rk%CH9P!U*LKR*M?mbmg>_&`=nd@&Ictzg`VePQ77NUXs_W z%$!UMH`}-6Mgn83l_Z}Y;f#U;qs~@?u|?1f*KK2FzX3EB9+7N}6PN?cNPC5)Juf~#+orfQ0;Lv#)HK6%K1mZ()8IxhiMC-L`NPtfNy0>uCwQ1yYGl{jfk;SyL{f%waoLdl5lNMr z4nnnw)HRtgLU)%GVQ~ znouap_Y$>&d{1PjPy!WzJlB$=q{f@I8XhMM0lH*OjKKsV^D11O#}%tCcRX!)LbXtq zv65WF*y9H$*@057x5l8!?tQJJAqL>cKTW5pho_*!!bTL3a-q?r4`Y!@1+-Gn-1y`g zJS0t^03*wX$SfzBciSeyG?goKqncvB5j53PQ%TkAC4Wq{l$2BOWKxfCov^qb6eQww3{FjdjhtXxi;NOdkXEsxA|SG* z(|P&jTZPgy6jSitvTEUuP>t!n0ppR>5(=jw=Yr~tmltI~twA;&A!Ju8`A3#fmCPne zlp{rURt{NY{a9DY z8e`;{NP}Lb{zAdahR1XS!O%6p;I}_#p!13*t+sk>JrhQY)fd)$KAFa!egIcY6i)g`I;Pc94xJ(q z_Ih0Q`l^XkE6;Vf`{NtJ#PZqeNQ0r;@W)4_2tT6ee)Bd_7%W`N+;S4fN zn7w$l)Rax7V3ngpORt$d@5L}$G8-|QCuq^j)YSdn&Gjw0LgTm zRhBm@3rG#7U^q0dZnTOn?oOaCgcH;i`&>QIqku3siAtcOQi`Y&*>sMMKz+(8BQ$6_ z>=LzyDZfN1h3az;X6_ zw=#`X$YCcPC`FJos{f?k*Fc8EwWt#+=J^(YD^;vY5v4M4 z`ap`NIXOIutwGwxZ|R9632-mM5O7P8oLVqew$uo8RKT99@x!S5s#-Vjr|{#e&PyzS zgO#C8KbS>LQzHT^wj5=?en`#6uqO2sT&&FU);UcKrkW#Y3sY6og#-Hq+FhcLVORok z0SH#ibws5c6KwfC_(r-4F;72*+#!By(G<&;NVt$PV+%l}e?@7D(=lIDF~$rlatG@; zMIfiE5!1M@(U4VDngh-X$#Lft;40%(OakyIcwGg$aq`K)V^spfR7Auf5Dz`OuhiFY zm4~agDp5K7?k11~c))@+RP@n%GB9cA5oji=C)j7E_SjLaON51x8;34MXp(v3{80Mg zosCDSFmzWN7+Ox^%rzw-QKAF;z6*fSuCYs$aTdBybvAM%#zvDPl>~VcJhgQ!o7kjP zpCBNfr+^@`lHf(6U!;x7RT1gd>KJdvU13AF3mCCOB(vg$nf;JET>u-tDvk2&23Lpw zhg|?6pcx>R2gz;8G;;x4Q>s+v{e#f;vin4dRzd}VVF`aOYlgiSR&2BdU8~~}z$?Tl zuu>IswQ^y0dzA79efA(=EngH%j?&rn1Gph9jOE?5@@5?GiagaW2l(QBDS6xM*g3)g#A)z+w}CBiFLC{>ab z9ERK~{@sq24{O#{vRi1Y{Hk`_24dui{gwRtuYH-)fV_L{v(GvE z?8n;cy_C&7s3K1kYG4x~(*Txhskdc?rA2=*z&C}3pBiYmgxIk(g@YIU|U zhPDl1NxKZRz^wiUm=fzIw9%wp$A>Ish{9*Pp-39^3Z2;K(N;%wXc>kbCfIMX^}*w4 z>RfqKVGEdthU`%h#>YWlQf`PjCw&YnobgMwp!nTvyu@zHuOG~RRa+~Bg1Jy2lE0my7vZ9VsTVbcI&TDp zeUXYaZ;f5m7GdX)onMKY)+mLT04`iL3I_4$qnju)CjIfBg)35b8F6EkETPBZVD>}t zrsAEn79gog8xlQeo6I`Yr*fMBnt8%#CK<){1ZUQLijl z3(8?p3>^)wUtNzUV2b>s<4Rgz|M**{L(sd%{k!&M&<(40mMVJ2011m-Mj&%0K|UL zlxzXV)NF*kMe&2-;i)pscXqGfRO;{#6hnzr1=tVvKD)4(o`r$HZYb@b@@?EKv1dDx zSuTzA=cLc(*xnMyg%mp$6Q4ympDG4&Nz$DnrhjQLe?2legXBLY_=I(R4t9r}9t^xc z6P66~bmX~p&kV8hON&Dy%6LWl){I9a1kAc}MWzEmRgDT=ff*&s!5Qxt2y@NDdiMRogr+bS33+#5u z&YQJVDpp}ePeD>R5qeh+6Wz4DN|l{MA{sdiQ^Woh%_jJ~!hxi=BD3J_bvA)&2+2Gt zVPt~XVXcCngwCKwUX0i|RFTsuoLiN*n@Am!cY)kPaNS2aR%(bds>T_Y11?@_VZ-#Y zZr}|EJ%`uKwM2hwH<3__raYRI_!%eLY6&${C%5opMHu(oNZMy<)cb}=JAs%8aS2OP zCAvQH9fchL;ZFN-o-(>!soW+5ktiSbh~eq(vdjpJNq(cqtI;1Pc)emv%W*AH$5_s<p8j^7H~pTMyNVpQxHoA8!ByUtYGYn^!h++w3xb+p9Uz!DulJTI_O$g(}F9cbG0(n$6-PRqJK)A-lMKl^KZ2 zy>I80bxM_SS#FQboD-GU$3~!dRrkR$ovOBPzVDXv^^c|=On|=Kf{0bbn=F7ssQZ?n zG9+VBaNjya+Hg@4{V;Sv8!vo#hB0MI!VE%8tu@Lx-1s%cgku*ey%v-J`>x2gdp-(j z(#9ah`hgx6VGTDGoF@qjg)W*`Ts>BVG)#nsTH%6sh8EBp@{N8+Cxs%2d4-suho~x4 zA##)A7QMie@7->-W)Et{-C68U3 zilL<~H0Pz##yL83?e9{#{Cy1j!sBU$(mT~Zc8}HchdNq4y+!J#hpyUEiHkW1;51V% zd+|WIROX#_HF$4X{u35j)ItG;XwHzH+!r9?9aiNsWnYJhVn0&9F&1O4ERT2nj+>%+ z{`N>UkFA26bHr|LmG#3o>4QnUN=|?XZrilop@mlL>mlbCCv$h`qZ23xlhfSL&+}U!VHwl`26loeN2y(akpcPi zTv;Pc3^>u<1Bok52VIQDEf{kP67i4pI{g8kw;BaXnCJwWDi3Q5?&v~d94yiMte%s7ikiV?F zHtDjxkpM4h(&(r`KBAo zKgNS(1Nj#tDL)+F%E*SL?cp@1Zy=LA%%1)8)CFn9JU>NpUBl=QKeSiF@MLq+O0qqP z-P2Lnx{X7-I<(%D;8YEUfQ@QG030=*OGd)%r&w`iI8#d!p1W%NUnS<5_;i_ph()e6H1%|oHwicy*1Rf?iXk0m^W~A*l$sU0 z4yCE*HGNLT@xzs!wc%j|Uucy?d)NAb0HUPphs&E$wZtOzkOJrln?LVY#vPC<8smn{ zep^)sdHf@OYgN`5OEI<;hbv+M$g5yBb<@T+K$faSIx6})`gITH@3FN!tdR!TNy2Ln zB8A0lMlwjr<%eg(AVfqwiEsRwSwY0J!qO~@RdgfKWxXSGga=_B2G}`UaJ0AeK?I+H zVHxd_xf7D5pr11Q(wqULTe6%ogQJM=)DRVAvfR^VkHF&Ew-Q{iH_VisoSi*QMOJ&8 zt60NVIVZJ|!koF16a=8h3HwRveweUC?Xh)C);9Kj%$7Ao3*lJmzTKijnPI_>tgl-n z$fmFZ__ac=l@Y5a}qCkTt8)y0+PU86*ut>6LANevnEWH5KBNlAn+N zn4hAWTES=0^2hnxQp@e4+G`==l5&(n2+YLNw7Um53yQeFh~s&MGdtU@!H6Tex5ky` zaQ#hig0<&}n1>ZUiZJ3qptuMlOjDtPxZ)KT3@dotWWm}lZl`duXfZtNE9$;kP}W17 zmZf%jA2LV9hfq0`HvOQcfvh|yt9}od7iy@djNSxsEz*Y{q*2OrICzY4j-gCOLL%jY zGE2EM4)!Q@l5^O*M2R$WGG z?a{>Uev-@B?-kz%f&uD@8&V`Du5}Vb70cW_dS~*au#{IU33Q#-i)K6dF?uA6!QYUA zUQuA27eL1dvx`&aCr6t9sO(rE3m@#ic)Ix?p_J8@23JuO_s+{g-N}GL_>3BayeF2y zu@wIJdq1@q`^|4Ts>zM zo*L(LWpOcje8f@_Lc2^zFgjquHWZ7q8<11IsW||p=I|-G5YLPe%kifH>VOyP(Sk>eVknmj3lrjg-Sp~f?+w~;y2hCy zHpJ#IP8V7hT2n zDvDKro3bPg5eWd0iJuBm`>dBTbf6&N5(~(M98@X38OG~4W(uIp2i;q&39IKj)TUN~ z-r1iPcxH3wr5aK2?wD+|IjWAR+Bb{_wZgBjCx%xnF7md-9f;CBY*JXg!n7e6ZI8l_ z!S&+MAx#n+$x#=45B-s^XM&OIQ5tVzKHp>BQXcGlRWiaT05LADilLbV21`t?pvD_zG4SF@QI_^o_qPe!FfGci8AvOv8-X6e0@-zK?Dp)srFp>lb;kY#Qg9n7 z{)~Zs4eQ!w%(;b-DJ)zHSa4ZOL(%Es(mA@ zM=TY4Y=_{X$Y|EzpozUr4bCFqAaP)vNqNkdt}LC$13&h$Dh^?G4p~=z$_*&LSF^kP z+@ov!-U)XGrDMg3HBwWYL2mDzpGT;eZ#uMOZte3L1HexF7OEl%;abIJk8mR5wep(7{M%E} z%ej1?DP?xDw0^|%!|rF!IO-&?3K9i&+RaN|z5ii3HvyQrz>Kjq% zlzNVT7Jq;CKfk~neH|Nt=e>JW>ixvOrNk3cbAHofrK@*Q@96ORPhLIk5YS0KAy-3` zJFJ*|2U_riT$*$iags=8p~!SwtTLn+72>Mmr~8=O)76T=7y4yR-Xl<;C!WW@L zq2%f*2r~(X^W1CTaXD_V^l}^G|E;7L zq2Z}DduP43YQv1xQw?4ceq>KgQsVj*7x%t0V{Zf^B49!T!|Rc$T{kh%IZw{y&9EHz zEyr0N^ciSl%zV3Ys6Fo{64N(?uDB*AdaQEIdZ_jZVOcF(TJ=<3^KVW(a>l{?tr-r@ zii&G#uAj_cTE7raeug*Wb2lhW@tHnyUSwsfF88s9nsFn2PqtIy&-)%_P2`}-I~XcE zWf@fK;y3DM-LIs?x#@ldA+9WQ(mm;z1w2MI2tM655eF6YJU2gmYTw{1Zn^`Xa=G|T zzf#Qj&jzzhF4TuAieBzyjHuR-jeh*b3D&r>_XH3=J$(y6)kJZpWoRU4RGO}-k8s@& z%?74l9o+^aWX^WVdx}M^Cnw@&#ANn8&oCL~VvIY!LOtOa)4$P9=qFa%2%Fq1Lgs!2 zk{h3(sNSXK;8`+kp(CUMTpY8A;7bc*Did?lB_=8qC{84ZvLfR^5Q=~gNF8!M=ZhLE z$8&I>dCzSuE9AaYVDNGu0b+Xh0qRNkixa;=#A=@O?jvQfHv&b>a$kCfXqi+Taoi3+ zcJF`~jPI%r*1cb~)CYyR4`3cw8zTR;tdAdDcj}mGUOxwfT@eg&E~gAUSlQf;29LeP zDquz;Zy4wv4ZEUFXK>V&Dx<2zF2peC;8|?upDtoorSW;y9bi_E07!uJ6m&d{ zU+yGHOGA?=qdOHTEoQO8Rg5uRMUTn@*H$VLZC(|M>>!#^-fK)q72i1Nip&Pgl`n}B zRDdm-ONKX>K8+4XkBr}11uZ(5HM6ZJp?e4Y5;Y3}Y^jpbdVH7x3CM&i;{R5Xs}!gam=uP|F&V@!U&}QuG)E9caiW42l+MFDkTyz0p3!@2RmFYL*-s zN+`qx>>*G-7+NDp7KJyq1JSd4MzMop^hKxvh>sauZKVNXV&vh$ARv#H(3rLur(IxF z#uQ@$0UlI9)A8i%gc~~$Fw~l_u^t_>F^rQ{ZCbm-pb%sG<;>-~G3z$WYKVEbxI37! zMV-F|uwQRTwA=%WkQc-~dO%jhEV-=R?!dC8n671vUn^L==7JGO`E7N}aMss7rXWP0 zb+|*qImh3U>y%-Kqdv!aw*&Rdh>I}lUAY=r5%=M6;R41Q9-UQ7IKi$t0`tovLS+2fK!V^8ZDh|M zt?i2Akel*cyvy3USwLv-yw}q+)aOn2a{&TrHeZ7+Y!RTG)Q(4?^ z_{N(o1ud-uQmbmBQ+-Z)-7kFEhn{qco`g={RUIZy`MuhkS+cT(J^ckW+*n$cRu?eP z(%Vkes!k0PkzeO=lKXg;iJ=!iNgt+0fAPiXPdb#5VueWwp#^C*gBdT|iU5(Wv66>9 zk8*REnu=vszw!8L1*dij3AD73Xp#(T>Q>iBeKVM!=>FKi{x8Uo(huH zK-(^nZDJzgYK(ETGbQvHOWm71(bLZOt@(lXlX|i8esR;SWN4DbE(kC5)-gI_1zbrx zd!myXFCJmm=4GF(B_~jU2(l2W$u7CEhI2x{@=%J@N<~=RIn3hT1&ryLf}JVIVKs1f znK0%Hs)k&d@nz)~t(3->ymp{!jfv?J>ET2OgE$t?OkE03UqYh1fo{&u1KO>;EmAuA zK;3eNgAEYg)oalvH$VsZU@_WhML3xGP1$e;3Kp^~4Km1@a#BV15^dkSLN}bT%!hB) z*p3ul;Ov9EDKr~cs$Dj}foXQGGbGA0VFnn&Oij%j)G3pr3+twjg1krtuVOE{c&nW5 zvZX`3D~EV5|HYt_H^Mp5Pjc6FU;>~`v=7T>nI+BHHAH~!$(QjfRag)`mxl9>x@AXpvcl&mXnoIy#s;-JfuOfQ^1eizz|q}qSc+*-826yr=&zs#19 zk|~bS6yI0L8uD2rj_$~#7I~+l2U5p6G=d71z9WH{aYv5(2v^mWbTu`ckgU5@q(yvj zs!uz_FdUMrgF-y%V=>V6z%Z30;8IG&B~Wux4`u`ju0(urA9zfRcoP|*5Jo1Fl~zbR z>|&NXSQ$x?6}2`*Q1m0cS7w||tFJ$p4!eM60Q2+4H}Udzn7eZ$hvF=5hS`0N`nzas zB$vKh82YmTRFY+vTlZ{Z)H>abwjrMcins3K#*<3GNo>~os2a;OCQcYa&Hv*I9*@!OBh*Rsk z)$V7#cin#}Mc`S7n3vSDrCe+=U!i4wm zcRCxxhwC-6G~|kBbu+!KCbhg%6}jqUUX}Zt96ZAE6!xafy{{$_wL=N%?#}TxWLG|-L_%RufQOlc}=38K;Oga+#NvSoQ=ZHDqgnPa=^X?8nmLj?_OX0OB0X``5_!X*DTC zu!9SylKYYbv6sg|rsvpz=t?3$)JdE}f$}Fg&96&NIjH0*ky+-o1aF}`5f+&##(?1UyJ~Dgs>kIc*-2Iy4s6VZRnX#L7AXqFF@n zx#hbsV6pgA3=c9RpmibA!S4>iiKMvNElm&C1?P>BYRn52Ayx99$<+&?DVLj1DqG5j(&(AyCS478aa(d~0)mgAwra#lg9K#dd%fpU@v3Bok|BfTl#f zK7%8wnC!XdW0EEV8B5X|w2g9E!7U{3?p#mojEbEW`W$h~xi$*7vW&YV2#q8hH)um? z#U9v6;qb`-#U?C%!x6%CE7x%xJ}$}1==5#3YW0ps)b12Z%^@?CWu!In1nZtGd8Fs$ z=}#i&nl>7T6F)L1QAJKgzngSm3+3iwwMAY9KE(D2sdFjaTA3duE2(_0$s)^y$3Xh6 z|EM+P46RRkTmP@bnXOSTZB;9kxqMwMpR_b4fSOmB-6~nq^WSzwaMAYM+p3PGM=OZ9 zM=|RmPY4#60amphMb}%k6G@B}eiY2(m&SZheZw|ICiPegxT$+N1dP+rFKV)W@7piA zWp$=`PSjJAWG;U0)$U#Uxq^i`cIM7V3|h&jW{^^8ceQUpSDu|+&70oDTDPv>RQJ&1 ziI`e7cafXr*1LY|!5L;=-)lTCXO>Sc&(1!}gm|H8cI3N)j;8Ck&W2v73hD-2Mz@R{w`SKfHcRhS<= zkrK1L7=eWwG6VQtZB*<9W=L%V& zn%}XJttTOPO{9vfB{O>`b$n(|$+6@AEOV}ZcLWjjg!`Oju8VZ+*Q;7V6>vOzU*W#a zten-;ey!|PII>pcs-4;>usM~AbYw^&58-tJaET%{k+HG;XA!%~yf`B1g-rgt?%A^8 zH&>xPV?|W;nE8%FnI=!@8X7|Ew`ujA(X9j%kRteI^yGBJkv5$-T&${^A#j3thAMJS zYj(4Mn|O zCJPpM%FPJ6T__u9na#-InB!Q2R^z-hW<{SmxfY`UQDj%yUVj|RN)MliM-kmyaaZ(d zpFL4Tf$>jD8q0_Q1ABYm&*FP`b~*2o6Tg%JPunjn<;bs3MPUqTI66!TZ~Ji8(lA7Q zL-iD#7!ji?qRjaRhU(?nE#@V&41#Uk#^qI61nLoxJs^9fzH`WE>}^Qa;xxEXWTi>3 z)jn%)hWtrzpA0d;Gw*XnZqU6CRBw_SH7FtE2{+>iGp~@>9{0xduUeP&-(8ZpApEmiUr_|9~>X!}6 zEU2w;Vg4DAr(In8158{DVEWyKx<-rIS}9KJ=v5jH8%g@3#p%@Mnxi|kiiM03_dib6 zSmIdW!A;P})XmWSlf@8Q)ZXF2v-z{qSMOr$U?WTamzXw##d=>X5hA)7k;3+GwLIlXmE-v)(V1i97+ILLyD=jBxE3j-{L z!5C@4T{5lnCOEOOT6fnmG>zeK+W^Kg8-T@YefJ9xbMfo!o2<_GMFWdznZx*>5cI>y zlaTW+gM{MYbfIupg%%jcW#W=b$lmTHrm2+d4Z`omf#W)6vvUWIYu=ZIy0S-dZ7~0Z zOA1bK#lbb+<$6!Ya{JXq*BmJpg#OPhv+>}BWYxiFtPIdoD>iHYk*v%}*W^a#`bgD9 zDo_MsO++r6T`qzKzvzy-I34}&Ba^@98Q)OpL_$j8sf=@8;h@U76l+T4Hk^7l@okkI z1+rWiZtX4#&DyVHJspuDZz<$)r^RgT1uG|#W z)oGn5X+okF0aO}6u6XCfVvSWb*?Tx??3xhHl!6%Ko9=^+#SNmoT|Oka=&ZvU7wY_u zxT}eYzN^GQE6e9haLMnTXs2+Od~K^#t--~;j^Q(_Ri_-2`$ZxugiOM&pvMGhA?ll8 zLKxIHt34LFIOMY#S0NRV&(Yjh)F3cHEFvpj&45I6OmwNFcM6zTXW~1~@HgZ*sfh^^ z|5WCx?GEzZ#69AwDKk`MCewv+wa6Sc=cG*?7 zMEwewn{w>6O2JJP7-0*^lehr{<&&#%Di|h_q(mpg@o90BO(Fxi*d+wooyHvh5)lhZ z)CvOM+{LqIv!XT7_JF(sQGjymKM$CIvrS%}N5-8b(ym;JK0AX+wKFO(gQ>=3=RqTb zOFDfsoTWv^KQ*L`k&lzxf{D~er$lxszHw!epicnN?*$=B{g?zKVxj5_6&0IOnA!ze zZXYVeJffvOFBJr0^Y6_{h(#bZ0o$ZQuO*X$>FV2WA^3Ytb$mN(&_5*7e?H8PitmaK z^U$bOIImRxg%Xx|D7l5x$c{tK${Juu4A0q!zEW?WRYs3M1dgA)a(C5G11y#1&&E@= z#|P26&CWLEi`RIA)OvDElFLz!wV-G@Bpo&D+@`V+*_c2pIt!vaVO(e^G=FVgA{vX16AWNm*E&pzLCQxd?!3#jF{+Ewm=r&6 zdd4=E$Hd_HN!<}?8Nm#o{1R3{0p)oq@fqntblHbZ zmu*QxIm452)3v9T(sC0OWuv8$;@Qb#Tn;doi2*?xF;_-zZ!x36Fjk~F0LPTeD`q>1 zlmmX2AS-2+C+%ETa+!H#UTom+cbM3s0y(j|1_P4<&GWVmC!keE5NMyw(}o&{q-O}j5=Yx@*tOVOl%NyE$v*Oz z9h(crPBQKX&Tv5&)o_;hPJMFkKr8Fk&s^mU#Sm+Z`k!?S92KJl&4~coWlm;4Q&L@Z z582NRKv$GmPyOP)S*wsRvj@nAK26x_G-jh|2S@89<$cxc*AwXI3}$=aeje%b%i=sY zz41)A_pT)wP-Ee9Q3}%&8BYZ9Dyv(8M#&z-`=0kOY`~|zVuHgaJ3;yL+6%o zDCBozJZxxm)yw%zPc!VnV5AB@8B^#OixUisoi=Q18Md6~cWJq?^HTS#x3Rc-SgXE1 z_Mhd=yaoYLDz$o5Y;=5Z*6mtOP4Nz6VDqq+JWrwEJdZ47%IMm1T>C!cN9wGF1Sm7K zv3bdqXO7tr+Vo|{R&(BL5zi_r`@`PKpoL{mOoNBLM5ut|*k1+kAt{eJNwseqijqJx z+q4Z2>|2=CI-JT9hDoh=hB|wwlirOn<_2X+F@&i9h`fJDy1fTFeI}SP<>aV-c(1=H zkCOo?zHo71L!IOpdkAkCBN}YP%JSPVZ?A%LSRi)ce`_VLz8mzqSJ~YBOh=uRXEquo zMjiKoP)8BMQQ%gAAvf*l3uUL2G_Q4sa}0&m>;iJnJ~Xui1xy^V%U5(n8{lZ_}SiV;z@YWIr~-SzqFF2RMD{0zNijiAA#*hbW4Y=pwTvU{^NnN*+m*6yb{*|3(t)8&V(DB$e#Q9k5 z(=}U|8Who#+-RwSu~K0)RZ#6zRfaURJ~Rd~t&XxC8$)OX8K~I?!hlfe(8>)t>M5v}5->=|U^q{Ql46pzk;{%)x-lAOs zPxlfbocR{E_7zGmUaUkJDHryYM^7ve62a={C~u}1w#+p^ra6*X^5^J!;kjC-eXo%8pW;B6M|H0@;7oIRO`jKQbzR!nHlb|lAmdlgYluFD{bq__VlP3+ zJBqX@d5`mv@A1U@j-27>nJzkQXwYdPNI+Hn3ophTG>gPK{0$xNZbpUD@+ie zB(Xy1V@sNs^77EUqO8-kLfFYbI-%W&;DNIVrguQ3XHor010-mSPwI0#P?UXNGl`5b zof;m;#U+5Qa#}@*>fErUoiD0%m88ssg5#1RS9Rs-~7Q(a|M$atj9% zIUB|q!K*Ru{@?XhlMMhdl*nnx{rtDYx&bS+82EcIL0k!A8991>&XiBd%mo3Psn@8&*% zq*xd-7{Mso1#sdsT;lHXtzHZh3HKuF^Vz;WCZ<@$_35QIY zy=?!$T@&{6N%5gW^5kC5cr(cfmwX=P^pjVaVWn6zrR}JYz%%qgM6lL*Z*tRz)-C>L z$7{?l=U||3YLv5n>r4@KEdyQSl{E}DVkJg0D((jxv5UtMdoW^inGGj+o+-5uo}&}8 zSf@-@e}V$(eo7$MS+G!Z6V?_kp=6$1C)oI-WNPY|{N#(Cz(NZb=uZy*+OdpCg(!ou zIBBKFnuG!%>YTTw%!=%^kTVCZ zM?DQK8^U)ZRP7DkF9uwI!t#YggI6}ziWjcVRo~V{=89J?`I58+kf`7&N^ENi-;j&z zT;ZFkeHDMk)y03=!F)_jSelHxjW4A>N|3L7Y2pzj2w!@a<&k>55aqf8u}k2^-lDybIV%^CprCLXZSaokdkbm0vIk){xqO~0CQs}>mKOe;sP}2d99GI;a~auV z6Wq7Ng~LbHL2qjAjO&oc9i-LJYcLq4em-D$93wu=Qub-|J%aW;mXA#YdFGEzLU-4T zN|+FFW%*r?D}dwv>#J4lGz(9&h^l#ucIiHMOp!8RJU$~wuhVIK;`Je+`q9~?w5?_T zYg}_2-oQ}Z8hgw)nlM{Rt-|;^d}zBo+9t+?gqwKfc`B{GSmGPCKt;Mv68$p}L6&uU zs^}QDDy%}qIAEZ8WRNHb0vI#;&JCNdB0)=dG(b^ZNrMyvyMlQh=net<*@fT_pD#|> zcyD_JqTut0xTqUT)CO?A04?5>vwX=kEFaHZ+Kl|C{PbRR5=d2Kh#79$;`{vB+AZ@l zG8Sj!sD1Xc-F$LJF#7MO-RB0ULXW>1eFpIPqb43vZqkwdg$kFxl=09JYu|jn@$`5c zsa^&t?vJyOzn^c4^&Jwj#gP77l46kh(QC98iLN2*KF5UOmLfa*e1aNO#4@l7CqGNr zlC$n-lEiyX5>owa^Qm3^%{Sf8e)*O4k%;Y`3<=@Na zL*I|ioKmWa!k@BA6_h04U*LH!8Ld`+G4Rgj(@5&#Tqd5_I8E5bSq49wtP%VODoTat zY+)+MDS&ieX^aZmB{G~FMDMU$vkK1!Jb@PPtP~X-+7L zJ1gHIeU^eNn)}uKlnn|oYz~d6Q&r~7sEVdwts19BJ~rBr%fWeC?L;R++Udr+ZLb~9 z4W3^J&XpIv4joobnySe)Q(6~tV3%6NfQf<8@xhOX6RBpn*NhV;gya^#9@+0z>I9%j z2&HP93#^rhdvj$}{`{hjX2RE&zcXfpWJM|NtkvrG8(&~8H1Vzq2kA_O|mTfa~&y?mO56but6(-u* z3m%I0c=0S2%vv~u1Ls@q&EB0ke#yw2NDu3r=n_3;F`!3&9S;e&P%$S0;ud_dHt{zA zWA^9p)&OiALgb}EcrlU?;vzh)aePTk_k@DZnkKnQo)0Nc=eLI-uBVZc%v{4rYnrFi z*rj`^ptNgszA_cDrf}$_%Y&yz`)=+sw(~MBV>C53%V%BuCFx_kopHkM73MLqmaAY9 z&`B0@T*Sy&102 zC)^(7S;42>PT|rOR<+tt3ydkomi9JxHupElENzR`#TPf@m{}t;LSSL+SW<-dD;?xd zdL2oeDT)_;c9}(o!9|y5lck1za6CDLJDJCDRmTa$xf(Zy7im%+)xgB{3P{f0&e=dY zW|?b6)fUM9ug%KuAfT^5_r%K64>VI!Q!YCgccUFWEC9Il2e=1uApCLvq;nsp@)hjo+6cX*xsgWgYPZnv6!!sxnHE__@IWI3@eJwJ%R;B#!-ak>UifkIs9PK3T3mG0A;18BP_=zc z9|5ok!nF;%riq2yyM3P=QfYs2e2n#;@k60PEfBXrg_z@cl=}w^Q-XWUv&FI6wRUP*FNW=G6pci6?i@xSZ^Dz?L)1xSjbJc*zn#xwxZkr z5XtVxe?qW6@Akj<=_|`P*u@tknjC*NqRp_hEBeP$w;Q(wdF|vpKu*RYnoG|Z->snJ zKP`m+cZ(Ngx#vg)UJ?Y;qbyv;fdkA4+<&H_{@>@{?>_qPjfq>~yI8UIorCnsU7S4i zAlbkA^s%9yEf0c=eiB@|8u@iAecEF&6B1Qz*`fBKm^%1Wu&QCWf=4HvVVICM+af60 zb>Z6wX9UNoqN~ zXKPB18aRspub^^jEr=$G*;e6E&7!TIqD`&N0Jj!5>VU>7puoM>>lIc2`b=N>+~{0c zt_(ugGZV3bk*d#ATyu)~dZ!v-XKTEcb8YlBiGbrrm8{8bo^u-Decct)3|SrxRw|yY zNw0(T5QG99^^?@e+(cEP%`NI}7rzW5}AhxzM35LD24lIkklM}uo~b=R4cDYH92{J@$_b<2N4$Msy-6Q zxSO78#Dqdr0Q%3YpjpUFN~36OrZor2r&-#54$8dt@ntrPhCXl&ckY;u9h!>7-ZBYj z?wf#z0~9w5hCGfaOqH;0IC7-!To2xA@C~glQ+d0-3l$Qa#JVRdj~vA_puq&~s9|8? zc{W3fyZBvL>R7E;kG@;8B7>Ez>Sb%Oow15mpAMo4QWY(EfJidnu%M9 z0)nW6oIyd_A%#dyS`PAuJTFvi?E>I8)r(4NMgBi(H?< z9Dc{LeHIqW7)Z;|hBteH^gF}C)m;lH7ALbiStNDR17;7f6nAaKIBWN_6LPxmPToj% zQamF@M8EJMmg{_BXU|sN*aY8JVm8EWquc#vFD7zhSfrg}yZ_di$Uddp{Z5y`Y zSXkxD{D-|)mW@6d!I}=H@61qx?(<7b`x7?F9LohZ2xDTI@Mzq868q`Z%hOri@suzF z={dHW7B{gGub+smNXN)BEf0)nhn0eD;Sd#6OkmVxT0&^{Z-!((#-1Jzj#RpezXPTs zhF7WxQ2-RX`C+)kjzobWq~B;`tBo#WBPS{E#NFXE3hso7s{kZ4yCZ>@1H`%YhN~U1 zPdYYQW1?hm(7kYD!Q#kccDkD3Mcyi|kD! zih_snY4^$q1Lp%FrZ}iP&GG~B`fq30azl|^C88KwUg5Yd69w@iF=qX~%|B92>cJrF zzS|5~&RxF{Ow~sfM@FUwQn+rv)gU<~kUqJP>=IS5nonu0#F*rqmmi4<^Z`af+UJB} zfQU-f1xnn}J~DBbbU!HzXx|$;d=hl#Z7PVq@S_hZ@jsZaRPDg4DtvCu^8WGgwdFq) z&_9Ht7K!NpnpwTo1Z2tTl>Uprk@;kpSzg|9#~mFJh1%{z<`N*<19r2bsi*9T1%;5T zIaEU^)RydJ;+|I0-UR67@FQ>?&LRH?N$_;rkIaukiTYbZM~md!Srh$HoQ7v>>${&v zI_Nr2sbZb-O8DI6=@Q}Q>? zu*KK))c0GXBztU!+v5A!*e%@5PGE&4UdZpeWhs&Vcq%QM76j`&&|c=Kw{Q}axy%sl zlH>18^f9XPAQnJ`oEHSlCg#cP!2($N%bbR&>Nv58J;86YSvf8(5a0~EO}Gm4c-=e0 zdcLI_E`^}~ar7g7UPu6y@Mw(UQROQ&y)H|gGjQ1jN!pj4Qfd~cIx zZ6qpxNeL>;eKrkDgz1Qk8~bkmz@SO)|ekzf=5U^t%FdrGnwP)C|jFX+{oP@Jbd! z=`%YEY)Xz~CshR)sN;m!SKa2D^npFypxZoL-Vo#sB2957lw!i9R#D)@F+GAoaN)qC z&dw2$n@OQ@POFht8$PDB0?ZCFFjm@XS4Nny^La;@!kA<-_A(C&;6W3Cy9&Up)g?eW z!oHwp-KmS5D@jBeD7DOBF=!v!@DQ zd5cnErnqE2dUjwTI{S=9#1zbOfMnZ0?`p#@&BW51-64eR@ke6vy`=M;EdH94Mbp6k z_1t%hth4(Yym_&nfAd-`hCJ-?-zb&}&LE1nMAPM>Hphc3=Q2Z)yWgb7;d@y+uK>~EP_kq|BaTm1$&aFmRsKBoW|+Ik z?-D;F{8)6kER|Z#(`R4ddnnvRPxNXoB zGpQnhw6LmCy?3wOsEPo%pIsKw}ntN1~3rHiZ@OG4wPN#C}0FX-5%RlS3m){?6{VNb|0l8q6tc;N8 z8SRLTwpS7s8O0vcN>ZaH52Oy=j--%6Ix$SPiQLvHScfo-n$=VUCSs#$&3H%L_RTjs zxv_N|F59{hJ!o}|?-?nDJPq*NqTWk;tC zvb(@&5IB^^!Yyzl$L87m31z23)I1z=DO$Jpmct=C0_cJ={62S?t!P>RhPgmCwoQ^2 zwtF-ym(=Y&sgrlda1ny=Y_*nE3#L*xS^DA2lw&n$jP($S z^zk3@UUu&`p?3z~V9)mMV%*Pjin9Sl7W7F4c#Ey zI+c<3JF&Fj2MotA#pI0ajLK?u`5u*`kHj$>G8L{Y;|*?@Xhg)!f@lJ-bxjs=Vxof+ z7(Ptnex=}aCOV>j&4$88u|qCNqh|ZqwIQcb>a2_0w!iHwbFnPH@Y zmhZh~nj@H!BnUR<}=*Lcf5a zd9KMMmWv7EiOjdT)bJ~wk)EYXw`RAZej##vSV{9?)HUM#h}bxkgqbqgm++KHq`S69 z6PQtUvABXj+pObaXS0UtE-plmunDTUSJ<{h)4&$nUOs%$rF!!5%|g8g<;$P3_W!OId& zb@~o)kRf$W`^-2w)g)E%N#j*_8%`pQ*hd?)1c7$i{n~K!#=ZV2gz>|M7SK z_pefj4n04z($9a6}KjfGVzP^^`H$5|1Vdl;_$lM8v|;IuzNc%|K&bsI89Q%?TCwmxF)BxOqr;~#}|LFo>8 z3a-&u$&+n&CrUtnKEB|Ch+_Na?#b1|NwvSlV8tv$%~7ONQF1Cr^i zv4oR`&b;SR;DUO~#aw<;E8(u!Y3r-{B-u@iHQ*+7fBWlsi66PUXoIM)wy!{n0Yve8{6+# zH2ci@UtsQ|BmJv>(ifzAAeoaZtjG5?JaNaf~sY@CoeB@5zA z28G8e=y+*XG4SSa#F|JX2l*CE9*H9pZ<{kUToKIEBV?Ka-uw}US&5&rp6H!sN!El= z08qnnKdEOVjZ;7Sp_~b5lCvd#5EKW-@CIWq7>TCM%_~0(iUMb8NDS^HR}yeI-&kvI z8Fv_-!24?M{<>Fm6mPWHv&<1v~8+59lX8~Jra*cTQh;Y(tDIy;#j zB|CgXy`yq9Jbq?aHg~T>ah+W=XpJ~tEXJ)Sj(70n^gYIJD#@;%Ck2}beVfUMG$B{F zrV%Gl?^a5kJVDlKMg(N3VQXQ2^u^2@YAIkmJV2DUV~a<0M4Xj?w<$b{s6VzIWv9{kKpz;FVNy_$#<9`z5%HSSw3pW4o-Ibr?HLrRk+t@uo<5 zZ)~xIdpl;Boa6gCo<^agT|`@gIiu;c1|R0HAkaHmc;5yi#EJIyU$k z7;aG#lhhv6VkE+qG2X~ms)F*|lO^EXR3W${n6G#yC}0??NcIH`4164j$6y0wnk=wg zi^S_XOjOQ|VxmGpVu)FN9b-D8RI(H7w_N8Pt0Q6n$v+WL7#hz)E<%{N3z>})!0d-e z=koI|PIn%IomW~{OTheZudNJU%l;y-k=V#U?0E()G6)%bV-5w>jl4A8gdtWVm_FWi z9t1#R2Y6GRLsJoo$vPsLk}pL(nxyT)FC<97{5)2b((i}rd{%2(TR`iLbu6s0kI2L1 zu=qaSrWh;u3-m$?p*#Gpe)5WKXG%@yl7_TZVOT_DkGSJ_JDXdBW|R%YWuoD3$L26@ zAy-)<*&H#Y1x3~!iEiKsP*9OEeF!M%WJraQdAABasI&*;^SD51fwkT|jE9G~i-<%u z1F`>-SIQEoXN+PXo>vTKazAT;sshf_{1lwEhIp|HEaDw!0>4C2{T)*~F&ZR@g+a0} zc9z$%W5o0KqaSKM>{d;@!asS{@bAt_oWs*6M76u(SRyjl&7!qJoD>PF^$R~|Kq4h4 z*qpQWU_2a&;kB`}BBJWp-jyXvDDs-Eq|($t6uK;!o%IBn*TL(1As;h$HLk3}xL~NZ zcrQokcrtA?ShR2qBvn;LD>E}o>R4ib%X(*=?6Dag<-}I0tUnb#GsT(OiI59d7@LgL zbU$ALwKi|KW4INocSXS9A~v0tu+hiIyFxTR37GW(&-a`akF&m89%+cbTXK(hScOrB zcJ|87R(Ww8thN`eVO(9r5zgE9A_FN?(;Ao9OS%!kbJbgVmrYyp{NvAi1@v!NM*2*9 zMf}@U28fGqVSSMI#SVnZ$asRNh}ck~b_e%&sSwPhz_=hPISq=Qc)4z#61H8N@ESBO zvH3WD8S5DVOwNY-;A3AhiU$;%5Fn{pQFR2G(Fze zJ7Oj4WItJc1eq6jFlY^L!6mL*tAXzdUfqeb_iEztHlSz8)} zr0+-mpG&0wsE4M9JT4m?VXu!V?=N$(%s%ygG9D(Z$Frn;4v7kfv8g(q1t~2D9xwh? zz&rjJvk-#c?;;}?$Uz-CR{JkXCQ8&rBeNJ?Oz-QriSGWc_b&WIV#O=PaKf1dSOX26 zLliWi{q0iGqzb)X6%+;U7;{Qvkc!BE<5vC784oY93J^w~XBN~H%eis)3+HC6$$nAJ zL3*!2a}N6YEvh~}-0Zze%mo()Yg&)phYI?|T|)gk{O5t@6LbFSw-9jnyeyudRFL`# zRpzE}6)*BjaiWle+K-7_FuQS=SxQ9usQAxDRIPr7{W!5O@m)O=;q*2q94<_Y z92PM$p~@!2@S~3$p7RrDXs75&@9{W~%*33qoY>P!^= zTP$y5pPIzadK2v1AALjKP_1^qLZq|vXe&gcy}<@qjGAd~VTy)P!`x+ygKY=5Hx1*v zs(?N5ddRDs#G|STeU-olktpRJZ$M6>Dnc`;h=E5xIkQquyq*(G<-aUwk1>WIUDl&( zBwH+3-I!ycVE3sob%Cy9a)T6x$EtHC)}BSYCy6!^P9sv0NC!)vje^g8O`<(IE3!j~ z{m7ZfNSPHDMcBkRvGhyvx^FM%2_fW9s=>XlD?)LK_Au^ zLdPBlT$Xt?(kKzSY~Iu)lc*e5U{p zHlqxgT-iUM@WjfZ>BP`iLGbPwDH2Mg+ojqEwU3ByKc?D_wH$F|Smqm9SW)%*m+*eZ z=w5J$dqSP@9e@wrSopWBxWA4JZ-&WebN(%JIF^Q|eZ+?3$d63hR{7=rz_kJAT$?>5 z)};Hypbi9a}5owS(Cc!5(Io z+sb#z?%9RpB>u8tGMAj;BfG%_cXaZ|0cC5$$&sdxx{8@E{?Zn8dkNM;^lh~qG$=sF z0*KX7&V_aocUw7yFK6&-0w4?^PF2<+iGWq)1UyaOUT!>n<8++VW`8-vCD)Z~hL=-U z?ki*P*2|;}jx9y0r0NV6Rz>V#t9^t(X?3?Xr4NkZ3lDZ; zjzm63m7!2$rP1MU@bPs0w`-9;!_=cYLH!G?e9f_Ob@T0-1hYg<;Yk;7B~l$-LR}eJ zh6=Y#7L&J|oPM>OS5_jDsJvoPljqE0!_(cS6!A>?H>os2c_n;s)8+j!62Ds*b+<=I zrg(Uzjjf=}8U>^jI=NMcOup~Fq>1mp#?vmqP7jDvFYk|c`;qipHg<0Y}S zp;SbIji+aHBxn^iV`ObhBDujjhY8{~L&`F{o{D~HN7OwZ?Axdo4wo%sg2F$suU8fO zdKTYSHcc~13!PnU#~1*OqbkatKg5Jr1x_cjw8Lkyd+}~K;IqO*Vt08E1MDII7?#tT zC7_q3OvTvBAwgq~6DH=aJH&iK0XWi0LQj*Oq~`e3Md>w`ZX|2shmy~%e9J9&lUS%U zCplXblC(Wbi)z7;o9Q=1PlDkj;f!%zi-6k0hbW}OwdsDns+Ch@BpPAS;o67Nd;3<5 z5ZT9J=CP5_hZQI1YO#Df57%)^yKPNF}XRk>%4L%n(aSCvl5nh@~6Mbe0Oz zCBB{Xfsv8R;$9j-bHfrj)I^*;E*HO^3Q|LI7OH|>Fe@JQc~BJAaX|r=2zs&@vpLXz zUCp(#@~E5ruKgUw$b0l-{b2*?EIpDXd9<-cjzs_$J;PBmw@kvc3&0K%4A~|D{KlKR zT8Bge#Wfs7yjCHF{AZ0|{9Q8sE;t@V_egjfU&st<3v$n9_TmH?TUoyAQ6!<N zG897M_AnhR8fnLFrf++bRx7(e_fnh@rsHD0Qf|-&Cw9BgMiS7FFD{5`+8+oR%1`U0 z^sbB~5^~ylS0EPC&{an(XNiTY?&UgzDD-REcQ2D9(QzVU=kqS-2@{X*s2GXI=ZC+T zdVt@kLK8GK%g6I=fktO%!LZy>uP--cn}OZ|IRl|IV9x&ShB|oe0q-?U`I@i*V%MfedsYp z@Y8@nH<4Q-t(1~=uG~;^jtLe5H)7V9VGwB? zMW5m;@O)>&n}CTF?wu6~ciV08!!ZJ|tudzD|VXNyMxpq1f1hDtY$rrM&j)WUE)xXQw{zZ4fyEK9^SbXl;sVmNihS*hs z0u)xvd4D99QO^7H$hjHyc~tz7QXH*E?9*pl9i{IPDX!R~EmRrc$x`XitoFJ{YW*i@ zW_^c=BMr3|UOPW0$oMD)?x~YoOH6Aw+?pO5;$9M7k9FSm%a&F>=b+ zmeJNx9FcrIF;dd9%(b*aEys=o52S=@s4;IjMUOJx^GUet3gTbgCMD!;)i~RVZ6@_+ zz6Ifv7oYhR$vOWGMR?|uasJ=kXQberBa=;c%1RNI4B9CiWcXCE3QemiEc!(*k||eA zl4_daAS5#wQ3Kt8l3+%XZrJHLl)} zuvzhbssXPu?YXBxA;xh>%I!7PW0?)qIJrO!-DJt zQTvq;nd`PGt@g_D|Jz&oA7o$NJLLKEAA3vxV<#T>@dlgrC%yl<_kVTlOE-3?;w{bp zkjyb!{ja^H-wU!bOZk8A{j<0Q>)VR|r_L{LJn8*sE)chr?f;1*qu0K1>Hp~VtLlG} zPP88JPjaCVu(|Yy?n|u{{6^XvB+20E$APm$HA;YTFbS!gOuyU1FkTqGu zt!Tmjy%{SisN?MMue*QoAx5nKqPO%{3ojgPFaE51(o69R#okh^<`QMbecmy-uAgb| z|M~9~Mg-77v>mL1*4gcS{Eyx9GkLoIUKbp5-A~t*gPKx=nLhsEqu@WAI{DaOpzg6e z>V5p@$MQHIqQ^hYXZ-!gzwdtPvHy^}VaY#y{6qIsA$SeB5{#>Tq9Mu=^1M>04l0o#W_Y9pvar7D%b z#O06k0UAWJ*R}60wYnu(Kwkt%;wlgbK~=uVQa(U-oqU1wd!8}h>sl=dhZ4H1HQzbM zyLG5pYQUC0y-yXFuk9z6N+DqA#7q}c#rayLC;L}lW5DS!ltIZZ~)?TVFkQBN5 z0;Mjs*(NTKJwI-vtx#y|9&FTWkGd^<$C=Hz+_X|zaO9B$A=~Jr2n4#Jp_^uZ(rI-5jjHB z&gR}xXEq`y4spS1z|A7xX=8MJY0Y(8dYqPE8MM!l<8ANE+{ z4_?PHUu07c=)rHs9_-BEM*V8fj@q}fsej9`?Mrnbx)=$9#c6-0ch}Op{h=J(iS;aR zHdXP$0Dmbi_KvzkFYpC|WmCtPBCvF^J<4OyW2C^f(O^X?bXSVUKofdr*o=b5t{I zE_*h0w1n;4)!ep732f!Rk4D{(4HLor(@}RlNAiKna~QMmN&C9vV?Ei|QS`w7aeF-n zNf!s=J=x*o5#iCf#q@fbi6!raK^-Pq^qRtybl?6soBE~3%#?`BF@H&D>RvT8+IWU= zL7le+ruL;`2{~}%yYlH=?)g#wCV_o@)CVp=@)wL-yIz+BkrnwUi$!Fc>sqhf_mcgd zx$6CFN{Cwfvi|7KqaS7T_Qm>W$$}l-NcN85P-Z8-GiB z^?4n?&0yQo2XBrVKH$LwWsPI%vulD@r-IeSA z^Tu2q1mbACr#RX>8k~dqaj}B$NNs#o!W|z;nQ;HV{LQ<+{+$268+AT#8vPu2DEYAp zgsa^0=lPgh%`q2^_Ron%hB=N@7AXNGunoEaJz{z$aF|UwqG#*lv>Jv$IsKkZ2?=Xo zr7<{F(<#5h)ll#NGY|otQSY6YZsC*4bTO{|xl+=Ap&w>b|3+STr!t0c=+BJ0i`kT* zu<&*LEf!=Ar5y6*7Y@0S>ZInvwXp|scQE=J*d?1PtoD7=YUtV@_1-5mv6{Gc?hB^- z&AVh$;TPkHFM)<@3MJQyYqF`I77SP?^NHtql2V%a!})$F(3V9Zps_urj+|h zFJGE16=e#_x&ByC_95eOb9Us)8QH8aOAO75yMchP-JLEmf8#E^2djfjCco z#gi=kclpu;PHh+~!OU%VY6&hw095-(IZ;uibrY{JM_~>?TAM@9pd~D~=&;lW5JQ@KdYLQ zO0E9TJJLtE?1rT*@;4LI!kYd0Y^n&dcyc~R;J4K}+bYwFk0#z1LE#st`p z=1MgOhRfSGjmA_q7EfhL8QZHV19SlLEP;vuK$v_nZA+|@?15VpvEC8gNDl~-dfD3! zVg8zoqgvNg_--S!fD{or^__(MjQ>4e8swRp97|@VCdPN*&q{VzFodlpLwwS(KV#^M zbs-Or_h3t5Q?1Q16t~ldR21XWGtZ zia<(!^mO3DAA~Rzz%Bqo)&jYp)aFD49WYg?@=$Kdu^~j{iha}Wj5^;ou=!!riqKR} zk1C;>?<>k7JorQrWVw_OnzSK6tg>ze<;@`y9l3Dvva26-I4m6$#3Yh>Y@x$@LV+v= z^QlPevHsuZ26lK?@Wc9pwl@F5kHBMtc9VdHu6z)(SOzTRKu^}k(zK1wpNVMh< zf>3VcqB}nw<5I3DLA@-&?!9`K66`|7{Ph!SSoxo*aS1UKm zNflTW4{%xm@8%G^rWD>s0du`D!_4(Sjk*xzDvP8=%T=2tTgpK&h~<~Q%^_M9uPkB0 zic7{u0cz?EYQ5<$`or>)p>{_xpiY7@95Q!it0Weuf6+BI3Sd_wUW5ux30E=j&3sODs3)X246cG{N zZ{-*)h;?irOER!qv1~+?kTX^_mn8r*liS(ASp=!t91LZPX|~AVQDzldxn@+3$m`nx z&K&hzH`*VW1~tppKDtxC&(8Q+sA_5#tO?KDMfK1XIQ1W)p`UFyCMR} zw*7k2C}N!I2?0VCFDV(D(=nt!ZBTiL3_CUi58*X2!3kMaxwly*_Ij>IOJfeGvk9Q) zZrmk@rGtW`M;x zmg;;Tu4#H%qNo$cic_qG>9m`unT{$|8?-nrTf>P2FTcx8^Rl;TN88gh;#_3}6^%}S ztdQ*0ta4Ss5$HMO^ys33nYcZnt8A2Av+GVgVBG7%Co&Shyay9 z2QUPAy`FoYI%bczlLvY^Z)z&{{{bl z!2f!!84)}~siJD3bZ)Lt{OK;bW#%M2m${%1)X;;(`cRP~AIgD;TDRXe6ZANWV1)Vt zY~FMR!?AG(B46VLpb*7ec98MWo%r}6z24=7b>cuxd|m`no%k-}O*obDIs)Rvb>jTi z*+Tc&ZMA0uY!t4OD8Sd;VuhPlo!i*{BY$lNPUN! zX?H;3W3Ah7kPW%u(zaaGaouzLjl(GM7kyy-P(9LCHEBA^_O@=n#a>-GT#AXfD^t+H&Ya$}Z_f)^_6NMQ{p#*B$M?T}|H(7Q&KxoLdi4qP1GNoL0F z+#DIuKfjY-y~YQ+VYKJi{qr`~W(!=F!Y5GZCl)UfXw|oD-{fEvRO?Q_5vb69b zRaL7_Ocw?|_;4jmBl&!G( zhn$kxTSTRKo9X88o!UtF0jM)0mmHv~0e?eD;KSc^#GambiYH)ACQGk@%(sP69gK^^ z*s~zo+ejYGOu|8GD^@-#gQ<;+?6JjTx9Bs+q{!x8v_yEb&vdl2S3qkI)B8S z3{cFG@A3X!JpD_ay=EJ5W`QO6MPD0xE2D&ziTx)o{Sc2QzJMXTw9Jgb<509NXeJer zF$f{gD)*w|<2;y{WYmTDaAK$V93e!Yj#;M&jXkZGAO6+p{l|9iKfOQ8e!KPZ;lDe% zd(WW9+ zA>?}~0SQIl@DbrEC$mT9td5sHhFFk~s6PMwj`BSuc-1x9-@1M7D+f>&#|`{su-EyU zlg(7f#!&3G7Ns!{+6tA3G6YoU+zh=>bw@jWm-9- zM#IuLxE&@Pd%$&C{ee{%4fBr6+6pkorP&=N2vF6M-2aKHZ^{Vx(L2)YkC}p26G&oV z#gyVnWje9_2!7Zn3~SJ@1ySJE_XZKWmib;h@N-;nQk;4vHF&K*o3*ZLH`#^6SF*xm)Lp7WguR?FlSS-MP(+os63qU zv^FXvE~Q`3c7YB7M6R6x1E8&oY2q*AsC9d0NH~$W zU>J0>dR9EgFU8kaB>AGs4}-ROM}dziMNogmylg~?tglFUcrwmp1Qek)-(Bim3QD=E z>z3&nuCxfNq+%Z_pq!6bQS~BMC@=&CrFyX}hS*FsjovKz2SAaH0W_pA#`D+^+FM`N zIMrdg2#{l{L&=K0Ad25@z5E!2d~)~xqd^qp`}Ku9=qpRW6;MXoW?&xq5Jzc7+C=ON zl0&(lCn2MNt^qRpk4T6R!;p?Ca2jZ#Zyz?KjX>?xpN@Yw_bRoyh`V+C=3`ws39&e! z0KS661#E|xa6D0hfVC&hf)|N{d!{oo_3>Z5u;*3o_!GrocHI^8Bu9$aE>7Sn8U<8m z{N9v?$XTD&!LL#ztyr%2Da_dKzC&QN!8&G|-g&?Kw>*!Y7#!vbk6_M(HmW~5I4YuD zk|qc82L_`CPyi|AU8Mb5WO{jm9U;&MMO1uFx1jmbN)8E)xT9}KWfy6nG7A~uCVXBj z?CRCwv`$*VMM)4=0>oD_QW}aYsTz1Kg(>yOCAzFB5i#wgO>5*U=N+Y^L13M~(X{XC z;fD2Xr#=yX0wcb4@8Mm@2#`evm{A5gpU2)^4Ftnn1VXs$s*729T+DirW6}+Qwu3)s z`3wQC19bW-kq9cEE8ra^Sy~S}8iVrjBAu1MP^yL{8VrTmc?`cKhX`*M0pO&u6x6F= z@I7)8i~bBIM^6p<2j5?*AN4={z&8G0Mcgb~)c1mi-D8x+b9 zf5PM>K34qPr*lK+MOuhr>PLB#7(xMlC(USs?K(91nKXc%#wrbRlb(u8P&oCkxDVnM`%EC6n9RTMl=kWNfcXHyG5*V z8K^8la4=AcK@_17TxSDK!N!aT2CK@#DRZ#onzynt9Qpt~RUKgvrSlBF2Y#i}pkqFqRezP`AkKqwYHnI*CmOgHfapW$<;X zk!h*j`M~?o3yy1T0AhW;!%(uuD(Ptgf|Q>GIBYYtRp15;Pk>`37ZqBCy9RUm)#2hQ znQV=NkBD~f4-f@&uhTFYI?5;tP+eYSW@L}di!Lalb6~8l@`ltZ&l3LyzoqHqS)-{` z1nD$8T3T%;Vs6wVuVK{-LoHX1?sHcMSTfHl79*Qdw^6#_E&&`xm6CDSdh{h2!||uA zUQ6oACKukdBJ?}}3Feo}+M~`*o~MevNFoJHZTXZnP*JnUHmC%%lYEo2{svK8-c@KH zeHezdRNJvQ>QGYg>X;-j>}u4MYZ70Lpc4054ha;7e~L;R&bb4LEyZA9|GK7D#K=t- zag#(wo2tyhfrbVS{E$w`H382N`)gPYsDrnm^_-4|4R6v)S*H&GD}L*DsJ{eVZKwP< z@{waDo5JF2@5v&BD*h86bRY}<@g)S5P5lFEE@-BnMN{n|#IvR#1W76Ik&vaz{Ri*V zb~t4$Lt?9#mMaB))z7v7!oKr^=O;k$kQ^m$;1?6!(8P*us#D=(jT_r6wm$0jLxyr$ z1}H0B;BWwg;6zNtP+3b4A`*Zcii1Tj6?vnEg?LC0JfqG(b>6O*4?lDC5%uE>Q+vmM&~{;4B3z!FB<^*`|tfyroZpcoyM^ z4T^At1GO0cL3tN$dJ+(X4B8chujP(j)ZusuB9iCpj`hxiJ8v6mwsKQJd?5v*TZY^` z)%0p6+kE0fbxE&?qp+7SvVWvn`hzkD5LSZWJ<5Pp+ubz5>#-BjD1r@Ah`wA$Ihp^c z1g^X-8&wZP02$(p9m!nzbv_Vmn9wH;^prFCNUck#5#r-hvix7{`pvu3?79&R8uh2? z`WTOZ@zqg+7BWwPCUN7x1>nJ{f;fykCX1t2-I& z+q*z0Gpp#wPKDdA&gaV};zY={>9I^8O!%j$L?;%3Fap2p?u1IBB;mi|?YC();0-`~ zmK{y;R`!Q_kMm-byIH=P?bD2J)MwO^*NQQJrUw@k%hCA;8sZs1lH28vG~!&UjeV?= z4CXayM{JF{R~p0FEeyqeJ>B6=!#xlC7~T*kmT#c>-|GA)KH$&B9g`AU+B?=5Qcr$5 z`4HKr0hlDl_nDZ1#JgY-VI`;ee#lKu(8-^!0wje#4%dmxEgTHNMm;zaeP_P+)y&#N z4`zPn2O2DmB_7P4(XALw?)px`=aUn9aqWv%5U;Z{=Xa;!k_ixiT%oQ)kVbsyMbmNk zTaz{TQCGj24IgQ%!hr~w5hcM})GM(Qx3$;QfKvaZYVE(zWo_OF3u7aMSc3fs1i173 zN3c?dO`WSFgB=0nG}EmNhxe;pW5p|{X_m&AsflINk{33{OzVZnVTvb~aM7s@4o($j z;|mG%`7vK4fczN7(S*u_nLo3a197?zL@05G>kz(_BX>1#{B($9+^ST82vIMq zDn>#QtGED*;Wa^n561H{u9S+f=Pr`xscYG839n z$4{x~5A-nqd|Sy7a_)0!N0MlN;qnF(GqbA$kL`@wIG9>Ozq2pU*f&Of@J5>mDbOUY znn?BLof=f{;7$Y-&Ih56R!e z^sUfEreeFo^weZREb+q!4fuDOS!nB%ASp$srGVB2*1*-auptR|f}VZbNezw`1kQjq z2s=_Uvk{ky)s)nj4H;B!w_T#=Q|HE|g7YIhrQ~lJ08Lef9*xT+gWew4-EIfi-R15@ z&QTuTQU9mzIV6+*{cJWLvJd)0}5+5E#6sUAoe#FChsT6el$fgKsgRY=r4OkNt#A zp$zjFhGVzGY)5&puhza+R;`9z1;ey`M$cvm_Xtl=@M|1v;{_6#e!rvZ zB*a`Ez`1<*ku|^N%P=H8w^6Y5)ra8ChjLScRGBNAQW_r6;%6bc4oP-ZataDwWKWA) zL{+4926$h@JBUf$d61#1*4dC#L*D^o8aRiS0+K}zQWpzb0Jv22{vP9ISu!QsWM*~> zEGf$ZBtV8$k%TZYjm`V>Oh}0JV2*Pj6MKXAV#CbejLHL&f}H`AQH&DOV)3R3_e%uM zD(r~P}i365Oi7vR#`DBYg?m-0CBhp}UIGmQQ zb%$ZeRzX!}8a};^fw!`$Q<@v)ERn8J@i%q12K=oGGl|SBh>sa$-6qoHUp^ENwsLo8 zXKt|2Q7K<_u8Cd;u$a6#%g1TeS;Z58 z2ik(gWT*jHbzM(9sQ*T~98t{yNA*Q1xz z+vsp1USs=^3Y~&Z71WM@a2&7iEVy@vbMXOEprbC(4FetOB=^?5VNQZNxyuD7rIg^n zf}D96ea`ZH9G(N2Okpy2cGUi4)Q6YN?d)cP^9clQE&6F_G7!qajDP?xb?{|qkim$T z8Hofe?1b2aI|S$b$q889^I-C6S*QA449p|OpEGR`ulb3-u5lnMOW`rWF0z?E$fCXu z@PaJZQz5q^OxaQ(V0He0fY5|@xUmn;8HfC3=&1U zKtWvuU;_(Ug>TFrA7o=_xg)>^DjR^GYC7ajwE3VGj)Dkj7$lHlOIV5$1%ac|N(LG@ ze04s0&BILa9Mwp_I6Hy+;A!Mwb-5E;G6~D#U_xvMF-%+ZP>51hK|H-bY^TQfg$%<~VGCW{&ut^@$6jp*lVk$Tg2O_TK;1yK z3fL}#aE^V_Qu7ga6js*0s988pqPmco*!m))ga9)b7hc!US+>)>YX`R-92%BJtMhdg zq(t5tASa&~iL-jg)B@b96-1^$w#Nnx%&3zqq33Bq6tSFC$DQ%KL(-%xdB9>91Bz#9 zP{iYW!%Yf39z4q3v;-h zQ@~(HhADh84KpgC3VWO@NQdb(2^m*(#JLs-P-dEof`!Zu06sFPWi{=t8)g=iW^o#I z5iHYlXmx0!5=+LP>m}z#NJ2?7FML@u%!>suuc%T)g1dx5YwJP>u2QY=zo)I3XP#D& zO(rD`B-cM$5lhidN@hYFB0Et6!6IkQx^Z7-YOLN{!l(&5#41OT6y3?NU{{TK^yPzg zy1v5SQR>f`X@N~94~GjA4+vvAY^V4jnOjyW-k~h2=Zq#YAcRFUlk`DT1ZGaVvp)A1 z(9k3XM7(OVpvMPT7IeZ>#4rj9Zm|paJKm)xEDvrp4tWM3iOE0!#!w9n)Bu^dwT+la zz-#zjdO3)_A;m(7sSK0~)3>dX06qWfoYNt!LF~Tg-c2&8@>MwSwMPt{&Fd#g3zpwE z0KuWNPte!EM5@y8D$e2$gyoo08Ku8n5gqrIy7?{w0&8Ef(02;>)~;4~1ka@qS8AK5 z84NHH%8ARj4dqj|4USL@h|K(=!s=yHf32lCL&pSVHG8inG&BkhRhbqkB0)o2LM&}) zQ1Q$g49T~1Brnz+%0((HA zVEBjm*Idvol3;X|NT8UohS0@)APVCOPO2G_@U!Orick!~=?E`f2i)-jn`#@zW{{i6 zik|w`gbAa|qeR3posgu6Q-~_L;aSY+bPam1@B<TD3vv&GQ2Nq@lB7lqU{6N=Pfz zr^^pX5ZB#B3uxvOIZHby9aN3F+l3L$L7JcJVhs!*nGsHR+KwU_?GovN|3Mx$3c04G z3L-08!w_0|&YUaCQpnY;HjA>T5g-2$(GAd-QS2DtT$EA52cn_^L^fD8?cX!BPo*); zGYo&5v_I1nDVIQF&CS^nIpIdWAee%-SVpw6gX!hz1q#nl5l^dFpEKi{#gJA&N=)pe zfY8cnN9%s>qoa@573d*< zCBMsS`650@1V2PGo+KDWJG1&!m(XQaoiA)8Cb#}c3T8qt;96t{up*I16Ey%Mf5S&b5K9sdU9)^v++=F=5(i5UX*{-#iUQ>QL3 z%jP~HGnKKG0Gfm_5tNG&Xj^LMK7j7`XLD2OwW$vnGB(?`C^nqxM06KtzcO3%*@P3=U9UZV&!w)MRB5CfMW+EIeD7~o1I z4;dqZ?LD)i3M&ycYFFs=M&Y#NIs<_a3pltHUNDCOVUb{S^;LYgI3{2Mq=1-VI&OyC_i7VL0Wu}s&!E*$JR3`hj8Rkjaw4E&WibHDMkZb>8(HFX(u48F6sXY}ERE*hwb%E_Cw)&AAS675SRfA4SMd!&u1-NErLr^qdW z1z4S62YcO(W1uD~9XEnI6=|KaVz3d&xIBUvBrBgP9`uAi0M*4?_N9wP;*FxrB@U>e z@xr^0^2FelOoH{{T9;kXX<&~hB;lC+qzjw$5G~n++6x+oe|Zg8W;za9;zAMY^CEas zh*LHZXoJ85+bya93AEsDN3IQ(1^%F@$Fx?c>k^1B@|OGOXkk%zsr0L2)Y~|69`OS# zxs@`EdvW|h%App90<>F-1qZ1~CJvVqa+Q)UANe}2h42SMtP7!j!-fQkXy6?NfAFtV z2FAk+Kn!rqt5}zDT*Oh&4A~%|H~l8`V+U@=a+y{JqFRw^ECTtc7uh$?%3#9O~l`(84d_Z3nKP9*B?pATd({`r-hax}>U^?1pDhai&yG9$3P{ zSO~```!UTlhGa#?b6E;|L_)Bp=i;iK7qLrbtq-A@vfLbMxz|y&wVg-HkavBieVigf zQw-oufQG1SFpQXM3K)NFzirRwWAWEjOlqMZCbzCjqXBE; z9b~3N(50+7j6-YLX;!%pUpywc2oB37bfE^ys8m2>N@XlXH0U1`Kp2asRe0+_z7M+3 zI@n3JzPT<*R$%FHf+#4qq08_;M9B0#=DMzZjq?pF;dH?%1YCl+@d1SCtx8_2Em9Q# zNc@V#))se0t%BcJ!`XpN0YFNbgfAo!)6$!nWdX!4FsE91 z39GS`B7kxady{{?-DAh^1g+4|xrsqx)_;dE3lw!wG92J&im{nBs>jGk=at!HG z{#H$rO+CT$^H2kDb8AsS4CwGRkBbxsE;!^b3GUYVGgyZCTJ|60XAV_#s550TO}n0yoQCe&nEk`DBPxi;i%1}aukPr z2M#Z4xNl2fAQgwwVHW%iRW+cP?+o%Ba|2^uO|X+{sH})w;Ul4B1@T>^%w;m!B-W)P>)uWIKxQ8-!TlLfeu)$KHv z>*%&e1dUS^+j+!5NmP&}<^g9L)bNQN{x$dg4tV}~Z2o4+kJJM+G0qx?s05X!hPT@s z%fFU^)G`1G;0xMQ<;&+dSwgm0f-sPosF}7MRaGwXxd(zBY-8_sfg(~BX&_0jEU@s2 zp{#O`*ZGzq$}}R2@AR`9x8v(8F`~K~!ku;cVF#TaO%aN0z)QtSzVivE!T-PsfU=Fn zS}!5M@>};xfP{&*#l$zCZ%8mq;1LWPUbbP_d~kmVOrR3RlERB@b$T5y637x{mJcNI z!c`MRAQ)+Nyw7~Bfx~_F#4L=VQ||5W3b;@n^C+kb=L?m>@$!stjC*B^CLzk#O9Ti> zjZg%B2$FW&iz}6aUBICNB$`Eh3zSHAGnP0ZETtpXd3K$t8$*P|--0_~B&`d)Cz;Zq z%E zHuYwDc(}xqg9@*~4GJm|j%qeE!0DjPB`3u-CU>zR2rv#-;tA0&>&i3zZ%1uzPqFdj zofyMh_BP^cmL(B&)iullddW_jIA&Rd9C;Y9X}^XLxRZJfZ~y?eH@qj5!vFww=3_tF zx4W>@S5J((qUChA24&9uQ{V=`c#*ZWhB1OzH zOZmr?LuYzb6gWZy(oU50$-8T+h1Bop01_@zA|lyhiL6;PXvA2zMs1bgNpAMdcn~|{cnHsF)LGLD z2Z-i53ry~z5=S6T{fI+bIxZ-KkJvrqYZu<>0*W&(Wq@z;V}YwyUqA1qmj_gQNfA)M zebks-53UJmeqg7WqA9W(-^hu`G*wg}up<x+nV*pOl7rYL3*$Q{a`@vQ619POG!) zlAFgsg@O|6qCeYSCd0A(gNsQ*tY+zRTtDOe4HolfXO@-&!*NE7xVJ`wD5LJq3|tU) zR%c2FzNrH_I()!N`^yC%MZ2N}CAb+g$+Pnp6>l@p(xr zGSbiD&XF7pxr8D_GVu%^dtSeUrPf=d$U(G-Jjn^gAsXxH-G$gYsqRl!%BwV^AijJd z<(4^zX)nGNOB_E72J__9UBU|2RRAcOp>MG>l1Mm~V?#ZQ=TiTiijI9FtYopG zOkN;s@Y`5gl4#9c?wk#mi2NZ1Z)o6vX~V9$aEG9IQ_RK+puVfp}L;hHll4 zykGVgAw6#mQc`kC)yfgcwWMU|eH)k4un2lnI$;hOd)^!Bo`jDsTiLs?ZnPJM=04;r z`-$>==%zWAmqvuXN@Yr&{qE&}vo>GT!IO_$-31EQ%%%DsJJFtH-r{K6qm-Kc071JB><02`a3zC*0 zm>DJot|S5fIK^L&9VRot?MfHD5`*Km3vcJcV8T?%m1P4)V-e_p`~aULYrA*#OAS3YJ`^lEMMGfh5M`k7le^!Th5Z3m)Q>OS_&$Hy7!;61oQ1Sh zQ7+MVx92KYhlq>g%9oXcNC%`5<}4vy77H5`y2#I|N+k;8%uolcTN8iWSbowOCSCX} zml&VmNj5Ch{N?&C`*D8Nq>BF)>JDfL)2MbUaIBhO83@1&P%go)2dlwX!?l37glYgm zcYC9Ad|5`;mqjUX7MUnYApwj2Z*(cd&5?@5`wKU;l)mIkv6BK4kz_RERPUDoY4Is2 zz@hl8D!xKvnd9^%do=HsX!fLXY+8>P01a6s#v^?4JC0zHzf!QUNU%>cQZ(j5fTbAI3=^R+g~@aUcoibsTL}{{REv>f;!1!> z+DK2z%CB;Qmh%zW- zz!Ve=*f}VOUooXT6;NHFUZXb>_{bxIJV8N6hX*_eBg@p8Fcdgd)(%K4MMH)M=^!@p zk?w}6aMIRBWrxbLJdNwh-$K-m6tlg(reFjnAal&Q2I0WAIDhlWy{MdeCWqc5%yW*b zlo6)vPWYw9X`V(&Fp2YM8i8$9^G<5-8t-6RhDa1Jrto=1DiKceP9Glj_Rz=fDFinGAtV?lImGL#*ev3?@*R9e$s}cbf&|7 z@Lz=&tPMF1MuH`GFtqz6C~FU*uBv^$gH75oA=*8KNK3GLLp#08P-+OE#oTvQ&835P z3(qC;lr7G4G~yycnG&<4Y8}IMu?Kgk=@Y~b(!5Rm zHx^`Z`*m3z%}U!*919n}5fj1x+7Plw!W_;!^e>niCurUB!FYEuicu1Gx#1#c$-!c5Hw3Fa; zl~oIiNPQ9r;+M=|Ljawj6H5gXvDPxwBz9q=9i+2FfUq^fmT~_3hXN=q6dHi4e?l)c zVHaEsBN3z{8W9sTwb8hFVqO`s3d@@j$Ayw&yV;wg4pVR)DSENd^P8U#n~5EnvFZsa zx-=97K&GMsD$#XT7(ge*i{6ka{&)+kVec+oAh0}*;p>`#@hh=WDRqL$7(~N>%|3ex z`^mPa*PzXeUYMl_r?%227!TR+*KvD?%tv2&4J%T&eFjc;`o>vQiw0IS{t zkxiFi0TS5^3&kPIqE9#2SID^tgA@4u!_YnYw|Z`Y$XENy0MKr1-hCBpY3)=3C#UgE zWW{G{;!u+`WIm9sYY`(GEJy1ETWMEm!hkIDZ;fSod@npNZR;oL5=#!rXhtm3PC-~X zi8K}$(gn^1rze75D`GU|b_huJ7&>m1_!9R!9|B!5)YXC>wN0P>L2~PZDpuqCTjs+c z1oal^GzEEx(pE^0%uTk4kSLv`ld5I6Rdn{&S2&p;_zUvzIm76MYOA;8<_a+DtJ_yA za~T?4-Dwjwsw9%p_iQamJk1#LkO(qWb? znKvGUevq2_OyS2BDJK*+RWuG6%=8E*62Nb37I_j5t*SdD6L%jwsw%iFvTYu!jfr2o zXp8?v5MoN63!TLj3wVxk*UTUST@;IYYyPU9;$4uWJxwZJ^wun9B2Vy?3_PtCthV8q zj%WBLZxJ$cl>x7fFdst=Ibv@v@2RgJ`A3%F`@UIB9}SVPK+m;?4_?4#?W+mJQ_JqX zV@q|aBsrJ@$)G0AMjXXA-9c4HGv&-LG(uffZdCD5p2Uz{0l`;-GY!$8U}d0$k$ISR z$t_BrrMGHn=@$@F^P_ewAKPyoCP{5R1jX#hV#3U_yEfh(I(~AwBhxOCX?q4NdfQLhPUOgf0;7Vxs;?|BpYz@AJ4i3T6BfDX&}U&$C{h)IO6CcotCCob?l&2m zYe2XV^Yq9sp`Tnm0L#e@sctb}OBY!_tb7qAk`H2gNgRY0nh)W016>*6LVL0n&PGx} zk-R#sI+U=`NwjfRSX*DWat^mJ4YFY?A^~Dk;5V-m(H(%t`++!Nlpc{s2@KD3t$ z-IY-AB!c7HG2K<;F5O6Vhup^MSXCek^@ZC-5YM7*+mY%(-2#BbOYZ|3jGzuT-|f$! zBod)Uw^-k$#kEcxfWDFv`rv!pQvf~AL#rHWV;0O>%@x{wSUP^Y0H|4z!BmNFa{HE2NWz#xi5j#OO53y2Th{e3dGQ?apdGP%CzDs86!~zOqm{xzE;wAuy5wU6%d_DA z&IZvs{J4mam-0MSUE=2;#s6DonE7X#0nIp@r3mwn0s+A63q;-L;kTiwyT7+6q~fh} z1R_WzC@9@zXeALBUd(XCh6cUV~)6^8qv;akwjQ9)}769 zp!_;W00@x83j!?rWSqd6GIQ$V*8Hpt1qK&WA{;unk*==_lUZ!eSfXF0Ojz+bSrNJZ zSzs!or3NG2Mn6wTvlRqqSfH&0rMM6PmgDTFAdN&7{2O%|OzGp8I#WglHj=#IcF5l` zw2UNg%7kh{5OIdUyWm7kb{^`A4bd&S;@E3CkR5>yBqFettj@)j)`6`el>lJ>r>vwj zv%)MCH_nr06zr@zn<+`!ikjf)Wwvij3kPX)!S^vL*i;gwqa!GQ2*SxEZk!`m!wpoJ z990Q(iyx1A45td`3767rX0d}_D>RFg;V(*|&||jtH_TI~hG47nd^J&3|5PU;1qP$l z1eO1386JY_S6f&yXE3qtb4#b6CYM85z zHCYsUUv)Cb4P{nRC@Cc@B8B(91EJh#Mshez6`d@Z@)sT66*ISMIDdjN`K4D{O|g05 z4f%(-a1`fr)`-Z=8d>{18#5NA&rhPjT*5xm19@YDO(UU>5^^x_PQZkX!r=`ThGHUa~ zbK4%RwW*HXvhPfACjTu5DH?zxV)$?tH&#Uz8OJxp}w3iBtq7nL0~FaW?=Ax;&K6k{x0Ag_%2w*iN!Gct%&f)icBLM8bs`a>qgSvK!#vxYyBmP$+hr{Pi!O3aE>!HCfyR4pE| zse()Fy8_!G1MWy$n`PePerE@f)9C_5HJdJQw4<4`ha|U2HBNN(J1T{*Da?_ayya>v zzT;+<-FdMS+95HP1Cm}s#xlGWWu{^}`kT5-jqjiU*>913MccS%MeOJ9>AFAi>7HfLNP|Ts{OajRsd_N zq)Z8qZz*8`$W>`!k;Z`eQlL-mqO=@~;&c!QkVFfJ&q%>SJhM*x64>aea>I@%yptZ- zB7xNjl<1tcN;tqS=OIQE22b{M1~cIj{eynYLGn$|SVkZ!Kzbzf+C;94HvpvORjaF< zHDZW2+T^{*VF63Mq+lo7Nj+46YE8 zp4GjaT!E!1D+qq#v~9f4@7HE!7f z=mrO4eIG+N&87ubd=q5iPC&4PA!w-knTrefC%U|e&o>5_9 z8dbA*U5(F@D0K)bf>3X*z=j#Uc{;yt^cLRMi)ih|r8v;41m&oQ{gL zFxpE~jFKHHo0W?c=D}?u0(-*Wc3@e}Uhx6NH9m%bjoFt|5BD6238{wm5e1_+Y|;&Bdb5bWD$cE;%JL%kP-#{DLz;T1oNF=BJs8PgfLkiS!9a%`HB)7 zCxQSVkuT!9*_Zr#L4yYaGIY$YHtd|RDiCpzbpZre}{_UT6+Mr9Zz5B6amNe);B5wk{<-ceK*yHshg%5>Tj5D`DR`*R<3bDe^f8(QXxg#aRCU_=%9q? zAmEz4c4YT``;VTAA5^w(dJ>@9qFPn)T7`QOikG$SJ=i0@M0FM8+XWD>=*jlSbjH5A z6*|DIrlYDdoGedA@+D#^r_fbg-c&|4500rRbNGeb_wRckDHH8q%4-CWPe2QF2v!{u z@H5Vh9Hb8=u5v$OvdCqEoFuY0d;Uf*RVr9lFhN}WPOC=zNsRDsHhW;~*y-JSp4tz_ z4wQ7PZx}E6kEel}vP#g~I#Fh{Cl%l-C|ykN4G4~!HrzmFj@EdKA2~X%P|)Z(6r~Z$ zQlh*#Y*Cv#?@Kg_CY1o86Pp_*$x~>#WKumpF9mR-x3mQI ze}pCW$^H^%4bKF5jhvgt0xN_}l_-GQmmrGAhbOHT9#E;J7v zeCMA5yax0XqfNfgjqGq7|8jMC_BR7Eg%Y_ga{rC&J_q@92iOl=hH4-oYC&x1z zb-ADZ+;fA9w#(bHoAx_DdHFGbcJjM9LOZ? z^)Ei4T_7h97Y6J=?x{|oGd6T#&RS;;x-=EVJOQ7q9cjahDzb1e^eL0oatI78&Vjd3 zl?a87{sSVfVma0jE%F5aFqZtC*s)!dx$B4H3}p?lH7G@Jjl>;qCq^v{O}HHKwYfH) zLj`(;?C{8mNJIKk$xy0&Sip#O^ss@5pkT5{xCFCO z{h2xWIvv*sie5DnQIInaVQkfh*k&!;h&Oe-T(0L$jpG63UAEf{*b}eHrLG{T1a3u* zV(nybf+Mn-5JzSO12^N**lk!(ha`G}0U@NKr`}%o)_~9h`Q|^|F(h_Vqtl6(T&ep7 zvMlyxn%W}Tv+Jk5dT*_*1y=A7P+{<&j%?%^N* z+{1eA=#PJnFSL2=r$>JLb4T>t;UE7Tr=E}f^uZth+=F^<|Bruee?Vg$lmZ-TI?$L> z7%x!7>(Z9dMNl;Iak*nNY8AdlS3$#yYkj1<3{IW@tnsDaKOzIf^8D0fAW0Cn`LU`{ zE6pPIbvYYq+q4#SMM>z?W~44cx}@SnG*ngQLQ=#Kq0Im#sppfLNN8ZWnI&D(hIlCH z$aVK6lViCmW_pXm5auMh&7t~29Cs?<1XOU+u~-DFiZ8cIYE1+eKd^*X5~Ay(-DblBsv)c9WG z4iPeO$A!75vG6X%!XyQqwMm-AQ1+w#E~_=Cyc|)~Ts0Gb6PTIi$omX;{IKKSd4$V7 zmuUnUrc$aR$%I(ERF-6Jn>Y)xw6YLt==aoWyy;x2KKqOwx_h4y5#<&D99N>{Sc(R$ z?-a8}V;B1ZVeiAfb;R(~09LRzc1x9ztv5bL8KA=dnlId_ae$B2BqbM73q_^`jY0^Z zAUJjJJAM#+dw%kT=#V;>wOmJVTqjNeFTblMvMP>L>J!9edG$(JzFHl~HBlrzqqT2T zHo!mBtb?h!BEdaS)hGNSa8d+=pK*D#`&xH>Co3WWXAI$Cou;xP6%z!j2K*X*b5bo1 zjDmn2usa%rpRMG7zySoP)LH$(=+?cQ3W1DEp#AhZd%m zO(HM%zIZv76XYb-B%PHE)^YK)t0)Xqa%YNusTB7k*7z$QkYF}EBBp7odP1tQO=BB= z)$MVJKd{F`_&`;gEYA$c26n|urBtBUb(xDsVtqg{TNA?V2Kv!_trqbL_6+lALxBlS zsdauqbkGSZ7a=R?-zii|`00m)XW71z`}Bn~2${HVC_UO;gfe%n;cHSVV56}_#_-V? zZ~nY|p0DsNpBH=qK4MWIvP)4j!w}LzmAUd;%c$NW@0L?DXH_N=OCgiDiJX_GB=4K{ z<-7Gc4p!uXfr>exO@%blP*u~9dhDl<{`f+K?Jr6((D_#`j;6e45{PWZ{$v2me-f@^0b0dkW1@`bJqC89bnSLbv z7XL#nC709mMsiscIS{ZHr|6p;e=Amb7dez`;%7a7%k$I#wdc9~PG~BG*e@T;S80xl zRX95I!D8B$<29Y^#>R2e7qvhspEi#Ny0xg-e~2(i^)0hW*m zud<%MRx<9**o;ayn{OHrr6l;9;}I~yB?VT6c}vNdur67Aj}!II@~9X6SN{-hId*KU z9jiS9C{ko>a^G5p^@cZlIM<$+YHOeo6+H3gk`2~?uSihbLh&P7s`-e}uZ!amQCJ|J z!fpzv&1q?j3lx+}%NU02#xHsX+5TJ(F8$Qx(B~SFV}%=Rx$(z_urB_bw)r@gUdpB% zRJyTr#!eGPE(m z2Ew^m!Gx-{NL6*ZL50Bwp@0ve%#|P{14~+dKEGm+Zw#N#%xLO>-s{p@SrJXVOB- zv4I!`)bVggsjRZ)i#~y@4)3!!NTyaPxyc=WUgTm5&%t>@G~pk81=5&)Cc3VdZ}>o5 z&9Y=}d?}o(1Ikm_-T;*Ib4LolThr+)w8`T$*N*;o~@MzE4&pzQy%ZsDiqaIlT@) z(#|ynyK`N|kysn&`f7xxLNby7Ja`#kH--M)G5}{$O}w6P}mT# z8;TEr^l_d!U|#O!vMu`uL~^NUiu7fSfMouSiv$`s>ZP7Df=Cvv>w){z&Q`YSl7W!Qqr zd)pjh4Q*CoIE57KIz6H)>@Ft{aK(%m6I_V~mp&4CLj_k#bOd_$a*0JxU3`I8LN zrB6=F{!G)um;&=AsDj-|W&|Mb>YlY&ZNvA16p^G-zJf-;pheb`_)1SX?hlmPJbti< z1c|ufNo7r5LN6V~Y(uTgHft+my)H(bR-VFsN;nc`3x2d?{mErUgC)C%7y?{)2nT3d z1|c^ps28#^l=Cn>@5nETe4QY zZ*#Z}6VW7~BWKeAcfiC}TE0)F`$Stkct@s7h?S-re1a4lM7I`6DG4NUDTFJ?D+tlt z{YVIg;#RU33S+tl#ln{-j72wdJei%(I5AQTv&~NwhfxV@^$54l$=J~f!4ufe;ZeL4 zE0}AqNo1%>Hm13d7)GYp*pib-j3%{$x40)!3vA^hxa>3Se3a9jJ)~ok;IuQMGIl*H zy_)aiTfvi{!rqJ(oRU*W2r3xxX+*{r?=_S$4fCLj%=`z^ZqTd_haemMpBxO2<{6H* za7`ITE9dZwfM7|$->7z_S(9OPshhB!_tmk(np;3?jskGKD^v_ji8P1`>%v0b&Bz|j z@%R}VXna6JH8+fa33R`Gn~(S*CQ*c5P_$XEctLwVHnc9AxWqmb5S6r|szW)wYm=GZ z6MG8~8$M4^4xKiv1bu+D0TK@F0pd-2 zkdO4G#!{c@K)UqVUNZdwS}vaGf_x~AJ`UF&dYb$BodZ?f=h~$5A_!7x#+L}G_^WP4 zv{~C=`8H(3oJ`2tKtW6ZyFw3r_2-@2#O=|@DJcYQ7mp$sGJ2E@)vTWMlhN2EYA2OO z2_<8rrj3n=I!89$1lkIDDkDOO)M-=dwF1#j*zc=c(Z?DgZZ?C+qATMY&`~JXRe)MC z5xRGUy0!`?G<&Eg!J9jH8HAz^^)RyGEq69Y<#2sy)Wvy7K}RY%WqYCSC;@Ma%Uk{> zQni=3idR(c0HepMbYa9vVE1hFmp3@P7S`?cLGb~e_z*IWV=36$^+J(}eTG#be0htk zOC0@Dn3gVBv_=Ech1;Fi4~h?kJ>qciGfW3@7HtS+pzV3%M4o35P~n;}nTq_Zpeo>Y?K~ovyY0|kEatTwj1I8B^f%1PP8R5$bbFfJ;mn0&WoyHn9 zbj$D&9WZt^XhaOA5?nRrHu*D|W0?54yaWrFosWPN)<7}pB^~W;Ar*oWWwejclcpAVOkxv4Jf`jonShmhJJm0a#>@G&U7N!oxS-UgkdO4LI!GL*}R zXf=NojDjB>vr3_xU(s^EBX^s+D{1F-vo=3?9%~66lw?p9= zfTtkc28mpyX{-L%XV0jp)wA;M2=GvizyOpynjR-Pdr(0FhzlxN6g;U`^VSF(l0f*d z25bYF%5RKN;=9Tm!b<#u_$YQIO&Ul9PjD7wV3$ju=GYF9hHgYo+bCsna%0u08h2`M zxy9ZREuve4kq}WiNg@WDArv)(Ig1U2esYWbt?E?-hOqxn?(b$W2RQvRqTmK4Y#znC zAEGXs#G&IHqW!|EV+64h!Z56aqoFUSHfQG(sbX7#Hj?*45<_-q4pi1)@(Si6y0>u@ zF?=gO#BiP)db39s0$71(s}2An=pk5fgs2hKy>n7;h3~JZ@mLqLf=fD3RW>Vh85@o* zpwzb_A63pZCJc=27|Zc_mK>>@eBm&43sYzl3=aWi`Wiy&#@8~FmGxu3Tg{)_Q#Y6NEjTTO)tr@dT7>Cq zR!gWz(4OQnTn&Ho`3`sjY23A#$h!(eGh?@swQaMRG;HFEqi4fBDEq&Ajbti7d*b zpe+uunxjxwj6e#;Zr})^VNLZgwoQ5>!{~wAfG!cx1kc3Jt#N%oPo2~Zb|`9$Lh=|= zviUD{2o&m2qS?SuLBy^~nLX8cQl~izb*P}#CURWKam^tr1w#?ld4ZR0ILxsOovU~N zNpQQNkQL{Bx-L0Ic|RUI`~U)J zOSx$i^*}82kAUo!3?;O@y!YW`nxeK50c>E98SEe%lqWkxUF8HQE7}u$Ag~5Q^_{Cm ziOnha7DHc3-rUA6%?FuAgiSkygo{yJx-m#NK<0Cno@Aw+$rfEh@JYye=jQL1Ad@4b zI?mK?NUxiAG$)uTLSGeivq?;}sH4A6x4$#L zlHS=T8N4}A6QDB}p_&e;)J0=Df`&LJ^wmw^fY4LI*EcO5R24Mz36Jm4gT#1+^35T5 zSOUW;nA6IGQOXHIL;JY2CudJ^Q;ep77AlET7>>^UTQvyB*vsQw@hVv7e z*r^Ag2-qO|VtvL9yn-fmDhjgfmxsK!h>U)XS=+rz$eVC4%@6)6os z(Or=nNkI`DnwmPJKK0u|U@!VA?inkho1;)$=)6V%5}v%PK4-q*Q8Fwu~^ltxpBv60A2lFNY`6uY1SM? zCX_L$NpWNJehTpSQzUE~>8KN6$48 z4wR_?4B11GTWrE7Z0!yLAQZAYCVs7UuIJUqc=zDh?=B9v{y8;TclBQS0$5UCfri= zYnnq)rM!=#Ihwnfn1h2P?GGW{!Y9pv%3TCtgt{nr%h$u{!7Cf6_M~KDd!fktFaMI2 zwA$Ft0_19|1iP3yd`t#~MfD1dQ9BL5{7UT%-2QIB4(z&ab`1$B#5${$ntAm``g@czD7~+0?(U%$HBwl&_qx{98k;>NNU- z7HPZlG~}hp+GYP?++481y_<_IgTb9mJyDryD<$woC*47v!b!O}DI9l?+S%2A@rOUz+uE01 zZtdHXecal&KfBV}cYpR#Yu|zFT8pnA`LMO`VD?FC-{bqUtF3)!vVk8smbF{Q_GG=* zvHe-Ub?pAE+d6h2n{6F?AnUY_9n9wVZGSds9Xpflnr@xgpPkL-v!!g;TdfoKXUo~H zH(MtTWQ*CZw_7J3$j)WE-e{dTm@Q=ITPIj&*G%ignQSGy-sa>HEf;UlYN@)`k-}sfA&ST zYom4g{_M+a*ZZy02eQwzU0bcw4`g3uyWVS^KA3%$?b>dgW~#55r*-;Fc0If0>0Zii zv|iei-E6(IKl`rr(*4=Dt(OjD-?v_RAp55E(!uP9)=NBftMw8B%=n4_maSNTpY9%Y zLYCH{?9(IgM>((JAx!yW-CJQB=%7(3{ z_GBNlp4y*nw4S;@d%yM6fo!Yw)C1Xjt)~uV+pVW~V6*kqnIz^ji201fd`4nEBQc+m zn9oSeXC&q`7W0`i$?4DI^ylUD=jHV0<@D#}^ylUD=jHV0dEjd6`7>Fl^?EkldVNoJ zw)Oh{?5)=8_h)amUO$k%-Fp3j?2Xpz2NN`2e;jPQ{?7`5{$o1F#bNl_?u*i6EegJ8$zh=^LH8I zgbi^5Spw&`63(9h=T8XdPYCBv2lpt5Bz+chsUE};o# zT$CBl$&3p!<4S49dRpW}IqOMFXj;VnC&&$b>{j6aUM zTXLpNiK-Zf!Dsnh;E<}sIOBc%oE7(0N)IBTDJuA;W3m)vWXCEg3 zp2cZP{H_pq7N;%p`vCy+EKVD=p3Ob?3Z8pKo_j@}dqtjmMV@;_o_j@}dxa^kw_eH3 z`6}joRpxwE=6qG=d{yRrRpxwE=6sb0He0Xe@%d`-Z7O>FcU z4_s}%X8RAY-ac>~@WTt!m{ul|7vAD`8A)Dvo8M(7d0~d%^WZ;>?uVuNVQGF?iXT?U z99GC2R`4HYxs}%8Gs-fo6nXDCEc=`+`$Dp!J+& P&F%-^$M)~bewzLNKw{)U literal 0 HcmV?d00001 diff --git a/recipes/wip/a11y/espeak-ng/espeak-ng-data/an_dict b/recipes/wip/a11y/espeak-ng/espeak-ng-data/an_dict new file mode 100644 index 0000000000000000000000000000000000000000..d10d32cefb100a3c4ddbcd232cf2eb22639f6b63 GIT binary patch literal 6691 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 literal 0 HcmV?d00001 diff --git a/recipes/wip/a11y/espeak-ng/espeak-ng-data/ar_dict b/recipes/wip/a11y/espeak-ng/espeak-ng-data/ar_dict new file mode 100644 index 0000000000000000000000000000000000000000..108ff2becba0de921c2ffc1e9208e64623d6b613 GIT binary patch literal 478165 zcma&Pdr;ihmG9dlTQ9l=SWV;}AQGb0Qmci8XzUOeCk5RNrU6emD(c9ziI1(CbB0HF zCUZ{)%PJsoVqO_Q|M(!uLl7mkHAEnyu{8+UeQckkB~%F^DhF$P�W#4Mwu8U^($< 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

>>iQ+T1G(T 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%0DZD1>IJ}Xq=KE2 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 z

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 Pg&BM_q?x!Y+a2y7J&tiY literal 0 HcmV?d00001 diff --git a/recipes/wip/a11y/espeak-ng/espeak-ng-data/as_dict b/recipes/wip/a11y/espeak-ng/espeak-ng-data/as_dict new file mode 100644 index 0000000000000000000000000000000000000000..46108a85e4b6e7498a6091ba263819888b14b800 GIT binary patch literal 5005 zcmc&%{cl@W89vFePClBnP1y!z1B$QBHQK=U-Z-{zBsA)fNPCq{E_qzS~PGfRd@iWG~#^lskZZE1h zS*2#j^6Mrl`XrMf>|}2 z-C~xUX>hy-S0XfDG`TQY2MyzJJp+*i&uq0QGz(B_nW)i7QDxmYMdN^nor7|#W*o~r z4MV9J6ln3VAAvhwG8)c0o`SyyY&6Ad}=2i|7h91wn6ZqpQ?ujl#&dLD5|+=Auv( ze!ChmHg741U0sND$_#B})3DYmd2Rwi zSRjYxN_(Rf6-^PoBe-(8ZF23%#sWVo{$+C$S&<+pU-8)K7Bbd1b83Z2fxr1AR=QcC zo3)g15`sImY}B4{O@T?Pz-f#er~8WbopB1GEzh3 z*BzMX_pbZ3Ocd<7a9yc0pkF~X2hFV8$Op}W-SQ0_3AdDOw%Hv~cGblhV+0v@z}bRg zp$(qoK9It)^+;d*%Lis7>)O5&$J(qT-)qj+NW|1YbHEBp$7j9JZ?2hpu1`VailnDN zF-Fe32O>!3rZDpG8dC-vRFQKJO zI+JAQqqLP)Xp5o`>vqxm>teEagk<34;(JXB=Yk*={oq2PbKgrAch5$w@&$3ltfOI3 zjU~2tY859CTx_C@#n_#qmB;aP9c=6}%Ox)r7Mb3z^X$g_hVUASm!m|z5pucPK%Ug_g zfz=r%9Gr6eJ5yL*-J;tI9A!ak$mH7xb~lcLREGoZ_pO>`$h%`m;hmPHV-7f}`E-^e zrB#VCz{>{>Dot0d^6lf8Hix(UU~qTK$4F)|Me+mN}LO7Su zOT7mu|6~mXDlaIu$5kV_X%4wE1wJl{w;PI=aDYb`?&-zu z)Si$YiZZUL6#j%4zw}ay>nOJF?aLmi8m-z(u~i&cr3LUF_2aG7!jLEFk{9EnejLNj zWJ;4?TE~t@4RsoR*&8+X!d>`;>BsM*Om}l=5bLvz8J==Gt4O!M@I!Ste??4vvBuPR z=LO%b1yub^XQP-0@dQ{CLha2W5r=w*%D#w|Ku3$WjR`!kj4*t_0f<4IC*B^&wJKQJt- zYyXs3`-e{cto)mk9@*}A@a&ZQ_d$Vu>}TAtK70c>Uc)@4RKFK156_=#Ca8>D5foBCCD19LC>jIaRUKaSQz?RZ2 zfzJs%RQgchH&liPbKbiB0Be=e=aEAWp$GQoT}rI3CIG8#y7*1m=!ViaWTS5h43rK8 zo)g$rx-0P80{4~P7idp=Pw72@_O!1neO+K~bgR6;BF`BA4|Gvvz9Yo5N}m2)v;51%cla*igD5@cROHl->~tH;|0F(shBJ8r$#n zK{}^r>=KJeWLA`3xr9;`{*qM7V*=)GUL-0?S7eup8kc;3q}PPeR=O>W>L?6xSoZBe zL0R2Revgt9o1}Z~6mT07)|FnLrD5B3HRiI0T-LYbsi-rI;%np@uQu$oHMs8EMwrNPTeY0Yz>=7YSvSn!l^=;{$ rA7LJV`D2s{e}5_&z^em!2$c>cObi1`QR^F5h2>lQ$%Jqpu> zs?3{t^5ogi$-L2nQS`r^ilXSX@BVdeeVhfSQkHMwWYgrg_za5&uHB%t4HtS>i_!s=H#z$zG8oU zDh-H1e~nn3%4{{7rnUpnZJqXqjhUH{NS|&w#)|i z*K^