[
  {
    "path": ".cargo/config.toml",
    "content": "[target.aarch64-unknown-redox]\nlinker = \"aarch64-unknown-redox-gcc\"\nrustflags = []\n\n[target.i586-unknown-redox]\nlinker = \"i586-unknown-redox-gcc\"\nrustflags = []\n\n[target.i686-unknown-redox]\nlinker = \"i686-unknown-redox-gcc\"\nrustflags = []\n\n[target.x86_64-unknown-redox]\nlinker = \"x86_64-unknown-redox-gcc\"\nrustflags = []\n\n[target.riscv64gc-unknown-redox]\nlinker = \"riscv64-unknown-redox-gcc\"\nrustflags = []\n\n[env]\nCFLAGS_riscv64gc_unknown_redox=\"-march=rv64gc -mabi=lp64d\"\n"
  },
  {
    "path": ".gitignore",
    "content": "/build/\n/prefix/\n.config\n**/my_*\n# Local settings folder for Jetbrains products (RustRover, IntelliJ, CLion)\n.idea/\n# Local settings folder for Visual Studio Professional\n.vs/\n# Local settings folder for vscode\n.vscode/\n# Local settings folder for the devcontainer extension that most IDEs support.\n.devcontainer/\n# Cookbook\n/repo\n/web\n/cookbook.toml\nsource\nsource.tmp\nsource-new\nsource-old\nsource.tar\nsource.tar.tmp\ntarget\nwget-log\n"
  },
  {
    "path": ".gitlab/issue_templates/Issue_template.md",
    "content": "<!-- Thank you for taking the time to submit an issue! By following these comments and filling out the sections below, you can help the developers get the necessary information to fix your issue. Please provide a single issue per report. You can also preview this report before submitting it. Feel free to modify/remove sections to fit the nature of your issue. -->\n\n<!-- Please search to check that your issue has not been created already. By preventing duplicate issues, you can help keep the repository organized. If your current issue has already been created and is still unresolved, you can contribute by commenting there. -->\n<!-- Replace the empty checkbox [ ] below with a checked one [x] if you have already searched for your issue. -->\n- [ ] I agree that I have searched opened and closed issues to prevent duplicates.\n\n--------------------\n\n\n\n## Description\n<!-- Briefly summarize/describe the issue that you are experiencing below. -->\nReplace me\n\n\n\n## Environment info\n<!-- To understand where your issue originates, please include some relevant information about your environment. -->\n\n<!-- If you are using a pre-built release of Redox, please specify the release version below. -->\n- Redox OS Release:\n0.0.0 Remove me\n\n<!-- If you have built Redox OS yourself, please provide the following information: -->\n- Operating system:\nReplace me\n- `uname -a`:\n`Replace me`\n- `rustc -V`:\n`Replace me`\n- `git rev-parse HEAD`:\n`Replace me`\n<!-- Depending on your issue, additional information about your environment (network config, package versions, dependencies, etc.) can also help. You can list that below. -->\n- Replace me:\nReplace me\n\n\n\n## Steps to reproduce\n<!-- If possible, please list the steps to reproduce (\"trigger\") your issue below. Being detailed definitely helps speed up bug fixes. -->\n1. Replace me\n2. Replace me\n3. ...\n\n\n\n## Behavior\n<!-- It may seem obvious to know what to expect, but isolating the behavior from everything else simplifies the development process. Remember to provide a single issue in this report. You can use the References section below to link your issues together. -->\n\n<!-- Describe the behavior you expect your steps should yield (i.e., correct behavior). -->\n- **Expected behavior**:\nReplace me\n\n<!-- Describe the behavior you observed when running your steps (i.e., buggy behavior). -->\n- **Actual behavior**:\nReplace me\n\n<!-- **Logs?** Posting a log can help developers find your particular issue more easily. Please wrap your code in code blocks using triple back-ticks ``` to increase readability. -->\n```\nReplace me\n```\n\n<!-- **Solution?** Have a solution in mind? Propose your solution below. -->\n- **Proposed solution**:\nReplace me\n\n<!-- **Screenshots?** Make it easier to get your point across with screenshots. You can drag & drop or paste your images below. -->\n\n\n\n## Optional references\n<!-- If you have found issues or pull requests that are related to or blocking this issue, please link them below. See https://help.github.com/articles/autolinked-references-and-urls/ for more options. You can also link related code snippets by providing the permalink. See https://help.github.com/articles/creating-a-permanent-link-to-a-code-snippet/ for more information. -->\n\nRelated to:\n- #0000 Remove me\n- Replace me\n- ...\n\nBlocked by:\n- #0000 Remove me\n- ...\n\n\n\n## Optional extras\n<!-- If you have other relevant information not found in other sections, you can include it below. -->\nReplace me\n\n<!-- **Code?** Awesome! You can also create a pull request with a reference to this issue. -->\n<!-- **Files?** Attach your relevant files by dragging & dropping or pasting them below. -->\n\n<!-- You also can preview your report before submitting it. Thanks for contributing to Redox! -->\n"
  },
  {
    "path": ".gitlab/merge_request_templates/Merge_request_template.md",
    "content": "**Problem**: [describe the problem you try to solve with this PR.]\n\n**Solution**: [describe carefully what you change by this PR.]\n\n**Changes introduced by this pull request**:\n\n- [...]\n- [...]\n- [...]\n\n**Drawbacks**: [if any, describe the drawbacks of this pull request.]\n\n**TODOs**: [what is not done yet.]\n\n**Fixes**: [what issues this fixes.]\n\n**State**: [the state of this PR, e.g. WIP, ready, etc.]\n\n**Blocking/related**: [issues or PRs blocking or being related to this issue.]\n\n**Other**: [optional: for other relevant information that should be known or cannot be described in the other fields.]\n\n------\n\n_The above template is not necessary for smaller PRs._\n"
  },
  {
    "path": ".gitlab-ci.yml",
    "content": "# The GitLab Continuous Integration configuration\n\nvariables:\n  GIT_STRATEGY: \"clone\"\n\nstages:\n  - lint\n  - test\n\nworkflow:\n  rules:\n    - if: '$CI_COMMIT_BRANCH == \"master\" && $CI_PROJECT_NAMESPACE == \"redox-os\"'\n    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == \"master\"'\n\nfmt:\n  image: \"rust:trixie\"\n  stage: lint\n  script:\n    - rustup component add rustfmt\n    - cargo fmt -- --check\n\ncargo-test:\n  image: \"rust:trixie\"\n  stage: lint\n  script:\n    - cargo test --locked\n\nimg:\n  image: \"redoxos/redox-base\"\n  stage: test\n  script:\n    - |\n      export PATH=\"$HOME/.cargo/bin:$PATH\" &&\n      (curl \"https://sh.rustup.rs\" -sSf | sh -s -- -y --default-toolchain stable --profile minimal ) &&\n      cargo install cbindgen &&\n      PODMAN_BUILD=0 SKIP_CHECK_TOOLS=1 REPO_BINARY=1 FSTOOLS_NO_MOUNT=1 COOKBOOK_VERBOSE=false make ci-img IMG_TAG=$CI_COMMIT_REF_NAME\n\npkg:\n  image: \"rust:trixie\"\n  stage: test\n  script:\n    - |\n      export PATH=\"$HOME/.cargo/bin:$PATH\" PODMAN_BUILD=0 &&\n      make CONFIG_NAME=ci SKIP_CHECK_TOOLS=1 repo-tree ARCH=x86_64 &&\n      make CONFIG_NAME=ci SKIP_CHECK_TOOLS=1 repo-tree ARCH=i586 &&\n      make CONFIG_NAME=ci SKIP_CHECK_TOOLS=1 repo-tree ARCH=aarch64 &&\n      make CONFIG_NAME=ci SKIP_CHECK_TOOLS=1 repo-tree ARCH=riscv64gc\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Redox\n\n**Thank you for your interest in contributing to Redox!**\n\nThis document will outline the basics of where to start if you wish to contribute to the project. There are many ways to help us out and and we appreciate all of them. We look forward to **your contribution!**\n\n**Please read this document until the end**\n\n## Code Of Conduct\n\nWe follow the [Rust Code Of Conduct](https://www.rust-lang.org/policies/code-of-conduct).\n\n## License\n\nIn general, your contributions to Redox are governed by the [MIT License](https://en.wikipedia.org/wiki/MIT_License). Each project repository has a `LICENSE` file that provides the license terms for that project.\n\nPlease review the `LICENSE` file for the project you are contributing to.\n\n[This](https://doc.redox-os.org/book/philosophy.html) page we explain why we use the MIT license.\n\n## Contribution Terms\n\nWhen making a contribution you agree to the following terms:\n\n- I understand these changes in full and will be able to respond to review comments.\n- I have read the [Developer Certificate of Origin](https://developercertificate.org/) and certify my contribution under its conditions.\n\n## AI Policy\n\nRedox OS does not accept contributions generated by LLMs ([Large Language Models](https://en.wikipedia.org/wiki/Large_language_model)), sometimes also referred to as \"AI\". This policy is not open to discussion, any content submitted that is clearly labelled as LLM-generated (including issues, merge requests, and merge request descriptions) will be immediately closed, and any attempt to bypass this policy will result in a ban from the project.\n\n## Chat\n\nYou can join in our chat platforms to discuss development, issues or ask questions.\n\n### [Matrix](https://matrix.to/#/#redox-join:matrix.org)\n\nMatrix is the official way to talk with Redox OS team and community (these rooms are English-only, we don't accept other languages because we don't understand them).\n\nMatrix has several different clients. [Element](https://element.io/) is a commonly used choice, it works on web browsers, Linux, MacOSX, Windows, Android and iOS.\n\nIf you have problems with Element, try [Fractal](https://gitlab.gnome.org/World/fractal).\n\n- Join the [Join Requests](https://matrix.to/#/#redox-join:matrix.org) room and send a message requesting for an invite to the Redox Matrix space (the purpose of this is to avoid spam and bots).\n- #redox-join:matrix.org (Use this Matrix room address if you don't want to use the external Matrix link)\n\n(We recommend that you leave the \"Join Requests\" room after your entry on Redox space)\n\nIf you want to have a big discussion in our rooms, you should use a Element thread, it's more organized and easy to keep track if more discussions happen on the same room.\n\nYou cand find more information on the [Chat](https://doc.redox-os.org/book/chat.html) page.\n\n### [Discord](https://discord.gg/JfggvrHGDY)\n\nWe have a Discord server as an alternative for Matrix, open the #join-requests channel and send a message requesting to be a member (the purpose of this is to avoid spam and bots)\n\nThe Matrix messages are sent to Discord and vice-versa using a bot, but sometimes some Discord messages aren't sent to Matrix (if this happens to you join in our Matrix space above)\n\n## [GitLab](https://gitlab.redox-os.org/redox-os/redox)\n\nA slightly more formal way of communication with fellow Redox developers, but a little less quick and convenient like the chat. Submit an issue when you run into problems compiling or testing. Issues can also be used if you would like to discuss a certain topic: be it features, code style, code inconsistencies, minor changes and fixes, etc.\n\nIf you want to create an account, read the [Signing in to GitLab](https://doc.redox-os.org/book/signing-in-to-gitlab.html) page.\n\nOnce you create an issue don't forget to post the link on the Dev or Support rooms of the chat, because the GitLab email notifications have distractions (service messages or spam) and most developers don't left their GitLab pages open to receive desktop notifications from the web browser (which require a custom setting to receive issue notifications).\n\nBy doing this you help us to pay attention to your issues and avoid them to be accidentally forgotten.\n\nIf you have ready MRs (merge requests) you must send the links in the [MRs](https://matrix.to/#/#redox-mrs:matrix.org) room. To join this room, you will need to request an invite in the [Join Requests](https://matrix.to/#/#redox-join:matrix.org) room.\n\nBy sending a message in the room, your MR will not be forgotten or accumulate conflicts.\n\n## Best Practices and Guidelines\n\nYou can read the best practices and guidelines on the [Best practices and guidelines](https://doc.redox-os.org/book/best-practices.html) chapter.\n\n## Development Recommendations and Tips\n\n- Copy-paste prevent and reduce typos\n- 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\n- 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.\n- 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.\n- 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.\n- 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.\n- 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).\n- Remember to log all errors, you can use this command as example:\n\n```sh\nyour-command 2>&1 | tee file-name.log\n```\n\n- 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).\n- If you want a quick review of your Merge Request, make it small.\n- 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.\n\n## Style Guidelines\n\n### Rust\n\nSince **Rust** is a relatively small and new language compared to others like C and C++, there's really only one standard. Just follow the official Rust standards for formatting, and maybe run `rustfmt` on your changes, until we setup the CI system to do it automatically.\n\n### Git\n\nPlease follow our [Git style](https://doc.redox-os.org/book/creating-proper-pull-requests.html) for pull requests.\n\n## GitLab\n\n### Identity\n\nOnce your GitLab account is created, you should add your Matrix or Discord username (the name after the `@` symbol) on the \"About\" section of your profile, that way we recognize you properly.\n\n### Issues\n\nWe use issues to organize and track our current and pending work, to know how to create issues on the Redox GitLab read the [Filing Issues](https://doc.redox-os.org/book/filing-issues.html) page.\n\nOnce you create an issue don't forget to post the link on the Dev or Support rooms of the chat, because the GitLab email notifications have distractions (service messages or spam) and most developers don't left their GitLab pages open to receive desktop notifications from the web browser (which require a custom setting to receive issue notifications).\n\nBy doing this you help us to pay attention to your issues and avoid them to be accidentally forgotten.\n\nYou can see all issues on [this](https://gitlab.redox-os.org/groups/redox-os/-/issues) link.\n\n### Pull Requests\n\nPlease follow [our process](https://doc.redox-os.org/book/creating-proper-pull-requests.html) for creating proper pull requests.\n\n## Important Places to Contribute\n\nBefore 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/).\n\nYou can contribute to the Redox documentation and code on the following repositories (non-exhaustive, easiest-to-hardest order):\n\n- [Website](https://gitlab.redox-os.org/redox-os/website)\n- [Book](https://gitlab.redox-os.org/redox-os/book) - High-level documentation\n- [Build System Configuration](https://gitlab.redox-os.org/redox-os/redox) - Our main repository\n- [Orbital](https://gitlab.redox-os.org/redox-os/orbital) - Display Server and Window Manager\n- [pkgutils](https://gitlab.redox-os.org/redox-os/pkgutils) - Package Manager\n- [acid](https://gitlab.redox-os.org/redox-os/acid) - Redox Test Suite\n- [relibc](https://gitlab.redox-os.org/redox-os/relibc) - Redox C Library\n- [libredox](https://gitlab.redox-os.org/redox-os/libredox) - Redox System Library\n- [Bootloader](https://gitlab.redox-os.org/redox-os/bootloader)\n- [RedoxFS](https://gitlab.redox-os.org/redox-os/redoxfs) - Default filesystem\n- [Base](https://gitlab.redox-os.org/redox-os/base) - Essential system components and drivers\n- [Kernel](https://gitlab.redox-os.org/redox-os/kernel)\n\nTo see all Redox repositories open the [redox-os group](https://gitlab.redox-os.org/redox-os).\n\n### Skill Levels\n\nIf you don't know programming:\n\n- Test the [daily images](https://static.redox-os.org/img/) on your computer and add the report on the [Hardware Compatibility](https://gitlab.redox-os.org/redox-os/redox/-/blob/master/HARDWARE.md) list\n- Monitor and warn developers if the [daily images](https://static.redox-os.org/img/) are outdated\n- Use/test Redox and create issues for bugs or needed features (please check for duplicates first)\n- Fix and write documentation\n- Find or fix typos in configuration\n\nIf you don't know how to code in Rust but know other programming languages:\n\n- Web development on the website (we only accept minimal JavaScript code to preserve performance)\n- Write unit tests (may require minimal knowledge of Rust)\n- Port C/C++ programs to Redox (read the `TODO`s of the recipes on the [WIP category](https://gitlab.redox-os.org/redox-os/redox/-/tree/master/recipes/wip))\n- Port programs to Redox\n\nIf you know how to code in Rust but don't know operating system development:\n\n- See the [easy](https://gitlab.redox-os.org/groups/redox-os/-/issues/?label_name[]=easy) issues\n- See the \"[good first issue](https://gitlab.redox-os.org/groups/redox-os/-/issues/?label_name[]=good%20first%20issue)\" issues\n- See the [help wanted](https://gitlab.redox-os.org/groups/redox-os/-/issues/?label_name[]=help%20wanted) issues (it's worth noting the skill level varies between projects, but a large subset of these should be approachable by contributors familiar with regular Rust/Unix application programming)\n- Improve the package manager, or build system tooling like `redoxer` or `installer`\n- Improve the [Ion](https://gitlab.redox-os.org/redox-os/ion) shell, or other high-level or mid-level projects\n- Port Rust programs (also look for issues with the `port` label)\n- Improve application compatibility in relibc by e.g. implementing missing POSIX/Linux functions\n\nIf you know how to code in Rust, and have experience with systems software/OS development:\n\n- Familiarize yourself with the repository layout, code, and build system\n- Update old code to remove warnings\n- Search for `TODO`, `FIXME`, `BUG`, `UNOPTIMIZED`, `REWRITEME`, `DOCME`, and `PRETTYFYME` and fix the code you find\n- Look in general for issues with the following labels: `critical`, `help wanted`, `feature`, `enhancement`, `bug` or `port`\n- Improve internal libraries and abstractions, e.g. `libredox`, `redox-scheme`, `redox-event` etc.\n- Help upstream Redox-specific functionality to the Rust ecosystem\n- Improve Redox's automated testing suite and continuous integration testing processes\n- Improve, profile, and optimize code, especially in the kernel, filesystem, and network stack\n- Improve or write device drivers\n\nFor those who want to contribute to the Redox GUI, our GUI strategy has changed.\n\n- We are improving the [Orbital](https://gitlab.redox-os.org/redox-os/orbital) display server and window manager, you can read more about it on [this tracking issue](https://gitlab.redox-os.org/redox-os/redox/-/issues/1430).\n- OrbTk is in maintenance mode, and its developers have moved to other projects such as the ones below. There is currently no Redox-specific GUI development underway.\n\n## Priorities\n\nYou can use the following GitLab issue label filters to know our development priorities on the moment:\n\n- [Critical](https://gitlab.redox-os.org/groups/redox-os/-/issues/?label_name[]=critical)\n- [High-priority](https://gitlab.redox-os.org/groups/redox-os/-/issues/?label_name[]=high-priority)\n- [Medium-priority](https://gitlab.redox-os.org/groups/redox-os/-/issues/?label_name[]=medium-priority)\n- [Low-priority](https://gitlab.redox-os.org/groups/redox-os/-/issues/?label_name[]=low-priority)\n\n## Roadmap\n\nWe use tracking issues for the goals in our roadmap, you can see them in the filter below:\n\n- [Tracking issues](https://gitlab.redox-os.org/groups/redox-os/-/issues/?label_name[]=tracking%20issue)\n\n## RFCs\n\nFor more significant changes that affect Redox's architecture, we use the [Request for Comments](https://gitlab.redox-os.org/redox-os/rfcs) repository.\n\n## Build System\n\nTo download the build system use the following commands:\n\n(You need to have [curl](https://curl.se/) installed on your system)\n\n```sh\ncurl -sf https://gitlab.redox-os.org/redox-os/redox/raw/master/podman_bootstrap.sh -o podman_bootstrap.sh\n```\n\n```sh\ntime bash -e podman_bootstrap.sh\n```\n\nTo start the compilation of the default recipes run the command below:\n\n```sh\nmake all\n```\n\nIn case your operating system does not use SELinux, you must set the `USE_SELINUX` to `0` when calling `make all`, otherwise you might experience errors:\n\n```sh\nmake all USE_SELINUX=0\n```\n\nYou can find the build system organization and commands on the [Build System](https://doc.redox-os.org/book/build-system-reference.html) page.\n\n## Developer FAQ\n\nYou can see the most common questions and problems on the [Developer FAQ](https://doc.redox-os.org/book/developer-faq.html) page.\n\n## Porting Software\n\nYou can read how to use the Cookbook recipe system to port applications on the [Application Porting](https://doc.redox-os.org/book/porting-applications.html) page.\n\n**Always verify if a recipe for your program or library already exist before porting to not break the build system with a recipe duplication or waste time.**\n\n## Libraries and APIs\n\nYou can read the [Libraries and APIs](https://doc.redox-os.org/book/libraries-apis.html) page to learn about the libraries and APIs used in Redox.\n\n## Visual Studio Code (VS Code) Configuration\n\nTo 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.\n\n## References\n\nWe 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.\n\nIf you are skilled/experienced there's still a possibility that they could improve your knowledge in some way.\n\n## Other Ways to Contribute\n\nIf you aren't good on coding, but you still want to help keep the project going, you can contribute and support in a variety of ways! We'll try to find a way to use anything you have to offer. \n\n### Design\n\nIf you're a good designer, whether it's 2D graphics, 3D graphics, interfaces, web design, you can help. We need logos, UI design, UI skins, app icons, desktop backgrounds, etc.\n\n- [Redox backgrounds](https://gitlab.redox-os.org/redox-os/backgrounds) - You can send your wallpapers on this repository.\n- [Redox assets](https://gitlab.redox-os.org/redox-os/assets) - You can send your logos, icons and themes on this repository.\n\nIf you have questions about the graphic design, ask us on the [Chat](https://doc.redox-os.org/book/chat.html).\n\n### Donate to Redox\n\nIf you are interested in donating to the Redox OS Nonprofit, you can find instructions on the [Donate](https://www.redox-os.org/donate/) page.\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"redox_cookbook\"\nversion = \"0.1.0\"\nauthors = [\"Jeremy Soller <jackpot51@gmail.com>\"]\nedition = \"2024\"\ndefault-run = \"repo\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[[bin]]\nname = \"cookbook_redoxer\"\npath = \"src/bin/cookbook_redoxer.rs\"\n\n[[bin]]\nname = \"repo\"\npath = \"src/bin/repo.rs\"\n\n[[bin]]\nname = \"repo_builder\"\npath = \"src/bin/repo_builder.rs\"\n\n[lib]\nname = \"cookbook\"\npath = \"src/lib.rs\"\ndoctest = false\n\n[features]\n#TODO: Actually make without tui feature works\ndefault = [\"tui\"]\ntui = [\"ratatui\", \"ansi-to-tui\", \"strip-ansi-escapes\"]\n\n[dependencies]\nanyhow = \"1\"\nblake3 = \"1\"\nglobset = \"0.4\"\nlibc = \"0.2\"\nignore = \"0.4\"\nobject = { version = \"0.38\", features = [\"build_core\"] }\npbr = \"1.0.2\"\npkgar = { git = \"https://gitlab.redox-os.org/redox-os/pkgar.git\" }\npkgar-core = { git = \"https://gitlab.redox-os.org/redox-os/pkgar.git\" }\npkgar-keys = { git = \"https://gitlab.redox-os.org/redox-os/pkgar.git\" }\nredox-pkg = { git = \"https://gitlab.redox-os.org/redox-os/pkgutils.git\", default-features = false }\nredox_installer = { git = \"https://gitlab.redox-os.org/redox-os/installer.git\", default-features = false }\nredoxer = { git = \"https://gitlab.redox-os.org/redox-os/redoxer.git\", default-features = false }\nregex = \"1.11\"\nserde = { version = \"=1.0.197\", features = [\"derive\"] }\ntermion = \"4\"\ntoml = \"0.8\"\nwalkdir = \"2.3.1\"\nansi-to-tui = { version = \"8\", optional = true }\nstrip-ansi-escapes = { version = \"0.2.1\", optional = true }\n\n[dependencies.ratatui]\nversion = \"0.30\"\ndefault-features = false\nfeatures = [\"termion\"]\noptional = true\n"
  },
  {
    "path": "HARDWARE.md",
    "content": "# Hardware Compatibility\n\nThis document tracks the current hardware compatibility of Redox OS.\n\n- [Why are hardware reports needed?](#why-are-hardware-reports-needed)\n- [What if my computer is customized?](#what-if-my-computer-is-customized)\n- [Status](#status)\n- [General](#general)\n- [Contribute to this document](#contribute-to-this-document)\n    - [Template](#template)\n    - [Table row ordering](#table-row-ordering)\n- [Recommended](#recommended)\n- [Booting](#booting)\n- [Broken](#broken)\n\n## Why are hardware reports needed?\n\nEach computer model has different hardware interfaces, firmware implementations, and devices, which can cause the following problems:\n\n- Boot bugs\n- Lack of device support\n- Performance degradation\n\nThese reports helps us to fix the problems above, your report may help to fix many computers affected by the same bugs or missing drivers.\n\n## What if my computer is customized?\n\nIf 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.\n\nA customized laptop should only be reported if you replaced the original CPU, report the CPU vendor and model in the \"Model\" category.\n\nWe 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.\n\n## Status\n\n- **Recommended:** The operating system boots with video, sound, PS/2 or USB input, Ethernet, terminal and Orbital working.\n- **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).\n- **Broken:** The boot loader don't work or can't bootstrap the operating system.\n\n## General\n\nThis section contain limitations that apply to any status.\n\n- ACPI support is incomplete (some things are hardcoded on the kernel to work)\n- Wi-Fi and Bluetooth aren't supported yet\n- AMD, NVIDIA, ARM, and PowerVR GPUs aren't supported yet (only BIOS VESA and UEFI GOP)\n- I2C devices aren't supported yet (PS/2 or USB devices should be used)\n- USB support varies on each device model because some USB devices require specific drivers (use input devices with standardized controls for more compatibility)\n- Automatic operating system discovery is not implemented in the boot loader yet (remember this before installing Redox)\n\n## Contribute to this document\n\nTo contribute to this document, learn how to create your GitLab account, follow the project-wide contribution guidelines and suggestions, please refer to the [CONTRIBUTING.md](./CONTRIBUTING.md) document.\n\n### Template\n\nYou will use this template to insert your computer on the table.\n\n```\n|  |  |  |  |  |  |  |  |\n```\n\nThe Redox image date should use the [ISO format](https://en.wikipedia.org/wiki/ISO_8601)\n\n### Table row ordering\n\nNew reports should use an independent alphabetical order in the \"Vendor\" and \"Model\" table rows, for example:\n\n```\n| ASUS | ROG g55vw |\n| ASUS | X554L |\n| System76 | Galago Pro (galp5) |\n| System76 | Lemur Pro (lemp9) |\n```\n\nA comes before S, R comes before X, G comes before L\n\nEach \"Vendor\" has its own alphabetical order in \"Model\", independent from models from other vendor.\n\n## Recommended\n\n| **Vendor** | **Model** | **Redox Version** | **Image Date** | **Variant** | **CPU Architecture** | **Motherboard Firmware** | **Report** |\n|------------|-----------|-------------------|----------------|-------------|----------------------|--------------------------|------------|\n| Lenovo | IdeaPad Y510P | 0.8.0 | 2022-11-11 | desktop | x86-64 | BIOS, UEFI | Boots to Orbital |\n| System76 | Galago Pro (galp5) | 0.8.0 | 2022-11-11 | desktop | x86-64 | UEFI | Boots to Orbital |\n| System76 | Lemur Pro (lemp9) | 0.8.0 | 2022-11-11 | desktop | x86-64 | UEFI | Boots to Orbital |\n\n## Booting\n\n| **Vendor** | **Model** | **Redox Version** | **Image Date** | **Variant** | **CPU Architecture** | **Motherboard Firmware** | **Report** |\n|------------|-----------|-------------------|----------------|-------------|----------------------|--------------------------|------------|\n| ASUS | Eee PC 900 | 0.8.0 | 2022-11-11 | desktop | i686 | BIOS | Boots to Orbital, No ethernet driver, Correct video mode not offered (firmware issue) |\n| ASUS | PRIME B350M-E (custom) | 0.9.0 | 2024-09-20 | desktop | x86-64 | UEFI | Partial support for the PS/2 keyboard, PS/2 mouse is broken |\n| ASUS | ROG g55vw | 0.8.0 | 2023-11-11 | desktop | x86-64 | BIOS | Boots to Orbital, UEFI panic in SETUP |\n| ASUS | X554L | 0.8.0 | 2022-11-11 | desktop | x86-64 | BIOS | Boots to Orbital, No audio, HDA driver cannot find output pins |\n| ASUS | Vivobook 15 OLED (M1503Q) | 0.9.0 | 2025-08-04 | desktop | x86-64 | UEFI | Boots to Orbital, touchpad and usb do not work, cannot connect to the internet, right maximum display resolution 2880x1620 |\n| Dell | XPS 13 (9350) | 0.8.0 | 2022-11-11 | desktop | i686 | BIOS | Boots to Orbital, NVMe driver livelocks |\n| Dell | XPS 13 (9350) | 0.8.0 | 2022-11-11 | desktop | x86-64 | BIOS, UEFI | Boots to Orbital, NVMe driver livelocks |\n| HP | Dev One | 0.8.0 | 2022-11-11 | desktop | x86-64 | UEFI | Boots to Orbital, No touchpad support, requires I2C HID |\n| HP | EliteBook Folio 9480M | 0.9.0 | 2025-11-04 | desktop | x86-64 | UEFI | Boots to Orbital, touchpad and usb work, cannot connect to the Internet, install failed, right maximum display resolution 1600x900\n| Lenovo | ThinkPad Yoga 260 Laptop - Type 20FE | 0.9.0 | 2024-09-07 | demo | x86-64 | UEFI | Boots to Orbital, No audio |\n| Lenovo | Yoga S730-13IWL | 0.9.0 | 2024-11-09 | desktop | x86-64 | UEFI | Boots to Orbital, No trackpad or USB mouse input support |\n| Raspberry Pi | 3 Model B+ | 0.8.0 | Unknown | server | ARM64 | U-Boot | Boots to UART serial console (pl011) |\n| Samsung | Series 3 (NP350V5C) | 0.9.0 | 2025-08-04 | desktop | x86-64 | UEFI | Boots to Orbital, touchpad works, USB does not work, can connect to the Internet through LAN. Wrong maximum display resolution 1024x768 |\n| System76 | Oryx Pro (oryp10) | 0.8.0 | 2022-11-11 | desktop | x86-64 | UEFI | Boots to Orbital, No touchpad support, though it should be working |\n| System76 | Pangolin (pang12) | 0.8.0 | 2022-11-11 | desktop | x86-64 | UEFI | Boots to Orbital, No touchpad support, requires I2C HID |\n| Toshiba | Satellite L500 | 0.8.0 | 2022-11-11 | desktop | x86-64 | BIOS | Boots to Orbital, No Ethernet driver, Correct video mode not offered (firmware issue) |\n\n## Broken\n\n| **Vendor** | **Model** | **Redox Version** | **Image Date** | **Variant** | **CPU Architecture** | **Motherboard Firmware** | **Report** |\n|------------|-----------|-------------------|----------------|-------------|----------------------|--------------------------|------------|\n| ASUS | PN41 | 0.8.0 | 2024-05-30 | server | x86-64 | Unknown | Aborts after panic in xhcid |\n| BEELINK | U59 | 0.8.0 | 2024-05-30 | server | x86-64 | Unknown | Aborts after panic in xhcid |\n| Framework | Laptop 16 (AMD Ryzen 7040 Series) | 0.9.0 | 2024-09-07 | server, demo | x86-64 | UEFI | Black screen and unresponsive after the bootloader and resolution selection |\n| HP | Compaq nc6120 | 0.9.0 | 2024-11-08 | desktop, server | i686 | BIOS | Unloads into memory at a rate slower than 1MB/s after selecting resolution. When unloading is complete the logger initializes and crashes after kernel::acpi, some information about APIC is printed. Boot logs do not progress after this point. |\n| HP | EliteBook 2570p | 0.8.0 | 2022-11-23 | demo | x86-64 | BIOS (CSM mode?) | Gets to resolution selection, Fails assert in `src/os/bios/mod.rs:77` after selecting resolution |\n| Lenovo | G570 | 0.8.0 | 2022-11-11 | desktop | x86-64 | BIOS | Bootloader panics in `alloc_zeroed_page_aligned`, Correct video mode not offered (firmware issue) |\n| Lenovo | IdeaPad Y510P | 0.8.0 | 2022-11-11 | desktop | i686 | BIOS | Panics on `phys_to_virt overflow`, probably having invalid mappings for 32-bit |\n| Lenovo | ThinkCentre M83 | 0.9.0 | 2025-11-09 | desktop | x86_64 | UEFI | Presents user with a set of display resolution options. After user selects an option, it takes a long time for the \"live\" thing to load all the way to 647MiB. Once it does reach 647MiB, however, it dumps a bunch of logs onto the screen. Those logs also happen to be offset so that the leftmost portion of all text \"exists\" past the leftmost part of the screen, resulting in the logs being only partially visible. The logs appear to include (among other things) 1. \"thread 'main' (1) panicked at acpid/src/acpi.rs:256:68: Called `Result::unwrap()` on an `Err` value: Aml(NoCurrentOp)\"; 2. \"thread 'main' (1) panicked at acpid/src/main.rs:147:39:acpid: failed to daemonize: Error `I/O error` 5\"; 3. \"... [@hwd:40 ERROR] failed to probe with error No such device (os error 19)...\"; etc. |\n| Panasonic | Toughbook CF-18 | 0.8.0 | 2022-11-11 | desktop | i686 | BIOS | Hangs after PIT initialization |\n| Toshiba | Satellite L500 | 0.8.0 | 2022-11-11 | desktop | i686 | BIOS | Correct video mode not offered (firmware issue), Panics on `phys_to_virt overflow`, probably having invalid mappings for 32-bit |\n| XMG (Schenker) | Apex 17 (M21) | 0.9.0 | 2024-09-30 | demo, server | x86-64 | UEFI | After selecting resolution, (release) repeats `...::interrupt::irq::ERROR -- Local apic internal error: ESR=0x40` a few times before it freezes; (daily) really slowly prints statements from `...::rmm::INFO` before it abruptly aborts |\n\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2016 Redox OS Developers\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "# This file contains the build system commands configuration\n# and environment variables\ninclude mk/config.mk\n\n# Build system dependencies\ninclude mk/depends.mk\n\nall: $(BUILD)/harddrive.img\n\nlive:\n\t-$(FUMOUNT) $(BUILD)/filesystem/ || true\n\t-$(FUMOUNT) /tmp/redox_installer/ || true\n\trm -f $(BUILD)/redox-live.iso\n\t$(MAKE) $(BUILD)/redox-live.iso\n\npopsicle: $(BUILD)/redox-live.iso\n\tpopsicle-gtk $(BUILD)/redox-live.iso\n\nimage:\n\t-$(FUMOUNT) $(BUILD)/filesystem/ || true\n\t-$(FUMOUNT) /tmp/redox_installer/ || true\n\trm -f $(BUILD)/harddrive.img $(BUILD)/redox-live.iso\n\t$(MAKE) all\n\nrebuild:\n\t-$(FUMOUNT) $(BUILD)/filesystem/ || true\n\t-$(FUMOUNT) /tmp/redox_installer/ || true\n\trm -rf $(BUILD)/repo.tag $(BUILD)/harddrive.img $(BUILD)/redox-live.iso\n\t$(MAKE) all\n\n# To tell that it's not safe\n# to execute the cookbook binary\nNOT_ON_PODMAN?=0\n\nclean:\nifeq ($(PODMAN_BUILD),1)\nifneq (\"$(wildcard $(CONTAINER_TAG))\",\"\")\n\t$(PODMAN_RUN) make $@\nelse\n\t$(info will not run cookbook clean as container is not built)\n\t$(MAKE) clean PODMAN_BUILD=0 NOT_ON_PODMAN=1 SKIP_CHECK_TOOLS=1\nendif # CONTAINER_TAG\nelse\nifneq ($(NOT_ON_PODMAN),1)\n\t$(MAKE) repo_clean\n\t-$(FUMOUNT) $(BUILD)/filesystem/ || true\n\t-$(FUMOUNT) /tmp/redox_installer/ || true\nendif # NOT_ON_PODMAN\n\trm -rf repo\n\trm -rf $(BUILD) $(PREFIX)\n\t$(MAKE) fstools_clean\nendif # PODMAN_BUILD\n\ndistclean:\nifeq ($(PODMAN_BUILD),1)\nifneq (\"$(wildcard $(CONTAINER_TAG))\",\"\")\n\t$(PODMAN_RUN) make $@\nelse\n\t$(info will not run cookbook unfetch as container is not built)\n\t$(MAKE) distclean PODMAN_BUILD=0 NOT_ON_PODMAN=1 SKIP_CHECK_TOOLS=1\nendif # CONTAINER_TAG\nelse\nifneq ($(NOT_ON_PODMAN),1)\n\t$(MAKE) fetch_clean\nendif # NOT_ON_PODMAN\n\t$(MAKE) clean NOT_ON_PODMAN=1\nendif # PODMAN_BUILD\n\npull:\n\tgit pull\n\trm -f $(FSTOOLS_TAG)\n\nrepo: $(BUILD)/repo.tag\n\nrepo_clean: c.--all\n\nfetch_clean: u.--all\n\n# Podman build recipes and vars\ninclude mk/podman.mk\n\n# Disk Imaging and Cookbook tools\ninclude mk/fstools.mk\n\n# Cross compiler recipes\ninclude mk/prefix.mk\n\n# Repository maintenance\ninclude mk/repo.mk\n\n# Disk images\ninclude mk/disk.mk\n\n# Emulation recipes\ninclude mk/qemu.mk\ninclude mk/virtualbox.mk\n\n# CI\ninclude mk/ci.mk\n\nenv: prefix FORCE $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\texport PATH=\"$(PREFIX_PATH):$$PATH\" && \\\n\tbash\nendif\n\nsetenv: FORCE\n\t@echo export ARCH='$(ARCH)'\n\t@echo export BOARD='$(BOARD)'\n\t@echo export CONFIG_NAME='$(CONFIG_NAME)'\n\t@echo BUILD='$(BUILD)'\n\nexport RUST_GDB=gdb-multiarch # Necessary when debugging for another architecture than the host\nGDB_KERNEL_FILE=recipes/core/kernel/target/$(TARGET)/build/kernel.sym\ngdb: FORCE\n\trust-gdb $(GDB_KERNEL_FILE) --eval-command=\"target remote :1234\"\n\n# This target allows debugging a userspace application without requiring gdbserver running inside\n# the VM. Because gdb doesn't know when the userspace application is scheduled by the kernel and as\n# it stops the entire VM rather than just the userspace application that the user wants to debug,\n# connecting to a gdbserver running inside the VM is highly encouraged when possible. This target\n# should only be used when the application to debug runs early during boot before the network stack\n# has started or you need to debug the interaction between the application and the kernel.\n# tl;dr: DO NOT USE THIS TARGET UNLESS YOU HAVE TO\ngdb-userspace: FORCE\n\trust-gdb $(GDB_APP_FILE) --eval-command=\"add-symbol-file $(GDB_KERNEL_FILE)\" --eval-command=\"target remote :1234\"\n\n# An empty target\nFORCE:\n\n# Wireshark\nwireshark: FORCE\n\twireshark $(BUILD)/network.pcap\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n<img alt=\"Redox\" width=\"346\" src=\"https://gitlab.redox-os.org/redox-os/assets/raw/master/logos/redox/logo.png\">\n</p>\n\nThis repository is the **Build System** for Redox OS.\n\nRedox is under active development by a vibrant community, you can see the key links below:\n\n- [The **main website** for Redox OS](https://www.redox-os.org).\n- [The Redox Book](https://doc.redox-os.org/book/) and [Build Instructions](https://doc.redox-os.org/book/podman-build.html).\n- [Redox Chat and Support](https://matrix.to/#/#redox-join:matrix.org).\n- [Patreon](https://www.patreon.com/redox_os), [Donate](https://redox-os.org/donate/) and [Merch](https://redox-os.creator-spring.com/).\n- Scroll down for a list of key Redox components and their repositories.\n\n[Redox](https://www.redox-os.org) is an open-source operating system written in Rust, a language with focus on safety, efficiency and high performance. Redox uses a microkernel architecture, and aims to be reliable, secure, usable, correct, and free. Redox is inspired by previous operating systems, such as seL4, MINIX, Plan 9, Linux and BSD.\n\nRedox _is not_ just a kernel, it's a **full-featured operating system**, providing components (file system, display server, core utilities, etc.) that together make up a functional and convenient operating system. Redox uses the COSMIC desktop apps, and provides source code compatibility with many Rust, Linux and BSD programs.\n\n[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)\n\n## More Links\n\n- [Book](https://doc.redox-os.org/book/)\n- [Contribute](CONTRIBUTING.md)\n- [Hardware Compatibility](https://doc.redox-os.org/book/hardware-support.html)\n- Run Redox in a [Virtual Machine](https://doc.redox-os.org/book/running-vm.html) or on [Real Hardware](https://doc.redox-os.org/book/real-hardware.html)\n- [Trying Out Redox](https://doc.redox-os.org/book/trying-out-redox.html)\n- [Building Redox](https://doc.redox-os.org/book/podman-build.html)\n- [Build System Documentation](https://doc.redox-os.org/book/build-system-reference.html)\n- [Developer FAQ](https://doc.redox-os.org/book/developer-faq.html)\n- [Chat/Discussions/Help](https://doc.redox-os.org/book/chat.html)\n\n## Ecosystem\n\nSome of the key repositories on the Redox GitLab:\n\n| Essential Repositories                                                               | Maintainer\n|-------------------------------------------------------------------------------------------------------------|---------------------------\n| [Kernel](https://gitlab.redox-os.org/redox-os/kernel)                                                       | **@jackpot51**\n| [Base (essential system components and drivers)](https://gitlab.redox-os.org/redox-os/base)                             | **@jackpot51**\n| [RedoxFS (default filesystem)](https://gitlab.redox-os.org/redox-os/redoxfs)                                | **@jackpot51**\n| [relibc (C POSIX library written in Rust)](https://gitlab.redox-os.org/redox-os/relibc)                     | **@jackpot51**\n| [Ion (defauilt shell)](https://gitlab.redox-os.org/redox-os/ion)                                            | **@jackpot51**\n| [Termion (terminal library)](https://gitlab.redox-os.org/redox-os/termion)                                  | **@jackpot51**\n| [pkgutils (current package manager)](https://gitlab.redox-os.org/redox-os/pkgutils)                         | **@jackpot51**\n| [Orbital (display server and window manager)](https://gitlab.redox-os.org/redox-os/orbital)                 | **@jackpot51**\n| This repo - the root of the Build System                                                                    | **@jackpot51** **@hatred_45**\n| [Redoxer (tool for easy Redox development on Linux)](https://gitlab.redox-os.org/redox-os/redoxer)          | **@jackpot51**\n| [The Redox Book](https://gitlab.redox-os.org/redox-os/book)                                                 | **@jackpot51** **@hatred_45**\n| [Website](https://gitlab.redox-os.org/redox-os/website)                                                     | **@jackpot51** **@hatred_45**\n\n## What it looks like\n\nSee [Redox in Action](https://www.redox-os.org/screens/) for photos and videos.\n\n<img alt=\"Redox\" height=\"150\" src=\"https://gitlab.redox-os.org/redox-os/website/-/raw/master/static/img/screenshot/orbital-visual.png\">\n<img alt=\"Redox\" height=\"150\" src=\"https://gitlab.redox-os.org/redox-os/website/-/raw/master/static/img/screenshot/cosmic-programs.png\">\n<img alt=\"Redox\" height=\"150\" src=\"https://gitlab.redox-os.org/redox-os/website/-/raw/master/static/img/screenshot/cosmic-term-screenfetch.png\">\n\n<img alt=\"Redox\" height=\"150\" src=\"https://gitlab.redox-os.org/redox-os/website/-/raw/master/static/img/screenshot/cosmic-edit-redox.png\">\n<img alt=\"Redox\" height=\"150\" src=\"https://gitlab.redox-os.org/redox-os/website/-/raw/master/static/img/screenshot/image-viewer.png\">\n<img alt=\"Redox\" height=\"150\" src=\"https://gitlab.redox-os.org/redox-os/assets/raw/master/screenshots/Boot.png\">\n"
  },
  {
    "path": "TRADEMARK.md",
    "content": "# Redox OS Trademark Policy\n\nThis document outlines the policy regarding the use of the Redox OS trademark owned by the Redox OS nonprofit. The purpose of this policy is to ensure that the Redox OS trademark is used correctly and consistently, maintaining the integrity and reputation of the Redox OS brand.\n\n1. Usage of the Redox OS Trademark\n    1. The Redox OS trademark includes, but is not limited to, the name \"Redox OS\", the Redox OS logo, and any associated symbols or designs.\n    2. The Redox OS trademark may only be used in accordance with this policy. Unauthorized use of the trademark is prohibited.\n2. Permissible Use\n    1. Community Projects: Community projects may use the Redox OS trademark to refer to the operating system, provided that such use is not misleading and does not imply endorsement by the Redox OS nonprofit without explicit permission.\n    2. Educational and Informational Use: The Redox OS trademark may be used in educational and informational materials, including books, websites, and articles, to refer to the operating system, provided that such use complies with the guidelines set forth in this policy.\n    3. Marketing and Promotional Use: Partners and affiliates of the Redox OS nonprofit may use the Redox OS trademark in marketing and promotional materials with prior written consent from the Redox OS nonprofit.\n3. Prohibited Use\n    1. Misrepresentation: The Redox OS trademark must not be used in a way that misrepresents or implies false association with, endorsement by, or sponsorship from the Redox OS nonprofit.\n    2. Modification: The Redox OS trademark must not be altered, modified, or used as part of another trademark or logo without prior written permission from the Redox OS nonprofit.\n    3. Merchandising: The Redox OS trademark must not be used on merchandise (e.g., T-shirts, mugs) for commercial purposes without explicit authorization from the Redox OS nonprofit.\n4. Logo Usage Guidelines\n    1. The Redox OS logo must be used as provided by the Redox OS nonprofit without any modifications. This includes maintaining the logo’s colors, proportions, and overall design.\n    2. The Redox OS logo must be displayed in a manner that is clear and legible. Sufficient clear space should be maintained around the logo to ensure it is not crowded by other visual elements.\n    3. The Redox OS name should be identified as a trademark using the “™” symbol.\n5. Official Redox OS Software\n    1. Software hosted at [the Redox OS GitLab group](https://gitlab.redox-os.org/redox-os/) is considered official Redox OS software. Only software that has been approved by the Redox OS nonprofit is permitted to use the Redox OS trademarks to refer to itself. Software that is official Redox OS software may use the “redox-os-” package namespace and “org.redox_os.” prefixed reverse-DNS ID. Other software should avoid using these prefixes.\n    2. Third-party software that integrates with or extend the Redox OS operating system must not use the Redox OS trademark in a way that implies official status or endorsement without prior approval from the Redox OS nonprofit. Third-party developers are encouraged to use the \"redox-os-ext-\" package namespace. This software may be described as \"for the Redox OS™ operating system\".\n    3. Third-party software may request inclusion as official Redox OS software. To request inclusion, please contact the Redox OS nonprofit at trademark@redox-os.org.\n6. Request for Permission\n    1. To request permission for uses of the Redox OS trademark not covered by this policy, please contact the Redox OS nonprofit at trademark@redox-os.org.\n    2. All requests will be reviewed on a case-by-case basis, and the Redox OS nonprofit reserves the right to grant or deny permission at its sole discretion.\n7. Enforcement\n    1. The Redox OS nonprofit reserves the right to take appropriate legal action against any unauthorized use of the Redox OS trademark.\n    2. The Redox OS nonprofit may, at its discretion, require the cessation of use of the Redox OS trademark by any party that fails to comply with this policy.\n\n## Contact Information\n\nFor any questions or to request permission to use the Redox OS trademark, please contact:<br><br>\nRedox OS<br>\ntrademark@redox-os.org<br><br>\nThis trademark policy is effective as of December 3, 2025 and may be updated from time to time at the discretion of the Redox OS nonprofit.\n\n---\nBy adhering to these guidelines, you help us protect the Redox OS brand and ensure it remains a symbol of quality and innovation. Thank you for your cooperation.\n"
  },
  {
    "path": "bin/aarch64-unknown-redox-pkg-config",
    "content": "#!/usr/bin/env bash\n\nexport PKG_CONFIG_SYSROOT_DIR=\"${COOKBOOK_SYSROOT}\"\nexport PKG_CONFIG_LIBDIR=\"${PKG_CONFIG_SYSROOT_DIR}/lib/pkgconfig\"\nexport PKG_CONFIG_PATH=\"${PKG_CONFIG_SYSROOT_DIR}/share/pkgconfig\"\n\nif [ -n \"${COOKBOOK_DYNAMIC}\" ]\nthen\n    exec pkg-config \"$@\"\nelse\n    exec pkg-config --static \"$@\"\nfi\n"
  },
  {
    "path": "bin/i586-unknown-redox-pkg-config",
    "content": "#!/usr/bin/env bash\n\nexport PKG_CONFIG_SYSROOT_DIR=\"${COOKBOOK_SYSROOT}\"\nexport PKG_CONFIG_LIBDIR=\"${PKG_CONFIG_SYSROOT_DIR}/lib/pkgconfig\"\nexport PKG_CONFIG_PATH=\"${PKG_CONFIG_SYSROOT_DIR}/share/pkgconfig\"\n\nif [ -n \"${COOKBOOK_DYNAMIC}\" ]\nthen\n    exec pkg-config \"$@\"\nelse\n    exec pkg-config --static \"$@\"\nfi\n"
  },
  {
    "path": "bin/i686-unknown-redox-pkg-config",
    "content": "#!/usr/bin/env bash\n\nexport PKG_CONFIG_SYSROOT_DIR=\"${COOKBOOK_SYSROOT}\"\nexport PKG_CONFIG_LIBDIR=\"${PKG_CONFIG_SYSROOT_DIR}/lib/pkgconfig\"\nexport PKG_CONFIG_PATH=\"${PKG_CONFIG_SYSROOT_DIR}/share/pkgconfig\"\n\nif [ -n \"${COOKBOOK_DYNAMIC}\" ]\nthen\n    exec pkg-config \"$@\"\nelse\n    exec pkg-config --static \"$@\"\nfi\n"
  },
  {
    "path": "bin/riscv64-unknown-redox-pkg-config",
    "content": "#!/usr/bin/env bash\n\nexport PKG_CONFIG_SYSROOT_DIR=\"${COOKBOOK_SYSROOT}\"\nexport PKG_CONFIG_LIBDIR=\"${PKG_CONFIG_SYSROOT_DIR}/lib/pkgconfig\"\nexport PKG_CONFIG_PATH=\"${PKG_CONFIG_SYSROOT_DIR}/share/pkgconfig\"\n\nif [ -n \"${COOKBOOK_DYNAMIC}\" ]\nthen\n    exec pkg-config \"$@\"\nelse\n    exec pkg-config --static \"$@\"\nfi\n"
  },
  {
    "path": "bin/x86_64-unknown-redox-llvm-config",
    "content": "#!/usr/bin/env python3\n\n# This script wraps llvm-config that intended for cross compiling to Redox.\n# Because we can't run llvm-config compiled to Redox, we wrap it here\n# and filter out architectures that do not match the current $TARGET.\n\nimport os\nimport sys\nimport subprocess\n\nLLVM_CONFIG = \"/bin/llvm-config\" \n\n# name of (--targets-built, --components prefix, --libs prefix)\nARCH_MAP = {\n    \"x86_64\":    (\"X86\", \"x86\", \"X86\"),\n    \"i586\":      (\"X86\", \"x86\", \"X86\"),\n    \"aarch64\":   (\"AArch64\", \"aarch64\", \"AArch64\"),\n    \"riscv64gc\": (\"RISCV\", \"riscv\", \"RISCV\"),\n}\n\nALL_ARCH_COMPS = [\"x86\", \"aarch64\", \"riscv\"]\nALL_ARCH_LIBS = [\"X86\", \"AArch64\", \"RISCV\"]\n\ndef is_unwanted_arch(item, allowed_prefix, all_prefixes, is_lib=False):\n    matched_arch = None\n    for arch in all_prefixes:\n        # libraries e.g., -lLLVMX86CodeGen / libLLVMAArch64Desc.a\n        if is_lib and f\"LLVM{arch}\" in item:\n            matched_arch = arch\n            break\n        # components e.g., x86codegen, aarch64desc\n        elif not is_lib and item.startswith(arch):\n            matched_arch = arch\n            break\n            \n    if matched_arch and matched_arch != allowed_prefix:\n        return True\n        \n    return False\n\ndef main():\n    toolchain_path = os.environ.get(\"COOKBOOK_HOST_SYSROOT\")\n    sysroot_path = os.environ.get(\"COOKBOOK_SYSROOT\")\n    target_triple = os.environ.get(\"TARGET\")\n\n    if not toolchain_path or not sysroot_path or not target_triple:\n        print(\"Error: COOKBOOK_HOST_SYSROOT or COOKBOOK_SYSROOT or TARGET not set\", file=sys.stderr)\n        sys.exit(1)\n\n    target_arch = target_triple.split('-')[0] if target_triple else \"\"\n    mapped_archs = ARCH_MAP.get(target_arch)\n    target_built_name, comp_prefix, lib_prefix = mapped_archs\n\n    cmd = [toolchain_path + LLVM_CONFIG] + sys.argv[1:]\n\n    try:\n        result = subprocess.run(\n            cmd,\n            stdout=subprocess.PIPE,\n            stderr=sys.stderr,\n            check=False,\n            text=True\n        )\n    except FileNotFoundError:\n        print(f\"Error: Could not find executable '{LLVM_CONFIG}'\", file=sys.stderr)\n        sys.exit(1)\n\n    if result.returncode != 0:\n        sys.exit(result.returncode)\n\n    output = result.stdout.strip()\n    \n    args_set = set(sys.argv[1:])\n\n    if \"--bindir\" in args_set:\n        output = toolchain_path + \"/usr/bin\"\n        \n    elif \"--targets-built\" in args_set:\n        output = target_built_name\n        \n    elif \"--components\" in args_set:\n        components = output.split()\n        filtered = [c for c in components if not is_unwanted_arch(c, comp_prefix, ALL_ARCH_COMPS, is_lib=False)]\n        output = \" \".join(filtered)\n        \n    elif \"--libs\" in args_set:\n        libs = output.split()\n        filtered = [l for l in libs if not is_unwanted_arch(l, lib_prefix, ALL_ARCH_LIBS, is_lib=True)]\n        output = \" \".join(filtered)\n        \n        # if \"--ldflags\" in args_set:\n        src = toolchain_path.rstrip(os.sep)\n        dst = sysroot_path.rstrip(os.sep)\n        output = output.replace(src, dst)\n    else: \n        src = toolchain_path.rstrip(os.sep)\n        dst = sysroot_path.rstrip(os.sep)\n        output = output.replace(src, dst)\n\n    print(output + '\\n', end='')\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "bin/x86_64-unknown-redox-pkg-config",
    "content": "#!/usr/bin/env bash\n\nexport PKG_CONFIG_SYSROOT_DIR=\"${COOKBOOK_SYSROOT}\"\nexport PKG_CONFIG_LIBDIR=\"${PKG_CONFIG_SYSROOT_DIR}/lib/pkgconfig\"\nexport PKG_CONFIG_PATH=\"${PKG_CONFIG_SYSROOT_DIR}/share/pkgconfig\"\n\nif [ -n \"${COOKBOOK_DYNAMIC}\" ]\nthen\n    exec pkg-config \"$@\"\nelse\n    exec pkg-config --static \"$@\"\nfi\n"
  },
  {
    "path": "build.sh",
    "content": "#!/usr/bin/env bash\n\n# Alternative script for the build system Makefiles\n\n###########################################################################\n#                                                                         #\n# Build the system, with a specified processor type and filesystem config #\n#                                                                         #\n###########################################################################\n\nusage()\n{\n    echo \"build.sh:      Invoke make for a particular architecture and configuration.\"\n    echo \"Usage:\"\n    echo \"./build.sh [-X | -A | -5 | -R | -a ARCH] [-c CONFIG] [-f FILESYSTEM_CONFIG] TARGET...\"\n    echo \"    -X         Equivalent to -a x86_64.\"\n    echo \"    -A         Equivalent to -a aarch64.\"\n    echo \"    -5         Equivalent to -a i586.\"\n    echo \"    -6         Equivalent to -a i586 (deprecated, use -5 instead).\"\n    echo \"    -R         Equivalent to -a riscv64gc.\"\n    echo \"    -a ARCH:   Processor Architecture. Normally one of x86_64, aarch64 or\"\n    echo \"               i686. ARCH is not checked, so you can add a new architecture.\"\n    echo \"               Defaults to the directory containing the FILESYSTEM_CONFIG file,\"\n    echo \"               or x86_64 if no FILESYSTEM_CONFIG is specified.\"\n    echo \"    -c CONFIG: The name of the config, e.g. desktop, server or demo.\"\n    echo \"               Determines the name of the image, build/ARCH/CONFIG/harddrive.img\"\n    echo \"               e.g. build/x86_64/desktop/harddrive.img\"\n    echo \"               Determines the name of FILESYSTEM_CONFIG if none is specified.\"\n    echo \"               Defaults to the basename of FILESYSTEM_CONFIG, or 'desktop'\"\n    echo \"               if FILESYSTEM_CONFIG is not specified.\"\n    echo \"    -f FILESYSTEM_CONFIG:\"\n    echo \"               The config file to use. It can be in any location.\"\n    echo \"               However, if the file is not in a directory named x86_64, aarch64\"\n    echo \"               or i686, you must specify the architecture.\"\n    echo \"               If -f is not specified, FILESYSTEM_CONFIG is set to\"\n    echo \"               config/ARCH/CONFIG.toml\"\n    echo \"               If you specify both CONFIG and FILESYSTEM_CONFIG, it is not\"\n    echo \"               necessary that they match, but it is recommended.\"\n    echo \"    Examples:  ./build.sh -c demo live - make build/x86_64/demo/redox-live.iso\"\n    echo \"               ./build.sh -6 qemu - make build/i686/desktop/harddrive.img and\"\n    echo \"                                    and run it in qemu\"\n    echo \"    NOTE:      If you do not change ARCH or CONFIG very often, edit mk/config.mk\"\n    echo \"               and set ARCH and FILESYSTEM_CONFIG. You only need to use this\"\n    echo \"               script when you want to override them.\"\n}\n\nif [ \"$1\" == \"-h\" ] || [ \"$1\" == \"--help\" ]; then\n    usage\n    exit\nfi\n\ndefaultarch=\"x86_64\"\ndefaultname=\"desktop\"\nARCH=\"\"\nCONFIG_NAME=\"\"\nFILESYSTEM_CONFIG=\"\"\n\nwhile getopts \":c:f:a:dhXA6\" opt\ndo\n    case \"$opt\" in\n        a) ARCH=\"$OPTARG\";;\n        c) CONFIG_NAME=\"$OPTARG\";;\n        f) FILESYSTEM_CONFIG=\"$OPTARG\";;\n        X) ARCH=\"x86_64\";;\n        A) ARCH=\"aarch64\";;\n        R) ARCH=\"riscv64gc\";;\n        5) ARCH=\"i586\";;\n        6) ARCH=\"i586\";;\n        h) usage;;\n        \\?) echo \"Unknown option -$OPTARG, try -h for help\"; exit;;\n        :) echo \"-$OPTARG requires a value\"; exit;;\n    esac\ndone\nshift $((OPTIND -1))\n\nif [ -z \"$ARCH\" ] && [ -n \"$FILESYSTEM_CONFIG\" ]; then\n    dirname=`dirname \"$FILESYSTEM_CONFIG\"`\n    ARCH=`basename $dirname`\n    case \"$ARCH\" in\n        x86_64) : ;;\n        aarch64) : ;;\n        riscv64gc) : ;;\n        i586) : ;;\n        \\?) ARCH=\"\"; echo \"Unknown Architecture, please specify x86_64, aarch64, riscv64gc or i586\";;\n    esac\nfi\n\nif [ -z \"$config_name\" ] && [ -n \"$FILESYSTEM_CONFIG\" ]; then\n    CONFIG_NAME=`basename \"$FILESYSTEM_CONFIG\" .toml`\nfi\n\nif [ -z \"$ARCH\" ]; then\n    ARCH=\"$defaultarch\"\nfi\n\nif [ -z \"$CONFIG_NAME\" ]; then\n    CONFIG_NAME=\"$defaultname\"\nfi\n\nif [ -z \"$FILESYSTEM_CONFIG\" ]; then\n    FILESYSTEM_CONFIG=\"config/$ARCH/$CONFIG_NAME.toml\"\nfi\n\nexport ARCH CONFIG_NAME FILESYSTEM_CONFIG\nmake $@\n"
  },
  {
    "path": "config/aarch64/ci.toml",
    "content": "# The Redox build server configuration\n\n# General settings\n[general]\n# Do not prompt if settings are not defined\nprompt = false\n\n# Package settings\n[packages]\n\n# If you need to disable some broken package comment out instead of removal to not increase the maintenance cost\n#TODO: commented out recipes need to be built and tested inside of Redox to verify if they returned to work\n\n# Meta-packages below\n\n# auto-test = {}\n# dev-essential = {}\n# dev-redox = {}\n# redox-tests = {}\n# x11-minimal = {}\n# x11-full = {}\n\n# Normal packages below\n\nacid = {}\nacid-bins = {}\nbase = {}\nbase-initfs = {}\nbash = {}\nbash-completion = {}\nbootloader = {}\nbottom = {}\nca-certificates = {}\ncontain = {}\ncoreutils = {}\ncosmic-edit = {}\ncosmic-files = {}\ncosmic-icons = {}\ncosmic-term = {}\ncosmic-text = {}\ncurl = {}\ndash = {}\ndejavu = {}\ndiffutils = {}\nexpat = {}\nextrautils = {}\nfindutils = {}\nfreefont = {}\nfreetype2 = {}\ngcc13 = {}\ngettext = {}\ngit = {}\ngnu-binutils = {}\ngnu-make = {}\nhicolor-icon-theme = {}\ninstaller = {}\ninstaller-gui = {}\nion = {}\nkernel = {}\nkibi = {}\nlibffi = {}\nlibgcc = {}\nlibiconv = {}\nlibjpeg = {}\nlibogg = {}\nliborbital = {}\nlibpng = {}\nlibstdcxx = {}\nlibvorbis = {}\nlibxkbcommon = {}\nlibxml2 = {}\nllvm21 = {}\nnano = {}\nnasm = {}\nncurses = {}\nnetdb = {}\nnetsurf = {}\nnetutils = {}\nnghttp2 = {}\nopenssl1 = {}\nopenssl3 = {}\norbdata = {}\norbital = {}\norbterm = {}\norbutils = {}\npatch = {}\npatchelf = {}\npcre = {}\npkgutils = {}\npls = {}\npop-icon-theme = {}\nredoxfs = {}\nrelibc = {}\nripgrep = {}\nrust = {}\nrustpython = {}\nsdl1 = {}\nsed = {}\nshared-mime-info = {}\nsmith = {}\nterminfo = {}\nuserutils = {}\nuutils = {}\nvim = {}\nxz = {}\nzlib = {}\nzstd = {}\n# #\"gcc13.cxx\" = {}\n# #\"llvm21.clang\" = {}\n# #\"llvm21.clang-dev\" = {}\n# #\"llvm21.dev\" = {}\n# #\"llvm21.lld\" = {}\n# #\"llvm21.lld-dev\" = {}\n# #\"llvm21.runtime\" = {}\n# #\"python312.dev\" = {}\n# #\"rust.doc\" = {}\n# #atk = {} # depends on glib which does not build\n# #benchmarks = {}\n# #binutils-gdb = {}\n# #book = {}\n# #cairo-demo = {} # linking errors\n# #classicube = {}\n# #cmake = {}\n# #cmatrix = {} # needs ncursesw now\n# #cookbook = {}\n# #cosmic-reader = {}\n# #cosmic-settings = {}\n# #cosmic-store = {}\n# #devilutionx = {}\n# #dynamic-example = {}\n# #fal\n# #fd = {} # ctrlc-3.1.1\n# #file = {}\n# #flycast = {}\n# #freeciv = {}\n# #freeglut = {}\n# #friar = {} # mio patch\n# #game-2048 = {} # rustc-serialize\n# #gawk = {} # langinfo.h\n# #gigalomania = {} # old recipe format\n# #gitoxide = {}\n# #goaccess = {}\n# #gstreamer = {} # conflict with thread local errno\n# #harfbuzz = {} # depends on glib which does not build\n# #helix = {}\n# #hello-redox = {}\n# #hematite = {} # needs crate patches for redox-unix\n# #hf = {}\n# #ibm-plex = {}\n# #iced = {}\n# #jansson = {} # needs config.sub update\n# #jq = {}\n# #libarchive = {}\n# #libatomic = {}\n# #libcosmic = {}\n# #libflac = {}\n# #libmodplug1 = {}\n# #libmpfr = {}\n# #libnettle = {}\n# #libogg = {}\n# #libpsl = {}\n# #libssh2 = {}\n# #libtool = {}\n# #liburcu = {}\n# #libuv = {}\n# #lua-compat-53 = {}\n# #luajit = {}\n# #luarocks = {}\n# #luv = {}\n# #mdp = {} # gcc hangs\n# #miniserve = {} # actix\n# #mpc = {}\n# #mupen64plus = {}\n# #ncdu = {} # multiple definitions of symbols\n# #newlib = {} # obsolete\n# #newlibtest = {} # obsolete\n# #noto-color-emoji = {}\n# #nushell = {} # needs cargo update\n# #openjk = {}\n# #openposixtestsuite = {}\n# #opentyrian = {}\n# #orbcalculator = {}\n# #ostest-bins = {}\n# #pango = {} # undefined references to std::__throw_system_error(int)\n# #pastel = {} # needs crate patches for redox-unix\n# #pathfinder = {} # servo-fontconfig\n# #pciids = {}\n# #pcre2 = {}\n# #pixman = {} # depends on glib which does not build\n# #pkgar = {} # uses virtual Cargo.toml, needs recipe update\n# #pls = {}\n# #pop-wallpapers = {}\n# #powerline = {} # dirs\n# #qemu = {} # can be built, but not working\n# #quakespasm = {}\n# #redox-posix-tests = {}\n# #redox-ssh = {} # does not compile\n# #retroarch = {} # OS_TLSIndex not declared\n# #rust-cairo = {} # linking errors\n# #rust-cairo-demo = {} # linking errors\n# #rvvm = {}\n# #schismtracker = {} # uses system includes\n# #sdl-player = {} # wctype_t\n# #sdl2-gfx = {}\n# #sm64ex = {}\n# #spacecadetpinball = {}\n# #twin-commander = {}\n# #ubuntu-wallpapers = {}\n# #unibilium = {}\n# #utf8proc = {}\n# #vice = {} # linker errors\n# #vvvvvv = {} # did not compile\n# #webrender = {} # unwind\n# #website = {}\n# #wesnoth = {}\n# #wget = {}\n# autoconf = {}\n# automake = {}\n# binutils = {}\n# bzip2 = {}\n# cairo = {}\n# cleye = {}\n# composer = {}\n# cpal = {}\n# dosbox = {}\n# duktape = {}\n# eduke32 = {}\n# exampled = {}\n# expat = {}\n# extrautils = {}\n# ffmpeg6 = {}\n# fontconfig = {}\n# freedoom = {}\n# freepats = {}\n# fribidi = {}\n# gdbserver = {} # wrong libc type\n# gdk-pixbuf = {}\n# gears = {}\n# generaluser-gs = {}\n# glib = {}\n# glutin = {}\n# gnu-grep = {}\n# htop = {}\n# intel-one-mono = {}\n# lci = {}\n# libavif = {}\n# libc-bench = {}\n# libedit = {}\n# libgmp = {}\n# libicu = {}\n# libonig = {}\n# libsodium = {}\n# libuuid = {}\n# libwebp = {}\n# lsd = {}\n# lua54 = {}\n# lz4 = {}\n# mednafen = {}\n# mesa = {} # libudev was not found\n# mesa-glu = {} # depends on mesa\n# mgba = {}\n# mpc = {} # libmpfr not found\n# ncursesw = {}\n# neverball = {}\n# nginx = {}\n# onefetch = {}\n# openjazz = {}\n# openssh = {}\n# openttd = {}\n# openttd-opengfx = {}\n# openttd-openmsx = {}\n# openttd-opensfx = {}\n# orbclient = {}\n# osdemo = {}\n# perg = {}\n# periodictable = {}\n# perl5 = {}\n# php84 = {}\n# pixelcannon = {}\n# pkg-config = {}\n# prboom = {}\n# procedural-wallpapers-rs = {}\n# python312 = {}\n# readline = {}\n# redox-fatfs = {}\n# redox-games = {}\n# relibc-tests = {}\n# relibc-tests-bins = {}\n# rodioplay = {}\n# rs-nes = {}\n# rsync = {}\n# rust64 = {}\n# rustual-boy = {}\n# scummvm = {}\n# sdl-gfx = {}\n# sdl1-image = {}\n# sdl1-mixer = {}\n# sdl1-ttf = {}\n# sdl2 = {}\n# sdl2-gears = {}\n# sdl2-image = {}\n# sdl2-mixer = {}\n# sdl2-ttf = {}\n# servo = {}\n# shellharden = {}\n# shellstorm = {}\n# simple-http-server = {}\n# sodium = {}\n# sopwith = {}\n# sqlite3 = {}\n# strace = {} # unknown syscall\n# syobonaction = {}\n# timidity = {}\n# tokei = {}\n# ttf-hack = {}\n# vttest = {}\n# webkitgtk3 = {}\n# winit = {}\n# xxhash = {}\n# zoxide = {} # untested\n"
  },
  {
    "path": "config/aarch64/demo.toml",
    "content": "# Configuration for demonstration\n\ninclude = [\"../desktop.toml\"]\n"
  },
  {
    "path": "config/aarch64/dev.toml",
    "content": "# Configuration for development\n\ninclude = [\"../dev.toml\"]\n\n# Override the default settings here\n\n# General settings\n[general]\n# Filesystem size in MiB\n# filesystem_size = 1024\n\n# Package settings\n[packages]\n# see ci.toml for error reasons\ngdbserver = \"ignore\"\ngnu-binutils = \"ignore\"\nmesa = \"ignore\"\nmesa-glu = \"ignore\"\nmpc = \"ignore\"\nstrace = \"ignore\"\n"
  },
  {
    "path": "config/aarch64/jeremy.toml",
    "content": "# Configuration for Jeremy Soller\n\ninclude = [\"desktop.toml\"]\n"
  },
  {
    "path": "config/aarch64/raspi3bp/minimal.toml",
    "content": "# Minimal configuration\n\ninclude = [\"../../minimal.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 256\n# EFI partition size in MiB\nefi_partition_size = 128\n"
  },
  {
    "path": "config/aarch64/redoxer.toml",
    "content": "# Configuration used for building redoxer base image\n\ninclude = [\"../redoxer.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 1024\n"
  },
  {
    "path": "config/acid.toml",
    "content": "# Configuration for \"acid\" testing\n\ninclude = [\"base.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 1024\n\n# Package settings\n[packages]\nacid = {}\ncoreutils = {}\nion = {}\n\n[[files]]\npath = \"/usr/lib/init.d/10_acid\"\ndata = \"\"\"\nrequires_weak 00_drivers\nion /usr/lib/run_acid.ion\n\"\"\"\n\n[[files]]\npath = \"/usr/lib/run_acid.ion\"\ndata = \"\"\"\n#!/usr/bin/env ion\nexport RUST_BACKTRACE=full\ncd /home/user/acid\ncargo test\nshutdown\n\"\"\"\n"
  },
  {
    "path": "config/auto-test.toml",
    "content": "# Configuration for automated testing of essential test suites\n# Smaller test suites are executed first to catch possible bugs or regressions faster\n\ninclude = [\"base.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 1024\n\n# Package settings\n[packages]\nauto-test = {}\n\n[[files]]\npath = \"/usr/lib/init.d/30_console\"\ndata = \"\"\"\nrequires_weak 10_net\nion /usr/lib/run_tests.ion\n\"\"\"\n\n[[files]]\npath = \"/usr/lib/run_tests.ion\"\ndata = \"\"\"\n#!/usr/bin/env ion\nexport RUST_BACKTRACE=full\ncd /home/user/acid\ncargo test\nbash /root/relibc-tests/run.sh\nos-test-runner\nshutdown\n\"\"\"\n"
  },
  {
    "path": "config/base.toml",
    "content": "# Base configuration: This configuration is meant to be included by\n# other configurations rather than use directly. It is the greatest\n# common divisor of all other configurations and misses several\n# parts necessary to create a bootable system.\n\n# General settings\n[general]\n# Do not prompt if settings are not defined\nprompt = false\n\n[packages]\nbase = {}\nbase-initfs = {}\nbootloader = {}\nkernel = {}\nlibgcc = {}\nlibstdcxx = {}\nnetdb = {}\nnetutils = {}\nrelibc = {}\nuserutils = {}\nuutils = {}\n\n## Configuration files\n[[files]]\npath = \"/usr/lib/init.d/00_base\"\ndata = \"\"\"\n# clear and recreate tmpdir with 0o1777 permission\nrm -rf /tmp\nmkdir -m a=rwxt /tmp\n\nnotify ipcd\nnotify ptyd\nnowait sudo --daemon\n\"\"\"\n\n[[files]]\npath = \"/usr/lib/init.d/00_drivers\"\ndata = \"\"\"\nrequires_weak 00_base\npcid-spawner\n\"\"\"\n\n## Network init\n[[files]]\npath = \"/usr/lib/init.d/10_net\"\ndata = \"\"\"\nrequires_weak 00_drivers\nnotify smolnetd\nnowait dhcpd\n\"\"\"\n\n[[files]]\npath = \"/etc/login_schemes.toml\"\ndata = \"\"\"\n[user_schemes.root]\nschemes = [\"*\"]\n[user_schemes.user]\nschemes = [\n  # Kernel schemes\n  \"debug\",\n  \"event\",\n  \"memory\",\n  \"pipe\",\n  \"serio\",\n  \"irq\",\n  \"time\",\n  \"sys\",\n  # Base schemes\n  \"rand\",\n  \"null\",\n  \"zero\",\n  \"log\",\n  # Network schemes\n  \"ip\",\n  \"icmp\",\n  \"tcp\",\n  \"udp\",\n  # IPC schemes\n  \"shm\",\n  \"chan\",\n  \"uds_stream\",\n  \"uds_dgram\",\n  # File schemes\n  \"file\",\n  # Display schemes\n  \"display.vesa\",\n  \"display*\",\n  # Other schemes\n  \"pty\",\n  \"sudo\",\n  \"audio\",\n  \"orbital\",\n]\n\"\"\"\n\n[[files]]\npath = \"/etc/hostname\"\ndata = \"redox\"\n\n## Default net configuration (optimized for QEMU)\n[[files]]\npath = \"/etc/net/dns\"\ndata = \"\"\"\n9.9.9.9\n\"\"\"\n\n[[files]]\npath = \"/etc/net/ip\"\ndata = \"\"\"\n10.0.2.15\n\"\"\"\n\n[[files]]\npath = \"/etc/net/ip_router\"\ndata = \"\"\"\n10.0.2.2\n\"\"\"\n\n[[files]]\npath = \"/etc/net/ip_subnet\"\ndata = \"\"\"\n255.255.255.0\n\"\"\"\n\n# https://www.freedesktop.org/software/systemd/man/latest/os-release.html\n[[files]]\npath = \"/usr/lib/os-release\"\ndata = \"\"\"\nPRETTY_NAME=\"Redox OS 0.9.0\"\nNAME=\"Redox OS\"\nVERSION_ID=\"0.9.0\"\nVERSION=\"0.9.0\"\nID=\"redox-os\"\n\nHOME_URL=\"https://redox-os.org/\"\nDOCUMENTATION_URL=\"https://redox-os.org/docs/\"\nSUPPORT_URL=\"https://redox-os.org/community/\"\n\"\"\"\n# FIXME maybe add VARIANT= and VARIANT_ID= keys depending on the chosen configuration?\n\n[[files]]\npath = \"/etc/os-release\"\ndata = \"../usr/lib/os-release\"\nsymlink = true\n\n[[files]]\npath = \"/etc/pkg.d/50_redox\"\ndata = \"https://static.redox-os.org/pkg\"\n\n## /usr and symlinks for usrmerge\n[[files]]\npath = \"/usr\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/usr/bin\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/bin\"\ndata = \"usr/bin\"\nsymlink = true\n\n[[files]]\npath = \"/usr/include\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/include\"\ndata = \"usr/include\"\nsymlink = true\n\n[[files]]\npath = \"/usr/lib\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/lib\"\ndata = \"usr/lib\"\nsymlink = true\n\n[[files]]\npath = \"/usr/libexec\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/usr/share\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/share\"\ndata = \"usr/share\"\nsymlink = true\n\n[[files]]\npath = \"/ui\"\ndata = \"usr/share/ui\"\nsymlink = true\n\n## legacy orbital font directory\n[[files]]\npath = \"/usr/share/ui/fonts\"\ndata = \"/usr/share/fonts\"\nsymlink = true\n\n## legacy orbital icon directory\n[[files]]\npath = \"/usr/share/ui/icons\"\ndata = \"/usr/share/icons\"\nsymlink = true\n\n## /var\n[[files]]\npath = \"/var\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/var/cache\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/var/lib\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/var/lock\"\ndata = \"\"\ndirectory = true\nmode = 0o1777\n\n[[files]]\npath = \"/var/log\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/var/run\"\ndata = \"\"\ndirectory = true\nmode = 0o755\n\n[[files]]\npath = \"/var/tmp\"\ndata = \"\"\ndirectory = true\nmode = 0o1777\n\n## Device file symlinks\n[[files]]\npath = \"/dev/null\"\ndata = \"/scheme/null\"\nsymlink = true\n\n[[files]]\npath = \"/dev/random\"\ndata = \"/scheme/rand\"\nsymlink = true\n\n[[files]]\npath = \"/dev/urandom\"\ndata = \"/scheme/rand\"\nsymlink = true\n\n[[files]]\npath = \"/dev/zero\"\ndata = \"/scheme/zero\"\nsymlink = true\n\n[[files]]\npath = \"/dev/tty\"\ndata = \"libc:tty\"\nsymlink = true\n\n[[files]]\npath = \"/dev/stdin\"\ndata = \"libc:stdin\"\nsymlink = true\n\n[[files]]\npath = \"/dev/stdout\"\ndata = \"libc:stdout\"\nsymlink = true\n\n[[files]]\npath = \"/dev/stderr\"\ndata = \"libc:stderr\"\nsymlink = true\n\n# User settings\n[users.root]\npassword = \"password\"\nuid = 0\ngid = 0\nshell = \"/usr/bin/ion\"\n\n[users.user]\n# Password is unset\npassword = \"\"\nshell = \"/usr/bin/ion\"\n\n# Group settings\n[groups.sudo]\ngid = 1\nmembers = [\"user\"]\n"
  },
  {
    "path": "config/desktop-minimal.toml",
    "content": "# Minimal desktop configuration\n\ninclude = [\"minimal.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 256\n\n# Package settings\n[packages]\norbdata = {}\norbital = {}\norbterm = {}\norbutils = {}\n\n[[files]]\npath = \"/usr/lib/init.d/20_orbital\"\ndata = \"\"\"\nrequires_weak 10_net\nnotify audiod\nnowait VT=3 orbital orblogin launcher\n\"\"\"\n\n# Override console config to not switch to VT 2\n[[files]]\npath = \"/usr/lib/init.d/30_console\"\ndata = \"\"\"\nrequires_weak 20_orbital\nnowait getty 2\nnowait getty /scheme/debug/no-preserve -J\n\"\"\"\n"
  },
  {
    "path": "config/desktop.toml",
    "content": "# Default build system configuration\n\ninclude = [\"desktop-minimal.toml\", \"server.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 650\n\n# Package settings\n[packages]\ncosmic-edit = {}\ncosmic-files = {}\ncosmic-icons = {}\ncosmic-term = {}\ndejavu = {}\nfreefont = {}\nhicolor-icon-theme = {}\ninstaller-gui = {}\nnetsurf = {}\npatchelf = {}\npop-icon-theme = {}\nshared-mime-info = {}\n# orbterm from desktop-minimal should be ignored\norbterm = \"ignore\"\n"
  },
  {
    "path": "config/dev.toml",
    "content": "# Configuration for development\n\ninclude = [\"desktop.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 20000\n# Do not prompt if settings are not defined\nprompt = false\n\n# Package settings\n[packages]\ndev-redox = {}\nhello-redox = {}\n"
  },
  {
    "path": "config/i586/ci.toml",
    "content": "# The Redox build server configuration\n\n# General settings\n[general]\n# Do not prompt if settings are not defined\nprompt = false\n\n# Package settings\n[packages]\n\n# If you need to disable some broken package comment out instead of removal to not increase the maintenance cost\n#TODO: commented out recipes need to be built and tested inside of Redox to verify if they returned to work\n\n# Meta-packages below\n\n# auto-test = {}\n# dev-essential = {}\n# dev-redox = {}\n# redox-tests = {}\n# x11-minimal = {}\n# x11-full = {}\n\n# Normal packages below\n\n# acid = {} # rust require dynamic linking\nacid-bins = {}\nbase = {}\nbase-initfs = {}\nbash = {}\nbash-completion = {}\nbootloader = {}\nbottom = {}\nca-certificates = {}\ncontain = {}\ncoreutils = {}\ncosmic-edit = {}\ncosmic-files = {}\ncosmic-icons = {}\ncosmic-term = {}\ncosmic-text = {}\ncurl = {}\ndash = {}\ndejavu = {}\ndiffutils = {}\nexpat = {}\nextrautils = {}\nfindutils = {}\nfreefont = {}\nfreetype2 = {}\ngettext = {}\ngit = {}\ngnu-make = {}\nhicolor-icon-theme = {}\ninstaller = {}\ninstaller-gui = {}\nion = {}\nkernel = {}\nkibi = {}\nlibffi = {}\nlibgcc = {}\nlibiconv = {}\nlibjpeg = {}\nlibogg = {}\nliborbital = {}\nlibpng = {}\nlibstdcxx = {}\nlibvorbis = {}\nlibxkbcommon = {}\nlibxml2 = {}\nnano = {}\nnasm = {}\nncurses = {}\nnetdb = {}\nnetsurf = {}\nnetutils = {}\nnghttp2 = {}\nopenssl1 = {}\norbdata = {}\norbital = {}\norbterm = {}\norbutils = {}\npatch = {}\npcre = {}\npatchelf = {}\npop-icon-theme = {}\npkgutils = {}\nredoxfs = {}\nrelibc = {}\nripgrep = {}\nrustpython = {}\nsdl1 = {}\nsed = {}\nshared-mime-info = {}\nsmith = {}\nterminfo = {}\nuserutils = {}\nuutils = {}\nxz = {}\n#vim = {} # conflicting types\nzlib = {}\n\n# #\"gcc13.cxx\" = {}\n# #\"llvm21.clang\" = {}\n# #\"llvm21.clang-dev\" = {}\n# #\"llvm21.dev\" = {}\n# #\"llvm21.lld\" = {}\n# #\"llvm21.lld-dev\" = {}\n# #\"llvm21.runtime\" = {}\n# #\"python312.dev\" = {}\n# #\"rust.doc\" = {}\n# #atk = {} # depends on glib which does not build\n# #benchmarks = {}\n# #binutils-gdb = {}\n# #book = {}\n# #cairo-demo = {} # linking errors\n# #classicube = {}\n# #cmake = {}\n# #cmatrix = {} # needs ncursesw now\n# #cookbook = {}\n# #cosmic-reader = {}\n# #cosmic-settings = {}\n# #cosmic-store = {}\n# #devilutionx = {}\n# #dynamic-example = {}\n# #fal\n# #fd = {} # ctrlc-3.1.1\n# #file = {}\n# #flycast = {}\n# #freeciv = {}\n# #freeglut = {}\n# #friar = {} # mio patch\n# #game-2048 = {} # rustc-serialize\n# #gawk = {} # langinfo.h\n# #gigalomania = {} # old recipe format\n# #gitoxide = {}\n# #goaccess = {}\n# #gstreamer = {} # conflict with thread local errno\n# #harfbuzz = {} # depends on glib which does not build\n# #helix = {}\n# #hello-redox = {}\n# #hematite = {} # needs crate patches for redox-unix\n# #hf = {}\n# #ibm-plex = {}\n# #iced = {}\n# #jansson = {} # needs config.sub update\n# #jq = {}\n# #libarchive = {}\n# #libatomic = {}\n# #libcosmic = {}\n# #libflac = {}\n# #libmodplug1 = {}\n# #libmpfr = {}\n# #libnettle = {}\n# #libogg = {}\n# #libpsl = {}\n# #libssh2 = {}\n# #libtool = {}\n# #liburcu = {}\n# #libuv = {}\n# #lua-compat-53 = {}\n# #luajit = {}\n# #luarocks = {}\n# #luv = {}\n# #mdp = {} # gcc hangs\n# #miniserve = {} # actix\n# #mpc = {}\n# #mupen64plus = {}\n# #ncdu = {} # multiple definitions of symbols\n# #newlib = {} # obsolete\n# #newlibtest = {} # obsolete\n# #noto-color-emoji = {}\n# #nushell = {} # needs cargo update\n# #openjk = {}\n# #openposixtestsuite = {}\n# #opentyrian = {}\n# #orbcalculator = {}\n# #ostest-bins = {}\n# #pango = {} # undefined references to std::__throw_system_error(int)\n# #pastel = {} # needs crate patches for redox-unix\n# #pathfinder = {} # servo-fontconfig\n# #pciids = {}\n# #pcre2 = {}\n# #pixman = {} # depends on glib which does not build\n# #pkgar = {} # uses virtual Cargo.toml, needs recipe update\n# #pls = {}\n# #pop-wallpapers = {}\n# #powerline = {} # dirs\n# #qemu = {} # can be built, but not working\n# #quakespasm = {}\n# #redox-posix-tests = {}\n# #redox-ssh = {} # does not compile\n# #retroarch = {} # OS_TLSIndex not declared\n# #rust-cairo = {} # linking errors\n# #rust-cairo-demo = {} # linking errors\n# #rvvm = {}\n# #schismtracker = {} # uses system includes\n# #sdl-player = {} # wctype_t\n# #sdl2-gfx = {}\n# #sm64ex = {}\n# #spacecadetpinball = {}\n# #twin-commander = {}\n# #ubuntu-wallpapers = {}\n# #unibilium = {}\n# #utf8proc = {}\n# #vice = {} # linker errors\n# #vvvvvv = {} # did not compile\n# #webrender = {} # unwind\n# #website = {}\n# #wesnoth = {}\n# #wget = {}\n# autoconf = {}\n# automake = {}\n# binutils = {}\n# bzip2 = {}\n# cairo = {}\n# cleye = {}\n# composer = {}\n# cpal = {}\n# dosbox = {}\n# duktape = {}\n# eduke32 = {}\n# exampled = {}\n# ffmpeg6 = {}\n# fontconfig = {}\n# freedoom = {}\n# freepats = {}\n# fribidi = {}\n# gcc13 = {}\n# gdbserver = {}\n# gdk-pixbuf = {}\n# gears = {}\n# generaluser-gs = {}\n# glib = {}\n# glutin = {}\n# gnu-binutils = {}\n# gnu-grep = {}\n# htop = {}\n# intel-one-mono = {}\n# lci = {}\n# libavif = {}\n# libc-bench = {}\n# libedit = {}\n# libgmp = {}\n# libicu = {}\n# libonig = {}\n# libsodium = {}\n# libuuid = {}\n# libwebp = {}\n# llvm21 = {}\n# lsd = {}\n# lua54 = {}\n# lz4 = {}\n# mednafen = {}\n# mesa = {}\n# mesa-glu = {}\n# mgba = {}\n# ncursesw = {}\n# neverball = {}\n# nginx = {}\n# onefetch = {}\n# openjazz = {}\n# openssh = {}\n# openssl3 = {}\n# openttd = {}\n# openttd-opengfx = {}\n# openttd-openmsx = {}\n# openttd-opensfx = {}\n# orbclient = {}\n# osdemo = {}\n# perg = {}\n# periodictable = {}\n# perl5 = {}\n# php84 = {}\n# pixelcannon = {}\n# pkg-config = {}\n# prboom = {}\n# procedural-wallpapers-rs = {}\n# python312 = {}\n# readline = {}\n# redox-fatfs = {}\n# redox-games = {}\n# relibc-tests = {}\n# relibc-tests-bins = {}\n# rodioplay = {}\n# rs-nes = {}\n# rsync = {}\n# rust = {}\n# rust64 = {}\n# rustual-boy = {}\n# scummvm = {}\n# sdl-gfx = {}\n# sdl1-image = {}\n# sdl1-mixer = {}\n# sdl1-ttf = {}\n# sdl2 = {}\n# sdl2-gears = {}\n# sdl2-image = {}\n# sdl2-mixer = {}\n# sdl2-ttf = {}\n# servo = {}\n# shellharden = {}\n# shellstorm = {}\n# simple-http-server = {}\n# sodium = {}\n# sopwith = {}\n# sqlite3 = {}\n# strace = {}\n# syobonaction = {}\n# timidity = {}\n# tokei = {}\n# ttf-hack = {}\n# vttest = {}\n# webkitgtk3 = {}\n# winit = {}\n# xxhash = {}\n# zoxide = {} # untested\n# zstd = {}\n"
  },
  {
    "path": "config/i586/demo.toml",
    "content": "# Configuration for demonstration\n\ninclude = [\"../desktop.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 768\n\n# Package settings\n[packages]\n# Games\ndosbox = {}\nfreedoom = {}\nprboom = {}\nredox-games = {}\n\n# Demos\npixelcannon = {}\n\n# MIDI\nfreepats = {}\n\n[[files]]\npath = \"/home/user/Welcome.txt\"\ndata = \"\"\"\n##############################################################################\n#                                                                            #\n#                             Welcome to Redox!                              #\n#                                                                            #\n# Redox is an operating system written in Rust, a language with focus        #\n# on safety and high performance. Redox, following the microkernel design,   #\n# aims to be secure, usable, and free. Redox is inspired by previous kernels #\n# and operating systems, such as SeL4, MINIX, Plan 9, and BSD.               #\n#                                                                            #\n# Redox _is not_ just a kernel, it's a full-featured Operating System,       #\n# providing packages (memory allocator, file system, display manager, core   #\n# utilities, etc.) that together make up a functional and convenient         #\n# operating system. You can loosely think of it as the GNU or BSD ecosystem, #\n# but in a memory safe language and with modern technology.                  #\n#                                                                            #\n# The website can be found at https://www.redox-os.org.                      #\n#                                                                            #\n# For things to try on Redox, please see                                     #\n# https://doc.redox-os.org/book/ch02-06-trying-out-redox.html                #\n#                                                                            #\n##############################################################################\n\"\"\"\n"
  },
  {
    "path": "config/i586/dev.toml",
    "content": "# Configuration for development\n\ninclude = [\"../dev.toml\"]\n\n# Override the default settings here\n\n# General settings\n[general]\n# Filesystem size in MiB\n# filesystem_size = 1024\n\n# Package settings\n[packages]\n# example = {}\n"
  },
  {
    "path": "config/i586/jeremy.toml",
    "content": "# Configuration for Jeremy Soller\n\ninclude = [\"../desktop.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 4000\n\n# Package settings\n[packages]\n# apps\ncosmic-text = {}\npixelcannon = {}\nsodium = {}\n\n# cli\nacid = {}\ncleye = {}\nripgrep = {}\n\n# demos\ncpal = {}\norbclient = {}\nrodioplay = {}\nwinit = {}\n\n# games\ndosbox = {}\neduke32 = {}\nfreedoom = {}\nprboom = {}\nredox-games = {}\n\n# stuff\nfreepats = {}\ngeneraluser-gs = {}\njeremy = {}\nttf-hack = {}\n"
  },
  {
    "path": "config/i586/redoxer.toml",
    "content": "# Configuration used for building redoxer base image\n\ninclude = [\"../redoxer.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 1024\n"
  },
  {
    "path": "config/minimal.toml",
    "content": "# Minimal configuration\n\ninclude = [\"base.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 196\n\n# Package settings\n[packages]\nca-certificates = {}\ncoreutils = {}\nextrautils = {}\nion = {}\npkgutils = {}\nkibi = {}\n\n[[files]]\npath = \"/usr/lib/init.d/30_console\"\ndata = \"\"\"\nrequires_weak 10_net\ninputd -A 2\nnowait getty 2\nnowait getty /scheme/debug/no-preserve -J\n\"\"\"\n"
  },
  {
    "path": "config/os-test.toml",
    "content": "# Configuration for \"os-test\" testing\n\ninclude = [\"server.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 1024\n# Do not prompt if settings are not defined\nprompt = false\n\n# Package settings\n[packages]\nos-test-bins = {} # Provides source and cross-compiled binaries\n\n[[files]]\npath = \"/usr/lib/init.d/30_console\"\ndata = \"\"\"\nrequires_weak 10_net\nRUST_BACKTRACE=full os-test-runner\nshutdown\n\"\"\"\n"
  },
  {
    "path": "config/redoxer-gui.toml",
    "content": "# Configuration for the Redoxer GUI image\n\ninclude = [\"redoxer.toml\"]\n\n# Package settings\n[packages]\norbdata = {}\norbital = {}\n\n# Override to run inside of orbital\n[[files]]\npath = \"/usr/lib/init.d/30_redoxer\"\ndata = \"\"\"\nrequires_weak 10_net\necho\necho \"## running redoxer in orbital ##\"\nnowait VT=3 orbital redoxerd\n\"\"\"\n"
  },
  {
    "path": "config/redoxer.toml",
    "content": "# Configuration for the Redoxer image\n\ninclude = [\"base.toml\"]\n\n# Package settings\n[packages]\nbash = {}\nca-certificates = {}\ncoreutils = {}\nextrautils = {}\nfindutils = {}\ngnu-make = {}\nion = {}\npkgutils = {}\nrelibc = {}\nsed = {}\n\n# Override to not background dhcpd\n[[files]]\npath = \"/usr/lib/init.d/10_net\"\ndata = \"\"\"\nrequires_weak 00_drivers\nnotify smolnetd\ndhcpd\n\"\"\"\n\n[[files]]\npath = \"/usr/lib/init.d/30_redoxer\"\ndata = \"\"\"\nrequires_weak 10_net\nion /usr/lib/run_redoxer.ion\n\"\"\"\n\n[[files]]\npath = \"/usr/lib/run_redoxer.ion\"\ndata = \"\"\"\n#!/usr/bin/env ion\necho\necho \"## preparing environment ##\"\nexport GROUPS=0\nexport HOME=/root\nexport HOST=redox\nexport SHELL=/bin/sh\nexport UID=0\nexport USER=root\ncd /root\nenv\necho\necho \"## running redoxer ##\"\nredoxerd\n\"\"\"\n"
  },
  {
    "path": "config/riscv64gc/ci.toml",
    "content": "# The Redox build server configuration\n\n# General settings\n[general]\n# Do not prompt if settings are not defined\nprompt = false\n\n# Package settings\n[packages]\n\n# If you need to disable some broken package comment out instead of removal to not increase the maintenance cost\n#TODO: commented out recipes need to be built and tested inside of Redox to verify if they returned to work\n\n# Meta-packages below\n\n# auto-test = {}\n# dev-essential = {}\n# dev-redox = {}\n# redox-tests = {}\n# x11-minimal = {}\n# x11-full = {}\n\n# Normal packages below\n\n# acid = {} # rust require dynamic linking\nacid-bins = {}\nbase = {}\nbase-initfs = {}\nbash = {}\nbash-completion = {}\nbootloader = {}\nbottom = {}\nca-certificates = {}\n#contain = {} # redox_syscall 0.4 not working on riscv64gc?\ncoreutils = {}\ncosmic-edit = {}\ncosmic-files = {}\ncosmic-icons = {}\ncosmic-term = {}\n#cosmic-text = {} # need to bump redox_syscall\ncurl = {}\ndash = {}\ndejavu = {}\ndiffutils = {}\nexpat = {}\nextrautils = {}\nfindutils = {}\nfreefont = {}\nfreetype2 = {}\ngettext = {}\ngit = {}\ngnu-make = {}\nhicolor-icon-theme = {}\ninstaller = {}\n#installer-gui = {} # redox_syscall 0.4 not working on riscv64gc?\nion = {}\nkernel = {}\nkibi = {}\nlibffi = {}\nlibgcc = {}\n#libiconv = {} # not tested yet, netsurf is commented out\nlibjpeg = {}\nlibogg = {}\n#liborbital = {} # not tested yet, netsurf is commented out\nlibpng = {}\nlibstdcxx = {}\nlibvorbis = {}\nlibxkbcommon = {}\nlibxml2 = {}\n#nano = {} # error compiling ncurses\nnasm = {}\n#ncurses = {}\nnetdb = {}\n#netsurf = {} # error compiling nghttp2\nnetutils = {}\n#nghttp2 = {}\nopenssl1 = {}\norbdata = {}\norbital = {}\norbterm = {}\norbutils = {}\n#patch = {} error configure machine `riscv64gc-unknown' not recognized\npcre = {}\npatchelf = {}\npop-icon-theme = {}\npkgutils = {}\nredoxfs = {}\nrelibc = {}\nripgrep = {}\nrustpython = {}\n#sdl1 = {} # not tested yet, netsurf is commented out\nsed = {}\nshared-mime-info = {}\nsmith = {}\nterminfo = {}\nuserutils = {}\nuutils = {}\nxz = {}\n#vim = {} # error compiling ncurses\nzlib = {}\n\n# #\"gcc13.cxx\" = {}\n# #\"llvm21.clang\" = {}\n# #\"llvm21.clang-dev\" = {}\n# #\"llvm21.dev\" = {}\n# #\"llvm21.lld\" = {}\n# #\"llvm21.lld-dev\" = {}\n# #\"llvm21.runtime\" = {}\n# #\"python312.dev\" = {}\n# #\"rust.doc\" = {}\n# #atk = {} # depends on glib which does not build\n# #benchmarks = {}\n# #binutils-gdb = {}\n# #book = {}\n# #cairo-demo = {} # linking errors\n# #classicube = {}\n# #cmake = {}\n# #cmatrix = {} # needs ncursesw now\n# #cookbook = {}\n# #cosmic-reader = {}\n# #cosmic-settings = {}\n# #cosmic-store = {}\n# #devilutionx = {}\n# #dynamic-example = {}\n# #fal\n# #fd = {} # ctrlc-3.1.1\n# #file = {}\n# #flycast = {}\n# #freeciv = {}\n# #freeglut = {}\n# #friar = {} # mio patch\n# #game-2048 = {} # rustc-serialize\n# #gawk = {} # langinfo.h\n# #gigalomania = {} # old recipe format\n# #gitoxide = {}\n# #goaccess = {}\n# #gstreamer = {} # conflict with thread local errno\n# #harfbuzz = {} # depends on glib which does not build\n# #helix = {}\n# #hello-redox = {}\n# #hematite = {} # needs crate patches for redox-unix\n# #hf = {}\n# #ibm-plex = {}\n# #iced = {}\n# #jansson = {} # needs config.sub update\n# #jq = {}\n# #libarchive = {}\n# #libatomic = {}\n# #libcosmic = {}\n# #libflac = {}\n# #libmodplug1 = {}\n# #libmpfr = {}\n# #libnettle = {}\n# #libogg = {}\n# #libpsl = {}\n# #libssh2 = {}\n# #libtool = {}\n# #liburcu = {}\n# #libuv = {}\n# #lua-compat-53 = {}\n# #luajit = {}\n# #luarocks = {}\n# #luv = {}\n# #mdp = {} # gcc hangs\n# #miniserve = {} # actix\n# #mpc = {}\n# #mupen64plus = {}\n# #ncdu = {} # multiple definitions of symbols\n# #newlib = {} # obsolete\n# #newlibtest = {} # obsolete\n# #noto-color-emoji = {}\n# #nushell = {} # needs cargo update\n# #openjk = {}\n# #openposixtestsuite = {}\n# #opentyrian = {}\n# #orbcalculator = {}\n# #ostest-bins = {}\n# #pango = {} # undefined references to std::__throw_system_error(int)\n# #pastel = {} # needs crate patches for redox-unix\n# #pathfinder = {} # servo-fontconfig\n# #pciids = {}\n# #pcre2 = {}\n# #pixman = {} # depends on glib which does not build\n# #pkgar = {} # uses virtual Cargo.toml, needs recipe update\n# #pls = {}\n# #pop-wallpapers = {}\n# #powerline = {} # dirs\n# #qemu = {} # can be built, but not working\n# #quakespasm = {}\n# #redox-posix-tests = {}\n# #redox-ssh = {} # does not compile\n# #retroarch = {} # OS_TLSIndex not declared\n# #rust-cairo = {} # linking errors\n# #rust-cairo-demo = {} # linking errors\n# #rvvm = {}\n# #schismtracker = {} # uses system includes\n# #sdl-player = {} # wctype_t\n# #sdl2-gfx = {}\n# #sm64ex = {}\n# #spacecadetpinball = {}\n# #twin-commander = {}\n# #ubuntu-wallpapers = {}\n# #unibilium = {}\n# #utf8proc = {}\n# #vice = {} # linker errors\n# #vvvvvv = {} # did not compile\n# #webrender = {} # unwind\n# #website = {}\n# #wesnoth = {}\n# #wget = {}\n# autoconf = {}\n# automake = {}\n# binutils = {}\n# bzip2 = {}\n# cairo = {}\n# cleye = {}\n# composer = {}\n# cosmic-text = {}\n# cpal = {}\n# dosbox = {}\n# duktape = {}\n# eduke32 = {}\n# exampled = {}\n# ffmpeg6 = {}\n# fontconfig = {}\n# freedoom = {}\n# freepats = {}\n# fribidi = {}\n# gcc13 = {}\n# gdbserver = {}\n# gdk-pixbuf = {}\n# gears = {}\n# generaluser-gs = {}\n# glib = {}\n# glutin = {}\n# gnu-binutils = {}\n# gnu-grep = {}\n# htop = {}\n# intel-one-mono = {}\n# lci = {}\n# libavif = {}\n# libc-bench = {}\n# libedit = {}\n# libgmp = {}\n# libicu = {}\n# libonig = {}\n# libsodium = {}\n# libuuid = {}\n# libwebp = {}\n# llvm21 = {}\n# lsd = {}\n# lua54 = {}\n# lz4 = {}\n# mednafen = {}\n# mesa = {}\n# mesa-glu = {}\n# mgba = {}\n# ncursesw = {}\n# neverball = {}\n# nginx = {}\n# onefetch = {}\n# openjazz = {}\n# openssh = {}\n# openssl3 = {}\n# openttd = {}\n# openttd-opengfx = {}\n# openttd-openmsx = {}\n# openttd-opensfx = {}\n# orbclient = {}\n# osdemo = {}\n# perg = {}\n# periodictable = {}\n# perl5 = {}\n# php84 = {}\n# pixelcannon = {}\n# pkg-config = {}\n# prboom = {}\n# procedural-wallpapers-rs = {}\n# python312 = {}\n# readline = {}\n# redox-fatfs = {}\n# redox-games = {}\n# relibc-tests = {}\n# relibc-tests-bins = {}\n# rodioplay = {}\n# rs-nes = {}\n# rsync = {}\n# rust = {}\n# rust64 = {}\n# rustual-boy = {}\n# scummvm = {}\n# sdl-gfx = {}\n# sdl1-image = {}\n# sdl1-mixer = {}\n# sdl1-ttf = {}\n# sdl2 = {}\n# sdl2-gears = {}\n# sdl2-image = {}\n# sdl2-mixer = {}\n# sdl2-ttf = {}\n# servo = {}\n# shellharden = {}\n# shellstorm = {}\n# simple-http-server = {}\n# sodium = {}\n# sopwith = {}\n# sqlite3 = {}\n# strace = {}\n# syobonaction = {}\n# timidity = {}\n# tokei = {}\n# ttf-hack = {}\n# vttest = {}\n# webkitgtk3 = {}\n# winit = {}\n# xxhash = {}\n# zoxide = {} # untested\n# zstd = {}\n"
  },
  {
    "path": "config/riscv64gc/demo.toml",
    "content": "# Configuration for demonstration\n\ninclude = [\"desktop.toml\"]\n"
  },
  {
    "path": "config/riscv64gc/desktop.toml",
    "content": "# Default build system configuration\n\ninclude = [\"../desktop.toml\"]\n\n# Override the default settings here\n\n# General settings\n[general]\n# Filesystem size in MiB\n# filesystem_size = 1024\n\n# Package settings\n[packages]\n# example = {}\nnetsurf = \"ignore\" # liborbital fails to link in due to mismatching float ABI\n"
  },
  {
    "path": "config/riscv64gc/jeremy.toml",
    "content": "# Configuration for Jeremy Soller\n\ninclude = [\"desktop.toml\"]\n"
  },
  {
    "path": "config/server.toml",
    "content": "# Server configuration\n\ninclude = [\"minimal.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 512\n\n# Package settings\n[packages]\nbash = {}\nbottom = {}\n#contain = {} # needs to update dependencies\ncurl = {}\ndiffutils = {}\nfindutils = {}\ngit = {}\ninstaller = {}\nkibi = {}\nredoxfs = {}\n"
  },
  {
    "path": "config/tests.toml",
    "content": "# Configuration for testing\n\ninclude = [\"server.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 10000\n# Do not prompt if settings are not defined\nprompt = false\n\n# Package settings\n[packages]\nredox-tests = {}\nbenchmarks = {}\n"
  },
  {
    "path": "config/wayland.toml",
    "content": "# Wayland configuration\n\ninclude = [\"desktop.toml\"]\n\n# Override the default settings here\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 2048\n\n# Package settings\n[packages]\nadwaita-icon-theme = {}\nbash = {}\ncosmic-app-library = {}\ncosmic-comp = {}\ngtk3 = {}\nlibcosmic-wayland = {}\nlibxcursor = {}\niced-wayland = {}\nmesa = {}\n\"pop-icon-theme.cursors\" = {}\nsmallvil = {}\nsoftbuffer-wayland = {}\nwayland-rs = {}\n#webkitgtk3 = {}\nwinit-wayland = {}\nxkeyboard-config = {}\n\n# Overridden to launch wayland compositor instead of orblogin\n[[files]]\npath = \"/usr/lib/init.d/20_orbital\"\ndata = \"\"\"\nrequires_weak 10_net\nnotify audiod\nnowait BROWSER=/bin/netsurf-fb VT=3 orbital orbital-wayland\n\"\"\"\n\n[[files]]\npath = \"/usr/bin/orbital-wayland\"\nmode = 0o755\ndata = \"\"\"\n#!/usr/bin/env bash\n\nset -ex\n\n# Prepare environment\nunset DISPLAY\nexport COSMIC_BACKEND=winit\nexport HOME=/root\nexport LD_DEBUG=all\nexport RUST_BACKTRACE=full\nexport RUST_LOG=debug\nexport XCURSOR_THEME=Pop\nexport XDG_RUNTIME_DIR=/tmp/run/user/0\n\n# Create XDG runtime directory\n#TODO: mkdir -p not working\nmkdir -p /tmp/run\nmkdir -p /tmp/run/user\nmkdir -p /tmp/run/user/0\n\n# Compile glib schemas\nglib-compile-schemas /usr/share/glib-2.0/schemas/\n\n# For cosmic-comp (more features)\ncosmic-comp wayland-session\n\n# For smallvil (easier to debug)\n#smallvil -c wayland-session&\n\"\"\"\n\n[[files]]\npath = \"/usr/bin/wayland-session\"\nmode = 0o755\ndata = \"\"\"\n#!/usr/bin/env bash\n\nset -ex\n\n#env G_MAIN_POLL_DEBUG=1 G_MESSAGES_DEBUG=all LD_DEBUG=all WEBKIT_DEBUG=all MiniBrowser&\nprintenv\n#wayland-rs_simple_window\n#winit-wayland_window\n#softbuffer-wayland_animation\n#iced-wayland_sctk_lazy\nlibcosmic-wayland_application\n#gtk3-widget-factory\n#cosmic-app-library run\n\"\"\"\n\n[[files]]\npath = \"/etc/gtk-3.0/settings.ini\"\ndata = \"\"\"\n[Settings]\ngtk-cursor-theme-name = \"Pop\"\ngtk-icon-theme-name = \"Cosmic\"\n\"\"\"\n"
  },
  {
    "path": "config/x11.toml",
    "content": "# X11 configuration\n\ninclude = [\"desktop.toml\"]\n\n# Override the default settings here\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 2048\n\n# Package settings\n[packages]\nadwaita-icon-theme = {}\ndbus = {}\ngtk3 = {}\nmate-common = {}\nmesa-demos-x11 = {}\n#webkitgtk3 = {} # not compiling\n#xfce4-panel = {}\n#xfwm4 = {}\nx11-full = {}\nzenity = {}\n\n[[files]]\npath = \"/usr/lib/init.d/10_dbus\"\ndata = \"\"\"\nrequires_weak 10_net\nbash /usr/bin/start-dbus.sh\n\"\"\"\n\n[[files]]\npath = \"/usr/bin/start-dbus.sh\"\nmode = 0o755\ndata = \"\"\"\n#!/usr/bin/env bash\nexport DBUS_DEBUG_OUTPUT=1\n#export DBUS_VERBOSE=1\n#export G_DBUS_DEBUG=all\nmkdir -p /var/lib/dbus\ndbus-uuidgen --ensure\nmkdir -p /run/dbus\nrm -f /run/dbus/pid\ndbus-daemon --system\n\"\"\"\n\n[[files]]\npath = \"/usr/lib/init.d/10_xenv\"\ndata = \"\"\"\nrequires_weak 10_net\nglib-compile-schemas /usr/share/glib-2.0/schemas/\n\"\"\"\n\n# Overridden to launch X instead of orblogin\n[[files]]\npath = \"/usr/lib/init.d/20_orbital\"\ndata = \"\"\"\nrequires_weak 10_dbus 10_xenv\nnotify audiod\nnowait BROWSER=/bin/netsurf-fb VT=3 orbital orbital-x11\n\"\"\"\n\n[[files]]\npath = \"/usr/bin/orbital-x11\"\nmode = 0o755\ndata = \"\"\"\n#!/usr/bin/env bash\n\nset -ex\n\n# for ice authority and pixbuf\nexport HOME=/home/root\nexport XDG_DATA_DIRS=/usr/share\n\n# Generate config file\nWIDTH=\"$((0x$(grep FRAMEBUFFER_WIDTH /scheme/sys/env | cut -d '=' -f 2)))\"\nHEIGHT=\"$((0x$(grep FRAMEBUFFER_HEIGHT /scheme/sys/env | cut -d '=' -f 2)))\"\nmkdir -p /usr/share/X11/xorg.conf.d\ncat > /usr/share/X11/xorg.conf.d/orbital.conf <<EOF\nSection \"Device\"\n    Identifier  \"Configured Video Device\"\n    Driver      \"dummy\"\n    VideoRam 256000\nEndSection\n\nSection \"Monitor\"\n    Identifier  \"Configured Monitor\"\n    HorizSync 5.0 - 1000.0\n    VertRefresh 5.0 - 200.0\n    $(cvt \"${WIDTH}\" \"${HEIGHT}\")\nEndSection\n\nSection \"Screen\"\n    Identifier  \"Default Screen\"\n    Monitor     \"Configured Monitor\"\n    Device      \"Configured Video Device\"\n    DefaultDepth 24\n    SubSection \"Display\"\n    Depth 24\n    Modes \"${WIDTH}x${HEIGHT}\"\n    EndSubSection\nEndSection\nEOF\n\n# Launch X11 and session on display 0\nexport DISPLAY=\":0\"\nX \"${DISPLAY}\" &\nsleep 1\nexec dbus-launch --exit-with-x11 orbital-x11-session\n\"\"\"\n\n[[files]]\npath = \"/usr/bin/orbital-x11-session\"\nmode = 0o755\ndata = \"\"\"\n#!/usr/bin/env bash\n\nset -ex\n\nxterm&\nsleep 1\n\ngdk-pixbuf-query-loaders --update-cache\nmate-session&\n\"\"\"\n\n\n# Override console config to set DISPLAY=:0\n[[files]]\npath = \"/usr/lib/init.d/30_console\"\ndata = \"\"\"\nrequires_weak 20_orbital\nnowait DISPLAY=:0 getty 2\nnowait DISPLAY=:0 getty /scheme/debug/no-preserve -J\n\"\"\"\n\n\n[[files]]\npath = \"/usr/bin/browser\"\nmode = 0o755\ndata = \"\"\"\n#!/usr/bin/env bash\n\nset -ex\n\n#export G_MAIN_POLL_DEBUG=1\nexport G_MESSAGES_DEBUG=all\n#export GDK_DEBUG=all\n#export GTK_DEBUG=all\nexport LD_DEBUG=all\n#export WEBKIT_DEBUG=all\nexec MiniBrowser --dark-mode --ignore-tls-errors \"about:blank\"\n\"\"\"\n\n[users.messagebus]\nuid = 100\ngid = 100\nname = \"messagebus\"\nhome = \"/nonexistent\"\nshell = \"/usr/bin/false\"\n\n"
  },
  {
    "path": "config/x86_64/ci.toml",
    "content": "# The Redox build server configuration\n\n# General settings\n[general]\n# Do not prompt if settings are not defined\nprompt = false\n\n# Package settings\n[packages]\n\n# If you need to disable some broken package comment out instead of removal to not increase the maintenance cost\n#TODO: commented out recipes need to be built and tested inside of Redox to verify if they returned to work\n\n# Meta-packages below\n\nauto-test = {}\ndev-essential = {}\ndev-redox = {}\nllvm21-common = {}\nmate-common = {}\nredox-tests = {}\nx11-minimal = {}\nx11-full = {}\n\n# Normal packages below\n\nacid = {}\nadwaita-icon-theme = {}\nautoconf = {}\nautomake = {}\nbase = {}\nbase-initfs = {}\nbash = {}\nbash-completion = {}\nbinutils = {}\nbootloader = {}\nbottom = {}\nbzip2 = {}\nca-certificates = {}\ncairo = {}\ncbindgen = {}\ncleye = {}\ncomposer = {}\ncontain = {}\ncoreutils = {}\ncosmic-edit = {}\ncosmic-files = {}\ncosmic-icons = {}\ncosmic-term = {}\ncosmic-text = {}\ncpal = {}\ncurl = {}\ndash = {}\ndejavu = {}\ndiffutils = {}\ndosbox = {}\nduktape = {}\neduke32 = {}\nexampled = {}\nexpat = {}\nextrautils = {}\nffmpeg6 = {}\nfindutils = {}\nfish-shell = {}\nfontconfig = {}\nfreedoom = {}\nfreefont = {}\nfreepats = {}\nfreetype2 = {}\nfribidi = {}\ngcc13 = {}\ngdbserver = {}\ngdk-pixbuf = {}\ngears = {}\ngeneraluser-gs = {}\ngettext = {}\ngit = {}\nglib = {}\nglutin = {}\ngnu-binutils = {}\ngnu-grep = {}\ngnu-make = {}\nhicolor-icon-theme = {}\nhtop = {}\ninstaller = {}\ninstaller-gui = {}\nintel-one-mono = {}\nion = {}\nkernel = {}\nkibi = {}\nlci = {}\nlibavif = {}\nlibc-bench = {}\nlibedit = {}\nlibffi = {}\nlibgcc = {}\nlibgmp = {}\nlibiconv = {}\nlibicu = {}\nlibjpeg = {}\nlibogg = {}\nlibonig = {}\nliborbital = {}\nlibpng = {}\nlibsodium = {}\nlibstdcxx = {}\nlibuuid = {}\nlibvorbis = {}\nlibwebp = {}\nlibxkbcommon = {}\nlibxcursor = {}\nlibxml2 = {}\nllvm21 = {}\nlsd = {}\nlua54 = {}\nlz4 = {}\nmednafen = {}\nmesa = {}\nmesa-glu = {}\nmesa-demos-x11 = {}\nmgba = {}\nnano = {}\nnasm = {}\nncurses = {}\nncursesw = {}\nneovim = {}\nnetdb = {}\nnetsurf = {}\nnetutils = {}\nneverball = {}\nnghttp2 = {}\nnginx = {}\nnodejs-21 = {}\nnushell = {}\nonefetch = {}\nopenjazz = {}\nopenssh = {}\nopenssl1 = {}\nopenssl3 = {}\nopenttd = {}\nopenttd-opengfx = {}\nopenttd-openmsx = {}\nopenttd-opensfx = {}\norbclient = {}\norbdata = {}\norbital = {}\norbterm = {}\norbutils = {}\nos-test-bins = {}\nosdemo = {}\npatch = {}\npatchelf = {}\npcre = {}\nperg = {}\nperiodictable = {}\nperl5 = {}\nphp84 = {}\npixelcannon = {}\npkg-config = {}\npkgar = {}\npkgutils = {}\npls = {}\npop-icon-theme = {}\nprboom = {}\nprocedural-wallpapers-rs = {}\npython312 = {}\nreadline = {}\nredox-fatfs = {}\nredox-games = {}\nredoxfs = {}\nrelibc = {}\nrelibc-tests = {}\nrelibc-tests-bins = {}\nripgrep = {}\nrodioplay = {}\nrs-nes = {}\nrsync = {}\nrust = {}\nrust64 = {}\nrustpython = {}\nrustual-boy = {}\nscummvm = {}\nsdl-gfx = {}\nsdl1 = {}\nsdl1-image = {}\nsdl1-mixer = {}\nsdl1-ttf = {}\nsdl2 = {}\nsdl2-gears = {}\nsdl2-image = {}\nsdl2-mixer = {}\nsdl2-ttf = {}\nsed = {}\nservo = {}\nshared-mime-info = {}\nshellharden = {}\nshellstorm = {}\nsimple-http-server = {}\nsmallvil = {}\nsmith = {}\nsodium = {}\nsoftbuffer-wayland = {}\nsopwith = {}\nsqlite3 = {}\nstrace = {}\nsyobonaction = {}\nterminfo = {}\ntimidity = {}\ntokei = {}\nttf-hack = {}\nuserutils = {}\nuutils = {}\nvim = {}\nvttest = {}\nwayland-rs = {}\nwebkitgtk3 = {}\nwinit = {}\nwinit-wayland = {}\nxxhash = {}\nxz = {}\nzenity = {}\nzoxide = {}\nzsh = {}\nzlib = {}\nzstd = {}\n\n#\"python312.dev\" = {}\n#\"rust.doc\" = {}\n#atk = {} # depends on glib which does not build\n#benchmarks = {}\n#binutils-gdb = {}\n#book = {}\n#cairo-demo = {} # linking errors\n#classicube = {}\n#cmake = {}\n#cmatrix = {} # needs ncursesw now\n#cookbook = {}\n#cosmic-reader = {}\n#cosmic-settings = {}\n#cosmic-store = {}\n#devilutionx = {}\n#dynamic-example = {}\n#fal\n#fd = {} # ctrlc-3.1.1\n#file = {}\n#flycast = {}\n#freeciv = {}\n#freeglut = {}\n#friar = {} # mio patch\n#game-2048 = {} # rustc-serialize\n#gawk = {} # langinfo.h\n#gigalomania = {} # old recipe format\n#gitoxide = {}\n#goaccess = {}\n#gstreamer = {} # conflict with thread local errno\n#harfbuzz = {} # depends on glib which does not build\n#helix = {}\n#hello-redox = {}\n#hematite = {} # needs crate patches for redox-unix\n#hf = {}\n#ibm-plex = {}\n#iced = {}\n#jansson = {} # needs config.sub update\n#jq = {}\n#libarchive = {}\n#libatomic = {}\n#libcosmic = {}\n#libflac = {}\n#libmodplug1 = {}\n#libmpfr = {}\n#libnettle = {}\n#libogg = {}\n#libpsl = {}\n#libssh2 = {}\n#libtool = {}\n#liburcu = {}\n#libuv = {}\n#lua-compat-53 = {}\n#luajit = {}\n#luarocks = {}\n#luv = {}\n#mdp = {} # gcc hangs\n#miniserve = {} # actix\n#mpc = {}\n#mupen64plus = {}\n#ncdu = {} # multiple definitions of symbols\n#newlib = {} # obsolete\n#newlibtest = {} # obsolete\n#noto-color-emoji = {}\n#openjk = {}\n#openposixtestsuite = {}\n#opentyrian = {}\n#orbcalculator = {}\n#ostest-bins = {}\n#pango = {} # undefined references to std::__throw_system_error(int)\n#pastel = {} # needs crate patches for redox-unix\n#pathfinder = {} # servo-fontconfig\n#pciids = {}\n#pcre2 = {}\n#pixman = {} # depends on glib which does not build\n#pls = {}\n#pop-wallpapers = {}\n#powerline = {} # dirs\n#qemu = {} # can be built, but not working\n#quakespasm = {}\n#redox-posix-tests = {}\n#redox-ssh = {} # does not compile\n#retroarch = {} # OS_TLSIndex not declared\n#rust-cairo = {} # linking errors\n#rust-cairo-demo = {} # linking errors\n#rvvm = {}\n#schismtracker = {} # uses system includes\n#sdl-player = {} # wctype_t\n#sdl2-gfx = {}\n#sm64ex = {}\n#spacecadetpinball = {}\n#twin-commander = {}\n#ubuntu-wallpapers = {}\n#unibilium = {}\n#utf8proc = {}\n#vice = {} # linker errors\n#vvvvvv = {} # did not compile\n#webrender = {} # unwind\n#website = {}\n#wesnoth = {}\n#wget = {}\n"
  },
  {
    "path": "config/x86_64/demo.toml",
    "content": "# Configuration for demonstration\n\ninclude = [\"../desktop.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 1536\n\n# Package settings\n[packages]\n# GUI Apps\nperiodictable = {}\n\n# GUI Data\nintel-one-mono = {}\n\n# Shell Apps\ngnu-grep = {}\nhtop = {}\nripgrep = {}\nterminfo = {}\nvim = {}\n\n# Games\ndosbox = {}\nfreedoom = {}\nneverball = {}\nprboom = {}\nredox-games = {}\nsopwith = {}\nsyobonaction = {}\n\n# Demos\nnushell = {}\norbclient = {}\npixelcannon = {}\nrodioplay = {}\ngears = {}\n\n# MIDI\nfreepats = {}\n\n[[files]]\npath = \"/home/user/Welcome.txt\"\ndata = \"\"\"\n##############################################################################\n#                                                                            #\n#                             Welcome to Redox!                              #\n#                                                                            #\n# Redox is an operating system written in Rust, a language with focus        #\n# on safety and high performance. Redox, following the microkernel design,   #\n# aims to be secure, usable, and free. Redox is inspired by previous kernels #\n# and operating systems, such as SeL4, MINIX, Plan 9, and BSD.               #\n#                                                                            #\n# Redox _is not_ just a kernel, it's a full-featured Operating System,       #\n# providing packages (memory allocator, file system, display manager, core   #\n# utilities, etc.) that together make up a functional and convenient         #\n# operating system. You can loosely think of it as the GNU or BSD ecosystem, #\n# but in a memory safe language and with modern technology.                  #\n#                                                                            #\n# The website can be found at https://www.redox-os.org.                      #\n#                                                                            #\n# For things to try on Redox, please see                                     #\n# https://doc.redox-os.org/book/ch02-06-trying-out-redox.html                #\n#                                                                            #\n##############################################################################\n\"\"\"\n"
  },
  {
    "path": "config/x86_64/desktop-contain.toml",
    "content": "# Desktop configuration using the Contain sandbox\n\ninclude = [\"../desktop.toml\"]\n\n# Override the default settings here\n\n# General settings\n[general]\n# Filesystem size in MiB\n# filesystem_size = 1024\n\n# Package settings\n[packages]\n# example = {}\n\n# Override orbital init to use contain_orblogin\n[[files]]\npath = \"/usr/lib/init.d/20_orbital\"\ndata = \"\"\"\nrequires_weak 10_net\nnotify audiod\nnowait VT=3 orbital contain_orblogin launcher\n\"\"\"\n\n# Override console init to use contain\n[[files]]\npath = \"/usr/lib/init.d/30_console\"\ndata = \"\"\"\nrequires_weak 20_orbital\nnowait getty --contain 2\nnowait getty --contain /scheme/debug/no-preserve -J\n\"\"\"\n\n[[files]]\npath = \"/etc/contain.toml\"\ndata = \"\"\"\npass_schemes = [\"rand\", \"null\", \"tcp\", \"udp\", \"thisproc\", \"pty\", \"orbital\", \"display.vesa\"]\nsandbox_schemes = [\"file\"]\nfiles = [\"file:/dev/null\"]\nrofiles = [\"file:/etc/passwd\", \"file:/etc/hostname\", \"file:/etc/localtime\"]\ndirs = [\"file:/tmp\"]\nrodirs = [\"file:/bin\", \"file:/ui\"]\n\"\"\"\n"
  },
  {
    "path": "config/x86_64/full.toml",
    "content": "include = [ \"../base.toml\", \"ci.toml\" ]\n\n# General settings\n[general]\nfilesystem_size = 8192\n\n# Package settings\n[packages]\n# example = {}"
  },
  {
    "path": "config/x86_64/jeremy.toml",
    "content": "# Configuration for Jeremy Soller\n\ninclude = [\"demo.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 8192\n\n# Package settings\n[packages]\n# apps\n#boxedwine = {}\ncosmic-player = {}\ncosmic-reader = {}\ncosmic-settings = {}\ncosmic-store = {}\ncosmic-term = {}\ncosmic-text = {}\n#qemu = {} # not building\nschismtracker = {}\nservo = {}\n\n# cli\ncleye = {}\nffmpeg6 = {}\nlua54 = {}\nnano = {}\n#nushell = {}\nperg = {}\n#relibc-tests = {}\nrussh = {}\nsed = {}\nshellharden = {}\nxz = {}\n\n# demos\n#cairodemo = {}\ncmatrix = {}\ncpal = {}\ngears = {}\nglutin = {}\n#hematite = {} # not building\niced = {}\nlibcosmic = {}\nosdemo = {} # does not show anything\n#pathfinder = {} # not building\nprocedural-wallpapers-rs = {}\n#rust-cairo = {}\n#rust-cairo-demo = {}\nsdl2-gears = {}\nvttest = {}\n#webrender = {}\nwinit = {}\n\n# dev\nautoconf = {}\nautomake = {}\n#cookbook = {}\ngcc13 = {}\ngnu-binutils = {}\ngnu-make = {}\nnasm = {}\npatch = {}\npkg-config = {}\nrust = {}\n\n# games\ndevilutionx = {}\neduke32 = {}\nflycast = {}\nfreeciv = {}\ngigalomania = {}\nlove = {}\nmednafen = {}\nmgba = {}\nopenjazz = {}\nopenjk = {}\nopenttd = {}\nopenttd-opengfx = {}\nopenttd-openmsx = {}\nopenttd-opensfx = {}\nquakespasm = {}\n#retroarch = {} # need to package cores\nrs-nes = {} # need game for testing\nrust64 = {} # need roms\nrustual-boy = {} # need game for testing\nscummvm = {} # need game for testing\nsm64ex = {}\n#spacecadetpinball = {} # not building\nsyobonaction = {}\n#vice = {} # broken on new toolchain\n#vvvvvv = {} # cannot find -lgcc_s\n\n# stuff\ngeneraluser-gs = {}\njeremy = {}\nnoto-color-emoji = {}\ntimidity = {}\nttf-hack = {}\n"
  },
  {
    "path": "config/x86_64/redoxer.toml",
    "content": "# Configuration used for building redoxer base image\n\ninclude = [\"../redoxer.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 1024\n"
  },
  {
    "path": "config/x86_64/rustconf2025.toml",
    "content": "# Configuration for demonstration\n\ninclude = [\"demo.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 1536\n\n# Package settings\n[packages]\ncosmic-reader = {}\nrustconf2025 = {}\n"
  },
  {
    "path": "config/x86_64/server-demo.toml",
    "content": "# Configuration for server stack demonstration\n\ninclude = [\"../server.toml\"]\n\n# General settings\n[general]\n# Filesystem size in MiB\nfilesystem_size = 4096\n\n# Package settings\n[packages]\n# Daemons\nopenssh = {}\nnginx = {}\nrustysd = {}\n\n# Backends\nphp84 = {}\ncomposer = {}\nluajit = {}\npython312 = {}\n# go = {}\n# zig = {}\n\n# Tools\nnano = {}\nneovim = {}\nrsync = {}\nvim = {}\nsqlite3 = {}\n# tmux = {}\nhtop = {}\n\n# Content\nwebsite = {}\n\n\n[[files]]\npath = \"/usr/lib/init.d/98_keygen_sh\"\ndata = \"\"\"\nrequires_weak 10_net\nbash /root/keygen.sh\n\"\"\"\n\n[[files]]\npath = \"/usr/lib/init.d/99_rustysd\"\ndata = \"\"\"\nrequires_weak 98_keygen_sh\n# Undocumented usage of rsdctl, pointing to notifications dir\nRSDCTL_ADDR=/var/run/rustysd/control.socket rustysd --conf /etc/rustysd\n\"\"\"\n\n[[files]]\npath = \"/etc/rustysd/system/network-online.target\"\ndata = \"\"\"\n[Unit]\nDescription=The target after networks has online\n\n[Install]\nWantedBy=default.target\n\"\"\"\n\n[[files]]\npath = \"/etc/rustysd/system/multi-user.target\"\ndata = \"\"\"\n[Unit]\nDescription=The target after user administrations has online\n\n[Install]\nWantedBy=default.target\n\"\"\"\n\n[[files]]\npath = \"/etc/rustysd/system/nginx.service\"\ndata = \"\"\"\n[Unit]\nDescription=The nginx HTTP and reverse proxy server\nAfter=network-online.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/nginx -g \"daemon off;\"\n\n[Install]\nWantedBy=multi-user.target\n\"\"\"\n\n\n[[files]]\npath = \"/etc/rustysd/system/ssh.service\"\ndata = \"\"\"\n[Unit]\nDescription=OpenBSD Secure Shell server\nAfter=network-online.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/sshd -D\n\n[Install]\nWantedBy=multi-user.target\n\"\"\"\n\n\n\n[[files]]\npath = \"/etc/rustysd/system/php.service\"\ndata = \"\"\"\n[Unit]\nDescription=OpenBSD Secure Shell server\nAfter=network-online.target\n\n[Service]\nType=simple\n# currently php-fpm not that quite work\nExecStart=env PWD=/var/www/html php -S localhost:9000\n# ExecStart=/usr/bin/php-fpm --fpm-config /etc/php/84/php-fpm.conf  --nodaemonize\n\n[Install]\nWantedBy=multi-user.target\n\"\"\"\n\n[[files]]\npath = \"/var/www/html/index.php\"\ndata = \"\"\"\n<?php\n\necho \"Hello from PHP on Redox!\";\n\"\"\"\n\n[[files]]\npath = \"/var/www/html/phpinfo.php\"\ndata = \"\"\"\n<?php phpinfo();\n\"\"\"\n\n\n[[files]]\npath = \"/var/www/html/README\"\ndata = \"\"\"\nThis is a demonstration into PHP server.\n\nAt the moment to run composer you have to run it like:\n> php /bin/composer install\n\"\"\"\n\n[[files]]\npostinstall = true\ndata = \"\"\npath = \"/etc/nginx/conf.d\"\ndirectory = true\n\n[[files]]\npostinstall = true\npath = \"/etc/nginx/nginx.conf\"\ndata = \"\"\"\nuser nginx;\n\n# currently nginx does a lot spin locking for some reason\nworker_processes 1;\nerror_log /var/log/nginx/error.log;\npid /var/run/nginx.pid;\n\nevents {\n    worker_connections 1024;\n}\nhttp {\n    log_format main '$remote_addr - $remote_user [$time_local] \"$request\" '\n                    '$status $body_bytes_sent \"$http_referer\" '\n                    '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n    access_log /var/log/nginx/access.log main;\n\n    include       mime.types;\n    include       fastcgi.conf;\n    default_type  application/octet-stream;\n\n    include /etc/nginx/conf.d/*.conf;\n}\n\"\"\"\n\n[[files]]\npostinstall = true\npath = \"/etc/nginx/conf.d/localhost.conf\"\ndata = \"\"\"\nserver {\n    listen       80;\n    server_name  localhost;\n    root   /usr/share/website;\n    absolute_redirect off;\n\n    location / {\n        index  index.html index.htm;\n    }\n}\n\"\"\"\n\n[[files]]\npostinstall = true\npath = \"/etc/nginx/conf.d/php-www.conf\"\ndata = \"\"\"\nserver {\n    listen 8081;\n    server_name localhost;\n    root /var/www/html;\n\n    index index.php index.html index.htm;\n\n    location / {\n        try_files $uri $uri/ =404;\n    }\n\n    location ~ \\\\.php$ {\n# because we're not using PHP FPM (see rustysd php.service)\n#       include fastcgi_params;\n#       fastcgi_pass 127.0.0.1:9000;\n#       fastcgi_index index.php;\n#       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        proxy_pass http://127.0.0.1:9000;\n    }\n}\n\"\"\"\n\n[[files]]\npostinstall = true\npath = \"/etc/php/84/php-fpm.conf\"\ndata = \"\"\"\n\nerror_log=/var/log/php-fpm.log\ninclude=/etc/php/84/php-fpm.d/*.conf\n\"\"\"\n\n[[files]]\npostinstall = true\npath = \"/etc/php/84/php-fpm.d/www.conf\"\ndata = \"\"\"\n[www]\nuser = user\ngroup = user\nlisten = 127.0.0.1:9000\npm = static\npm.max_children = 1\n\"\"\"\n\n[[files]]\npostinstall = true\npath = \"/etc/ssh/sshd_config\"\ndata = \"\"\"\nPort 22\nAddressFamily inet\nAuthorizedKeysFile\t.ssh/authorized_keys\nPermitRootLogin yes\nPasswordAuthentication yes\nPermitEmptyPasswords yes\nSubsystem\tsftp\t/usr/libexec/sftp-server\n\"\"\"\n\n[users.nobody]\npassword = \"\"\nshell = \"/usr/bin/ion\" #TODO: nologin?\n\n[users.nginx]\npassword = \"\"\nshell = \"/usr/bin/ion\" #TODO: nologin?\n\n[[files]]\npath = \"/root/keygen.sh\"\ndata = \"\"\"\n#!/usr/bin/env bash\n\nif [ ! -f /etc/ssh/ssh_host_rsa_key ]; then\nssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N \"\"\nssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N \"\"\nssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N \"\"\nfi\n\"\"\"\n\n[[files]]\npath = \"/home/user/server.sh\"\ndata = \"\"\"\n#!/usr/bin/env bash\n\n/bin/sshd -D &\nnginx -g \"daemon off;\" &\nphp-fpm --nodaemonize &\n\"\"\"\n\n[[files]]\npath = \"/home/user/Welcome.txt\"\ndata = \"\"\"\n##############################################################################\n# Welcome to Redox Server Demo!\n#\n# This is a quick demonstration of Redox used as server stack.\n# At the moment we support SSH, NGINX, Python, PHP. There's more to come\n#\n# This server demo is insecure by design, we encourage you to get familiar into\n#   basics of server security if you wish to use this as a production server.\n#\n# There should be rustysd already running, if not, you can try start it manually\n# > sudo rustysd --conf /etc/rustysd\n#\n# You can also try running all daemons manually\n# > sudo bash server.sh\n#\n# The server will start port 22 (ssh), 80 (static web) and 8081 (php)\n# If you use the Redox OS build system, starting QEMU with `net=redir`\n#   should expose those port to 8022, 8080 and 8081.\n# Try logging in to console via SSH with `ssh user@localhost -p 8022`\n#\n##############################################################################\n\"\"\"\n"
  },
  {
    "path": "flake.nix",
    "content": "{\n  description = \"The Nix-flake for Redox development on NixOS\";\n\n  inputs = {\n    nixpkgs.url = \"github:NixOS/nixpkgs/nixpkgs-unstable\";\n    flake-parts.url = \"github:hercules-ci/flake-parts\";\n    rust-overlay = {\n      url = \"github:oxalica/rust-overlay\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n    };\n  };\n\n  outputs =\n    inputs@{\n      nixpkgs,\n      flake-parts,\n      rust-overlay,\n      ...\n    }:\n    flake-parts.lib.mkFlake { inherit inputs; } (\n      top@{\n        config,\n        withSystem,\n        moduleWithSystem,\n        ...\n      }:\n      {\n        systems = [\n          \"i686-linux\"\n          \"x86_64-linux\"\n          \"aarch64-linux\"\n          \"x86_64-darwin\"\n          \"aarch64-darwin\"\n        ];\n        perSystem =\n          {\n            system,\n            lib,\n            inputs',\n            ...\n          }:\n          let\n            pkgs = import nixpkgs {\n              inherit system;\n\n              overlays = [ rust-overlay.overlays.default ];\n            };\n            rust-bin = pkgs.rust-bin.nightly.\"2025-10-03\".default.override {\n              extensions = [\n                \"rust-analyzer\"\n                \"rust-src\"\n              ];\n              targets = [ \"x86_64-unknown-redox\" ];\n            };\n          in\n          {\n            formatter = pkgs.nixfmt-rfc-style;\n\n            # TODO: Create Redox OS Image as package\n            # TODO: No cross-compile for now, as there is no pkgsCross.aarch64-unknown-redox and so on\n            # TODO: Get rid of make env step: package custom libtool and setup rust toolchain properly\n            devShells = {\n              # Podman config taken from https://nixos.wiki/wiki/Podman and https://gist.github.com/adisbladis/187204cb772800489ee3dac4acdd9947\n              # Provides a script that copies required files to ~/\n              default =\n                let\n                  rustPlatform = pkgs.makeRustPlatform {\n                    cargo = rust-bin;\n                    rustc = rust-bin;\n                  };\n\n                  podmanSetupScript =\n                    let\n                      registriesConf = pkgs.writeText \"registries.conf\" ''\n                        [registries.search]\n                        registries = ['docker.io']\n                        [registries.block]\n                        registries = []\n                      '';\n                    in\n                    pkgs.writeScript \"podman-setup\" ''\n                      #!${pkgs.runtimeShell}\n                      # Dont overwrite customised configuration\n                      if ! test -f ~/.config/containers/policy.json; then\n                        install -Dm555 ${pkgs.skopeo.src}/default-policy.json ~/.config/containers/policy.json\n                      fi\n                      if ! test -f ~/.config/containers/registries.conf; then\n                        install -Dm555 ${registriesConf} ~/.config/containers/registries.conf\n                      fi\n                      systemctl --user start podman.socket || true\n                      export PODMAN_SYSTEMD_UNIT=podman.socket\n                    '';\n                  # Provides a fake \"docker\" binary mapping to podman\n                  dockerCompat = pkgs.runCommand \"docker-podman-compat\" { } ''\n                    mkdir -p $out/bin\n                    ln -s ${pkgs.podman}/bin/podman $out/bin/docker\n                  '';\n\n                in\n                pkgs.mkShell rec {\n                  buildInputs = with pkgs; [\n                    # Podman\n                    dockerCompat\n                    podman # Docker compat\n                    runc # Container runtime\n                    conmon # Container runtime monitor\n                    skopeo # Interact with container registry\n                    slirp4netns # User-mode networking for unprivileged namespaces\n                    fuse-overlayfs # CoW for images, much faster than default vfs\n\n                    # with FSTOOLS_IN_PODMAN=1 these are not needed\n                    # without it, the installer fails to link FUSE somehow\n                    #fuse\n                    #rust-bin\n                    qemu_kvm\n                  ];\n\n                  LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;\n                  NIX_SHELL_BUILD = \"1\";\n                  FSTOOLS_IN_PODMAN = \"1\";\n                  shellHook = ''\n                    # Install required configuration\n                    ${podmanSetupScript}\n                    echo \"Redox podman build environment loaded\"\n                  '';\n                };\n\n              #TODO: This isn't tested yet, use at your own risk\n              native = pkgs.mkShell rec {\n                nativeBuildInputs =\n                  let\n                    autoreconf269 = pkgs.writeShellScriptBin \"autoreconf2.69\" \"${pkgs.autoconf269}/bin/autoreconf\";\n                  in\n                  with pkgs;\n                  [\n                    ant\n                    autoconf\n                    autoreconf269 # gnu-binutils\n                    automake\n                    bison\n                    cmake\n                    curl\n                    doxygen\n                    file\n                    flex\n                    gettext\n                    gnumake\n                    gnupatch\n                    gperf\n                    help2man\n                    just\n                    llvmPackages.clang\n                    llvmPackages.llvm\n                    lua\n                    m4\n                    meson\n                    nasm\n                    ninja\n                    perl\n                    perl540Packages.HTMLParser\n                    perl540Packages.Po4a\n                    pkg-config\n                    pkgconf\n                    (python3.withPackages (ps: with ps; [ mako ]))\n                    qemu_kvm\n                    rust-cbindgen\n                    scons\n                    texinfo\n                    unzip\n                    waf\n                    wget\n                    xdg-utils\n                    xxd\n                    zip\n                  ] ++ pkgs.lib.optionals pkgs.stdenv.hostPlatform.isx86 [\n                    pkgs.syslinux\n                  ];\n\n                buildInputs = with pkgs; [\n                  rust-bin\n                  fuse # fuser\n                  libpng # netsurf\n                  fontconfig # orbutils\n                  SDL # prboom\n                  xorg.utilmacros # libX11\n                  xorg.xtrans # libX11\n                ];\n\n                LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;\n                PERL_PATH = \"${pkgs.perl}/bin/perl\";\n                NIX_SHELL_BUILD = \"1\";\n                PODMAN_BUILD = \"0\";\n                shellHook = with pkgs; ''\n                  export PKG_CONFIG_PATH=\"${fuse.dev}/lib/pkgconfig\\\n                  :${libpng.dev}/lib/pkgconfig\"\n                '';\n              };\n            };\n          };\n      }\n    );\n}\n"
  },
  {
    "path": "mk/ci.mk",
    "content": "# Configuration file of the build system commands for the build server\n\nIMG_TAG?=$(shell git describe --tags)\nIMG_SEPARATOR?=_\nIMG_DIR?=build/img/$(ARCH)\nOS_TEST_DIR?=build/os-test/$(ARCH)\nCI_COOKBOOK_CONFIG?=CI=1 COOKBOOK_LOGS=true COOKBOOK_CLEAN_BUILD=true COOKBOOK_VERBOSE=false COOKBOOK_COMPRESSED=true\n\n# CI image target - build standard images\n# To leave out the build tag, set both IMG_TAG and IMG_SEPARATOR to null\nci-img: FORCE\n\trm -rf $(IMG_DIR)\n\tmkdir -p $(IMG_DIR)\n\t$(MAKE) server desktop demo\n\tcd $(IMG_DIR) && zstd --rm *\n\tcd $(IMG_DIR) && sha256sum -b * > SHA256SUM\n\n# The name of the target must match the name of the filesystem config file\nserver desktop demo: FORCE\n\trm -f \"build/$(ARCH)/$@/harddrive.img\" \"build/$(ARCH)/$@/redox-live.iso\"\n\texport $(CI_COOKBOOK_CONFIG) REPO_NONSTOP=0 && \\\n\t\t$(MAKE) CONFIG_NAME=$@ build/$(ARCH)/$@/harddrive.img build/$(ARCH)/$@/redox-live.iso\n\tmkdir -p $(IMG_DIR)\n\tcp \"build/$(ARCH)/$@/harddrive.img\" \"$(IMG_DIR)/redox_$(@)$(IMG_SEPARATOR)$(IMG_TAG)_harddrive.img\"\n\tcp \"build/$(ARCH)/$@/redox-live.iso\" \"$(IMG_DIR)/redox_$(@)$(IMG_SEPARATOR)$(IMG_TAG)_livedisk.iso\"\n\nci-os-test: FORCE\n\tmake CONFIG_NAME=os-test unmount\n\trm -f \"build/$(ARCH)/os-test/harddrive.img\"\n\t$(MAKE) CONFIG_NAME=os-test qemu gpu=no\n\trm -rf $(OS_TEST_DIR)\n\tmkdir -p $(OS_TEST_DIR)\n\t$(MAKE) CONFIG_NAME=os-test mount\n\tcp -rv build/$(ARCH)/os-test/filesystem/usr/share/os-test/html $(OS_TEST_DIR)\n\tcp -v build/$(ARCH)/os-test/filesystem/usr/share/os-test/os-test.json $(OS_TEST_DIR)\n\ttar \\\n\t\t--create \\\n\t\t--gzip \\\n\t\t--file \"$(OS_TEST_DIR)/out.tar.gz\" \\\n\t\t--directory=\"build/$(ARCH)/os-test/filesystem/usr/share/os-test\" \\\n\t\tout\n\t$(MAKE) CONFIG_NAME=os-test unmount\n\n# CI packaging target\nci-pkg: prefix $(FSTOOLS_TAG) $(CONTAINER_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(HOST_CARGO) build --manifest-path Cargo.toml --release\n\texport $(CI_COOKBOOK_CONFIG) REPO_NONSTOP=1 PATH=\"$(PREFIX_PATH):$$PATH\" COOKBOOK_HOST_SYSROOT=\"$(ROOT)/$(PREFIX_INSTALL)\" && \\\n\t$(REPO_BIN) cook --with-package-deps \"--filesystem=config/$(ARCH)/ci.toml\"\nendif\n\n# CI toolchain\nci-toolchain: $(CONTAINER_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(MAKE) PREFIX_BINARY=0 \\\n\t\t\"prefix/$(TARGET)/gcc-install.tar.gz\" \\\n\t\t\"prefix/$(TARGET)/relibc-install.tar.gz\" \\\n\t\t\"prefix/$(TARGET)/rust-install.tar.gz\" \\\n\t\t\"prefix/$(TARGET)/clang-install.tar.gz\"\n\trm -rf \"build/toolchain/$(HOST_TARGET)/$(TARGET)\"\n\tmkdir -p \"build/toolchain/$(HOST_TARGET)/$(TARGET)\"\n\tcp \"prefix/$(TARGET)/gcc-install.tar.gz\" \"build/toolchain/$(HOST_TARGET)/$(TARGET)/gcc-install.tar.gz\"\n\tcp \"prefix/$(TARGET)/relibc-install.tar.gz\" \"build/toolchain/$(HOST_TARGET)/$(TARGET)/relibc-install.tar.gz\"\n\tcp \"prefix/$(TARGET)/rust-install.tar.gz\" \"build/toolchain/$(HOST_TARGET)/$(TARGET)/rust-install.tar.gz\"\n\tcp \"prefix/$(TARGET)/clang-install.tar.gz\" \"build/toolchain/$(HOST_TARGET)/$(TARGET)/clang-install.tar.gz\"\n\tcd \"build/toolchain/$(HOST_TARGET)/$(TARGET)\" && sha256sum -b * > SHA256SUM\nendif\n"
  },
  {
    "path": "mk/config.mk",
    "content": "# Configuration file of the build system environment variables\n\n-include .config\n\nHOST_ARCH?=$(shell uname -m)\n\n# Configuration\n## Architecture to build Redox for (aarch64, i586, or x86_64). Defaults to a host one\nARCH?=$(HOST_ARCH)\n## Sub-device type for aarch64 if needed\nBOARD?=\n## Enable to use binary prefix (much faster)\nPREFIX_BINARY?=1\n## Enable to use up-to-date rust compiler (experimental, only available to Tier 2 targets)\n## Even more experimental, add -Zbuild-std to cookbook.toml to allow compilation to Tier 3 targets\nPREFIX_USE_UPSTREAM_RUST_COMPILER?=0\n## Enable to use binary packages (much faster)\nREPO_BINARY?=0\n## Name of the configuration to include in the image name e.g. desktop or server\nCONFIG_NAME?=desktop\n## Build appstream data for repo\nREPO_APPSTREAM?=0\n## Ignore errors when building the repo, attempt to build every package\nREPO_NONSTOP?=0\n## Do not update source repos, attempt to build in offline condition\nREPO_OFFLINE?=0\n## Do not strip debug info for local build\nREPO_DEBUG?=0\n## Old config value that need to be corrected\nifeq ($(ARCH),i686)\n\tARCH=i586\nendif\n## Select filesystem config\nifeq ($(BOARD),)\nifeq ($(wildcard config/$(ARCH)/$(CONFIG_NAME).toml),)\nFILESYSTEM_CONFIG?=config/$(CONFIG_NAME).toml\nelse\nFILESYSTEM_CONFIG?=config/$(ARCH)/$(CONFIG_NAME).toml\nendif\nelse\nFILESYSTEM_CONFIG?=config/$(ARCH)/$(BOARD)/$(CONFIG_NAME).toml\nendif\nHOST_CARGO=env -u RUSTUP_TOOLCHAIN -u CC -u TARGET cargo\n## Filesystem size in MB (default comes from filesystem_size in the FILESYSTEM_CONFIG)\n## FILESYSTEM_SIZE?=$(shell $(INSTALLER) --filesystem-size -c $(FILESYSTEM_CONFIG))\n## Flags to pass to redoxfs-mkfs. Add --encrypt to set up disk encryption\nREDOXFS_MKFS_FLAGS?=\n## Set to 1 to enable Podman build, any other value will disable it\nPODMAN_BUILD?=1\n## Set to 1 to put filesystem tools inside podman, any other value will install it to host\nFSTOOLS_IN_PODMAN?=0\n## Set to 1 if FUSE is not available and we are running in a container\nFSTOOLS_NO_MOUNT?=0\n## Enable sccache to speed up cargo builds\n## only do this by default if this is inside podman\nSCCACHE_BUILD?=$(shell [ -f /run/.containerenv ] && echo 1 || echo 0)\n## The containerfile to use for the Podman base image\nCONTAINERFILE?=podman/redox-base-containerfile\n\n# Per host variables\nNPROC=nproc\nSED=sed\nFIND=find\nREPO_BIN=./target/release/repo\n\nifneq ($(PODMAN_BUILD),1)\nFSTOOLS_IN_PODMAN=0\nHOST_TARGET := $(shell env -u RUSTUP_TOOLCHAIN rustc -vV | grep host | cut -d: -f2 | tr -d \" \")\n# x86_64 linux hosts have all toolchains\nifeq ($(PREFIX_BINARY),1)\nifeq ($(HOST_TARGET),aarch64-unknown-linux-gnu)\n\tifneq ($(ARCH),aarch64)\n\tifneq ($(ARCH),x86_64)\n        $(info The $(ARCH) binary prefix is only built for x86_64 Linux hosts)\n\t\tPREFIX_BINARY=0\n\tendif\n\tendif\nelse ifeq ($(HOST_TARGET),x86_64-unknown-linux-gnu)\nelse\n    $(info The $(ARCH) binary prefix is only built for Linux hosts)\n\tPREFIX_BINARY=0\nendif\nendif\nendif\n\nifeq ($(SCCACHE_BUILD),1)\nifeq (,$(shell command -v sccache))\n    $(info sccache not found in PATH)\n\tSCCACHE_BUILD=0\nendif\nendif\n\nifeq ($(REPO_APPSTREAM),1)\n\texport COOKBOOK_APPSTREAM=true\nendif\nifeq ($(REPO_NONSTOP),1)\n\texport COOKBOOK_NONSTOP=true\nendif\nifeq ($(REPO_OFFLINE),1)\n\texport COOKBOOK_OFFLINE=true\nendif\nifeq ($(REPO_DEBUG),1)\n\texport COOKBOOK_NOSTRIP=true\n\texport COOKBOOK_DEBUG=true\n#TODO: https://gitlab.redox-os.org/redox-os/relibc/-/issues/226\n#\texport PROFILE=debug\n#\texport RUSTCFLAGS=\"-Cdebuginfo=2\"\nendif\n\nUNAME := $(shell uname)\nifeq ($(UNAME),Darwin)\n\tFUMOUNT=umount\n\tNPROC=sysctl -n hw.ncpu\n\tSED=gsed\n\tFIND=gfind\n\tVB_AUDIO=coreaudio\n\tVBM=/Applications/VirtualBox.app/Contents/MacOS/VBoxManage\nelse ifeq ($(UNAME),FreeBSD)\n\tFIND=gfind\n\tFUMOUNT=sudo umount\n\tVB_AUDIO=pulse # To check, will probably be OSS on most setups\n\tVBM=VBoxManage\nelse ifeq ($(UNAME),Redox)\n\tPODMAN_BUILD=0\n# TODO: allow overriding to cross compiler toolchain when build server have one prebuilt\n\tHOSTED_REDOX=1\nifneq ($(shell which repo),)\n\tREPO_BIN=repo\nendif\nelse\n\t# Detect which version of the fusermount binary is available.\n\tifneq (, $(shell which fusermount3))\n\t\tFUMOUNT=fusermount3 -u\n\telse\n\t\tFUMOUNT=fusermount -u\n\tendif\n\n\tVB_AUDIO=pulse\n\tVBM=VBoxManage\nendif\n\n# Automatic variables\nROOT=$(CURDIR)\nexport RUST_COMPILER_RT_ROOT=$(ROOT)/rust/src/llvm-project/compiler-rt\nexport TESTBIN?=\nRUNNING_IN_PODMAN=$(shell [ -f /run/.containerenv ] && echo 1 || echo 0)\nifeq ($(PODMAN_BUILD),1)\nifeq ($(RUNNING_IN_PODMAN),1)\n$(info Please unset PODMAN_BUILD=1 in .config!)\nendif\nendif\n\nALLOW_FSTOOLS?=0\nifeq ($(FSTOOLS_IN_PODMAN),0)\nifeq ($(RUNNING_IN_PODMAN),0)\nALLOW_FSTOOLS=1\nendif\nendif\n\n## Userspace variables\nifeq ($(ARCH),riscv64gc)\n\texport TARGET=riscv64gc-unknown-redox\n\texport GNU_TARGET=riscv64-unknown-redox\nelse\n\texport TARGET=$(ARCH)-unknown-redox\n\texport GNU_TARGET=$(ARCH)-unknown-redox\nendif\nBUILD=build/$(ARCH)/$(CONFIG_NAME)\nMOUNT_DIR=$(BUILD)/filesystem\nFSTOOLS=build/fstools\nINSTALLER=$(FSTOOLS)/bin/redox_installer\nREDOXFS=$(FSTOOLS)/bin/redoxfs\nREDOXFS_MKFS=$(FSTOOLS)/bin/redoxfs-mkfs\nINSTALLER_OPTS=--cookbook=.\nINSTALLER_FEATURES=\nREDOXFS_FEATURES=\nCOOKBOOK_OPTS=\"--filesystem=$(FILESYSTEM_CONFIG)\"\nifeq ($(REPO_BINARY),1)\nINSTALLER_OPTS+=--repo-binary\nCOOKBOOK_OPTS+=--repo-binary\nendif\nifeq ($(FSTOOLS_NO_MOUNT),1)\nINSTALLER_OPTS+=--no-mount\nINSTALLER_FEATURES=--no-default-features --features installer\nREDOXFS_FEATURES= --no-default-features --features std,log\nendif\n\nREPO_TAG=$(BUILD)/repo.tag\nFSTOOLS_TAG=build/fstools.tag\nexport BOARD FIND\n\nifeq ($(SCCACHE_BUILD),1)\n\texport CC_WRAPPER:=sccache\n\texport RUSTC_WRAPPER:=$(CC_WRAPPER)\nendif\n\nifeq ($(HOSTED_REDOX),1)\nFSTOOLS_TAG=\nendif\n\n## If Podman is being used, a container is required\nifeq ($(PODMAN_BUILD),1)\nCONTAINER_TAG=build/container.tag\nelse\nCONTAINER_TAG=\nendif\n"
  },
  {
    "path": "mk/depends.mk",
    "content": "# Configuration file for the build system dependencies\n\n# Don't check for dependencies if you will be using Podman\nifneq ($(PODMAN_BUILD),1)\n# Don't check for dependencies if you will be using Hosted Redox\nifneq ($(HOSTED_REDOX),1)\n\n# don't check for Rust and Cargo if building on a Nix system\nifneq ($(NIX_SHELL_BUILD),1)\nifeq ($(shell which rustup),)\n$(error rustup not found, install from \"https://rustup.rs/\")\nendif\nendif\n\n# don't check for compile tools, used internally when installing fstools on host\nifneq ($(SKIP_CHECK_TOOLS),1)\nifeq ($(shell which cbindgen),)\n$(error cbindgen not found, install from crates.io or from your package manager)\nendif\nifeq ($(shell which nasm),)\n$(error nasm not found, install from your package manager)\nendif\nifeq ($(shell which just),)\n$(error 'just' not found, install from crates.io or from your package manager)\nendif\nendif\n\nendif\nendif\n"
  },
  {
    "path": "mk/disk.mk",
    "content": "# Configuration file with the commands configuration of the Redox image\n\n$(BUILD)/harddrive.img: $(FSTOOLS) $(REPO_TAG)\nifeq ($(FSTOOLS_IN_PODMAN),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p $(BUILD)\n\t-$(FUMOUNT) $(MOUNT_DIR) || true\n\t-$(FUMOUNT) /tmp/redox_installer || true\n\trm -rf $@  $@.partial $(MOUNT_DIR)\n\tFILESYSTEM_SIZE=$(FILESYSTEM_SIZE) && \\\n\tif [ -z \"$$FILESYSTEM_SIZE\" ] ; then \\\n\tFILESYSTEM_SIZE=$(shell $(INSTALLER) --filesystem-size -c $(FILESYSTEM_CONFIG)); \\\n\tfi && \\\n\ttruncate -s \"$$FILESYSTEM_SIZE\"m $@.partial\n\tumask 002 && $(INSTALLER) $(INSTALLER_OPTS) -c $(FILESYSTEM_CONFIG) $@.partial\n\tmv $@.partial $@\nendif\n\n$(BUILD)/redox-live.iso: $(FSTOOLS) $(REPO_TAG) redox.ipxe\nifeq ($(FSTOOLS_IN_PODMAN),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p $(BUILD)\n\trm -rf $@  $@.partial\n\t-$(FUMOUNT) /tmp/redox_installer || true\n\tFILESYSTEM_SIZE=$(FILESYSTEM_SIZE) && \\\n\tif [ -z \"$$FILESYSTEM_SIZE\" ] ; then \\\n\tFILESYSTEM_SIZE=$(shell $(INSTALLER) --filesystem-size -c $(FILESYSTEM_CONFIG)); \\\n\tfi && \\\n\ttruncate -s \"$$FILESYSTEM_SIZE\"m $@.partial\n\tumask 002 && $(INSTALLER) $(INSTALLER_OPTS) -c $(FILESYSTEM_CONFIG) --write-bootloader=\"$(BUILD)/bootloader-live.efi\" --live $@.partial\n\tmv $@.partial $@\n\tcp redox.ipxe $(BUILD)/redox.ipxe\nendif\n\n$(BUILD)/filesystem.img: $(FSTOOLS) $(REPO_TAG)\nifeq ($(FSTOOLS_IN_PODMAN),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p $(BUILD)\n\t-$(FUMOUNT) $(MOUNT_DIR) || true\n\trm -rf $@  $@.partial $(MOUNT_DIR)\n\t-$(FUMOUNT) /tmp/redox_installer || true\n\tFILESYSTEM_SIZE=$(FILESYSTEM_SIZE) && \\\n\tif [ -z \"$$FILESYSTEM_SIZE\" ] ; then \\\n\tFILESYSTEM_SIZE=$(shell $(INSTALLER) --filesystem-size -c $(FILESYSTEM_CONFIG)); \\\n\tfi && \\\n\ttruncate -s \"$$FILESYSTEM_SIZE\"m $@.partial\n\t$(REDOXFS_MKFS) $(REDOXFS_MKFS_FLAGS) $@.partial\n\tmkdir -p $(MOUNT_DIR)\n\t$(REDOXFS) $@.partial $(MOUNT_DIR)\n\tsleep 1\n\tpgrep redoxfs\n\tumask 002 && $(INSTALLER) $(INSTALLER_OPTS) -c $(FILESYSTEM_CONFIG) $(MOUNT_DIR)\n\tsync\n\t-$(FUMOUNT) $(MOUNT_DIR) || true\n\trm -rf $(MOUNT_DIR)\n\tmv $@.partial $@\nendif\n\nmount: $(FSTOOLS) FORCE\nifeq ($(FSTOOLS_IN_PODMAN),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@mkdir -p $(MOUNT_DIR)\n\t$(REDOXFS) $(BUILD)/harddrive.img $(MOUNT_DIR)\n\t@sleep 2\n\t@echo \"\\033[1;36;49mharddrive.img mounted ($$(pgrep redoxfs))\\033[0m\"\nendif\n\nmount_extra: $(FSTOOLS) FORCE\nifeq ($(FSTOOLS_IN_PODMAN),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@mkdir -p $(MOUNT_DIR)\n\t$(REDOXFS) $(BUILD)/extra.img $(MOUNT_DIR)\n\t@sleep 2\n\t@echo \"\\033[1;36;49mextra.img mounted ($$(pgrep redoxfs))\\033[0m\"\nendif\n\nmount_live: $(FSTOOLS) FORCE\nifeq ($(FSTOOLS_IN_PODMAN),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@mkdir -p $(MOUNT_DIR)\n\t$(REDOXFS) $(BUILD)/redox-live.iso $(MOUNT_DIR)\n\t@sleep 2\n\t@echo \"\\033[1;36;49mredox-live.iso mounted ($$(pgrep redoxfs))\\033[0m\"\nendif\n\nunmount: FORCE\nifeq ($(FSTOOLS_IN_PODMAN),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@sync\n\t-$(FUMOUNT) $(MOUNT_DIR)\n\t@rm -rf $(MOUNT_DIR)\n\t@-$(FUMOUNT) /tmp/redox_installer 2>/dev/null || true\n\t@echo \"\\033[1;36;49mFilesystem unmounted\\033[0m\"\nendif\n"
  },
  {
    "path": "mk/fstools.mk",
    "content": "# Configuration file for redox-installer, Cookbook and RedoxFS FUSE\n\nfstools: $(FSTOOLS_TAG) $(FSTOOLS)\n\nGOING_TO_PODMAN_AGAIN?=0\n\n# These tools run inside Podman if it is used, or on the host if Podman is not used\n$(FSTOOLS): | prefix $(CONTAINER_TAG) $(FSTOOLS_TAG)\nifeq ($(PODMAN_BUILD),1)\nifeq ($(FSTOOLS_IN_PODMAN),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(MAKE) $@ PODMAN_BUILD=0 SKIP_CHECK_TOOLS=1 GOING_TO_PODMAN_AGAIN=1\nendif\nelse\n\trm -rf $@ $@.partial\n\tmkdir -p $@.partial\n\tln -s ../../recipes $@.partial/recipes\n\t$(MAKE) fstools_fetch PODMAN_BUILD=$(GOING_TO_PODMAN_AGAIN)\n\n\t# Compile installer and redoxfs for host (may be outside of podman container)\n\tcd $@.partial && \\\n\t\texport CARGO_TARGET_DIR=../$@-target && \\\n\t\t$(HOST_CARGO) install --root . --path recipes/core/installer/source $(INSTALLER_FEATURES) && \\\n\t\t$(HOST_CARGO) install --root . --path recipes/core/redoxfs/source $(REDOXFS_FEATURES)\n\n\tmv $@.partial $@\n\ttouch $@\nendif\n\nfstools_fetch: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(REPO_BIN) fetch installer redoxfs\nendif\n\nCARGO_OFFLINE_FLAG=\nifeq ($(REPO_OFFLINE),1)\nCARGO_OFFLINE_FLAG=--offline\nendif\n\n$(FSTOOLS_TAG): $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(HOST_CARGO) build --manifest-path Cargo.toml --release --locked $(CARGO_OFFLINE_FLAG)\n\tmkdir -p $(@D)\n\ttouch $@\nendif\n\nfstools_clean: FORCE\n\trm -rf target\n\trm -rf $(FSTOOLS)\n\trm -rf $(FSTOOLS)-target\n\trm -f $(FSTOOLS_TAG)\n"
  },
  {
    "path": "mk/podman.mk",
    "content": "# Configuration file of the Podman commands\n\n# Configuration variables for running make in Podman\n## Tag the podman image $IMAGE_TAG\nIMAGE_TAG?=redox-base\n## Working Directory in Podman\nCONTAINER_WORKDIR?=/mnt/redox\n\n## Flag passed to the Podman volumes. :Z can be used only with SELinux\nUSE_SELINUX?=1\nifeq ($(USE_SELINUX),1)\nPODMAN_VOLUME_FLAG=:Z\nelse\nPODMAN_VOLUME_FLAG=\nendif\n\n# Cache layers to redox-os docker hub\nPODMAN_CACHE=\nPODMAN_CACHE_PATH=docker.io/redoxos/$(IMAGE_TAG)\n\nPODMAN_CACHE_PULL?=1\nifeq ($(PODMAN_CACHE_PULL),1)\nPODMAN_CACHE+=--cache-from=$(PODMAN_CACHE_PATH)\nendif\n\nPODMAN_CACHE_PUSH?=0\nifeq ($(PODMAN_CACHE_PUSH),1)\nPODMAN_CACHE+=--cache-to=$(PODMAN_CACHE_PATH)\nendif\n\n## Podman Home Directory\nPODMAN_HOME=$(ROOT)/build/podman\n## Podman command with its many arguments\nPODMAN_VOLUMES=--volume $(ROOT):$(CONTAINER_WORKDIR)$(PODMAN_VOLUME_FLAG) --volume $(PODMAN_HOME):/root$(PODMAN_VOLUME_FLAG)\nPODMAN_ENV=--env PATH=/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env PODMAN_BUILD=0\nPODMAN_CONFIG=--env ARCH=$(ARCH) --env BOARD=$(BOARD) --env CONFIG_NAME=$(CONFIG_NAME) --env FILESYSTEM_CONFIG=$(FILESYSTEM_CONFIG) --env PREFIX_BINARY=$(PREFIX_BINARY) \\\n               --env CI=$(CI) --env COOKBOOK_MAKE_JOBS=$(COOKBOOK_MAKE_JOBS) --env COOKBOOK_LOGS=$(COOKBOOK_LOGS) --env COOKBOOK_VERBOSE=$(COOKBOOK_VERBOSE) --env COOKBOOK_COMPRESSED=$(COOKBOOK_COMPRESSED) \\\n               --env REPO_APPSTREAM=$(REPO_APPSTREAM) --env REPO_BINARY=$(REPO_BINARY) --env REPO_NONSTOP=$(REPO_NONSTOP) --env REPO_OFFLINE=$(REPO_OFFLINE) --env TESTBIN=$(TESTBIN) \\\n\t\t\t   --env HOSTED_REDOX=$(HOSTED_REDOX) --env PREFIX_USE_UPSTREAM_RUST_COMPILER=$(PREFIX_USE_UPSTREAM_RUST_COMPILER)\nPODMAN_OPTIONS=--rm --workdir $(CONTAINER_WORKDIR) --interactive --tty --cap-add SYS_ADMIN --device /dev/fuse --network=host --env TERM=$(TERM) --pids-limit=-1\nPODMAN_RUN=podman run $(PODMAN_OPTIONS) $(PODMAN_VOLUMES) $(PODMAN_ENV) $(PODMAN_CONFIG) $(IMAGE_TAG)\n\ncontainer_shell: build/container.tag\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) bash\nelse\n\t@echo PODMAN_BUILD=$(PODMAN_BUILD), please set it to 1 in mk/config.mk\nendif\n\ncontainer_clean: FORCE\n\trm -f build/container.tag\n\t@echo \"If podman dir cannot be removed, remove with \\\"sudo rm\\\".\"\n\t-rm -rf $(PODMAN_HOME) || true\n\t@echo \"For complete clean of images and containers, use \\\"podman system reset\\\"\"\n\t-podman image rm --force $(IMAGE_TAG) || true\n\ncontainer_touch: FORCE\nifeq ($(PODMAN_BUILD),1)\n\trm -f build/container.tag\n\tpodman image exists $(IMAGE_TAG) || (echo \"Image does not exist, it will be rebuilt during normal make.\"; exit 1)\n\ttouch build/container.tag\nelse\n\t@echo PODMAN_BUILD=$(PODMAN_BUILD), container not required.\nendif\n\ncontainer_kill: FORCE\n\tpodman kill --latest --signal SIGKILL\n\n## Must match the value of CONTAINER_TAG in config.mk\nbuild/container.tag: $(CONTAINERFILE)\nifeq ($(PODMAN_BUILD),1)\n\trm -f $@ $(FSTOOLS_TAG)\n\t-podman image rm --force $(IMAGE_TAG) || true\n\tmkdir -p $(PODMAN_HOME)\n\t@echo \"Building Podman image. This may take some time.\"\n\tcat $(CONTAINERFILE) | podman build --file - $(PODMAN_VOLUMES) $(PODMAN_CACHE) --tag $(IMAGE_TAG)\n\t$(PODMAN_RUN) bash -e podman/rustinstall.sh\n\tmkdir -p build\n\ttouch $@\n\t@echo \"Podman ready!\"\nelse\n\t@echo PODMAN_BUILD=$(PODMAN_BUILD), container not required.\nendif\n\ncontainer_push: build/container.tag\n\tpodman push $(IMAGE_TAG) $(PODMAN_CACHE_PATH)\n\nKERNEL_PATH := recipes/core/kernel\nKERNEL_PATH_SOURCE := $(ROOT)/$(KERNEL_PATH)/source\nKERNEL_PATH_TARGET := $(ROOT)/$(KERNEL_PATH)/target/$(TARGET)\n\n# TODO: make this work using `make debug.kernel` and remove this\nkernel_debugger:\n\t@echo \"Building and running gdbgui container...\"\n\tpodman build -t redox-kernel-debug - < $(ROOT)/podman/redox-gdb-containerfile\n\tpodman run --rm -p 5000:5000 -it --name redox-gdb \\\n\t\t-v \"$(KERNEL_PATH_TARGET)/build/kernel.sym:/kernel.sym\" \\\n\t\t-v \"$(KERNEL_PATH_SOURCE)/src:/src\" \\\n\t\tredox-kernel-debug --gdb-cmd \"gdb -ex 'set confirm off' \\\n\t\t\t-ex 'add-symbol-file /kernel.sym' \\\n\t\t\t-ex 'target remote host.containers.internal:1234'\"\n"
  },
  {
    "path": "mk/prefix.mk",
    "content": "# Configuration file for the Rust/GCC cross-compilers, relibc and libtool\n\nPREFIX=prefix/$(TARGET)\n\nPREFIX_INSTALL=$(PREFIX)/sysroot/\nPREFIX_PATH=$(ROOT)/$(PREFIX_INSTALL)/bin\nBINUTILS_TARGET=recipes/dev/binutils-gdb/target/$(HOST_TARGET)/$(TARGET)\nLIBTOOL_TARGET=recipes/dev/libtool/target/$(HOST_TARGET)\nGCC_TARGET=recipes/dev/gcc13/target/$(HOST_TARGET)/$(TARGET)\nLIBSTDCXX_TARGET=recipes/libs/libstdcxx-v3/target/$(TARGET)/$(HOST_TARGET)\nRELIBC_FREESTANDING_TARGET=recipes/core/relibc/target/$(TARGET)/$(HOST_TARGET)\nRELIBC_TARGET=recipes/core/relibc/target/$(TARGET)\nLLVM_TARGET=recipes/dev/llvm21/target/$(HOST_TARGET)/$(TARGET)\nRUST_TARGET=recipes/dev/rust/target/$(HOST_TARGET)/$(TARGET)\nCLANG_TARGET=recipes/dev/clang21/target/$(HOST_TARGET)/$(TARGET)\nLLD_TARGET=recipes/dev/lld21/target/$(HOST_TARGET)/$(TARGET)\n\n# official RISC-V support introduced in newer version\nUPSTREAM_RUSTC_VERSION=2025-11-15\n\nexport PREFIX_RUSTFLAGS=-L $(ROOT)/$(PREFIX_INSTALL)/$(TARGET)/lib\nexport RUSTUP_TOOLCHAIN=$(ROOT)/$(PREFIX_INSTALL)\nexport REDOXER_TOOLCHAIN=$(RUSTUP_TOOLCHAIN)\nPREFIX_CONFIG=CI=1 COOKBOOK_CLEAN_BUILD=true COOKBOOK_CLEAN_TARGET=false COOKBOOK_VERBOSE=true COOKBOOK_NONSTOP=false\n\nprefix: $(PREFIX)/sysroot\n\n# Remove prefix builds and downloads\nprefix_clean:\n\trm -rf $(PREFIX)\n\n# Remove relibc in sysroot and all statically linked recipes\nstatic_clean: | $(FSTOOLS_TAG)\n\t$(MAKE) c.relibc\n\t$(MAKE) c.base,base-initfs,extrautils,kernel,ion,pkgutils,redoxfs\n\t$(MAKE) c.bash,luajit,gettext,openssl1,openssl3,pcre2,sdl1,zstd,zlib,bzip2,xz\n\t$(MAKE) c.expat,freetype2,libffi,libiconv,libjpeg,liborbital,libpng,libxml2,ncurses,ncursesw\n\trm -rf $(REPO_TAG)\n\n$(PREFIX)/relibc-install: $(PREFIX)/clang-install $(PREFIX)/rust-install $(PREFIX)/gcc-install | $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@echo \"\\033[1;36;49mBuilding relibc-install\\033[0m\"\n\trm -rf \"$@.partial\" \"$@\"\n\tmkdir \"$@.partial\"\n\tcp -r \"$(PREFIX)/gcc-install/\". \"$@.partial\"\n\tcp -r \"$(PREFIX)/rust-install/\". \"$@.partial\"\n\tcp -r \"$(PREFIX)/clang-install/\". \"$@.partial\"\n\trm -rf \"$@.partial/$(GNU_TARGET)/include/\"*\n\tcp -r \"$(PREFIX)/gcc-install/$(GNU_TARGET)/include/c++\" \"$@.partial/$(GNU_TARGET)/include/c++\"\n\texport PATH=\"$(ROOT)/$@.partial/bin:$$PATH\" && \\\n\texport CARGO=\"env -u CARGO cargo\" $(PREFIX_CONFIG) && \\\n\t$(REPO_BIN) cook relibc\n\tcp -r \"$(RELIBC_TARGET)/stage/usr/\". \"$@.partial/$(GNU_TARGET)\"\n\tmkdir -p \"$@.partial/$(GNU_TARGET)/usr\"\n\tln -s \"../include\" \"$@.partial/$(GNU_TARGET)/usr/include\"\n\tln -s \"../lib\" \"$@.partial/$(GNU_TARGET)/usr/lib\"\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\n$(PREFIX)/relibc-install.tar.gz: $(PREFIX)/relibc-install\n\ttar \\\n\t\t--create \\\n\t\t--gzip \\\n\t\t--file \"$@\" \\\n\t\t--directory=\"$<\" \\\n\t\t.\n\n\n$(PREFIX)/sysroot: $(PREFIX)/relibc-install $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\trm -rf \"$@\"\n\tcp -r \"$(PREFIX)/relibc-install/\" \"$@\"\n# adapt path for libtoolize\n\tsed 's|/usr/share|$(ROOT)/$@/share|g' \"$@/bin/libtoolize.orig\" > \"$@/bin/libtoolize\"\n\tchmod 0755 \"$@/bin/libtoolize\"\n\ttouch \"$@\"\nendif\n\n# PREFIX_BINARY ---------------------------------------------------\nifeq ($(PREFIX_BINARY),1)\n\n# PREFIX_BINARY FOR LINUX -----------------------------------------\nifneq ($(HOSTED_REDOX),1)\n\n$(PREFIX)/%.tar.gz: | $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p \"$(@D)\"\n\twget -O $@.partial \"https://static.redox-os.org/toolchain/$(HOST_TARGET)/$(TARGET)/$(@F)\"\n\tmv $@.partial $@\nendif\n\n$(PREFIX)/gcc-install $(PREFIX)/rust-install $(PREFIX)/clang-install: %: %.tar.gz | $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\trm -rf \"$@.partial\" \"$@\"\n\tmkdir -p \"$@.partial\"\n\ttar --extract --file \"$<\" --directory \"$@.partial\" --no-same-owner --strip-components=1\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\n# PREFIX_BINARY FOR REDOX -----------------------------------------\nelse\n\n$(PREFIX)/id_ed25519.pub.toml: | $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p \"$(@D)\"\n\twget -O $@.partial \"https://static.redox-os.org/pkg/id_ed25519.pub.toml\"\n\tmv $@.partial $@\nendif\n\n$(PREFIX)/%.pkgar: $(PREFIX)/id_ed25519.pub.toml | $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p \"$(@D)\"\n\twget -O $@.partial \"https://static.redox-os.org/pkg/$(TARGET)/$(@F)\"\n\tmv $@.partial $@\nendif\n\n\n$(PREFIX)/gcc-install: $(PREFIX)/gcc13.pkgar $(PREFIX)/gcc13.cxx.pkgar $(PREFIX)/libgcc.pkgar $(PREFIX)/libstdcxx.pkgar $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\trm -rf \"$@.partial\" \"$@\"\n\tmkdir -p \"$@.partial\"\n\tpkgar extract --pkey $(PREFIX)/id_ed25519.pub.toml --archive \"$(PREFIX)/gcc13.pkgar\" \"$@.partial\"\n\tpkgar extract --pkey $(PREFIX)/id_ed25519.pub.toml --archive \"$(PREFIX)/gcc13.cxx.pkgar\" \"$@.partial\"\n\tpkgar extract --pkey $(PREFIX)/id_ed25519.pub.toml --archive \"$(PREFIX)/libgcc.pkgar\" \"$@.partial\"\n\tpkgar extract --pkey $(PREFIX)/id_ed25519.pub.toml --archive \"$(PREFIX)/libstdcxx.pkgar\" \"$@.partial\"\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\n$(PREFIX)/rust-install: $(PREFIX)/llvm21.pkgar $(PREFIX)/rust.pkgar $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\trm -rf \"$@.partial\" \"$@\"\n\tmkdir -p \"$@.partial\"\n\tpkgar extract --pkey $(PREFIX)/id_ed25519.pub.toml --archive \"$(PREFIX)/llvm21.pkgar\" \"$@.partial\"\n\tpkgar extract --pkey $(PREFIX)/id_ed25519.pub.toml --archive \"$(PREFIX)/rust.pkgar\" \"$@.partial\"\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\n$(PREFIX)/clang-install: $(PREFIX)/llvm21.runtime.pkgar $(PREFIX)/clang21.pkgar $(PREFIX)/lld21.pkgar $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\trm -rf \"$@.partial\" \"$@\"\n\tmkdir -p \"$@.partial\"\n\tpkgar extract --pkey $(PREFIX)/id_ed25519.pub.toml --archive \"$(PREFIX)/llvm21.runtime.pkgar\" \"$@.partial\"\n\tpkgar extract --pkey $(PREFIX)/id_ed25519.pub.toml --archive \"$(PREFIX)/clang21.pkgar\" \"$@.partial\"\n\tpkgar extract --pkey $(PREFIX)/id_ed25519.pub.toml --archive \"$(PREFIX)/lld21.pkgar\" \"$@.partial\"\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\nendif\n\nelse\n\n$(PREFIX)/%.tar.gz: $(PREFIX)/%\n\ttar \\\n\t\t--create \\\n\t\t--gzip \\\n\t\t--file \"$@\" \\\n\t\t--directory=\"$<\" \\\n\t\t.\n\n# BUILD GCC ---------------------------------------------------\n$(PREFIX)/libtool-install: | $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@echo \"\\033[1;36;49mBuilding libtool-install\\033[0m\"\n\trm -rf \"$@.partial\" \"$@\"\n\tmkdir -p \"$@.partial\"\n\texport $(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr && \\\n\t$(REPO_BIN) cook host:libtool\n\tcp -r \"$(LIBTOOL_TARGET)/stage/usr/\". \"$@.partial\"\n\tmv \"$@.partial/bin/libtoolize\" \"$@.partial/bin/libtoolize.orig\"\n# adapt path for libtoolize\n\tsed 's|/usr/share|$(ROOT)/$@/share|g' \"$@.partial/bin/libtoolize.orig\" > \"$@.partial/bin/libtoolize\"\n\tchmod 0755 \"$@.partial/bin/libtoolize\"\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\n$(PREFIX)/binutils-install: | $(PREFIX)/libtool-install $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@echo \"\\033[1;36;49mBuilding binutils-install\\033[0m\"\n\trm -rf \"$@.partial\" \"$@\"\n\tmkdir -p \"$@.partial\"\n\texport $(PREFIX_CONFIG) PATH=\"$(ROOT)/$(PREFIX)/libtool-install/bin:$$PATH\" \\\n\t\tCOOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) && \\\n\t$(REPO_BIN) cook host:binutils-gdb\n\tcp -r \"$(BINUTILS_TARGET)/stage/usr/\". \"$@.partial\"\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\n$(PREFIX)/gcc-freestanding-install: $(PREFIX)/binutils-install | $(PREFIX)/libtool-install $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@echo \"\\033[1;36;49mBuilding gcc-freestanding-install\\033[0m\"\n\trm -rf \"$@.partial\" \"$@\" $(PREFIX)/relibc-freestanding-install $(PREFIX)/sysroot\n\tmkdir -p \"$@.partial\" $(PREFIX)/relibc-freestanding-install/$(GNU_TARGET)/include\n\texport $(PREFIX_CONFIG) PATH=\"$(ROOT)/$(PREFIX)/libtool-install/bin:$(ROOT)/$(PREFIX)/binutils-install/bin:$$PATH\" \\\n\t\tCOOKBOOK_LIBTOOL_DIR=$(ROOT)/$(PREFIX)/libtool-install COOKBOOK_CROSS_TARGET=$(TARGET) COOKBOOK_CROSS_GNU_TARGET=$(GNU_TARGET) \\\n\t\tCOOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_SYSROOT=$(ROOT)/$(PREFIX)/relibc-freestanding-install/$(GNU_TARGET) && \\\n\t$(REPO_BIN) cook host:gcc13\n\tcp -r \"$(GCC_TARGET)/stage/usr/\". \"$@.partial\"\n\tcp -r \"$(GCC_TARGET)/stage.cxx/usr/\". \"$@.partial\"\n\tcp -r \"$(PREFIX)/binutils-install/\". \"$@.partial\"\n\trm -rf $(PREFIX)/relibc-freestanding-install\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\n$(PREFIX)/relibc-freestanding-install: $(PREFIX)/gcc-freestanding-install | $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@echo \"\\033[1;36;49mBuilding relibc-freestanding-install\\033[0m\"\n\trm -rf \"$@.partial\" \"$@\"\n\tmkdir -p \"$@.partial\"\n\texport CARGO=\"env -u CARGO -u RUSTUP_TOOLCHAIN cargo\" RUSTUP=\"env -u CARGO -u RUSTUP_TOOLCHAIN rustup\" && \\\n\texport PATH=\"$(ROOT)/$(PREFIX)/gcc-freestanding-install/bin:$$PATH\" && \\\n\texport CC_$(subst -,_,$(TARGET))=\"$(GNU_TARGET)-gcc -isystem $(ROOT)/$@.partial/$(GNU_TARGET)/include\" LINKFLAGS=\"\" && \\\n\texport $(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \\\n\t$(REPO_BIN) cook relibc\n\tcp -r \"$(RELIBC_FREESTANDING_TARGET)/stage/usr/\". \"$@.partial/$(GNU_TARGET)\"\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\n$(PREFIX)/gcc-install: $(PREFIX)/relibc-freestanding-install | $(PREFIX)/libtool-install $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@echo \"\\033[1;36;49mBuilding gcc-install\\033[0m\"\n\trm -rf \"$@.partial\" \"$@-build.partial\" \"$@\"\n\tif [ ! -d \"$(ROOT)/$(GCC_TARGET)\" ]; then \\\n\t\techo \"\\033[1;38;5;196m Incomplete build stages. Please re-run the build\\033[0m\"; \\\n\t\trm -rf \"$(PREFIX)\"/gcc-freestanding-install && \"$(PREFIX)\"/relibc-freestanding-install && \\\n\t\texit 1; fi\n\tmkdir -p \"$@.partial\" \"$@-build.partial\"\n\tcp -r \"$(PREFIX)/gcc-freestanding-install/\". \"$@.partial\"\n\tcp -r \"$(PREFIX)/relibc-freestanding-install/\". \"$@.partial\"\n\tcp -r \"$(PREFIX)/libtool-install/\". \"$@.partial\"\n\t@#TODO: how to make this not conflict with libc?\n\trm -f \"$@.partial/lib/gcc/$(GNU_TARGET)/13.2.0/include/limits.h\"\n# libgcc and freestanding libstdcxx\n\texport PATH=\"$(ROOT)/$@.partial/bin:$$PATH\" && \\\n\t$(MAKE) -C \"$(ROOT)/$(GCC_TARGET)/build\" all-target-libgcc all-target-libstdc++-v3 && \\\n\t$(MAKE) -C \"$(ROOT)/$(GCC_TARGET)/build\" install-target-libgcc install-target-libstdc++-v3 DESTDIR=\"$(ROOT)/$@-build.partial/usr\"\n\tcp -r \"$@-build.partial/usr/\". \"$@.partial\"\n\t@#TODO: in riscv64gc libgcc_s.so is a GNU ld script\n\trm -f \"$@.partial\"/$(GNU_TARGET)/lib/libgcc_s.so\n\tln -s libgcc_s.so.1 \"$@.partial\"/$(GNU_TARGET)/lib/libgcc_s.so\n\t@#TODO: generates wrong lib path for libtool\n\trm -f \"$@.partial\"/$(GNU_TARGET)/lib/libstdc++.la\n\trm -f \"$@.partial\"/$(GNU_TARGET)/lib/libsupc++.la\n# hosted libstdcxx\n\texport PATH=\"$(ROOT)/$@.partial/bin:$$PATH\" && \\\n\texport $(PREFIX_CONFIG) \"COOKBOOK_HOST_SYSROOT=$(ROOT)/$@.partial\" COOKBOOK_CROSS_TARGET=$(HOST_TARGET) && \\\n\trm -rf \"$(LIBSTDCXX_TARGET)/stage\" && $(REPO_BIN) cook libstdcxx-v3\n\tcp -r \"$(LIBSTDCXX_TARGET)/stage/usr/\". \"$@.partial/$(GNU_TARGET)\"\n\trm -rf \"$@-build.partial\"\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\n# no longer needed, delete build files to save disk space\n\trm -rf $(BINUTILS_TARGET) $(LIBTOOL_TARGET) $(GCC_TARGET) $(LIBSTDCXX_TARGET) $(RELIBC_FREESTANDING_TARGET)\nendif\n\n# RUST FROM UPSTREAM COMPILER ---------------------------------------------------\nifeq ($(PREFIX_USE_UPSTREAM_RUST_COMPILER),1)\n\nPREFIX_RUST_VERSION_TAG=$(PREFIX)/rustc-version-tag-$(UPSTREAM_RUSTC_VERSION)\n\n$(PREFIX_RUST_VERSION_TAG):\n\trm -f \"$(PREFIX)\"/rustc-version-tag-*\n\trm -f \"$(PREFIX)\"/rustc-install.tar.xz\n\trm -f \"$(PREFIX)\"/cargo-install.tar.xz\n\trm -f \"$(PREFIX)\"/rust-std-host-install.tar.xz\n\trm -f \"$(PREFIX)\"/rust-std-target-install.tar.xz\n\trm -f \"$(PREFIX)\"/rust-src-install.tar.xz:\n\tmkdir -p \"$(@D)\"\n\ttouch $@\n\n$(PREFIX)/rustc-install.tar.xz $(PREFIX)/cargo-install.tar.xz: $(PREFIX)/%-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p \"$(@D)\"\n\twget -O $@.partial \"https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/$*-nightly-$(HOST_TARGET).tar.xz\"\n\tmv $@.partial $@\nendif\n\n$(PREFIX)/rust-std-host-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p \"$(@D)\"\n\twget -O $@.partial \"https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-std-nightly-$(HOST_TARGET).tar.xz\"\n\tmv $@.partial $@\nendif\n\n$(PREFIX)/rust-std-target-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p \"$(@D)\"\nifeq ($(TARGET),x86_64-unknown-redox)\n\twget -O $@.partial \"https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-std-nightly-$(TARGET).tar.xz\"\n\tmv $@.partial $@\nelse\n\ttouch $@\nendif\nendif\n\n$(PREFIX)/rust-src-install.tar.xz: | $(PREFIX_RUST_VERSION_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\tmkdir -p \"$(@D)\"\n\twget -O $@.partial \"https://static.rust-lang.org/dist/$(UPSTREAM_RUSTC_VERSION)/rust-src-nightly.tar.xz\"\n\tmv $@.partial $@\nendif\n\n$(PREFIX)/rust-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\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@echo \"\\033[1;36;49mBuilding rust-install\\033[0m\"\n\trm -rf \"$@.partial\" \"$@\"\n\tmkdir -p \"$@.partial\"\n\ttar --extract --file \"$(PREFIX)/rustc-install.tar.xz\" -C \"$@.partial\" rustc-nightly-$(HOST_TARGET)/rustc/ --strip-components=2\n\ttar --extract --file \"$(PREFIX)/cargo-install.tar.xz\" --directory \"$@.partial\" cargo-nightly-$(HOST_TARGET)/cargo/ --strip-components=2\n\ttar --extract --file \"$(PREFIX)/rust-std-host-install.tar.xz\" --directory \"$@.partial\" rust-std-nightly-$(HOST_TARGET)/rust-std-$(HOST_TARGET)/ --strip-components=2\n\ttar --extract --file \"$(PREFIX)/rust-src-install.tar.xz\" --directory \"$@.partial\" rust-src-nightly/rust-src/ --strip-components=2\nifeq ($(TARGET),x86_64-unknown-redox)\n\ttar --extract --file \"$(PREFIX)/rust-std-target-install.tar.xz\" --directory \"$@.partial\" rust-std-nightly-$(TARGET)/rust-std-$(TARGET)/ --strip-components=2\nendif\n\trm -f \"$@.partial/manifest.in\"\n\ttouch \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\nendif\n\n# BUILD RUST ---------------------------------------------------\nelse\n\n$(PREFIX)/rust-install: | $(PREFIX)/libtool-install $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@echo \"\\033[1;36;49mBuilding rust-install\\033[0m\"\n\trm -rf \"$@.partial\" \"$@\"\n\texport PATH=\"$(ROOT)/$(PREFIX)/libtool-install/bin:$$PATH\" \\\n\t\t$(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(TARGET) && \\\n\t\t$(REPO_BIN) cook host:llvm21 host:rust\n\tcp -r \"$(RUST_TARGET)/stage/usr/\". \"$@.partial\"\n\tcp -r \"$(LLVM_TARGET)/stage/usr/\". \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\n# TODO: Cache from RUST_TARGET is currently not cleared.\n# TIP: If you're developing std for rust, remove COOKBOOK_CLEAN_BUILD=true\n#      at the top of this file so your next rust build reuses the build cache\nendif\n\nendif\n\n# BUILD CLANG ---------------------------------------------------\n$(PREFIX)/clang-install: | $(PREFIX)/rust-install $(PREFIX)/libtool-install $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@echo \"\\033[1;36;49mBuilding clang-install\\033[0m\"\n\trm -rf \"$@.partial\" \"$@\"\n\texport PATH=\"$(ROOT)/$(PREFIX)/libtool-install/bin:$$PATH\" \\\n\t\t$(PREFIX_CONFIG) COOKBOOK_HOST_SYSROOT=/usr COOKBOOK_CROSS_TARGET=$(TARGET) && \\\n\t\t$(REPO_BIN) cook host:llvm21 host:clang21 host:lld21\n# llvm libraries is already in rust if building\nifeq ($(PREFIX_USE_UPSTREAM_RUST_COMPILER),1)\n\tcp -r \"$(LLVM_TARGET)/stage/usr/\". \"$@.partial\"\nendif\n\tcp -r \"$(LLVM_TARGET)/stage.dev/usr/\". \"$@.partial\"\n\tcp -r \"$(LLVM_TARGET)/stage.runtime/usr/\". \"$@.partial\"\n\tcp -r \"$(CLANG_TARGET)/stage/usr/\". \"$@.partial\"\n\tcp -r \"$(LLD_TARGET)/stage/usr/\". \"$@.partial\"\n\tmv \"$@.partial\" \"$@\"\n# no longer needed, delete build files to save disk space\n\trm -rf $(LLVM_TARGET) $(CLANG_TARGET) $(LLD_TARGET)\nendif\n\nendif\n"
  },
  {
    "path": "mk/qemu.mk",
    "content": "# Configuration file for QEMU\n\nQEMU=qemu-system-$(QEMU_ARCH)\nQEMUFLAGS=-d guest_errors -name \"Redox OS $(ARCH)\"\nnetboot?=no\nredoxer?=no\nVGA_SUPPORTED=no\n\nifeq ($(ARCH),i586)\n\taudio?=ac97\n\tdisk?=ata\n\tgpu?=vga\n\tuefi=no\n\tVGA_SUPPORTED=yes\n\tQEMU_ARCH=i386\n\tQEMU_MACHINE?=pc\n\tQEMU_CPU?=pentium2\n\tQEMU_SMP?=1\n\tQEMU_MEM?=1024\n\n\t# Default to using kvm when arch is i586 and host is x86_64\n\tifeq ($(HOST_ARCH),x86_64)\n\t\tkvm?=yes\n\tendif\nelse ifeq ($(ARCH),x86_64)\n\tgpu?=vga\n\tuefi?=yes\n\tVGA_SUPPORTED=yes\n\tQEMU_ARCH=x86_64\n\tQEMU_MACHINE?=q35\n\tQEMU_CPU?=core2duo\n\tQEMU_SMP?=4\n\tQEMU_MEM?=2048\n\tifeq ($(uefi),yes)\n\t\tFIRMWARE=$(firstword \\\n\t\t\t$(wildcard /usr/share/ovmf/OVMF.fd) \\\n\t\t\t$(wildcard /usr/share/OVMF/OVMF_CODE.fd) \\\n\t\t)\n\t\tifeq ($(FIRMWARE),)\n\t\t\tPFLASH0=$(firstword \\\n\t\t\t\t$(wildcard /usr/share/qemu/edk2-x86_64-code.fd) \\\n\t\t\t\t$(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2s-x86_64-code.fd) \\\n\t\t\t)\n\t\tendif\n\tendif\n\tifneq ($(usb),no)\n\t\tQEMUFLAGS+=-device qemu-xhci\n\tendif\nelse ifeq ($(ARCH),aarch64)\n\t# Default to UEFI as U-Boot doesn't set up a framebuffer for us and we don't yet support\n\t# setting up a framebuffer ourself.\n\tuefi?=yes\n\tlive?=yes\n\tgpu?=ramfb\n\tQEMU_ARCH=aarch64\n\tQEMU_MACHINE?=virt\n\tQEMU_CPU=max\n\tQEMU_SMP?=1\n\tQEMU_MEM?=2048\n\tifeq ($(BOARD),raspi3bp)\n\t\tQEMU_KERNEL=$(BUILD)/raspi3bp_uboot.rom\n\t\tdisk?=sdcard\n\t\tgpu=none\n\t\tQEMU_MACHINE:=raspi3b\n\t\tQEMU_SMP:=4\n\t\tQEMU_MEM:=1024\n\t\tnet:=usb-net\n\t\taudio:=no\n\t\tifneq ($(usb),no)\n\t\t\tQEMUFLAGS+=-usb -device usb-kbd -device usb-tablet\n\t\tendif\n\telse\n\t\tifeq ($(uefi),yes)\n\t\t\tFIRMWARE=$(firstword \\\n\t\t\t\t$(wildcard /usr/share/AAVMF/AAVMF_CODE.fd) \\\n\t\t\t)\n\t\t\tifeq ($(FIRMWARE),)\n\t\t\t\tPFLASH0=$(firstword \\\n\t\t\t\t\t$(wildcard /usr/share/qemu/edk2-aarch64-code.fd) \\\n\t\t\t\t\t$(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd) \\\n\t\t\t\t)\n\t\t\tendif\n\t\telse\n\t\t\tFIRMWARE=$(BUILD)/qemu_uboot.rom\n\t\tendif\n\t\tifneq ($(usb),no)\n\t\t\tQEMUFLAGS+=-device qemu-xhci -device usb-kbd -device usb-tablet\n\t\tendif\n\tendif\n\n\t# Default to using HVF when host is MacOS Silicon\n\tifeq ($(HOST_ARCH),arm64)\n\t\tkvm?=yes\n\tendif\nelse ifeq ($(ARCH),riscv64gc)\n\tlive=no\n\taudio=no\n\tgpu?=ramfb\n\tnet=bridge\n\tQEMU_ARCH=riscv64\n\t# QEMU_MACHINE=virt  for ACPI mode instead of DTB\n\tQEMU_MACHINE=virt,acpi=off\n#\tQEMU_MACHINE:=${QEMU_MACHINE},aclint=on\n#\tQEMU_MACHINE:=${QEMU_MACHINE},aia=aplic\n#\tQEMU_MACHINE:=${QEMU_MACHINE},aia=aplic-imsic\n\tQEMU_SMP?=4\n\tQEMU_MEM?=2048\n\tQEMU_CPU=max\n\tPFLASH0=$(firstword \\\n\t\t$(wildcard /usr/share/qemu-efi-riscv64/RISCV_VIRT_CODE.fd) \\\n\t\t$(wildcard /usr/share/edk2/riscv/RISCV_VIRT_CODE.fd) \\\n\t\t$(wildcard /usr/share/qemu/edk2-riscv-code.fd) \\\n\t\t$(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-code.fd) \\\n\t)\n\tPFLASH1=$(firstword \\\n\t\t$(wildcard /usr/share/qemu-efi-riscv64/RISCV_VIRT_VARS.fd) \\\n\t\t$(wildcard /usr/share/edk2/riscv/RISCV_VIRT_VARS.fd) \\\n\t\t$(wildcard /usr/share/qemu/edk2-riscv-vars.fd) \\\n\t\t$(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-vars.fd) \\\n\t)\n\tifneq ($(usb),no)\n\t\tQEMUFLAGS+=-device qemu-xhci -device usb-kbd -device usb-tablet\n\tendif\nelse\n$(error Unsupported ARCH for QEMU \"$(ARCH)\"))\nendif\n\nQEMUFLAGS+=-smp $(QEMU_SMP) -m $(QEMU_MEM)\n\n# If host and target arch do not match, disable kvm\n# (unless overridden above or by environment)\nifneq ($(ARCH),$(HOST_ARCH))\n\tkvm?=no\nendif\n\n# wsl2: run qemu on windows instead\nifeq ($(QEMU_ON_WINDOWS),1)\n\tQEMU:=$(QEMU).exe\n\tWINDOWS_DISK=/mnt/c/ProgramData/redox.img\n\tdisk=windows\n\tnet=windows\n\tQEMU_MACHINE=pc\n\tFIRMWARE=\n\tQEMU_KERNEL=\n\tQEMUFLAGS+=-device usb-tablet\nendif\n\nifneq ($(FIRMWARE),)\n\tQEMUFLAGS+=-bios $(FIRMWARE)\nendif\n\nifneq ($(QEMU_KERNEL),)\n\tQEMUFLAGS+=-kernel $(QEMU_KERNEL)\nendif\n\nifeq ($(live),yes)\n\tDISK=$(BUILD)/redox-live.iso\nelse\n\tDISK=$(BUILD)/harddrive.img\nendif\n\nifeq ($(serial),no)\n\tQEMUFLAGS+=-chardev stdio,id=debug -device isa-debugcon,iobase=0x402,chardev=debug\nelse\n\tQEMUFLAGS+=-chardev stdio,id=debug,signal=off,mux=on,\"$(if $(qemu_serial_logfile),logfile=$(qemu_serial_logfile))\"\n\tQEMUFLAGS+=-serial chardev:debug -mon chardev=debug\nendif\n\n# redoxer exit code: 51 => success, 53 => failure\nifeq ($(redoxer),yes)\nifeq ($(ARCH),x86_64)\n\tQEMUFLAGS+=-device isa-debug-exit\nelse ifeq ($(ARCH),i586)\n\tQEMUFLAGS+=-device isa-debug-exit\nelse ifeq ($(ARCH),aarch64)\n\tQEMUFLAGS+=-semihosting-config enable=on,target=native,userspace=on\nendif\nendif\n\nifeq ($(iommu),yes)\n\tQEMUFLAGS+=-machine $(QEMU_MACHINE),iommu=on\nelse\n\tQEMUFLAGS+=-machine $(QEMU_MACHINE)\nendif\n\nifeq ($(audio),no)\n\t# No audio\nelse ifeq ($(audio),ac97)\n\t# AC'97\n\tQEMUFLAGS+=-device AC97\nelse\n\t# Intel High Definition Audio\n\tQEMUFLAGS+=-device ich9-intel-hda -device hda-output\nendif\n\nifeq ($(net),no)\n\tQEMUFLAGS+=-net none\nelse\n\tifeq ($(net),rtl8139) # RTL8139\n\t\tQEMUFLAGS+=-device rtl8139,netdev=net0\n\telse ifeq ($(net),virtio) # virtio-net\n\t\tQEMUFLAGS+=-device virtio-net,netdev=net0\n\telse ifeq ($(net),usb-net)\n\t\tQEMUFLAGS+=-device usb-net,netdev=net0\n\telse\n\t\tQEMUFLAGS+=-device e1000,netdev=net0,id=nic0\n\tendif\n\n\tEXTRANETARGS=\n\tifeq ($(netboot),yes)\n\t\tEXTRANETARGS+=,tftp=$(BUILD),bootfile=redox.ipxe\n\t\tQEMUFLAGS+=-kernel /usr/lib/ipxe/ipxe-amd64.efi\n\tendif\n\n\tifneq ($(bridge),)\n\t\tQEMUFLAGS+=-netdev bridge,br=$(bridge),id=net0\n\telse ifeq ($(net),redir)\n\t\t# port 8022 - ssh\n\t\t# port 8080-8083 - webservers\n\t\t# port 64126 - our gdbserver implementation\n\t\tFWD_PORTS := 8081 8082 8083 64126\n\t\tFWD_FLAGS := hostfwd=tcp::8022-:22,hostfwd=tcp::8080-:80\n\t\tFWD_FLAGS2 := $(foreach p,$(FWD_PORTS),,hostfwd=tcp::$(p)-:$(p))\n\t\tQEMUFLAGS += -netdev user,id=net0,$(FWD_FLAGS)$(subst $(eval ) ,,$(FWD_FLAGS2))$(EXTRANETARGS)\n\telse ifeq ($(net),windows)\n\t\tQEMUFLAGS+=-netdev user,id=net0$(EXTRANETARGS)\n\telse\n\t\tQEMUFLAGS+=-netdev user,id=net0$(EXTRANETARGS) -object filter-dump,id=f1,netdev=net0,file=$(BUILD)/network.pcap\n\tendif\nendif\n\nifeq ($(gpu),no)\n\tQEMUFLAGS+=-nographic -vga none\nelse ifeq ($(gpu),vga)\n\tifeq ($(VGA_SUPPORTED),yes)\n\t\tQEMUFLAGS+=-vga std\n\telse\n\t\tQEMUFLAGS+=-vga none -device secondary-vga\n\tendif\nelse ifeq ($(gpu),ramfb)\n\tQEMUFLAGS+=-vga none -device ramfb\nelse ifeq ($(gpu),multi)\n\tifeq ($(VGA_SUPPORTED),yes)\n\t\tQEMUFLAGS+=-display sdl -vga none -device virtio-vga,max_outputs=2\n\telse\n\t\tQEMUFLAGS+=-display sdl -vga none -device virtio-gpu,max_outputs=2\n\tendif\nelse ifeq ($(gpu),virtio)\n\tifeq ($(VGA_SUPPORTED),yes)\n\t\tQEMUFLAGS+=-vga none -device virtio-vga\n\telse\n\t\tQEMUFLAGS+=-vga none -device virtio-gpu\n\tendif\nelse ifeq ($(gpu),virtio-sdl)\n\tifeq ($(VGA_SUPPORTED),yes)\n\t\tQEMUFLAGS+=-vga none -device virtio-vga -display sdl,show-cursor=on\n\telse\n\t\tQEMUFLAGS+=-vga none -device virtio-gpu -display sdl,show-cursor=on\n\tendif\nelse ifeq ($(gpu),virtio-gl)\n\tifeq ($(VGA_SUPPORTED),yes)\n\t\tQEMUFLAGS+=-display gtk,gl=on -vga none -device virtio-vga-gl\n\telse\n\t\tQEMUFLAGS+=-display gtk,gl=on -vga none -device virtio-gpu-gl\n\tendif\nendif\n\nEXTRA_DISK=$(BUILD)/extra.img\ndisk?=nvme\nifeq ($(disk),ata)\n\t# For i386, ata will use ided\n\t# For aarch64 and x86_64, ata will use ahcid\n\tQEMUFLAGS+= \\\n\t\t-drive file=$(DISK),format=raw \\\n\t\t-drive file=$(EXTRA_DISK),format=raw\nelse ifeq ($(disk),nvme)\n\tQEMUFLAGS+= \\\n\t\t-drive file=$(DISK),format=raw,if=none,id=drv0 -device nvme,drive=drv0,serial=NVME_SERIAL \\\n\t\t-drive file=$(EXTRA_DISK),format=raw,if=none,id=drv1 -device nvme,drive=drv1,serial=NVME_EXTRA\nelse ifeq ($(disk),usb)\n\tQEMUFLAGS+= \\\n\t\t-drive if=none,id=usbstick,format=raw,file=$(DISK) \\\n\t\t-device usb-storage,drive=usbstick\nelse ifeq ($(disk),virtio)\n\tQEMUFLAGS+= \\\n\t\t-drive file=$(DISK),format=raw,if=virtio \\\n\t\t-drive file=$(EXTRA_DISK),format=raw,if=virtio\nelse ifeq ($(disk),cdrom)\n\tQEMUFLAGS+= \\\n\t\t-boot d -cdrom $(DISK) \\\n\t\t-drive file=$(EXTRA_DISK),format=raw\nelse ifeq ($(disk),sdcard)\n\tQEMUFLAGS+=-drive file=$(DISK),if=sd,format=raw\nelse ifeq ($(disk),windows)\n\tQEMUFLAGS+=-drive file=\"$(shell wslpath -w $(WINDOWS_DISK))\",format=raw,if=virtio\nendif\n\nifeq ($(gdb),yes)\n\tQEMUFLAGS+=-d cpu_reset -s -S\nelse ifeq ($(gdb),nonblock)\n\t# Allow attaching gdb, but don't block for it\n\tQEMUFLAGS+=-d cpu_reset -s\nendif\n\nifeq ($(UNAME),Linux)\n\tifneq ($(kvm),no)\n\t\tifeq ($(QEMU_ON_WINDOWS),1)\n\t\t\tQEMUFLAGS+=-accel whpx,kernel-irqchip=off -cpu Broadwell,x2apic=off\n\t\telse\n\t\t\tQEMUFLAGS+=-enable-kvm -cpu host\n\t\tendif\n\telse\n\t\tQEMUFLAGS+=-cpu $(QEMU_CPU)\n\tendif\nendif\n\nifeq ($(UNAME),Darwin)\n    ifneq ($(kvm),no)\n        QEMUFLAGS+=-accel hvf -cpu max\n    else\n        QEMUFLAGS+=-cpu $(QEMU_CPU)\n    endif\nendif\n\nifneq ($(PFLASH0),)\n\tQEMUFLAGS+=-drive if=pflash,format=raw,unit=0,file=$(PFLASH0),readonly=on\nendif\n\nifneq ($(PFLASH1),)\n\tQEMUFLAGS+=-drive if=pflash,format=raw,unit=1,file=$(BUILD)/fw_vars.bin\nendif\n\n.PHONY: qemu-deps\n\nqemu-deps: $(DISK)\n\nifeq ($(disk),usb)\nelse ifeq ($(disk),sdcard)\nelse ifeq ($(disk),windows)\nqemu-deps: $(WINDOWS_DISK)\nelse\nqemu-deps: $(EXTRA_DISK)\nendif\n\nqemu-deps:$(FIRMWARE)\n\nqemu-deps:$(QEMU_KERNEL)\n\nqemu-deps: $(PFLASH0)\n\nifneq ($(PFLASH1),)\nqemu-deps: $(BUILD)/fw_vars.bin\n\n.PRECIOUS: $(BUILD)/fw_vars.bin\n$(BUILD)/fw_vars.bin: $(PFLASH1)\n\tcp \"$<\" \"$@\"\nendif\n\n$(EXTRA_DISK):\n\ttruncate -s 1g $@\n\n$(WINDOWS_DISK): $(BUILD)/harddrive.img\n\trm -f $@\n\tmkdir -p $(shell dirname $@)\n\tcp \"$<\" \"$@\"\n\n$(BUILD)/raspi3bp_uboot.rom:\n\twget -O $@ https://gitlab.redox-os.org/Ivan/redox_firmware/-/raw/main/platform/raspberry_pi/rpi3/u-boot-rpi-3-b-plus.bin\n\n$(BUILD)/qemu_uboot.rom:\n\twget -O $@ https://gitlab.redox-os.org/Ivan/redox_firmware/-/raw/main/platform/qemu/qemu_arm64/u-boot-qemu-arm64.bin\n\nqemu: qemu-deps\n\t$(QEMU) $(QEMUFLAGS)\n"
  },
  {
    "path": "mk/repo.mk",
    "content": "# Configuration file for recipe commands\n\n$(REPO_TAG): prefix $(FILESYSTEM_CONFIG) | $(FSTOOLS) $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\texport PATH=\"$(PREFIX_PATH):$$PATH\" && \\\n\texport COOKBOOK_HOST_SYSROOT=\"$(ROOT)/$(PREFIX_INSTALL)\" && \\\n\t$(REPO_BIN) cook $(COOKBOOK_OPTS) --with-package-deps\n\tmkdir -p $(BUILD)\n\ttouch $@\nendif\n\ncomma := ,\n\n# List all recipes in a cook-tree fashion specified by the filesystem config\nrepo-tree: $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@$(REPO_BIN) cook-tree $(COOKBOOK_OPTS) --with-package-deps\nendif\n\n# List all recipes in a push-tree fashion specified by the filesystem config\nimage-tree: $(FSTOOLS_TAG) $(CONTAINER_TAG)\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@$(REPO_BIN) push-tree $(COOKBOOK_OPTS)\nendif\n\n# Clean specific target to all recipes, similar to repo_clean but more specific\nrepo_clean_target: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(REPO_BIN) clean-target --all\nendif\n\n# Fetch all recipes source or binary from filesystem config\nfetch: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\texport PATH=\"$(PREFIX_PATH):$$PATH\" && \\\n\texport COOKBOOK_HOST_SYSROOT=\"$(ROOT)/$(PREFIX_INSTALL)\" && \\\n\t$(REPO_BIN) fetch $(COOKBOOK_OPTS) --with-package-deps\nendif\n\n# Fetch Cargo dependencies for the cookbook tool (needed for REPO_OFFLINE=1 builds)\ncargo-fetch: FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(HOST_CARGO) fetch --manifest-path Cargo.toml --locked\nendif\n\n# Find recipe for one or more targets separated by comma\nfind.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t@$(REPO_BIN) find $(foreach f,$(subst $(comma), ,$*),$(f))\nendif\n\n# Invoke clean for relibc in recipe and relibc in sysroot\nc.relibc: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(REPO_BIN) clean relibc\n\trm -rf $(PREFIX)/relibc-install $(PREFIX)/sysroot\n\t@echo \"\\033[1;36;49mSysroot cleaned\\033[0m\"\nendif\n\n# Invoke clean for one or more targets separated by comma\nc.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(REPO_BIN) clean $(foreach f,$(subst $(comma), ,$*),$(f))\nendif\n\n# Invoke fetch for one or more targets separated by comma\nf.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\texport PATH=\"$(PREFIX_PATH):$$PATH\" && \\\n\texport COOKBOOK_HOST_SYSROOT=\"$(ROOT)/$(PREFIX_INSTALL)\" && \\\n\t$(REPO_BIN) fetch $(foreach f,$(subst $(comma), ,$*),$(f)) $(COOKBOOK_OPTS)\nendif\n\n# Invoke cook for one or more targets separated by comma\nr.%: prefix $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\texport PATH=\"$(PREFIX_PATH):$$PATH\" && \\\n\texport COOKBOOK_HOST_SYSROOT=\"$(ROOT)/$(PREFIX_INSTALL)\" && \\\n\t$(REPO_BIN) cook $(foreach f,$(subst $(comma), ,$*),$(f)) $(COOKBOOK_OPTS)\nendif\n\n# Show what to cook\nrt.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(REPO_BIN) cook-tree $(foreach f,$(subst $(comma), ,$*),$(f)) $(COOKBOOK_OPTS)\nendif\n\nMOUNTED_TAG=$(MOUNT_DIR)~\n\n# Push compiled package into existing image\n# DO NOT RUN THIS WHILE QEMU ALIVE, THE DISK MIGHT CORRUPT IN DOING SO\np.%: $(FSTOOLS_TAG) FORCE\nifeq ($(ALLOW_FSTOOLS),1)\n\t@rm -f $(MOUNTED_TAG)\n\t@if [ ! -d \"$(MOUNT_DIR)\" ]; then \\\n\t\t$(MAKE) mount; \\\n\t\ttouch $(MOUNTED_TAG); \\\n\tfi\nendif\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@ ALLOW_FSTOOLS=$(FSTOOLS_IN_PODMAN)\nelse\n\t$(REPO_BIN) push $(foreach f,$(subst $(comma), ,$*),$(f)) \"--sysroot=$(MOUNT_DIR)\"\nendif\nifeq ($(ALLOW_FSTOOLS),1)\n\t@if [ -f $(MOUNTED_TAG) ]; then \\\n\t\t$(MAKE) unmount && rm -f $(MOUNTED_TAG); \\\n\telse echo \"\\033[0;33;49mNot unmounting by ourself, don't forget to do it\\033[0m\"; \\\n\tfi\nendif\n\n# Show what to push\npt.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(REPO_BIN) push-tree $(foreach f,$(subst $(comma), ,$*),$(f)) $(COOKBOOK_OPTS)\nendif\n\n# Push all recipes specified by the filesystem config\npush: $(FSTOOLS_TAG) FORCE\nifeq ($(ALLOW_FSTOOLS),1)\n\t@rm -f $(MOUNTED_TAG)\n\t@if [ ! -d \"$(MOUNT_DIR)\" ]; then \\\n\t\t$(MAKE) mount; \\\n\t\ttouch $(MOUNTED_TAG); \\\n\tfi\nendif\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@ ALLOW_FSTOOLS=$(FSTOOLS_IN_PODMAN)\nelse\n\t$(REPO_BIN) push $(COOKBOOK_OPTS) --with-package-deps \"--sysroot=$(MOUNT_DIR)\"\nendif\nifeq ($(ALLOW_FSTOOLS),1)\n\t@if [ -f $(MOUNTED_TAG) ]; then \\\n\t\t$(MAKE) unmount && rm -f $(MOUNTED_TAG); \\\n\telse echo \"\\033[1;33;49mNot unmounting by ourself, don't forget to do it\\033[0m\"; \\\n\tfi\nendif\n\n# Rebuild and push all recipes specified by the filesystem config\nrebuild-push: $(FSTOOLS_TAG) FORCE\n\trm -f $(REPO_TAG)\n\t$(MAKE) repo\n\t$(MAKE) push\n\n# Invoke unfetch for one or more targets separated by comma\nu.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(REPO_BIN) unfetch $(foreach f,$(subst $(comma), ,$*),$(f))\nendif\n\n# Invoke clean, and repo.sh for one of more targets separated by comma\ncr.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(MAKE) c.$*\n\t$(MAKE) r.$*\nendif\n\n# Invoke unfetch, clean, and repo.sh for one or more targets separated by comma\nucr.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(MAKE) u.$*\n\t$(MAKE) cr.$*\nendif\n\n# Invoke unfetch and clean for one or more targets separated by comma\nuc.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(MAKE) u.$*\n\t$(MAKE) c.$*\nendif\n\n# Invoke unfetch, clean and fetch for one or more targets separated by comma\nucf.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t$(PODMAN_RUN) make $@\nelse\n\t$(MAKE) uc.$*\n\t$(MAKE) f.$*\nendif\n\n# Invoke repo.sh and push for one of more targets separated by comma\n# Don't use podman here, as the p target cannot mount inside podman\nrp.%: $(FSTOOLS_TAG) FORCE\n\t$(MAKE) r.$*,--with-package-deps\n\t$(MAKE) p.$*\n\n# Invoke clean, repo.sh and push for one of more targets separated by comma\ncrp.%: $(FSTOOLS_TAG) FORCE\n\t$(MAKE) cr.$*,--with-package-deps\n\t$(MAKE) p.$*\n\n# Invoke unfetch. clean, repo.sh and push for one of more targets separated by comma\nucrp.%: $(FSTOOLS_TAG) FORCE\n\t$(MAKE) ucr.$*,--with-package-deps\n\t$(MAKE) p.$*\n\nexport DEBUG_BIN?=\n\n# Debug a statically linked program with gdbgui, for example: debug.drivers-initfs DEBUG_BIN=pcid\n# Enable debug symbols with `REPO_DEBUG=1 make cr.recipe rebuild`, make sure `file` outputs \"debug_info, not stripped\"\n# Open http://localhost:5000/dashboard, start QEMU with `make qemu kvm=no QEMU_SMP=1 gdb=yes` before opening a session\n# Experimental, may not work if ARCH is different with what host is running\ndebug.%: $(FSTOOLS_TAG) FORCE\nifeq ($(PODMAN_BUILD),1)\n\t@cd $(shell make find.$* | grep ^recipes) && \\\n\t\texport RECIPE_STAGE=target/$(TARGET)/stage && \\\n\t\texport BIN_PATH=$$(find $$RECIPE_STAGE -type f -name \"$(DEBUG_BIN)\" -or -type f -name \"$*\") && \\\n\t\tfile $$BIN_PATH 2> /dev/null || ( echo \"Binary is not found, please set DEBUG_BIN\" && exit 1 ) && \\\n\t\techo \"Opening gdbgui for debugging $* with binary '$$BIN_PATH'\" && echo \"----------\" && \\\n\t\tpodman build -t redox-kernel-debug - < $(ROOT)/podman/redox-gdb-containerfile > /dev/null && \\\n\t\tpodman run --rm -p 5000:5000 -it --name redox-gdb \\\n\t\t-v \"./$$BIN_PATH:/binary\" \\\n\t\t-v \"./source:/source\" -w \"/source\" \\\n\t\tredox-kernel-debug --gdb-cmd \"gdb -ex 'set confirm off' \\\n\t\t\t-ex 'add-symbol-file /binary' \\\n\t\t\t-ex 'target remote host.containers.internal:1234'\"\nelse\n\t@cd $(shell make find.$* | grep ^recipes) && \\\n\t\texport RECIPE_STAGE=target/$(TARGET)/stage && \\\n\t\texport BIN_PATH=$$(find $$RECIPE_STAGE -type f -name \"$(DEBUG_BIN)\" -or -type f -name \"$*\") && \\\n\t\tfile $$BIN_PATH 2> /dev/null || ( echo \"Binary is not found, please set DEBUG_BIN\" && exit 1 ) && \\\n\t\techo \"Opening gdbgui for debugging $* with binary '$$BIN_PATH'\" && echo \"----------\" && \\\n\t\tgdbgui.pex --gdb-cmd \"gdb -ex 'set confirm off' \\\n\t\t\t-ex 'add-symbol-file $$BIN_PATH' \\\n\t\t\t-ex 'target remote localhost:1234'\"\nendif\n"
  },
  {
    "path": "mk/virtualbox.mk",
    "content": "# Configuration file for VirtualBox, it creates a VirtualBox virtual machine\n\nvirtualbox: $(BUILD)/harddrive.img\n\techo \"Delete VM\"\n\t-$(VBM) unregistervm Redox --delete; \\\n\tif [ $$? -ne 0 ]; \\\n\tthen \\\n\t\tif [ -d \"$$HOME/VirtualBox VMs/Redox\" ]; \\\n\t\tthen \\\n\t\t\techo \"Redox directory exists, deleting...\"; \\\n\t\t\t$(RM) -rf \"$$HOME/VirtualBox VMs/Redox\"; \\\n\t\tfi \\\n\tfi\n\techo \"Delete Disk\"\n\t-$(RM) harddrive.vdi\n\techo \"Create VM\"\n\t$(VBM) createvm --name Redox --register\n\techo \"Set Configuration\"\n\t$(VBM) modifyvm Redox --memory 2048\n\t$(VBM) modifyvm Redox --vram 32\n\tif [ \"$(net)\" != \"no\" ]; \\\n\tthen \\\n\t\t$(VBM) modifyvm Redox --nic1 nat; \\\n\t\t$(VBM) modifyvm Redox --nictype1 82540EM; \\\n\t\t$(VBM) modifyvm Redox --cableconnected1 on; \\\n\t\t$(VBM) modifyvm Redox --nictrace1 on; \\\n\t\t$(VBM) modifyvm Redox --nictracefile1 \"$(ROOT)/$(BUILD)/network.pcap\"; \\\n\tfi\n\t$(VBM) modifyvm Redox --uart1 0x3F8 4\n\t$(VBM) modifyvm Redox --uartmode1 file \"$(ROOT)/$(BUILD)/serial.log\"\n\t$(VBM) modifyvm Redox --usb off # on\n\t$(VBM) modifyvm Redox --keyboard ps2\n\t$(VBM) modifyvm Redox --mouse ps2\n\t$(VBM) modifyvm Redox --audio-driver $(VB_AUDIO)\n\t$(VBM) modifyvm Redox --audiocontroller hda\n\t$(VBM) modifyvm Redox --audioout on\n\t$(VBM) modifyvm Redox --nestedpaging on\n\techo \"Create Disk\"\n\t$(VBM) convertfromraw $< $(BUILD)/harddrive.vdi\n\techo \"Attach Disk\"\n\t$(VBM) storagectl Redox --name ATA --add sata --controller IntelAHCI --bootable on --portcount 1\n\t$(VBM) storageattach Redox --storagectl ATA --port 0 --device 0 --type hdd --medium $(BUILD)/harddrive.vdi\n\techo \"Run VM\"\n\t$(VBM) startvm Redox\n"
  },
  {
    "path": "native_bootstrap.sh",
    "content": "#!/usr/bin/env bash\n\n# This script is used to setup the Redox build system\n# It installs Rustup, the recipe dependencies for cross-compilation\n# and downloads the build system configuration files\n\nset -e\n\n##########################################################\n# This function is simply a banner to introduce the script\n##########################################################\nbanner()\n{\n    echo \"|------------------------------------------|\"\n    echo \"|----- Welcome to the Redox bootstrap -----|\"\n    echo \"|------------------------------------------|\"\n}\n\n############################################################################\n# This function takes care of installing a dependency via package manager of\n# choice for building Redox on BSDs (macOS, FreeBSD, etc.).\n# @params:    $1 package manager\n#             $2 package name\n#             $3 binary name (optional)\n############################################################################\ninstall_bsd_pkg()\n{\n    PKG_MANAGER=$1\n    PKG_NAME=$2\n    BIN_NAME=$3\n    if [ -z \"$BIN_NAME\" ]; then\n        BIN_NAME=$PKG_NAME\n    fi\n\n    BIN_LOCATION=$(which $BIN_NAME || true)\n    if [ -z \"$BIN_LOCATION\" ]; then\n        echo \"$PKG_MANAGER install $PKG_NAME\"\n        $PKG_MANAGER install \"$PKG_NAME\"\n    else\n        echo \"$BIN_NAME already exists at $BIN_LOCATION, no need to install $PKG_NAME...\"\n    fi\n}\n\ninstall_macports_pkg()\n{\n    install_bsd_pkg \"sudo port\" \"$1\" \"$2\"\n}\n\ninstall_brew_pkg()\n{\n    install_bsd_pkg \"brew\" $@\n}\n\ninstall_brew_cask_pkg()\n{\n    install_bsd_pkg \"brew cask\" $@\n}\n\ninstall_freebsd_pkg()\n{\n    install_bsd_pkg \"sudo pkg\" $@\n}\n\n##############################################################################\n# This function checks which of the supported package managers is available on\n# the macOS host.\n# If a supported package manager is found, it delegates the installing work to\n# the relevant function.\n# Otherwise this function will exit this script with an error.\n##############################################################################\nosx()\n{\n    if [ ! -z \"$(which brew)\" ]; then\n        osx_homebrew $@\n    elif [ ! -z \"$(which port)\" ]; then\n        osx_macports $@\n    else\n        echo \"Please install either Homebrew or MacPorts, if you wish to use this script\"\n        echo \"Re-run this script once you installed one of those package managers\"\n        echo \"Will not install, now exiting...\"\n        exit 1\n    fi\n}\n\n############################################################################\n# This function takes care of installing all dependencies using MacPorts for\n# building Redox on macOS\n# @params:    $1 the emulator to install, \"virtualbox\" or \"qemu\"\n############################################################################\nosx_macports()\n{\n    echo \"MacPorts detected! Now updating...\"\n    sudo port -v selfupdate\n\n    echo \"Installing missing packages...\"\n\n    install_macports_pkg \"git\"\n\n    if [ \"$1\" == \"qemu\" ]; then\n        install_macports_pkg \"qemu\" \"qemu-system-x86_64\"\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        install_macports_pkg \"virtualbox\"\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    install_macports_pkg \"autoconf\"\n    install_macports_pkg \"automake\"\n    install_macports_pkg \"bison\"\n    install_macports_pkg \"cmake\"\n    install_macports_pkg \"coreutils\"\n    install_macports_pkg \"curl\"\n    install_macports_pkg \"doxygen\"\n    install_macports_pkg \"expat\"\n    install_macports_pkg \"file\"\n    install_macports_pkg \"findutils\"\n    install_macports_pkg \"flex\"\n    install_macports_pkg \"gcc14\"\n    install_macports_pkg \"gdb +multiarch\"\n    install_macports_pkg \"gmake\"\n    install_macports_pkg \"gmp\"\n    install_macports_pkg \"gpatch\"\n    install_macports_pkg \"jpeg\"\n    install_macports_pkg \"libpng\"\n    install_macports_pkg \"libsdl12\"\n    install_macports_pkg \"libsdl2_ttf\"\n    install_macports_pkg \"libtool\"\n    install_macports_pkg \"m4\"\n    install_macports_pkg \"meson\"\n    install_macports_pkg \"nasm\"\n    install_macports_pkg \"ninja\"\n    install_macports_pkg \"openssl11\"\n    install_macports_pkg \"openssl3\"\n    install_macports_pkg \"osxfuse\"\n    install_macports_pkg \"p5-html-parser\"\n    install_macports_pkg \"patchelf\"\n    install_macports_pkg \"perl5.24\"\n    install_macports_pkg \"pkgconfig\"\n    install_macports_pkg \"po4a\"\n    install_macports_pkg \"protobuf-c\"\n    install_macports_pkg \"py37-mako\"\n    install_macports_pkg \"python311\"\n    install_macports_pkg \"scons\"\n    install_macports_pkg \"texinfo\"\n    install_macports_pkg \"unzip\"\n    install_macports_pkg \"wget\"\n    install_macports_pkg \"x86_64-elf-gcc\"\n    install_macports_pkg \"xdg-utils\"\n    install_macports_pkg \"zip\"\n}\n\n############################################################################\n# This function takes care of installing all dependencies using Homebrew for\n# building Redox on macOS\n# @params:    $1 the emulator to install, \"virtualbox\" or \"qemu\"\n############################################################################\nosx_homebrew()\n{\n    echo \"Homebrew detected! Now updating...\"\n    brew update\n\n    echo \"Installing missing packages...\"\n\n    install_brew_pkg \"git\"\n\n    if [ \"$1\" == \"qemu\" ]; then\n        install_brew_pkg \"qemu\" \"qemu-system-x86_64\"\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        install_brew_pkg \"virtualbox\"\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    install_brew_pkg \"ant\"\n    install_brew_pkg \"autoconf\"\n    install_brew_pkg \"automake\"\n    install_brew_pkg \"bison\"\n    install_brew_pkg \"cmake\"\n    install_brew_pkg \"curl\"\n    install_brew_pkg \"doxygen\"\n    install_brew_pkg \"expat\"\n    install_brew_pkg \"findutils\"\n    install_brew_pkg \"flex\"\n    install_brew_pkg \"gcc@14\"\n    install_brew_pkg \"gdb\"\n    install_brew_pkg \"gettext\"\n    install_brew_pkg \"gmp\"\n    install_brew_pkg \"gpatch\"\n    install_brew_pkg \"jpeg\"\n    install_brew_pkg \"libpng\"\n    install_brew_pkg \"libtool\"\n    install_brew_pkg \"llvm\"\n    install_brew_pkg \"m4\"\n    install_brew_pkg \"macfuse\"\n    install_brew_pkg \"make\"\n    install_brew_pkg \"meson\"\n    install_brew_pkg \"nasm\"\n    install_brew_pkg \"ninja\"\n    install_brew_pkg \"openssl@1.1\"\n    install_brew_pkg \"openssl@3.0\"\n    install_brew_pkg \"patchelf\"\n    install_brew_pkg \"perl\"\n    install_brew_pkg \"pkg-config\"\n    install_brew_pkg \"po4a\"\n    install_brew_pkg \"protobuf\"\n    install_brew_pkg \"python@3.11\"\n    install_brew_pkg \"scons\"\n    install_brew_pkg \"sdl12-compat\"\n    install_brew_pkg \"sdl2_ttf\"\n    install_brew_pkg \"texinfo\"\n    install_brew_pkg \"unzip\"\n    install_brew_pkg \"wget\"\n    install_brew_pkg \"zip\"\n\n    install_brew_pkg \"redox-os/gcc_cross_compilers/x86_64-elf-gcc\" \"x86_64-elf-gcc\"\n}\n\n#######################################################################\n# This function takes care of installing all dependencies using pkg for\n# building Redox on FreeBSD\n# @params:    $1 the emulator to install, \"virtualbox\" or \"qemu\"\n#######################################################################\nfreebsd()\n{\n    set -x\n    echo \"FreeBSD detected!\"\n    echo \"Installing missing packages...\"\n\n    install_freebsd_pkg \"git\"\n\n    if [ \"$1\" == \"qemu\" ]; then\n        install_freebsd_pkg \"qemu\" \"qemu-system-x86_64\"\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        install_freebsd_pkg \"virtualbox\"\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    install_freebsd_pkg \"autoconf\"\n    install_freebsd_pkg \"automake\"\n    install_freebsd_pkg \"bison\"\n    install_freebsd_pkg \"cmake\"\n    install_freebsd_pkg \"coreutils\"\n    install_freebsd_pkg \"curl\"\n    install_freebsd_pkg \"doxygen\"\n    install_freebsd_pkg \"expat2\"\n    install_freebsd_pkg \"file\"\n    install_freebsd_pkg \"findutils\"\n    install_freebsd_pkg \"flex\"\n    install_freebsd_pkg \"fusefs-libs3\"\n    install_freebsd_pkg \"gcc\"\n    install_freebsd_pkg \"gdb\"\n    install_freebsd_pkg \"gettext\"\n    install_freebsd_pkg \"gmake\"\n    install_freebsd_pkg \"gmp\"\n    install_freebsd_pkg \"libjpeg-turbo\"\n    install_freebsd_pkg \"libtool\"\n    install_freebsd_pkg \"m4\"\n    install_freebsd_pkg \"meson\"\n    install_freebsd_pkg \"nasm\"\n    install_freebsd_pkg \"ninja\"\n    install_freebsd_pkg \"openssl\"\n    install_freebsd_pkg \"p5-HTML-Parser\"\n    install_freebsd_pkg \"patch\"\n    install_freebsd_pkg \"patchelf\"\n    install_freebsd_pkg \"perl5.36\"\n    install_freebsd_pkg \"pkgconf\"\n    install_freebsd_pkg \"png\"\n    install_freebsd_pkg \"po4a\"\n    install_freebsd_pkg \"py-protobuf-compiler\"\n    install_freebsd_pkg \"python\"\n    install_freebsd_pkg \"scons\"\n    install_freebsd_pkg \"sdl12\"\n    install_freebsd_pkg \"sdl2_ttf\"\n    install_freebsd_pkg \"syslinux\"\n    install_freebsd_pkg \"texinfo\"\n    install_freebsd_pkg \"unzip\"\n    install_freebsd_pkg \"wget\"\n    install_freebsd_pkg \"xdg-utils\"\n    install_freebsd_pkg \"zip\"\n    set +x\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Arch Linux\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n# \t\t$2 install non-interactively, boolean\n###############################################################################\narchLinux()\n{\n    noninteractive=$2\n\n    pacman_install=\"pacman -S --needed\"\n    if [ \"$noninteractive\" = true ]; then\n        pacman_install+=\"  --noconfirm\"\n    fi\n\n    echo \"Detected Arch Linux\"\n    packages=\"ant \\\n    autoconf \\\n    automake \\\n    bison \\\n    cmake \\\n    curl \\\n    doxygen \\\n    expat \\\n    file \\\n    flex \\\n    fuse \\\n    gdb \\\n    git \\\n    gmp \\\n    libjpeg-turbo \\\n    libpng \\\n    libtool \\\n    m4 \\\n    make \\\n    meson \\\n    nasm \\\n    patch \\\n    patchelf \\\n    perl \\\n    perl-html-parser \\\n    pkgconf \\\n    po4a \\\n    protobuf \\\n    python \\\n    python-mako \\\n    rsync \\\n    scons \\\n    sdl12-compat \\\n    syslinux \\\n    texinfo \\\n    unzip \\\n    waf \\\n    wget \\\n    xdg-utils \\\n    zip\"\n\n    if [ \"$1\" == \"qemu\" ]; then\n        packages=\"$packages qemu-system-x86 qemu-system-arm qemu-system-riscv\"\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        packages=\"$packages virtualbox\"\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n    # Scripts should not cause a system update in order to just install a\n    #   couple of packages. If pacman -S --needed is going to fail, let it fail\n    #   and the user will figure out the issues (without updating if required)\n    #   and rerun the script.\n    #echo \"Updating system...\"\n    #sudo pacman -Syu\n\n    echo \"Installing packages $packages...\"\n    sudo $pacman_install $packages\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Debian-based Linux\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n# \t\t$2 install non-interactively, boolean\n#\t\t$3 the package manager to use\n###############################################################################\nubuntu()\n{\n    noninteractive=$2\n    package_manager=$3\n    echo \"Detected Ubuntu/Debian\"\n    echo \"Updating system...\"\n    sudo $package_manager update\n\n    if [ $package_manager == \"apt-get\" ]; then\n        if [ \"$noninteractive\" = true ]; then\n            install_command+=\"DEBIAN_FRONTEND=noninteractive apt-get install --assume-yes --quiet\"\n        else\n            install_command=\"apt-get install\"\n        fi\n    else\n        install_command=\"$package_manager install\"\n    fi\n\n    echo \"Installing required packages...\"\n    pkgs=\"\\\n    ant \\\n    appstream \\\n    appstream-compose \\\n    autoconf \\\n    autoconf2.69 \\\n    automake \\\n    autopoint \\\n    bison \\\n    bsdextrautils \\\n    build-essential \\\n    clang \\\n    cmake \\\n    curl \\\n    dos2unix \\\n    doxygen \\\n    expect \\\n    file \\\n    flex \\\n    fuse3 \\\n    g++ \\\n    gdb-multiarch \\\n    genisoimage \\\n    git \\\n    git-lfs \\\n    gtk-doc-tools \\\n    help2man \\\n    intltool \\\n    libc6-dev-i386 \\\n    libfuse3-dev \\\n    libgdk-pixbuf2.0-bin \\\n    libglib2.0-dev-bin \\\n    libgmp-dev \\\n    libhtml-parser-perl \\\n    libjpeg-dev \\\n    libmpfr-dev \\\n    libparse-yapp-perl \\\n    libsdl1.2-dev \\\n    libsdl2-ttf-dev \\\n    llvm \\\n    lua5.4 \\\n    lzip \\\n    m4 \\\n    make \\\n    meson \\\n    nasm \\\n    ninja-build \\\n    patch \\\n    patchelf \\\n    perl \\\n    pkg-config \\\n    po4a \\\n    protobuf-compiler \\\n    python3 \\\n    python3-dev \\\n    python3-mako \\\n    python3-venv \\\n    rsync \\\n    ruby \\\n    scons \\\n    ssh \\\n    syslinux-utils \\\n    texinfo \\\n    unifdef \\\n    unzip \\\n    wget \\\n    xdg-utils \\\n    xfonts-utils \\\n    xorg-dev \\\n    xutils-dev \\\n    xxd \\\n    zip \\\n    zstd\"\n    # Not availible for at least ARM hosts\n    case \"$host_arch\" in\n        x86*|i?86) pkgs=\"$pkgs libc6-dev-i386 syslinux-utils\";;\n    esac\n    sudo $install_command $pkgs\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            echo \"Installing QEMU...\"\n            sudo $install_command qemu-system-x86 qemu-kvm\n            sudo $install_command qemu-system-arm qemu-efi-aarch64\n            sudo $install_command qemu-system-riscv\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            if grep '^ID=debian$' /etc/os-release > /dev/null; then\n                echo \"Virtualbox is not in the official debian packages\"\n                echo \"To install virtualbox on debian, see https://wiki.debian.org/VirtualBox\"\n                echo \"Please install VirtualBox and re-run this script,\"\n                echo \"or run with -e qemu\"\n                exit 1\n            else\n                echo \"Installing VirtualBox...\"\n                sudo $install_command virtualbox\n            fi\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Fedora Linux\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n# \t\t$2 install non-interactively, boolean\n###############################################################################\nfedora()\n{\n    noninteractive=$2\n\n    dnf_install=\"dnf install\"\n    if [ \"$noninteractive\" = true ]; then\n        dnf_install+=\" --assumeyes --quiet\"\n    fi\n\n    echo \"Detected Fedora\"\n    if [ -z \"$(which git)\" ]; then\n        echo \"Installing git...\"\n        sudo $dnf_install git-all\n    fi\n\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            echo \"Installing QEMU...\"\n            sudo $dnf_install qemu-system-x86 qemu-kvm\n            sudo $dnf_install qemu-system-arm edk2-aarch64\n            sudo $dnf_install qemu-system-riscv\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            echo \"Please install VirtualBox and re-run this script,\"\n            echo \"or run with -e qemu\"\n            exit 1\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    # Use rpm -q <package> to check if it's already installed\n    PKGS=$(for pkg in @development-tools \\\n    ant \\\n    autoconf \\\n    automake \\\n    bison \\\n    cmake \\\n    curl \\\n    doxygen \\\n    expat \\\n    expat-devel \\\n    file \\\n    flex \\\n    fuse-devel \\\n    fuse3-devel \\\n    gcc \\\n    gcc-c++ \\\n    gdb \\\n    genisoimage \\\n    gettext-devel \\\n    glibc-devel.i686 \\\n    gmp-devel \\\n    help2man \\\n    libjpeg-turbo-devel \\\n    libpng-devel \\\n    libtool \\\n    lzip \\\n    m4 \\\n    make \\\n    meson \\\n    nasm \\\n    ninja-build \\\n    openssl \\\n    patch \\\n    patchelf \\\n    perl \\\n    perl-FindBin \\\n    perl-HTML-Parser \\\n    perl-Pod-Html \\\n    perl-Pod-Xhtml \\\n    pkgconf-pkg-config \\\n    po4a \\\n    protobuf-compiler \\\n    python3-mako \\\n    SDL2_ttf-devel \\\n    sdl12-compat-devel \\\n    syslinux \\\n    texinfo \\\n    unzip \\\n    vim \\\n    waf \\\n    zip \\\n    zstd ; do rpm -q $pkg > /dev/null || echo $pkg; done)\n    # If the list of packages is not empty, install missing\n    COUNT=$(echo $PKGS | wc -w)\n    if [ $COUNT -ne 0 ]; then\n        echo \"Installing necessary build tools...\"\n        sudo $dnf_install $PKGS\n    fi\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# *SUSE Linux\n###############################################################################\nsuse()\n{\n    echo \"Detected SUSE Linux\"\n\n    packages=(\n    \"ant\"\n    \"autoconf\"\n    \"automake\"\n    \"bison\"\n    \"cmake\"\n    \"curl\"\n    \"doxygen\"\n    \"file\"\n    \"flex\"\n    \"fuse-devel\"\n    \"gcc\"\n    \"gcc-c++\"\n    \"gdb-multiarch\"\n    \"gettext-tools\"\n    \"glibc-devel-32bit\"\n    \"gmp-devel\"\n    \"libexpat-devel\"\n    \"libjpeg8-devel\"\n    \"libpng16-devel\"\n    \"libtool\"\n    \"m4\"\n    \"make\"\n    \"meson\"\n    \"nasm\"\n    \"ninja\"\n    \"openssl\"\n    \"patch\"\n    \"patchelf\"\n    \"perl\"\n    \"perl-HTML-Parser\"\n    \"pkgconf\"\n    \"po4a\"\n    \"protobuf\"\n    \"python-Mako\"\n    \"scons\"\n    \"syslinux-utils\"\n    \"unzip\"\n    \"wget\"\n    \"xdg-utils\"\n    \"zip\"\n    )\n\n    if [ -z \"$(which git)\" ]; then\n        echo \"Will install git ...\"\n        packages+=(git)\n    fi\n\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            echo \"Will install QEMU...\"\n            packages+=(qemu-x86 qemu-kvm)\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            echo \"Please install VirtualBox and re-run this script,\"\n            echo \"or run with -e qemu\"\n            exit 1\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    echo \"Installing necessary build tools...\"\n\n    # We could install all the packages in a single zypper command with:\n    #\n    #        zypper install package1 package2 package3\n    #\n    # But there is an issue with this: zypper returns a success code if at\n    # least one of the packages was correctly installed, but we need it to fail\n    # if any of the packages is missing.\n    #\n    # To confirm that the packages are available, we try to install them one by\n    # one with --dry-run.\n    # We still install all the packages in a single zypper command so that the\n    # user has to confirm only once.\n    for p in ${packages[@]}; do\n        if rpm -q \"${p}\" > /dev/null ; then\n            echo \"${p} is already installed\"\n        else\n            # Zypper shows a confirmation prompt and the \"y\" answer even with\n            # --non-interactive and --no-confirm:\n            #\n            #   1 new package to install.\n            #   Overall download size: 281.7 KiB. Already cached: 0 B.\n            #   After the operation, additional 394.6 KiB will be used.\n            #   Continue? [y/n/v/...? shows all options] (y): y\n            #\n            # That could make the user think that the package was installed,\n            # when it was only a dry run.\n            # To avoid the confusion, we hide the output unless there was an\n            # error.\n            if out=\"$(zypper --non-interactive install --no-confirm --dry-run --force-resolution ${p}  2>&1)\"  ; then\n                echo \"${p} can be installed\"\n            else\n                echo \"no\"\n                echo \"\"\n                echo \"Zypper output:\"\n                echo \"\"\n                echo \"${out}\"\n                echo \"\"\n                echo \"Could not find how to install '${p}', try running:\"\n                echo \"\"\n                echo \"     zypper install ${p}\"\n                echo \"\"\n                exit 1\n            fi\n        fi\n    done\n\n    zypper install ${packages[@]}\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Gentoo Linux\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\ngentoo()\n{\n    echo \"Detected Gentoo Linux\"\n    if [ -z \"$(which nasm)\" ]; then\n        echo \"Installing nasm...\"\n        sudo emerge dev-lang/nasm\n    fi\n    if [ -z \"$(which git)\" ]; then\n        echo \"Installing git...\"\n        sudo emerge dev-vcs/git\n    fi\n    if [ -z \"$(which fusermount 2>/dev/null)\" ] && [ -z \"$(which fusermount3 2>/dev/null)\" ]; then\n        echo \"Installing fuse...\"\n        sudo emerge sys-fs/fuse\n    fi\n\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            echo \"Please install QEMU and re-run this script\"\n            echo \"Step1. Add QEMU_SOFTMMU_TARGETS=\\\"x86_64\\\" to /etc/portage/make.conf\"\n            echo \"Step2. Execute \\\"sudo emerge app-emulation/qemu\\\"\"\n            exit 1\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            echo \"Please install VirtualBox and re-run this script,\"\n            echo \"or run with -e qemu\"\n            exit 1\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    if [ -z \"$(which cmake)\" ]; then\n        echo \"Installing cmake...\"\n        sudo emerge dev-util/cmake\n    fi\n    if [ -z \"$(ldconfig -p | grep fontconfig)\" ]; then\n        sudo emerge media-libs/fontconfig\n    fi\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Solus\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\nsolus()\n{\n    echo \"Detected Solus\"\n\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            sudo eopkg it qemu\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            echo \"Please install VirtualBox and re-run this script,\"\n            echo \"or run with -e qemu\"\n            exit 1\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    echo \"Installing necessary build tools...\"\n    #if guards are not necessary with eopkg since it does nothing if latest version is already installed\n    sudo eopkg it autoconf \\\n    automake \\\n    binutils-gold \\\n    bison \\\n    cmake \\\n    flex \\\n    fuse-devel \\\n    fuse2-devel \\\n    g++ \\\n    gcc \\\n    glibc-devel \\\n    git \\\n    libgcc-32bit \\\n    libpng-devel \\\n    libstdc++-32bit \\\n    libtool-devel \\\n    linux-headers \\\n    m4 \\\n    make \\\n    nasm \\\n    patch \\\n    patchelf \\\n    perl-html-parser \\\n    pkg-config \\\n    po4a \\\n    rsync\n}\n\n###############################################################################\n# Helper function to detect if we're running on Redox OS\n# This needs to be checked before FreeBSD since both use 'pkg' package manager\n###############################################################################\nis_os_redox()\n{\n    [ \"$(uname -s)\" = \"Redox\" ]\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Redox OS itself (bootstrapping Redox on Redox)\n# @params:    $1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\nredox()\n{\n    echo \"Detected Redox OS\"\n    \n    # Check if git is installed\n    if [ -z \"$(which git)\" ]; then\n        echo \"Installing git...\"\n        sudo pkg install git\n    fi\n\n    # Handle emulator selection\n    if [ \"$1\" == \"qemu\" ]; then\n        echo \"QEMU is not available on Redox OS yet, but it is mandatory for running the built system.\"\n        echo \"Please install QEMU manually on a compatible host or use another machine to run the emulator.\"\n        exit 1\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        echo \"VirtualBox is not supported on Redox OS.\"\n        exit 1\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    echo \"Installing necessary build tools...\"\n    \n    # Core development packages that are available on x86_64 Redox\n    # This list is based on list of \"cookbook\" and \"dev-essential\" recipe\n    packages=\"autoconf \\\n    automake \\\n    cbindgen \\\n    expat \\\n    gcc13 \\\n    gcc13.cxx \\\n    git \\\n    gnu-grep \\\n    gnu-make \\\n    installer \\\n    libgmp \\\n    libjpeg \\\n    libpng \\\n    nasm \\\n    patch \\\n    pkgar \\\n    pkg-config \\\n    python312 \\\n    rust \\\n    sdl1 \\\n    sdl2-ttf \\\n    vim\"\n\n    \n    # Try to install packages, but don't fail if some are unavailable\n    # since Redox package ecosystem is still developing\n    for pkg in $PKGS; do\n        if ! pkg list | grep -q \"^${pkg}\"; then\n            echo \"Attempting to install ${pkg}...\"\n            if ! sudo pkg install ${pkg} 2>/dev/null; then\n                echo \"Warning: ${pkg} could not be installed. It may not be available yet.\"\n            fi\n        else\n            echo \"${pkg} is already installed.\"\n        fi\n    done\n    \n    echo \"\"\n    echo \"Note: Building Redox on Redox itself is experimental.\"\n    echo \"Some dependencies may not be available yet in the Redox package repository.\"\n    echo \"For the best build experience, consider using podman_bootstrap.sh on another system.\"\n}\n\n######################################################################\n# This function outlines the different options available for bootstrap\n######################################################################\nusage()\n{\n    echo \"------------------------\"\n    echo \"|Redox bootstrap script|\"\n    echo \"------------------------\"\n    echo \"Usage: ./native_bootstrap.sh\"\n    echo \"OPTIONS:\"\n    echo\n    echo \"   -h,--help      Show this prompt\"\n    echo \"   -u [branch]    Update git repo and update rust\"\n    echo \"                  If blank defaults to master\"\n    echo \"   -s             Check the status of the current travis build\"\n    echo \"   -e [emulator]  Install specific emulator, virtualbox or qemu\"\n    echo \"   -p [package    Choose an Ubuntu package manager, apt-fast or\"\n    echo \"       manager]   aptitude\"\n    echo \"   -d             Only install the dependencies, skip boot step\"\n    echo \"   -y             Install non-interactively. Answer \\\"yes\\\" or\"\n    echo \"                  select the default option for rustup and package\"\n    echo \"\t\t\t\t\tmanagers. Only the apt, dnf and pacman\"\n    echo \"                  package managers are supported.\"\n    echo \"EXAMPLES:\"\n    echo\n    echo \"./native_bootstrap.sh -e qemu\"\n    exit\n}\n\n#############################################################\n# Looks for and installs a cargo-managed binary or subcommand\n#############################################################\ncargoInstall()\n{\n    if is_os_redox ; then\n        # in redox OS, cargo is not based on rustup. Packages are managed by pkg\n        return 0\n    fi\n    if [[ \"`cargo +stable install --list`\" != *\"$1 v$2\"* ]]; then\n        cargo +stable install --force --version \"$2\" \"$1\"\n    else\n        echo \"You have $1 version $2 installed already!\"\n    fi\n}\n\n#############################################################################\n# This function takes care of everything associated to rust, and the version\n# manager that controls it, it can install rustup and uninstall multirust as\n# well as making sure that the correct version of rustc is selected by rustup\n# @params:\t$1 install non-interactively, boolean\n#############################################################################\nrustInstall()\n{\n    if is_os_redox ; then\n        # in redox OS, rustup is not available. Packages are managed by pkg\n        return 0\n    fi\n    noninteractive=$1\n    # Check to see if multirust is installed, we don't want it messing with rustup\n    # In the future we can probably remove this but I believe it's good to have for now\n    if [ -e /usr/local/lib/rustlib/uninstall.sh ] ; then\n        echo \"It appears that multirust is installed on your system.\"\n        echo \"This tool has been deprecated by the maintainer, and will cause issues.\"\n        echo \"This script can remove multirust from your system if you wish.\"\n        printf \"Uninstall multirust (y/N):\"\n        read multirust\n        if echo \"$multirust\" | grep -iq \"^y\" ;then\n            sudo /usr/local/lib/rustlib/uninstall.sh\n        else\n            echo \"Please manually uninstall multirust and any other versions of rust, then re-run bootstrap.\"\n            exit 1\n        fi\n    fi\n    # If rustup is not installed we should offer to install it for them\n    if [ -z \"$(which rustup)\" ]; then\n        rustup_options=\"--default-toolchain stable\"\n        echo \"You do not have rustup installed.\"\n        if [ \"$noninteractive\" = true ]; then\n            rustup=\"y\"\n            rustup_options+=\" -y\"\n        else\n            echo \"We HIGHLY recommend using rustup.\"\n            echo \"Would you like to install it now?\"\n            echo \"*WARNING* this involves a 'curl | sh' style command\"\n            printf \"(y/N): \"\n            read rustup\n        fi\n        if echo \"$rustup\" | grep -iq \"^y\" ;then\n            #install rustup\n            curl https://sh.rustup.rs -sSf | sh -s -- $rustup_options\n            # You have to add the rustup variables to the $PATH\n            echo \"export PATH=\\\"\\$HOME/.cargo/bin:\\$PATH\\\"\" >> ~/.bashrc\n            # source the variables so that we can execute rustup commands in the current shell\n            source ~/.cargo/env\n        else\n            echo \"Rustup will not be installed!\"\n        fi\n    fi\n\n    if [ -z \"$(which rustc)\" ]; then\n        echo \"Rust is not installed\"\n        echo \"Please either run the script again, accepting rustup install\"\n        echo \"or install rustc stable manually (not recommended) via:\"\n        echo \"\\#curl -sSf https://static.rust-lang.org/rustup.sh | sh -s -- --channel=stable\"\n        exit 1\n    else\n        echo \"Your Rust install looks good!\"\n    fi\n}\n\n####################################################################\n# This function gets the current build status from travis and prints\n# a message to the user\n####################################################################\nstatusCheck()\n{\n    for i in $(echo \"$(curl -sf https://api.travis-ci.org/repositories/redox-os/redox.json)\" | tr \",\" \"\\n\")\n    do\n        if echo \"$i\" | grep -iq \"last_build_status\" ;then\n            if echo \"$i\" | grep -iq \"0\" ;then\n                echo\n                echo \"********************************************\"\n                echo \"Travis reports that the last build succeeded!\"\n                echo \"Looks like you are good to go!\"\n                echo \"********************************************\"\n            elif echo \"$i\" | grep -iq \"null\" ;then\n                echo\n                echo \"******************************************************************\"\n                echo \"The Travis build did not finish, this is an error with its config.\"\n                echo \"I cannot reliably determine whether the build is succeeding or not.\"\n                echo \"Consider checking for and maybe opening an issue on gitlab\"\n                echo \"******************************************************************\"\n            else\n                echo\n                echo \"**************************************************\"\n                echo \"Travis reports that the last build *FAILED* :(\"\n                echo \"Might want to check out the issues before building\"\n                echo \"**************************************************\"\n            fi\n        fi\n    done\n}\n\n###########################################################################\n# This function is the main logic for the bootstrap; it clones the git repo\n# then it installs the rust version manager and the latest version of rustc\n###########################################################################\nboot()\n{\n    echo \"Cloning gitlab repo...\"\n    git clone https://gitlab.redox-os.org/redox-os/redox.git --origin upstream\n    echo \"Creating .config with PODMAN_BUILD=0\"\n    echo 'PODMAN_BUILD?=0' > redox/.config\n    echo \"Cleaning up...\"\n    rm native_bootstrap.sh\n    echo\n    echo \"---------------------------------------\"\n    echo \"Well it looks like you are ready to go!\"\n    echo \"---------------------------------------\"\n    statusCheck\n    echo\n    echo \"** Be sure to update your path to include Rust - run the following command: **\"\n    echo 'source $HOME/.cargo/env'\n    echo\n    echo \"Run the following commands to build Redox:\"\n    echo \"cd redox\"\n    MAKE=\"make\"\n    if [[ \"$(uname)\" == \"FreeBSD\" ]]; then\n        MAKE=\"gmake\"\n        echo \"kldload fuse.ko # This loads the kernel module for FUSE\"\n    fi\n    echo \"$MAKE all\"\n    echo \"$MAKE virtualbox or qemu\"\n    echo\n    echo \"      Good luck!\"\n\n    exit\n}\n\nif [ \"$1\" == \"-h\" ] || [ \"$1\" == \"--help\" ]; then\n    usage\nelif [ \"$1\" == \"-u\" ]; then\n    git pull upstream master\n    exit\nelif [ \"$1\" == \"-s\" ]; then\n    statusCheck\n    exit\nfi\n\nhost_arch=$(uname -m)\nemulator=\"qemu\"\ndefpackman=\"apt-get\"\ndependenciesonly=false\nupdate=false\nnoninteractive=false\n\nwhile getopts \":e:p:udhys\" opt\ndo\n    case \"$opt\" in\n        e) emulator=\"$OPTARG\";;\n        p) defpackman=\"$OPTARG\";;\n        d) dependenciesonly=true;;\n        u) update=true;;\n        h) usage;;\n        y) noninteractive=true;;\n        s) statusCheck && exit;;\n        \\?) echo \"I don't know what to do with that option, try -h for help\"; exit 1;;\n    esac\ndone\n\nbanner\n\nif [ \"Darwin\" == \"$(uname -s)\" ]; then\n    echo \"Detected macOS!\"\n\n    echo \"WARNING: Building Redox OS on MacOS is not recommended, please use podman_bootstrap.sh instead.\"\n    echo \"WARNING: Our toolchain is not designed to work on MacOS and it relies on FUSE which requires kernel extensions.\"\n    echo \"WARNING: If you want to continue anyway, please wait for 3 seconds or cancel this script now!\"\n    sleep 3\nfi\n\nif [ \"$update\" == \"true\" ]; then\n    git pull upstream master\n    exit\nfi\n\nrustInstall \"$noninteractive\"\n\nif [ \"Darwin\" == \"$(uname -s)\" ]; then\n    osx \"$emulator\"\nelse\n    # Here we will use package managers to determine which operating system the user is using.\n\n    # Redox OS\n    if is_os_redox; then\n        redox \"$emulator\"\n    # SUSE and derivatives\n    elif hash 2>/dev/null zypper; then\n        suse \"$emulator\"\n    # Debian or any derivative of it\n    elif hash 2>/dev/null apt-get; then\n        ubuntu \"$emulator\" \"$noninteractive\" \"$defpackman\"\n    # Fedora\n    elif hash 2>/dev/null dnf; then\n        fedora \"$emulator\" \"$noninteractive\"\n    # Gentoo\n    elif hash 2>/dev/null emerge; then\n        gentoo \"$emulator\"\n    # Solus\n    elif hash 2>/dev/null eopkg; then\n        solus \"$emulator\"\n    # Arch Linux\n    elif hash 2>/dev/null pacman; then\n        archLinux \"$emulator\" \"$noninteractive\"\n    # FreeBSD\n    elif hash 2>/dev/null pkg; then\n        freebsd \"$emulator\"\n    # Unsupported platform\n    else\n        printf \"\\e[31;1mFatal error: \\e[0;31mUnsupported platform, please open an issue\\e[0m\\n\"\n    fi\nfi\n\ncargoInstall just 1.42.4\ncargoInstall cbindgen 0.29.0\n\nif [ \"$dependenciesonly\" = false ]; then\n    boot\nfi\n\necho \"Redox bootstrap complete!\"\n"
  },
  {
    "path": "podman/redox-base-containerfile",
    "content": "# Configuration file to install the recipe dependencies inside the Podman container\n\nFROM docker.io/library/debian:trixie\n\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends \\\n        appstream \\\n        appstream-compose \\\n        autoconf \\\n        autoconf2.69 \\\n        automake \\\n        autopoint \\\n        bison \\\n        bsdextrautils \\\n        build-essential \\\n        cmake \\\n        curl \\\n        dos2unix \\\n        doxygen \\\n        expect \\\n        file \\\n        flex \\\n        fuse3 \\\n        g++ \\\n        genisoimage \\\n        git \\\n        git-lfs \\\n        gobject-introspection \\\n        gtk-doc-tools \\\n        gtk-update-icon-cache \\\n        help2man \\\n        ipxe-qemu \\\n        intltool \\\n        libaudiofile-dev \\\n        libdbus-glib-1-dev-bin \\\n        libfuse3-dev \\\n        libgdk-pixbuf2.0-bin \\\n        libglib2.0-dev-bin \\\n        libhtml-parser-perl \\\n        librsvg2-common \\\n        libsdl1.2-dev \\\n        libsdl2-ttf-dev \\\n        lzip \\\n        m4 \\\n        make \\\n        meson \\\n        nano \\\n        nasm \\\n        ninja-build \\\n        patch \\\n        patchelf \\\n        perl \\\n        pkg-config \\\n        po4a \\\n        protobuf-compiler \\\n        qemu-system-x86 \\\n        qemu-system-arm \\\n        qemu-efi-aarch64 \\\n        python3 \\\n        python3-dev \\\n        python3-libxml2 \\\n        python3-mako \\\n        python3-venv \\\n        rsync \\\n        ruby \\\n        scons \\\n        ssh \\\n        texinfo \\\n        unifdef \\\n        unzip \\\n        wget \\\n        xdg-utils \\\n        xfonts-utils \\\n        xserver-xorg-dev \\\n        xutils-dev \\\n        xxd \\\n        zip \\\n    && if [ \"$(uname -m)\" = \"x86_64\" ]; then \\\n         apt-get install -y --no-install-recommends \\\n            libc6-dev-i386 \\\n            syslinux-utils \\\n    ; fi\n"
  },
  {
    "path": "podman/redox-gdb-containerfile",
    "content": "FROM debian:stable-backports\n\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends -t stable-backports \\\n        python3 \\\n        python3-pip \\\n        gdb \\\n        curl \\\n    && rm -rf /var/lib/apt/lists/*\n\nRUN pip3 install gdbgui --break-system-packages\n\nEXPOSE 5000\n\nENTRYPOINT [ \"gdbgui\", \"--remote\", \"--port\", \"5000\" ]\n"
  },
  {
    "path": "podman/rustinstall.sh",
    "content": "#!/usr/bin/env bash\n# This must be run outside podman build so the build/podman volume mount to /root contains all home folder changes\nset -ex\n\necho \"Installing rust...\"\ncurl \"https://sh.rustup.rs\" -sSf | sh -s -- -y --default-toolchain stable --profile minimal\n\necho \"Downloading sccache...\"\nSCCACHE_URL=\"https://github.com/mozilla/sccache/releases/download/v0.10.0/sccache-v0.10.0-$(uname -m)-unknown-linux-musl.tar.gz\"\nwget -qO- --show-progress \"${SCCACHE_URL}\" | tar -xz -C ~/.cargo/bin --strip-components=1 --wildcards '*/sccache'\n\necho \"Downloading just...\"\nJUST_URL=\"https://github.com/casey/just/releases/download/1.45.0/just-1.45.0-$(uname -m)-unknown-linux-musl.tar.gz\"\nwget -qO- --show-progress \"${JUST_URL}\" | tar -xz -C ~/.cargo/bin --wildcards 'just'\n\necho \"Downloading cbindgen...\"\nCBINDGEN_NAME=\"$( [ \"$(uname -m)\" = \"x86_64\" ] && echo \"ubuntu22.04\" || echo \"ubuntu22.04-aarch64\" )\"\nCBINDGEN_URL=\"https://github.com/mozilla/cbindgen/releases/download/0.29.0/cbindgen-${CBINDGEN_NAME}\"\nwget -qO- --show-progress \"${CBINDGEN_URL}\" > ~/.cargo/bin/cbindgen\nchmod +x ~/.cargo/bin/cbindgen\n"
  },
  {
    "path": "podman_bootstrap.sh",
    "content": "#!/usr/bin/env bash\n\n# This script setup the Redox build system with Podman\n# It install the Podman dependencies for cross-compilation\n# and download the build system configuration files\n\nset -e\n\n##########################################################\n# This function is simply a banner to introduce the script\n##########################################################\nbanner()\n{\n  echo \"|------------------------------------------|\"\n  echo \"|----- Welcome to the redox bootstrap -----|\"\n  echo \"|-------- for building with Podman --------|\"\n  echo \"|------------------------------------------|\"\n}\n\n############################################################################\n# This function takes care of installing a dependency via package manager of\n# choice for building Redox on BSDs (macOS, FreeBSD, etc.).\n# @params:    $1 package manager\n#             $2 package name\n#             $3 binary name (optional)\n############################################################################\ninstall_bsd_pkg()\n{\n    PKG_MANAGER=$1\n    PKG_NAME=$2\n    BIN_NAME=$3\n    if [ -z \"$BIN_NAME\" ]; then\n        BIN_NAME=$PKG_NAME\n    fi\n\n    BIN_LOCATION=$(which $BIN_NAME || true)\n    if [ -z \"$BIN_LOCATION\" ]; then\n        echo \"$PKG_MANAGER install $PKG_NAME\"\n        $PKG_MANAGER install \"$PKG_NAME\"\n    else\n        echo \"$BIN_NAME already exists at $BIN_LOCATION, no need to install $PKG_NAME...\"\n    fi\n}\n\ninstall_macports_pkg()\n{\n    install_bsd_pkg \"sudo port\" \"$1\" \"$2\"\n}\n\ninstall_brew_pkg()\n{\n    install_bsd_pkg \"brew\" $@\n}\n\ninstall_brew_cask_pkg()\n{\n    install_bsd_pkg \"brew cask\" $@\n}\n\ninstall_freebsd_pkg()\n{\n    install_bsd_pkg \"sudo pkg\" $@\n}\n\n###############################################################################\n# This function checks which of the supported package managers\n# is available on the macOS host.\n# If a supported package manager is found, it delegates the installing work to\n# the relevant function.\n# Otherwise this function will exit this script with an error.\n###############################################################################\nosx()\n{\n    echo \"Detected macOS!\"\n\n    if [ ! -z \"$(which brew)\" ]; then\n        osx_homebrew $@\n    elif [ ! -z \"$(which port)\" ]; then\n        osx_macports $@\n    else\n        echo \"Please install either Homebrew or MacPorts, if you wish to use this script\"\n        echo \"Re-run this script once you installed one of those package managers\"\n        echo \"Will not install, now exiting...\"\n        exit 1\n    fi\n}\n\n###############################################################################\n# This function takes care of installing all dependencies using MacPorts\n# for building Redox on macOS\n# @params:    $1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\nosx_macports()\n{\n    echo \"MacPorts detected! Now updating...\"\n    sudo port -v selfupdate\n\n    echo \"Installing missing packages...\"\n\n    install_macports_pkg \"git\"\n    install_macports_pkg \"gmake\"\n    install_macports_pkg \"curl\"\n    install_macports_pkg \"podman\"\n    install_macports_pkg \"gdb +multiarch\"\n\n    if [ \"$1\" == \"qemu\" ]; then\n        install_macports_pkg \"qemu\" \"qemu-system-x86_64\"\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        install_macports_pkg \"virtualbox\"\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n}\n\n###############################################################################\n# This function takes care of installing all dependencies using Homebrew\n# for building Redox on macOS\n# @params:    $1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\nosx_homebrew()\n{\n    echo \"Homebrew detected! Now updating...\"\n    brew update\n\n    echo \"Installing missing packages...\"\n\n    install_brew_pkg \"git\"\n    install_brew_pkg \"make\"\n    install_brew_pkg \"curl\"\n    install_brew_pkg \"podman\"\n    install_brew_pkg \"gdb\"\n\n    if [ \"$1\" == \"qemu\" ]; then\n        install_brew_pkg \"qemu\" \"qemu-system-x86_64\"\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        install_brew_pkg \"virtualbox\"\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n}\n\n###############################################################################\n# This function takes care of installing all dependencies using pkg\n# for building Redox on FreeBSD\n# @params:    $1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\nfreebsd()\n{\n    set -x\n    echo \"FreeBSD detected!\"\n    echo \"Installing missing packages...\"\n\n    install_freebsd_pkg \"git\"\n    install_freebsd_pkg \"gmake\"\n    install_freebsd_pkg \"curl\"\n    install_freebsd_pkg \"podman\"\n    install_freebsd_pkg \"gdb\"\n\n    if [ \"$1\" == \"qemu\" ]; then\n        install_freebsd_pkg \"qemu\" \"qemu-system-x86_64\"\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        install_freebsd_pkg \"virtualbox\"\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    set +x\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Arch Linux\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\narchLinux()\n{\n    echo \"Detected Arch Linux\"\n    packages=\"git make curl fuse3 fuse-overlayfs slirp4netns podman gdb\"\n    if [ \"$1\" == \"qemu\" ]; then\n        packages=\"$packages qemu-system-x86 qemu-system-arm qemu-system-riscv\"\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        packages=\"$packages virtualbox\"\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n    # Scripts should not cause a system update in order to just install a\n    #   couple of packages. If pacman -S --needed is going to fail, let it fail\n    #   and the user will figure out the issues (without updating if required)\n    #   and rerun the script.\n    #echo \"Updating system...\"\n    #sudo pacman -Syu\n\n    echo \"Installing packages $packages...\"\n    sudo pacman -S --needed $packages\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Debian-based Linux\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n# \t\t$2 the package manager to use\n###############################################################################\nubuntu()\n{\n    echo \"Detected Ubuntu/Debian\"\n    echo \"Updating system...\"\n    sudo \"$2\" update\n    echo \"Installing required packages...\"\n    sudo \"$2\" install \\\n        podman curl git make pkg-config fuse3 libfuse3-dev fuse-overlayfs slirp4netns gdb-multiarch\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            echo \"Installing QEMU...\"\n            sudo \"$2\" install qemu-system-x86 qemu-kvm\n            sudo \"$2\" install qemu-system-arm qemu-efi-aarch64\n            sudo \"$2\" install qemu-system-riscv\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            if grep '^ID=debian$' /etc/os-release > /dev/null; then\n                echo \"Virtualbox is not in the official debian packages\"\n                echo \"To install virtualbox on debian, see https://wiki.debian.org/VirtualBox\"\n                echo \"Please install VirtualBox and re-run this script,\"\n                echo \"or run with -e qemu\"\n                exit 1\n            else\n                echo \"Installing VirtualBox...\"\n                sudo \"$2\" install virtualbox\n            fi\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Fedora Linux\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\nfedora()\n{\n    echo \"Detected Fedora\"\n    if [ -z \"$(which git)\" ]; then\n        echo \"Installing git...\"\n        sudo dnf install git-all\n    fi\n\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            echo \"Installing QEMU...\"\n            sudo dnf install qemu-system-x86 qemu-system-arm \\\n            qemu-system-riscv qemu-kvm edk2-aarch64\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            echo \"Please install VirtualBox and re-run this script,\"\n            echo \"or run with -e qemu\"\n            exit 1\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    # Use rpm -q <package> to check if it's already installed\n    PKGS=$(for pkg in podman curl make fuse3 fuse3-devel fuse-overlayfs slirp4netns gdb; do rpm -q $pkg > /dev/null || echo $pkg; done)\n    # If the list of packages is not empty, install missing\n    COUNT=$(echo $PKGS | wc -w)\n    if [ $COUNT -ne 0 ]; then\n        echo \"Installing necessary build tools...\"\n        sudo dnf install $PKGS\n    fi\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# *SUSE Linux\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\nsuse()\n{\n    echo \"Detected SUSE Linux\"\n\n    packages=(\n        \"git\"\n        \"curl\"\n        \"make\"\n        \"fuse\"\n        \"fuse-overlayfs\"\n        \"slirp4netns\"\n        \"podman\"\n        \"gdb-multiarch\"\n    )\n\n    if [ -z \"$(which git)\" ]; then\n        echo \"Will install git ...\"\n        packages+=(git)\n    fi\n\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            echo \"Will install QEMU...\"\n            packages+=(qemu-x86 qemu-kvm)\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            echo \"Please install VirtualBox and re-run this script,\"\n            echo \"or run with -e qemu\"\n            exit 1\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    echo \"Installing necessary build tools...\"\n\n    # We could install all the packages in a single zypper command with:\n    #\n    #        zypper install package1 package2 package3\n    # \n    # But there is an issue with this: zypper returns a success code if at\n    # least one of the packages was correctly installed, but we need it to fail\n    # if any of the packages is missing.\n    #\n    # To confirm that the packages are available, we try to install them one by\n    # one with --dry-run.\n    # We still install all the packages in a single zypper command so that the\n    # user has to confirm only once.\n    for p in ${packages[@]}; do\n        if rpm -q \"${p}\" > /dev/null ; then\n            echo \"${p} is already installed\"\n        else\n            # Zypper shows a confirmation prompt and the \"y\" answer even with\n            # --non-interactive and --no-confirm:\n            #\n            #   1 new package to install.\n            #   Overall download size: 281.7 KiB. Already cached: 0 B.\n            #   After the operation, additional 394.6 KiB will be used.\n            #   Continue? [y/n/v/...? shows all options] (y): y\n            #\n            # That could make the user think that the package was installed,\n            # when it was only a dry run.\n            # To avoid the confusion, we hide the output unless there was an\n            # error.\n            if out=\"$(zypper --non-interactive install --no-confirm --dry-run --force-resolution ${p}  2>&1)\"  ; then\n                echo \"${p} can be installed\"\n            else\n                echo \"no\"\n                echo \"\"\n                echo \"Zypper output:\"\n                echo \"\"\n                echo \"${out}\"\n                echo \"\"\n                echo \"Could not find how to install '${p}', try running:\"\n                echo \"\"\n                echo \"     zypper install ${p}\"\n                echo \"\"\n                exit 1\n            fi\n        fi\n    done\n\n    zypper install ${packages[@]}\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Gentoo Linux\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\ngentoo()\n{\n    echo \"Detected Gentoo Linux\"\n    if [ -z \"$(which git)\" ]; then\n        echo \"Installing git...\"\n        sudo emerge dev-vcs/git\n    fi\n    if [ -z \"$(which fusermount 2>/dev/null)\" ] && [ -z \"$(which fusermount3 2>/dev/null)\" ]; then\n        echo \"Installing fuse...\"\n        sudo emerge sys-fs/fuse\n    fi\n\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            echo \"Please install QEMU and re-run this script\"\n            echo \"Step1. Add QEMU_SOFTMMU_TARGETS=\\\"x86_64\\\" to /etc/portage/make.conf\"\n            echo \"Step2. Execute \\\"sudo emerge app-emulation/qemu\\\"\"\n            exit 1\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            echo \"Please install VirtualBox and re-run this script,\"\n            echo \"or run with -e qemu\"\n            exit 1\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    if [ -z \"$(which cmake)\" ]; then\n        echo \"Installing cmake...\"\n        sudo emerge dev-util/cmake\n    fi\n    if [ -z \"$(which podman)\" ]; then\n        echo \"Please install Podman, https://wiki.gentoo.org/wiki/Podman\"\n        exit 1\n    fi\n}\n\n###############################################################################\n# This function takes care of installing all dependencies for building Redox on\n# Solus\n# @params:\t$1 the emulator to install, \"virtualbox\" or \"qemu\"\n###############################################################################\nsolus()\n{\n    echo \"Detected Solus\"\n\n    if [ \"$1\" == \"qemu\" ]; then\n        if [ -z \"$(which qemu-system-x86_64)\" ]; then\n            sudo eopkg it qemu\n        else\n            echo \"QEMU already installed!\"\n        fi\n    elif [ \"$1\" == \"virtualbox\" ]; then\n        if [ -z \"$(which virtualbox)\" ]; then\n            echo \"Please install VirtualBox and re-run this script,\"\n            echo \"or run with -e qemu\"\n            exit 1\n        else\n            echo \"VirtualBox already installed!\"\n        fi\n    else\n        echo \"Unknown emulator: $1\"\n        exit 1\n    fi\n\n    echo \"Installing necessary build tools...\"\n    # if guards are not necessary with eopkg since it does nothing if latest\n    # version is already installed\n    sudo eopkg it fuse-devel git make fuse2-devel rsync\n    if [ -z \"$(which podman)\" ]; then\n        echo \"Please install Podman\"\n        exit 1\n    fi\n}\n\n######################################################################\n# This function outlines the different options available for bootstrap\n######################################################################\nusage()\n{\n    echo \"------------------------\"\n    echo \"|Redox bootstrap script|\"\n    echo \"------------------------\"\n    echo \"Usage: ./podman_bootstrap.sh\"\n    echo \"OPTIONS:\"\n    echo\n    echo \"   -h,--help      Show this prompt\"\n    echo \"   -u [branch]    Update git repo and update rust\"\n    echo \"                  If blank defaults to master\"\n    echo \"   -e [emulator]  Install specific emulator, virtualbox or qemu\"\n    echo \"   -p [package    Choose an Ubuntu package manager, apt-fast or\"\n    echo \"       manager]   aptitude\"\n    echo \"   -d             Only install the dependencies, skip boot step\"\n    echo \"EXAMPLES:\"\n    echo\n    echo \"./podman_bootstrap.sh -e qemu\"\n    exit\n}\n\n#############################################################################\n# This function takes care of everything associated to rust, and the version\n# manager that controls it, it can install rustup and uninstall multirust as\n# well as making sure that the correct version of rustc is selected by rustup\n# @params:\t$1 install non-interactively, boolean\n#############################################################################\nrustInstall()\n{\n    noninteractive=$1\n    # Check to see if multirust is installed, we don't want it messing with rustup\n    # In the future we can probably remove this but I believe it's good to have for now\n    if [ -e /usr/local/lib/rustlib/uninstall.sh ] ; then\n        echo \"It appears that multirust is installed on your system.\"\n        echo \"This tool has been deprecated by the maintainer, and will cause issues.\"\n        echo \"This script can remove multirust from your system if you wish.\"\n        printf \"Uninstall multirust (y/N):\"\n        read multirust\n        if echo \"$multirust\" | grep -iq \"^y\" ;then\n            sudo /usr/local/lib/rustlib/uninstall.sh\n        else\n            echo \"Please manually uninstall multirust and any other versions of rust, then re-run bootstrap.\"\n            exit 1\n        fi\n    fi\n    # If rustup is not installed we should offer to install it for them\n    if [ -z \"$(which rustup)\" ]; then\n        rustup_options=\"--default-toolchain stable\"\n        echo \"You do not have rustup installed.\"\n        if [ \"$noninteractive\" = true ]; then\n            rustup=\"y\"\n            rustup_options+=\" -y\"\n        else\n            echo \"We HIGHLY recommend using rustup.\"\n            echo \"Would you like to install it now?\"\n            echo \"*WARNING* this involves a 'curl | sh' style command\"\n            printf \"(y/N): \"\n            read rustup\n        fi\n        if echo \"$rustup\" | grep -iq \"^y\" ;then\n            #install rustup\n            curl https://sh.rustup.rs -sSf | sh -s -- $rustup_options\n            # You have to add the rustup variables to the $PATH\n            echo \"export PATH=\\\"\\$HOME/.cargo/bin:\\$PATH\\\"\" >> ~/.bashrc\n            # source the variables so that we can execute rustup commands in the current shell\n            source ~/.cargo/env\n        else\n            echo \"Rustup will not be installed!\"\n        fi\n    fi\n    if [ -z \"$(which rustc)\" ]; then\n        echo \"Rust is not installed\"\n        echo \"Please either run the script again, accepting rustup install\"\n        echo \"or install rustc stable manually (not recommended) via:\"\n        echo \"\\#curl -sSf https://static.rust-lang.org/rustup.sh | sh -s -- --channel=stable\"\n        exit 1\n    else\n        echo \"Your Rust install looks good!\"\n    fi\n}\n\n###########################################################################\n# This function is the main logic for the bootstrap; it clones the git repo\n# then it installs the dependent packages\n###########################################################################\nboot()\n{\n    echo \"Cloning gitlab repo...\"\n    git clone https://gitlab.redox-os.org/redox-os/redox.git --origin upstream\n    echo \"Creating .config with PODMAN_BUILD=1\"\n    echo 'PODMAN_BUILD?=1' > redox/.config\n    if [[ \"$(uname -m)\" == \"arm64\" ]]; then\n        echo \"Appending .config with ARCH=aarch64\"\n        echo 'ARCH=aarch64' >> redox/.config\n    fi\n    echo \"Cleaning up...\"\n    rm podman_bootstrap.sh\n    echo\n    echo \"---------------------------------------\"\n    echo \"Well it looks like you are ready to go!\"\n    echo \"---------------------------------------\"\n    echo \"The file redox/.config was created with PODMAN_BUILD=1.\"\n    echo \"If you need a much quicker installation, run: \"\n    echo \"  echo REPO_BINARY=1 >> redox/.config\"\n    echo\n    echo \"Run the following commands to build Redox using Podman:\"\n    echo\n    echo \"cd redox\"\n    MAKE=\"make\"\n    if [[ \"$(uname)\" == \"FreeBSD\" ]]; then\n        MAKE=\"gmake\"\n    fi\n    echo \"$MAKE all\"\n    echo \"$MAKE $emulator\"\n    echo\n    echo \"      Good luck!\"\n\n    exit\n}\n\nif [ \"$1\" == \"-h\" ] || [ \"$1\" == \"--help\" ]; then\n    usage\nelif [ \"$1\" == \"-u\" ]; then\n    git pull upstream master\n    exit\nfi\n\nemulator=\"qemu\"\ndefpackman=\"apt-get\"\ndependenciesonly=false\nupdate=false\nwhile getopts \":e:p:udhs\" opt\ndo\n    case \"$opt\" in\n        e) emulator=\"$OPTARG\";;\n        p) defpackman=\"$OPTARG\";;\n        d) dependenciesonly=true;;\n        u) update=true;;\n        h) usage;;\n        \\?) echo \"I don't know what to do with that option, try -h for help\"; exit 1;;\n    esac\ndone\n\nbanner\n\nrustInstall \"$noninteractive\"\n\nif [ \"$update\" == \"true\" ]; then\n    git pull upstream master\n    exit\nfi\n\nif [ \"Darwin\" == \"$(uname -s)\" ]; then\n    osx \"$emulator\"\nelse\n    # Here we will use package managers to determine which operating system the user is using.\n\n    # SUSE and derivatives\n    if hash 2>/dev/null zypper; then\n        suse \"$emulator\"\n    # Debian or any derivative of it\n    elif hash 2>/dev/null apt-get; then\n        ubuntu \"$emulator\" \"$defpackman\"\n    # Fedora\n    elif hash 2>/dev/null dnf; then\n        fedora \"$emulator\"\n    # Gentoo\n    elif hash 2>/dev/null emerge; then\n        gentoo \"$emulator\"\n    # Solus\n    elif hash 2>/dev/null eopkg; then\n        solus \"$emulator\"\n    # Arch Linux\n    elif hash 2>/dev/null pacman; then\n        archLinux \"$emulator\"\n    # FreeBSD\n    elif hash 2>/dev/null pkg; then\n        freebsd \"$emulator\"\n    # Unsupported platform\n    else\n        printf \"\\e[31;1mFatal error: \\e[0;31mUnsupported platform, please open an issue\\e[0m\\n\"\n    fi\nfi\n\nif [ \"$dependenciesonly\" = false ]; then\n    boot\nfi\n\necho \"Redox bootstrap complete!\"\n"
  },
  {
    "path": "recipes/archives/lz4/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/lz4/lz4/releases/download/v1.10.0/lz4-1.10.0.tar.gz\"\nblake3 = \"3e69fd475e7852e17594985528b5232afeba7d3d56cfebe2e89071768b2ab36a\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\nexport CPPFLAGS=\"${CPPFLAGS} -D_REDOX\"\n\n${COOKBOOK_MAKE} prefix=\"/usr\"\n${COOKBOOK_MAKE} install DESTDIR=\"${COOKBOOK_STAGE}\" prefix=\"/usr\"\n\"\"\"\n"
  },
  {
    "path": "recipes/archives/lz4/redox.patch",
    "content": "diff '--color=auto' -ruwN source/programs/util.h source-new/programs/util.h\n--- source/programs/util.h\t2024-07-21 13:29:49.000000000 -0400\n+++ source-new/programs/util.h\t2024-12-13 02:21:03.032769559 -0500\n@@ -52,6 +52,9 @@\n #include <time.h>         /* time */\n #include <limits.h>       /* INT_MAX */\n #include <errno.h>\n+#if defined(_REDOX)\n+#  include <sys/time.h>  /* utimes */\n+#endif\n \n \n \n@@ -239,12 +242,20 @@\n         timebuf.modtime = statbuf->st_mtime;\n         res += utime(filename, &timebuf);  /* set access and modification times */\n #else\n+        #if defined(_REDOX)\n+            struct timeval timebuf[2];\n+            memset(timebuf, 0, sizeof(timebuf));\n+            timebuf[0].tv_usec = UTIME_NOW;\n+            timebuf[1].tv_sec = statbuf->st_mtime;\n+            res += utimes(filename, timebuf);\n+        #else\n         struct timespec timebuf[2];\n         memset(timebuf, 0, sizeof(timebuf));\n         timebuf[0].tv_nsec = UTIME_NOW;\n         timebuf[1].tv_sec = statbuf->st_mtime;\n         res += utimensat(AT_FDCWD, filename, timebuf, 0);  /* set access and modification times */\n #endif\n+#endif\n     }\n \n #if !defined(_WIN32)\n"
  },
  {
    "path": "recipes/archives/zstd/01_redox.patch",
    "content": "diff -ruwN source/programs/platform.h source-new/programs/platform.h\r\n--- source/programs/platform.h\t2025-02-19 07:04:24.000000000 +0700\r\n+++ source-new/programs/platform.h\t2025-07-21 22:52:07.716447723 +0700\r\n@@ -109,6 +109,11 @@\r\n #endif   /* PLATFORM_POSIX_VERSION */\r\n \r\n \r\n+#if defined(__redox__)\r\n+/* TODO: AT_FDCWD && utimensat must be defined to conform _POSIX_VERSION */\r\n+#   define PLATFORM_POSIX_VERSION 1\r\n+#endif\r\n+\r\n #if PLATFORM_POSIX_VERSION > 1\r\n    /* glibc < 2.26 may not expose struct timespec def without this.\r\n     * See issue #1920. */\r\n"
  },
  {
    "path": "recipes/archives/zstd/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz\"\npatches = [\n    \"01_redox.patch\"\n]\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n# TODO: fPIC is the default on linux but not on redox and\n#       required by llvm21 as zstd statically linked there\nexport CPPFLAGS=\"$CPPFLAGS -fPIC\"\n${COOKBOOK_MAKE}\n${COOKBOOK_MAKE} install DESTDIR=\"${COOKBOOK_STAGE}\" prefix=\"/usr\"\n\"\"\"\n"
  },
  {
    "path": "recipes/artwork/pop-wallpapers/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/wallpapers\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/wallpapers\ncp -rv \"${COOKBOOK_SOURCE}\"/original/* \"${COOKBOOK_STAGE}\"/usr/share/wallpapers\n\"\"\"\n"
  },
  {
    "path": "recipes/artwork/ubuntu-wallpapers/recipe.toml",
    "content": "[source]\ntar = \"https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/ubuntu-wallpapers/23.10.4/ubuntu-wallpapers_23.10.4.orig.tar.gz\"\nblake3 = \"1e479d0aa48fe3f2961a2dac28c3ed397a29616cf6e7d73f5ceb6fabfd6449e1\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/wallpapers\ncp -rv \"${COOKBOOK_SOURCE}\"/ubuntu-wallpapers-23.10.4/*.{jpg,png} \"${COOKBOOK_STAGE}\"/usr/share/wallpapers\n\"\"\"\n"
  },
  {
    "path": "recipes/core/base/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/base.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\nfor package in audiod ipcd ptyd; do\n    \"${COOKBOOK_CARGO}\" build \\\n        --manifest-path \"${COOKBOOK_SOURCE}/${package}/Cargo.toml\" \\\n        ${build_flags}\n    cp -v \\\n        \"target/${TARGET}/${build_type}/${package}\" \\\n        \"${COOKBOOK_STAGE}/usr/bin/${package}\"\ndone\n\n\"${COOKBOOK_CARGO}\" build \\\n    --manifest-path \"${COOKBOOK_SOURCE}/netstack/Cargo.toml\" \\\n    ${build_flags}\ncp -v \\\n    \"target/${TARGET}/${build_type}/smolnetd\" \\\n    \"${COOKBOOK_STAGE}/usr/bin/smolnetd\"\n\n# Drivers that are built on all architectures, and NOT in drivers-initfs\nBINS=(\n    e1000d\n    ihdad\n    ihdgd\n    ixgbed\n    pcid\n    pcid-spawner\n    rtl8139d\n    rtl8168d\n    usbctl\n    usbhidd\n    usbhubd\n    usbscsid\n    virtio-netd\n    xhcid\n    inputd\n    redoxerd\n)\n\n# Add additional drivers to the list to build, that are not in drivers-initfs\n# depending on the target architecture\ncase \"${TARGET}\" in\n    i586-unknown-redox | i686-unknown-redox | x86_64-unknown-redox)\n        BINS+=(ac97d bgad sb16d vboxd)\n        ;;\n    *)\n        ;;\nesac\n\n#Build each driver in the list\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\" \"${COOKBOOK_STAGE}/usr/lib/drivers\"\nexport CARGO_PROFILE_RELEASE_OPT_LEVEL=s\nexport CARGO_PROFILE_RELEASE_PANIC=abort\n\"${COOKBOOK_CARGO}\" build ${build_flags} \\\n    --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n    $(for bin in \"${BINS[@]}\"; do echo \"-p\" \"${bin}\"; done)\nfor bin in \"${BINS[@]}\"\ndo\n    if [[ \"${bin}\" == \"inputd\" || \"${bin}\" == \"pcid\" || \"${bin}\" == \"pcid-spawner\" || \"${bin}\" == \"redoxerd\" ]]; then\n        cp -v \"target/${TARGET}/${build_type}/${bin}\" \"${COOKBOOK_STAGE}/usr/bin\"\n    else\n        cp -v \"target/${TARGET}/${build_type}/${bin}\" \"${COOKBOOK_STAGE}/usr/lib/drivers\"\n    fi\ndone\n\nmkdir -pv \"${COOKBOOK_STAGE}/lib/pcid.d\"\n${FIND} \"${COOKBOOK_SOURCE}/drivers\" -maxdepth 3 -type f -name 'config.toml' | while read conf\ndo\n    driver=\"$(basename \"$(dirname \"$conf\")\")\"\n    cp -v \"$conf\" \"${COOKBOOK_STAGE}/lib/pcid.d/$driver.toml\"\ndone\n\"\"\"\n"
  },
  {
    "path": "recipes/core/base-initfs/recipe.toml",
    "content": "[source]\nsame_as = \"../base\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n  \"redoxfs\",\n]\nscript = \"\"\"\nBINS=(\n    init\n    logd\n    ramfs\n    randd\n    zerod\n\n    acpid\n    fbbootlogd\n    fbcond\n    hwd\n    inputd\n    lived\n    nvmed\n    pcid\n    pcid-spawner\n    rtcd\n    vesad\n)\n\nvirt_bins()\n{\n    BINS+=(virtio-blkd virtio-gpud)\n}\n\nx86_common_bins()\n{\n    BINS+=(ahcid ided ps2d vesad)\n    virt_bins\n}\n\naarch64_bins()\n{\n    case \"${BOARD}\" in\n        raspi3b*)\n            BINS+=(bcm2835-sdhcid)\n        ;;\n        *)\n        #qemu-virt\n            virt_bins\n        ;;\n    esac\n}\n\ncase \"${TARGET}\" in\n    i586-unknown-redox | i686-unknown-redox)\n        x86_common_bins\n        ;;\n    x86_64-unknown-redox)\n        x86_common_bins\n        ;;\n    aarch64-unknown-redox)\n        aarch64_bins\n        ;;\n    *)\n        ;;\nesac\n\nrm -rf \"${COOKBOOK_BUILD}/initfs\"\nmkdir -p \"${COOKBOOK_BUILD}/initfs/lib/init.d\"\n\ncp \"${COOKBOOK_SOURCE}/init.d\"/* \"${COOKBOOK_BUILD}/initfs/lib/init.d/\"\n\nmkdir -pv \"${COOKBOOK_BUILD}/initfs/lib/pcid.d\"\ncp -v \"${COOKBOOK_SOURCE}/drivers/initfs.toml\" \"${COOKBOOK_BUILD}/initfs/lib/pcid.d/initfs.toml\"\n\nexport CARGO_PROFILE_RELEASE_OPT_LEVEL=s\nexport CARGO_PROFILE_RELEASE_PANIC=abort\n\"${COOKBOOK_CARGO}\" build ${build_flags} \\\n    --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n    $(for bin in \"${BINS[@]}\"; do echo \"-p\" \"${bin}\"; done)\n\nmkdir -pv \"${COOKBOOK_BUILD}/initfs/bin\" \"${COOKBOOK_BUILD}/initfs/lib/drivers\"\nfor bin in \"${BINS[@]}\"\ndo\n    case \"${bin}\" in\n      init | logd | ramfs | randd | zerod | pcid | pcid-spawner | fbbootlogd | fbcond | inputd | vesad | lived | ps2d | acpid | bcm2835-sdhcid | rtcd | hwd)\n        cp -v \"target/${TARGET}/${build_type}/${bin}\" \"${COOKBOOK_BUILD}/initfs/bin\"\n        ;;\n      *)\n        cp -v \"target/${TARGET}/${build_type}/${bin}\" \"${COOKBOOK_BUILD}/initfs/lib/drivers\"\n        ;;\n    esac\ndone\n\ncp \"${COOKBOOK_SYSROOT}/usr/bin/redoxfs\" \"${COOKBOOK_BUILD}/initfs/bin\"\n\nARCH=\"$(echo \"${GNU_TARGET}\" | cut -d - -f1)\"\nRUSTFLAGS=\"$RUSTFLAGS -Ctarget-feature=+crt-static\" cargo \\\n    -Zbuild-std=core,alloc,compiler_builtins \\\n    -Zbuild-std-features=compiler-builtins-mem build \\\n    --target \"${TARGET}\" \\\n    --manifest-path \"${COOKBOOK_SOURCE}/bootstrap/Cargo.toml\" \\\n    --release \\\n    --target-dir \"${COOKBOOK_BUILD}\"\n\"${GNU_TARGET}-ld\" \\\n    -o \"${COOKBOOK_BUILD}/bootstrap\" \\\n    --gc-sections \\\n    -T \"${COOKBOOK_SOURCE}/bootstrap/src/${ARCH}.ld\" \\\n    -z max-page-size=4096 \\\n    \"${COOKBOOK_BUILD}/${TARGET}/release/libbootstrap.a\"\n\nenv -u CARGO -u RUSTFLAGS cargo run --manifest-path \"${COOKBOOK_SOURCE}/initfs/tools/Cargo.toml\" --bin redox-initfs-ar -- \"${COOKBOOK_BUILD}/initfs\" \"${COOKBOOK_BUILD}/bootstrap\" -o \"${COOKBOOK_BUILD}/initfs.img\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/lib/boot\"\ncp \"${COOKBOOK_BUILD}/initfs.img\" \"${COOKBOOK_STAGE}/usr/lib/boot/initfs\"\n\"\"\"\n"
  },
  {
    "path": "recipes/core/binutils/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/binutils.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/core/bootloader/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/bootloader.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nOUTDIR=\"${COOKBOOK_BUILD}\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/lib/boot\"\n\nfunction bootloader {\n    export TARGET=\"$1\"\n    src=\"$2\"\n    dst=\"$3\"\n    \"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\" -f \"${COOKBOOK_SOURCE}/Makefile\" -C \"${OUTDIR}\" \"${OUTDIR}/${src}\"\n    cp -v \"${OUTDIR}/${src}\" \"${COOKBOOK_STAGE}/usr/lib/boot/${dst}\"\n}\n\nARCH=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n\n# Build BIOS bootloader for supported architectures\nif [ \"${ARCH}\" == \"i586\" -o \"${ARCH}\" == \"i686\" -o \"${ARCH}\" == \"x86_64\" ]\nthen\n    bootloader \"x86-unknown-none\" bootloader.bin bootloader.bios\n    bootloader \"x86-unknown-none\" bootloader-live.bin bootloader-live.bios\nfi\n\n# Build UEFI bootloader for supported architectures\nif [ \"${ARCH}\" == \"aarch64\" -o \"${ARCH}\" == \"x86_64\" -o \"${ARCH}\" == \"riscv64gc\" ]\nthen\n    bootloader \"${ARCH}-unknown-uefi\" bootloader.efi bootloader.efi\n    bootloader \"${ARCH}-unknown-uefi\" bootloader-live.efi bootloader-live.efi\nfi\n\"\"\"\n"
  },
  {
    "path": "recipes/core/contain/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/contain.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/core/coreutils/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/coreutils.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/core/dash/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/dash.git\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n./autogen.sh\n./configure \\\n    --host=\"${TARGET}\" \\\n    --prefix=\"\" \\\n    --enable-static \\\n    cross_compiling=yes\n# See https://stackoverflow.com/questions/4247068/sed-command-with-i-option-failing-on-mac-but-works-on-linux.\nsed -i'' -e 's|#define HAVE_GETRLIMIT 1|/* #undef HAVE_GETRLIMIT */|g' config.h\n# Skip configure\nCOOKBOOK_CONFIGURE=\"true\"\nCOOKBOOK_CONFIGURE_FLAGS=()\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/core/extrautils/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/extrautils.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"xz\"\n]\nscript = \"\"\"\n# TODO: Can't be linked correctly yet\n# DYNAMIC_INIT\n\nif [ \"${COOKBOOK_DYNAMIC}\" != \"1\" ]; then\n    install_flags+=\" --features=static\"\nfi\n\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/core/findutils/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/findutils.git\"\n\n[build]\ntemplate = \"cargo\"\ncargoflags = [\n    \"--bin find\"\n]\n"
  },
  {
    "path": "recipes/core/installer/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/installer.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/core/ion/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/ion.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n# Must be statically linked\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/core/kernel/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/kernel.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmake -f ${COOKBOOK_SOURCE}/Makefile\nmkdir -pv \"${COOKBOOK_STAGE}/usr/lib/boot\"\ncp -v kernel \"${COOKBOOK_STAGE}/usr/lib/boot\"\n\"\"\"\n"
  },
  {
    "path": "recipes/core/netdb/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/netdb.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncp -rv \"${COOKBOOK_SOURCE}/\"* \"${COOKBOOK_STAGE}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/core/netutils/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/netutils.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/core/pkgar/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/pkgar.git\"\n\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"pkgar\",\n    \"pkgar-keys\",\n]\ncargoflags = [\n    \"--features cli\"\n]\n"
  },
  {
    "path": "recipes/core/pkgutils/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/pkgutils.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n# Must be statically linked\nCOOKBOOK_CARGO_PATH=pkg-cli\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/core/profiled/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/profiled.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n# Must be statically linked\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/core/redoxfs/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/redoxfs.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n# Must be statically linked\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/core/relibc/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/relibc.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n# obscure crash if jobs number is too much\nCOOKBOOK_MAKE_JOBS=\"$(( ${COOKBOOK_MAKE_JOBS} > 8 ? 8 : ${COOKBOOK_MAKE_JOBS} ))\"\n\n# rustup workaround https://github.com/rust-lang/rustup/issues/988\nif [ \"${COOKBOOK_HOST_SYSROOT}\" = \"/usr\" ]; then\nif command -v rustup >/dev/null 2>&1; then\n    pushd ${COOKBOOK_SOURCE}\n    ${RUSTUP:-rustup} install\n    popd\nfi\nfi\n\nexport CARGO=${CARGO:-env -u CARGO cargo}\n\"${COOKBOOK_MAKE}\" \\\n    -C \"${COOKBOOK_SOURCE}\" \\\n    -j\"${COOKBOOK_MAKE_JOBS}\" \\\n    DESTDIR=\"${COOKBOOK_STAGE}/usr\" \\\n    install\n\"\"\"\n"
  },
  {
    "path": "recipes/core/strace/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/strace-redox.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/core/userutils/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/userutils.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\ncp -rv \"${COOKBOOK_SOURCE}/res\" \"${COOKBOOK_STAGE}/etc\"\nln -s id \"${COOKBOOK_STAGE}/usr/bin/whoami\"\n\"\"\"\n"
  },
  {
    "path": "recipes/core/uutils/recipe.toml",
    "content": "# TODO Fix coreutils i18n/l10n behavior on Redox\n# TODO Fix locale init bug on aarch64 before removing patches\n[source]\ngit = \"https://github.com/uutils/coreutils\"\nrev = \"0.7.0\"\npatches = [\n  \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n# TODO: upstream changes, consider using feat_require_unix_core if relibc is ready?\nCARGO_PROFILE_RELEASE_LTO=thin cookbook_cargo --no-default-features --features feat_os_unix_redox,kill --bin coreutils\n\nBINS=(\n    '['\n    b2sum\n    b3sum\n    base32\n    base64\n    basename\n    basenc\n    cat\n    chmod\n    cksum\n    comm\n    cp\n    csplit\n    cut\n    date\n    dd\n    #df not working, use redox coreutils\n    dir\n    dircolors\n    dirname\n    du\n    echo\n    env\n    expand\n    expr\n    factor\n    false\n    fmt\n    fold\n    hashsum\n    head\n    join\n    install\n    kill\n    link\n    ln\n    ls\n    md5sum\n    mkdir\n    mktemp\n    more\n    mv\n    nl\n    nproc\n    numfmt\n    od\n    paste\n    pr\n    printenv\n    printf\n    ptx\n    pwd\n    readlink\n    realpath\n    rm\n    rmdir\n    seq\n    sha1sum\n    sha224sum\n    sha256sum\n    sha3-224sum\n    sha3-256sum\n    sha3-384sum\n    sha3-512sum\n    sha384sum\n    sha3sum\n    sha512sum\n    shake128sum\n    shake256sum\n    shred\n    shuf\n    sleep\n    sort\n    split\n    stat\n    sum\n    tac\n    tail\n    tee\n    test\n    touch\n    tr\n    true\n    truncate\n    tsort\n    unexpand\n    uname\n    uniq\n    unlink\n    vdir\n    wc\n    yes\n)\n\nfor bin in \"${BINS[@]}\"\ndo\n  ln -sv coreutils \"${COOKBOOK_STAGE}/usr/bin/$bin\"\ndone\n\"\"\"\n"
  },
  {
    "path": "recipes/core/uutils/redox.patch",
    "content": "diff --git a/Cargo.toml b/Cargo.toml\nindex b0015fa6f..cfb2b1b30 100644\n--- a/Cargo.toml\n+++ b/Cargo.toml\n@@ -326,6 +326,7 @@ feat_os_unix_redox = [\n   \"feat_common_core\",\n   #\n   \"chmod\",\n+  \"nproc\",\n   \"stat\",\n   \"uname\",\n ]\ndiff --git a/src/uucore/src/lib/features/fs.rs b/src/uucore/src/lib/features/fs.rs\nindex fd1f30303..c508f6b9b 100644\n--- a/src/uucore/src/lib/features/fs.rs\n+++ b/src/uucore/src/lib/features/fs.rs\n@@ -13,7 +13,7 @@ use libc::{\n     S_IRUSR, S_ISGID, S_ISUID, S_ISVTX, S_IWGRP, S_IWOTH, S_IWUSR, S_IXGRP, S_IXOTH, S_IXUSR,\n     mkfifo, mode_t,\n };\n-#[cfg(all(unix, not(target_os = \"redox\")))]\n+#[cfg(unix)]\n pub use libc::{major, makedev, minor};\n use std::collections::HashSet;\n use std::collections::VecDeque;\n@@ -849,24 +849,6 @@ pub fn make_fifo(path: &Path) -> std::io::Result<()> {\n     }\n }\n \n-// Redox's libc appears not to include the following utilities\n-\n-#[cfg(target_os = \"redox\")]\n-pub fn major(dev: libc::dev_t) -> libc::c_uint {\n-    (((dev >> 8) & 0xFFF) | ((dev >> 32) & 0xFFFFF000)) as _\n-}\n-\n-#[cfg(target_os = \"redox\")]\n-pub fn minor(dev: libc::dev_t) -> libc::c_uint {\n-    ((dev & 0xFF) | ((dev >> 12) & 0xFFFFF00)) as _\n-}\n-\n-#[cfg(target_os = \"redox\")]\n-pub fn makedev(maj: libc::c_uint, min: libc::c_uint) -> libc::dev_t {\n-    let [maj, min] = [maj as libc::dev_t, min as libc::dev_t];\n-    (min & 0xff) | ((maj & 0xfff) << 8) | ((min & !0xff) << 12) | ((maj & !0xfff) << 32)\n-}\n-\n #[cfg(test)]\n mod tests {\n     // Note this useful idiom: importing names from outer (for mod tests) scope.\ndiff --git a/src/uucore/src/lib/mods/locale.rs b/src/uucore/src/lib/mods/locale.rs\nindex e7d05f4c7..d86e51e98 100644\n--- a/src/uucore/src/lib/mods/locale.rs\n+++ b/src/uucore/src/lib/mods/locale.rs\n@@ -212,10 +212,11 @@ fn init_localization(\n         }\n     };\n \n-    LOCALIZER.with(|lock| {\n+    // TODO: In aarch64 redox OS, this lock (once cell) is already initialized out of nothing\n+    let _ = LOCALIZER.with(|lock| {\n         lock.set(loc)\n             .map_err(|_| LocalizationError::Bundle(\"Localizer already initialized\".into()))\n-    })?;\n+    });\n     Ok(())\n }\n \n@@ -431,10 +432,12 @@ pub fn setup_localization(p: &str) -> Result<(), LocalizationError> {\n         let english_bundle = create_english_bundle_from_embedded(&default_locale, p)?;\n         let localizer = Localizer::new(english_bundle);\n \n-        LOCALIZER.with(|lock| {\n+        // TODO: In aarch64 redox OS, this lock (once cell) is already initialized out of nothing\n+        // TODO: When this code is used? Patching for keep sake\n+        let _ = LOCALIZER.with(|lock| {\n             lock.set(localizer)\n                 .map_err(|_| LocalizationError::Bundle(\"Localizer already initialized\".into()))\n-        })?;\n+        });\n     }\n     LOCALIZER_IS_SET.with(|f| f.set(true));\n     Ok(())\n"
  },
  {
    "path": "recipes/demos/cairo-demo/cairo-demo.c",
    "content": "#include <stdint.h>\n#include <math.h>\n#include <stdlib.h>\n#include <cairo/cairo.h>\n#include <orbital.h>\n\n#ifndef M_PI\n#define M_PI 3.14159265\n#endif\n\nstatic int width = 800;\nstatic int height = 600;\n\nstatic void\ntravel_path (cairo_t *cr)\n{\n\n  cairo_pattern_t *pat;\n\n  pat = cairo_pattern_create_linear (0.0, 0.0,  0.0, 256.0);\n  cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 1);\n  cairo_pattern_add_color_stop_rgba (pat, 0, 1, 1, 1, 1);\n  cairo_rectangle (cr, 0, 0, 256, 256);\n  cairo_set_source (cr, pat);\n  cairo_fill (cr);\n  cairo_pattern_destroy (pat);\n\n  pat = cairo_pattern_create_radial (115.2, 102.4, 25.6,\n                                    102.4,  102.4, 128.0);\n  cairo_pattern_add_color_stop_rgba (pat, 0, 1, 1, 1, 1);\n  cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 1);\n  cairo_set_source (cr, pat);\n  cairo_arc (cr, 128.0, 128.0, 76.8, 0, 2 * M_PI);\n  cairo_fill (cr);\n  cairo_pattern_destroy (pat);\n\n\n  double x         = 305.6,        /* parameters like cairo_rectangle */\n        y         = 25.6,\n        width         = 204.8,\n        height        = 204.8,\n        aspect        = 1.0,     /* aspect ratio */\n        corner_radius = height / 10.0;   /* and corner curvature radius */\n\n  double radius = corner_radius / aspect;\n  double degrees = M_PI / 180.0;\n\n  cairo_new_sub_path (cr);\n  cairo_arc (cr, x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees);\n  cairo_arc (cr, x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees);\n  cairo_arc (cr, x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees);\n  cairo_arc (cr, x + radius, y + radius, radius, 180 * degrees, 270 * degrees);\n  cairo_close_path (cr);\n\n  cairo_set_source_rgb (cr, 0.5, 0.5, 1);\n  cairo_fill_preserve (cr);\n  cairo_set_source_rgba (cr, 0.5, 0, 0, 0.5);\n  cairo_set_line_width (cr, 10.0);\n  cairo_stroke (cr);\n\n\n  double xc = 128.0;\n  double yc = 128.0;\n  radius = 100.0;\n  double angle1 = 45.0  * (M_PI/180.0);  /* angles are specified */\n  double angle2 = 180.0 * (M_PI/180.0);  /* in radians           */\n\n  cairo_set_line_width (cr, 10.0);\n  cairo_arc (cr, xc, yc, radius, angle1, angle2);\n  cairo_stroke (cr);\n\n  /* draw helping lines */\n  cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);\n  cairo_set_line_width (cr, 6.0);\n\n  cairo_arc (cr, xc, yc, 10.0, 0, 2*M_PI);\n  cairo_fill (cr);\n\n  cairo_arc (cr, xc, yc, radius, angle1, angle1);\n  cairo_line_to (cr, xc, yc);\n  cairo_arc (cr, xc, yc, radius, angle2, angle2);\n  cairo_line_to (cr, xc, yc);\n  cairo_stroke (cr);\n}\n\nstatic void \ndraw (cairo_surface_t *surface)\n{\n  cairo_t *cr;\n  cr = cairo_create (surface);\n  travel_path (cr);\n  cairo_destroy (cr);\n}\n\nint\nmain(int argc, char *argv[])\n{\n  void * window = orb_window_new(-1, -1, width, height, \"CairoDemo\");\n  \n  //Cairo\n  uint32_t * frame_data = orb_window_data(window);\n  cairo_surface_t *surface = cairo_image_surface_create_for_data((uint8_t*) frame_data, CAIRO_FORMAT_ARGB32, width, height, cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width));\n  cairo_create(surface);\n  draw (surface);\n\n  orb_window_sync(window);\n\n  char running = 1;\n  while (running) {\n   void * event_iter = orb_window_events(window);\n\n   OrbEventOption event_option;\n   do {\n     event_option = orb_events_next(event_iter);\n     switch (event_option.tag) {\n       case OrbEventOption_Quit:\n         running = 0;\n         break;\n       default:\n         break;\n     }\n   } while (running && event_option.tag != OrbEventOption_None);\n\n   orb_events_destroy(event_iter);\n  }\n  orb_window_destroy(window);\n  return 0;             /* ANSI C requires main to return int. */\n}\n\n"
  },
  {
    "path": "recipes/demos/cairo-demo/recipe.toml",
    "content": "# source is part of cookbook\n\n[build]\ndependencies = [\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"liborbital\",\n    \"libpng\",\n    \"pixman\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\n\"${CXX}\" \\\n    $(\"${PKG_CONFIG}\" --cflags cairo) \\\n    \"${COOKBOOK_RECIPE}/cairo-demo.c\" \\\n    -o cairo-demo \\\n    -static \\\n    $(\"${PKG_CONFIG}\" --libs cairo) \\\n    -lorbital\nmkdir -pv \"${COOKBOOK_STAGE}/bin\"\ncp -v \"cairo-demo\" \"${COOKBOOK_STAGE}/bin/cairo-demo\"\n\"\"\"\n"
  },
  {
    "path": "recipes/demos/cmatrix/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/abishekvashok/cmatrix\"\nscript = \"\"\"\nautoreconf -i\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncursesw\"\n]\nscript = \"\"\"\nexport LIBS=\"-lncursesw\"\n\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --without-fonts\n)\n\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\n\nsed -i -e 's|#define USE_TIOCSTI 1|/* #undef USE_TIOCSTI */|g' config.h\n\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" install DESTDIR=\"${COOKBOOK_STAGE}\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"terminfo\"\n]"
  },
  {
    "path": "recipes/demos/cpal/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/cpal.git\"\nbranch = \"redox\"\nupstream = \"https://github.com/tomaka/cpal.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_examples beep\n\"\"\"\n"
  },
  {
    "path": "recipes/demos/dynamic-example/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/dynamic-example.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\n\"\"\""
  },
  {
    "path": "recipes/demos/exampled/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/exampled.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/demos/gears/gears.c",
    "content": "/* gears.c */\n\n/*\n * 3-D gear wheels.  This program is in the public domain.\n *\n * Brian Paul\n */\n\n/* Conversion to GLUT by Mark J. Kilgard */\n\n#include <math.h>\n#include <stdlib.h>\n#include <GL/gl.h>\n#include <GL/glu.h>\n#include <GL/osmesa.h>\n#include <orbital.h>\n#include <stdio.h>\n\n#ifndef M_PI\n#define M_PI 3.14159265\n#endif\n\n/**\n\n  Draw a gear wheel.  You'll probably want to call this function when\n  building a display list since we do a lot of trig here.\n\n  Input:  inner_radius - radius of hole at center\n          outer_radius - radius at center of teeth\n          width - width of gear\n          teeth - number of teeth\n          tooth_depth - depth of tooth\n\n **/\n\nstatic void\ngear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,\n  GLint teeth, GLfloat tooth_depth)\n{\n  GLint i;\n  GLfloat r0, r1, r2;\n  GLfloat angle, da;\n  GLfloat u, v, len;\n\n  r0 = inner_radius;\n  r1 = outer_radius - tooth_depth / 2.0;\n  r2 = outer_radius + tooth_depth / 2.0;\n\n  da = 2.0 * M_PI / teeth / 4.0;\n\n  glShadeModel(GL_FLAT);\n\n  glNormal3f(0.0, 0.0, 1.0);\n\n  /* draw front face */\n  glBegin(GL_QUAD_STRIP);\n  for (i = 0; i <= teeth; i++) {\n    angle = i * 2.0 * M_PI / teeth;\n    glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);\n    glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);\n    glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);\n    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);\n  }\n  glEnd();\n\n  /* draw front sides of teeth */\n  glBegin(GL_QUADS);\n  da = 2.0 * M_PI / teeth / 4.0;\n  for (i = 0; i < teeth; i++) {\n    angle = i * 2.0 * M_PI / teeth;\n\n    glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);\n    glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);\n    glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);\n    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);\n  }\n  glEnd();\n\n  glNormal3f(0.0, 0.0, -1.0);\n\n  /* draw back face */\n  glBegin(GL_QUAD_STRIP);\n  for (i = 0; i <= teeth; i++) {\n    angle = i * 2.0 * M_PI / teeth;\n    glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);\n    glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);\n    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);\n    glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);\n  }\n  glEnd();\n\n  /* draw back sides of teeth */\n  glBegin(GL_QUADS);\n  da = 2.0 * M_PI / teeth / 4.0;\n  for (i = 0; i < teeth; i++) {\n    angle = i * 2.0 * M_PI / teeth;\n\n    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);\n    glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);\n    glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);\n    glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);\n  }\n  glEnd();\n\n  /* draw outward faces of teeth */\n  glBegin(GL_QUAD_STRIP);\n  for (i = 0; i < teeth; i++) {\n    angle = i * 2.0 * M_PI / teeth;\n\n    glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);\n    glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);\n    u = r2 * cos(angle + da) - r1 * cos(angle);\n    v = r2 * sin(angle + da) - r1 * sin(angle);\n    len = sqrt(u * u + v * v);\n    u /= len;\n    v /= len;\n    glNormal3f(v, -u, 0.0);\n    glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);\n    glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);\n    glNormal3f(cos(angle), sin(angle), 0.0);\n    glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);\n    glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);\n    u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);\n    v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);\n    glNormal3f(v, -u, 0.0);\n    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);\n    glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);\n    glNormal3f(cos(angle), sin(angle), 0.0);\n  }\n\n  glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);\n  glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);\n\n  glEnd();\n\n  glShadeModel(GL_SMOOTH);\n\n  /* draw inside radius cylinder */\n  glBegin(GL_QUAD_STRIP);\n  for (i = 0; i <= teeth; i++) {\n    angle = i * 2.0 * M_PI / teeth;\n\n    glNormal3f(-cos(angle), -sin(angle), 0.0);\n    glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);\n    glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);\n  }\n  glEnd();\n\n}\n\nstatic int width = 800;\nstatic int height = 600;\n\nstatic void * buffer = NULL;\nstatic void * window = NULL;\n\nstatic GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;\nstatic GLint gear1, gear2, gear3;\nstatic GLfloat angle = 0.0;\n\nstatic GLuint limit;\nstatic GLuint count = 1;\n\nstatic void\nsync(void)\n{\n  glFinish();\n\n  uint32_t * frame_data = orb_window_data(window);\n  uint32_t * image_data = (uint32_t *)buffer;\n\n  int i;\n  for(i = 0; i < width * height; i++) {\n    frame_data[i] = image_data[i] | 0xFF000000;\n  }\n\n  orb_window_sync(window);\n}\n\nstatic void\ndraw(void)\n{\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n  glPushMatrix();\n  glRotatef(view_rotx, 1.0, 0.0, 0.0);\n  glRotatef(view_roty, 0.0, 1.0, 0.0);\n  glRotatef(view_rotz, 0.0, 0.0, 1.0);\n\n  glPushMatrix();\n  glTranslatef(-3.0, -2.0, 0.0);\n  glRotatef(angle, 0.0, 0.0, 1.0);\n  glCallList(gear1);\n  glPopMatrix();\n\n  glPushMatrix();\n  glTranslatef(3.1, -2.0, 0.0);\n  glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);\n  glCallList(gear2);\n  glPopMatrix();\n\n  glPushMatrix();\n  glTranslatef(-3.1, 4.2, 0.0);\n  glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);\n  glCallList(gear3);\n  glPopMatrix();\n\n  glPopMatrix();\n\n  sync();\n\n  count++;\n  if (count == limit) {\n    exit(0);\n  }\n}\n\nstatic void\nidle(void)\n{\n  angle += 2.0;\n  draw();\n}\n\n/* new window size or exposure */\nstatic void\nreshape(int width, int height)\n{\n  GLfloat h = (GLfloat) height / (GLfloat) width;\n\n  glViewport(0, 0, (GLint) width, (GLint) height);\n  glMatrixMode(GL_PROJECTION);\n  glLoadIdentity();\n  glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);\n  glMatrixMode(GL_MODELVIEW);\n  glLoadIdentity();\n  glTranslatef(0.0, 0.0, -40.0);\n}\n\nstatic void\ninit(void)\n{\n  static GLfloat pos[4] =\n  {5.0, 5.0, 10.0, 0.0};\n  static GLfloat red[4] =\n  {0.8, 0.1, 0.0, 1.0};\n  static GLfloat green[4] =\n  {0.0, 0.8, 0.2, 1.0};\n  static GLfloat blue[4] =\n  {0.2, 0.2, 1.0, 1.0};\n\n  glLightfv(GL_LIGHT0, GL_POSITION, pos);\n  glEnable(GL_CULL_FACE);\n  glEnable(GL_LIGHTING);\n  glEnable(GL_LIGHT0);\n  glEnable(GL_DEPTH_TEST);\n\n  /* make the gears */\n  gear1 = glGenLists(1);\n  glNewList(gear1, GL_COMPILE);\n  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);\n  gear(1.0, 4.0, 1.0, 20, 0.7);\n  glEndList();\n\n  gear2 = glGenLists(1);\n  glNewList(gear2, GL_COMPILE);\n  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);\n  gear(0.5, 2.0, 2.0, 10, 0.7);\n  glEndList();\n\n  gear3 = glGenLists(1);\n  glNewList(gear3, GL_COMPILE);\n  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);\n  gear(1.3, 2.0, 0.5, 10, 0.7);\n  glEndList();\n\n  glEnable(GL_NORMALIZE);\n}\n\nmain(int argc, char *argv[])\n{\n  if (argc > 1) {\n    /* do 'n' frames then exit */\n    limit = atoi(argv[1]) + 1;\n  } else {\n    limit = 0;\n  }\n\n  OSMesaContext ctx = OSMesaCreateContextExt(OSMESA_BGRA, 16, 0, 0, NULL);\n  if (!ctx) {\n    printf(\"OSMesaCreateContextExt failed\\n\");\n    return 1;\n  }\n\n  buffer = malloc(width * height * 4);\n  if(!buffer) {\n    printf(\"malloc failed\\n\");\n    OSMesaDestroyContext(ctx);\n    return 1;\n  }\n\n  if (!OSMesaMakeCurrent(ctx, buffer, GL_UNSIGNED_BYTE, width, height)) {\n    printf(\"OSMesaMakeCurrent failed\\n\");\n    OSMesaDestroyContext(ctx);\n    return 1;\n  }\n\n  OSMesaPixelStore(OSMESA_Y_UP, 0);\n\n  OSMesaColorClamp(GL_TRUE);\n\n  window = orb_window_new_flags(-1, -1, width, height, \"Gears\", ORB_WINDOW_ASYNC);\n\n  init();\n\n  reshape(width, height);\n\n  char running = 1;\n  while (running) {\n   idle();\n\n   void * event_iter = orb_window_events(window);\n\n   OrbEventOption event_option;\n   do {\n     event_option = orb_events_next(event_iter);\n     switch (event_option.tag) {\n       case OrbEventOption_Quit:\n         running = 0;\n         break;\n       default:\n         break;\n     }\n   } while (running && event_option.tag != OrbEventOption_None);\n\n   orb_events_destroy(event_iter);\n  }\n\n  orb_window_destroy(window);\n  OSMesaDestroyContext(ctx);\n  free(buffer);\n\n  return 0;             /* ANSI C requires main to return int. */\n}\n"
  },
  {
    "path": "recipes/demos/gears/recipe.toml",
    "content": "[build]\ndependencies=[\n    \"liborbital\",\n    \"mesa\",\n    \"mesa-glu\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\n${CXX} -O2 -I \"${COOKBOOK_SYSROOT}/usr/include\" \\\n    $LDFLAGS \"${COOKBOOK_RECIPE}/gears.c\" \\\n    -o gears -lorbital $(\"${PKG_CONFIG}\" --libs glu) -lz\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\ncp -v \"gears\" \"${COOKBOOK_STAGE}/usr/bin/gears\"\n\"\"\"\n"
  },
  {
    "path": "recipes/demos/glutin/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/glutin.git\"\nbranch = \"redox-0.30\"\nupstream = \"https://github.com/rust-windowing/glutin.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"mesa\",\n    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nEXAMPLES=(\n    window\n)\nfor example in \"${EXAMPLES[@]}\"\ndo\n    cargo rustc \\\n        --target \"$TARGET\" \\\n        --release \\\n        --manifest-path \"${COOKBOOK_SOURCE}/glutin_examples/Cargo.toml\" \\\n        --example \"${example}\" \\\n        -- -C link-args=\"$LDFLAGS $(\"${TARGET}-pkg-config\" --libs osmesa) -lz -lstdc++ -lc -lgcc\"\n    mkdir -pv \"${COOKBOOK_STAGE}/bin\"\n    cp -v \"target/${TARGET}/release/examples/${example}\" \"${COOKBOOK_STAGE}/bin/glutin_${example}\"\ndone\n\"\"\"\n"
  },
  {
    "path": "recipes/demos/iced/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/iced.git\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages styling\n\"\"\"\n"
  },
  {
    "path": "recipes/demos/orbclient/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/orbclient.git\"\n\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"simple\"\n]\n"
  },
  {
    "path": "recipes/demos/osdemo/osdemo.c",
    "content": "/*\n * Test OSMesa interface at 8, 16 and 32 bits/channel.\n *\n * Usage: osdemo [options]\n *\n * Options:\n *   -f   generate image files\n *   -g   render gradient and print color values\n */\n\n#include <assert.h>\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <GL/osmesa.h>\n#include <GL/glu.h>\n#include <orbital.h>\n\n#define WIDTH 600\n#define HEIGHT 600\n\nstatic GLboolean DisplayImages = GL_FALSE;\nstatic GLboolean WriteFiles = GL_FALSE;\nstatic GLboolean Gradient = GL_FALSE;\n\n\nstatic void\nSphere(float radius, int slices, int stacks)\n{\n   GLUquadric *q = gluNewQuadric();\n   gluQuadricNormals(q, GLU_SMOOTH);\n   gluSphere(q, radius, slices, stacks);\n   gluDeleteQuadric(q);\n}\n\n\nstatic void\nCone(float base, float height, int slices, int stacks)\n{\n   GLUquadric *q = gluNewQuadric();\n   gluQuadricDrawStyle(q, GLU_FILL);\n   gluQuadricNormals(q, GLU_SMOOTH);\n   gluCylinder(q, base, 0.0, height, slices, stacks);\n   gluDeleteQuadric(q);\n}\n\n\nstatic void\nTorus(float innerRadius, float outerRadius, int sides, int rings)\n{\n   /* from GLUT... */\n   int i, j;\n   GLfloat theta, phi, theta1;\n   GLfloat cosTheta, sinTheta;\n   GLfloat cosTheta1, sinTheta1;\n   const GLfloat ringDelta = 2.0 * M_PI / rings;\n   const GLfloat sideDelta = 2.0 * M_PI / sides;\n\n   theta = 0.0;\n   cosTheta = 1.0;\n   sinTheta = 0.0;\n   for (i = rings - 1; i >= 0; i--) {\n      theta1 = theta + ringDelta;\n      cosTheta1 = cos(theta1);\n      sinTheta1 = sin(theta1);\n      glBegin(GL_QUAD_STRIP);\n      phi = 0.0;\n      for (j = sides; j >= 0; j--) {\n         GLfloat cosPhi, sinPhi, dist;\n\n         phi += sideDelta;\n         cosPhi = cos(phi);\n         sinPhi = sin(phi);\n         dist = outerRadius + innerRadius * cosPhi;\n\n         glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);\n         glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, innerRadius * sinPhi);\n         glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);\n         glVertex3f(cosTheta * dist, -sinTheta * dist,  innerRadius * sinPhi);\n      }\n      glEnd();\n      theta = theta1;\n      cosTheta = cosTheta1;\n      sinTheta = sinTheta1;\n   }\n}\n\n\nstatic void Cube(float size)\n{\n   size = 0.5 * size;\n\n   glBegin(GL_QUADS);\n   /* +X face */\n   glNormal3f(1, 0, 0);\n   glVertex3f(size, -size,  size);\n   glVertex3f(size, -size, -size);\n   glVertex3f(size,  size, -size);\n   glVertex3f(size,  size,  size);\n\n   /* -X face */\n   glNormal3f(-1, 0, 0);\n   glVertex3f(-size,  size,  size);\n   glVertex3f(-size,  size, -size);\n   glVertex3f(-size, -size, -size);\n   glVertex3f(-size, -size,  size);\n\n   /* +Y face */\n   glNormal3f(0, 1, 0);\n   glVertex3f(-size, size,  size);\n   glVertex3f( size, size,  size);\n   glVertex3f( size, size, -size);\n   glVertex3f(-size, size, -size);\n\n   /* -Y face */\n   glNormal3f(0, -1, 0);\n   glVertex3f(-size, -size, -size);\n   glVertex3f( size, -size, -size);\n   glVertex3f( size, -size,  size);\n   glVertex3f(-size, -size,  size);\n\n   /* +Z face */\n   glNormal3f(0, 0, 1);\n   glVertex3f(-size, -size, size);\n   glVertex3f( size, -size, size);\n   glVertex3f( size,  size, size);\n   glVertex3f(-size,  size, size);\n\n   /* -Z face */\n   glNormal3f(0, 0, -1);\n   glVertex3f(-size,  size, -size);\n   glVertex3f( size,  size, -size);\n   glVertex3f( size, -size, -size);\n   glVertex3f(-size, -size, -size);\n\n   glEnd();\n}\n\n\n\n/**\n * Draw red/green gradient across bottom of image.\n * Read pixels to check deltas.\n */\nstatic void\nrender_gradient(void)\n{\n   GLfloat row[WIDTH][4];\n   int i;\n\n   glMatrixMode(GL_PROJECTION);\n   glLoadIdentity();\n   glOrtho(-1, 1, -1, 1, -1, 1);\n   glMatrixMode(GL_MODELVIEW);\n   glLoadIdentity();\n\n   glBegin(GL_POLYGON);\n   glColor3f(1, 0, 0);\n   glVertex2f(-1, -1.0);\n   glVertex2f(-1, -0.9);\n   glColor3f(0, 1, 0);\n   glVertex2f(1, -0.9);\n   glVertex2f(1, -1.0);\n   glEnd();\n   glFinish();\n\n   glReadPixels(0, 0, WIDTH, 1, GL_RGBA, GL_FLOAT, row);\n   for (i = 0; i < 4; i++) {\n      printf(\"row[i] = %f, %f, %f\\n\", row[i][0], row[i][1], row[i][2]);\n   }\n}\n\n\nstatic void\nrender_image(void)\n{\n   static const GLfloat light_ambient[4] = { 0.0, 0.0, 0.0, 1.0 };\n   static const GLfloat light_diffuse[4] = { 1.0, 1.0, 1.0, 1.0 };\n   static const GLfloat light_specular[4] = { 1.0, 1.0, 1.0, 1.0 };\n   static const GLfloat light_position[4] = { 1.0, 1.0, 1.0, 0.0 };\n   static const GLfloat red_mat[4]   = { 1.0, 0.2, 0.2, 1.0 };\n   static const GLfloat green_mat[4] = { 0.2, 1.0, 0.2, 1.0 };\n   static const GLfloat blue_mat[4]  = { 0.2, 0.2, 1.0, 1.0 };\n#if 0\n   static const GLfloat yellow_mat[4]  = { 0.8, 0.8, 0.0, 1.0 };\n#endif\n   static const GLfloat purple_mat[4]  = { 0.8, 0.4, 0.8, 0.6 };\n\n   glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);\n   glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);\n   glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);\n   glLightfv(GL_LIGHT0, GL_POSITION, light_position);\n\n   glEnable(GL_DEPTH_TEST);\n   glEnable(GL_LIGHT0);\n\n   glMatrixMode(GL_PROJECTION);\n   glLoadIdentity();\n   glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 50.0);\n   glMatrixMode(GL_MODELVIEW);\n   glTranslatef(0, 0.5, -7);\n\n   glClearColor(0.3, 0.3, 0.7, 0.0);\n   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );\n\n   glPushMatrix();\n   glRotatef(20.0, 1.0, 0.0, 0.0);\n\n   /* ground */\n   glEnable(GL_TEXTURE_2D);\n   glBegin(GL_POLYGON);\n   glNormal3f(0, 1, 0);\n   glTexCoord2f(0, 0);  glVertex3f(-5, -1, -5);\n   glTexCoord2f(1, 0);  glVertex3f( 5, -1, -5);\n   glTexCoord2f(1, 1);  glVertex3f( 5, -1,  5);\n   glTexCoord2f(0, 1);  glVertex3f(-5, -1,  5);\n   glEnd();\n   glDisable(GL_TEXTURE_2D);\n\n   glEnable(GL_LIGHTING);\n\n   glPushMatrix();\n   glTranslatef(-1.5, 0.5, 0.0);\n   glRotatef(90.0, 1.0, 0.0, 0.0);\n   glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red_mat );\n   Torus(0.275, 0.85, 20, 20);\n   glPopMatrix();\n\n   glPushMatrix();\n   glTranslatef(-1.5, -0.5, 0.0);\n   glRotatef(270.0, 1.0, 0.0, 0.0);\n   glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, green_mat );\n   Cone(1.0, 2.0, 16, 1);\n   glPopMatrix();\n\n   glPushMatrix();\n   glTranslatef(0.95, 0.0, -0.8);\n   glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blue_mat );\n   glLineWidth(2.0);\n   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);\n   Sphere(1.2, 20, 20);\n   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);\n   glPopMatrix();\n\n#if 0\n   glPushMatrix();\n   glTranslatef(0.75, 0.0, 1.3);\n   glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, yellow_mat );\n   glutWireTeapot(1.0);\n   glPopMatrix();\n#endif\n\n   glPushMatrix();\n   glTranslatef(-0.25, 0.0, 2.5);\n   glRotatef(40, 0, 1, 0);\n   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n   glEnable(GL_BLEND);\n   glEnable(GL_CULL_FACE);\n   glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, purple_mat );\n   Cube(1.0);\n   glDisable(GL_BLEND);\n   glDisable(GL_CULL_FACE);\n   glPopMatrix();\n\n   glDisable(GL_LIGHTING);\n\n   glPopMatrix();\n\n   glDisable(GL_DEPTH_TEST);\n}\n\n\nstatic void\ninit_context(void)\n{\n   const GLint texWidth = 64, texHeight = 64;\n   GLubyte *texImage;\n   int i, j;\n\n   /* checker image */\n   texImage = (GLubyte *)malloc(texWidth * texHeight * 4);\n   for (i = 0; i < texHeight; i++) {\n      for (j = 0; j < texWidth; j++) {\n         int k = (i * texWidth + j) * 4;\n         if ((i % 5) == 0 || (j % 5) == 0) {\n            texImage[k+0] = 200;\n            texImage[k+1] = 200;\n            texImage[k+2] = 200;\n            texImage[k+3] = 255;\n         }\n         else {\n            if ((i % 5) == 1 || (j % 5) == 1) {\n               texImage[k+0] = 50;\n               texImage[k+1] = 50;\n               texImage[k+2] = 50;\n               texImage[k+3] = 255;\n            }\n            else {\n               texImage[k+0] = 100;\n               texImage[k+1] = 100;\n               texImage[k+2] = 100;\n               texImage[k+3] = 255;\n            }\n         }\n      }\n   }\n\n   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0,\n                GL_RGBA, GL_UNSIGNED_BYTE, texImage);\n   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n\n   free(texImage);\n}\n\nstatic void\ndisplay_image(const char *filename, const GLubyte *buffer, int width, int height)\n{\n  void * window = orb_window_new(-1, -1, width, height, filename);\n\n  uint32_t * frame_data = orb_window_data(window);\n  uint32_t * image_data = (uint32_t *)buffer;\n\n  int x, y;\n  for(y = 0; y < height; y++) {\n   for(x = 0; x < width; x++) {\n     frame_data[y * width + x] = image_data[(height - 1 - y) * width + x] | 0xFF000000;\n   }\n  }\n\n  orb_window_sync(window);\n\n  char running = 1;\n  while (running) {\n   void * event_iter = orb_window_events(window);\n\n   OrbEventOption event_option;\n   do {\n     event_option = orb_events_next(event_iter);\n     switch (event_option.tag) {\n       case OrbEventOption_Quit:\n         running = 0;\n         break;\n       default:\n         break;\n     }\n   } while (running && event_option.tag != OrbEventOption_None);\n\n   orb_events_destroy(event_iter);\n  }\n\n  orb_window_destroy(window);\n}\n\nstatic void\nwrite_ppm(const char *filename, const GLubyte *buffer, int width, int height)\n{\n   const int binary = 0;\n   FILE *f = fopen( filename, \"w\" );\n   if (f) {\n      int i, x, y;\n      const GLubyte *ptr = buffer;\n      if (binary) {\n         fprintf(f,\"P6\\n\");\n         fprintf(f,\"# ppm-file created by osdemo.c\\n\");\n         fprintf(f,\"%i %i\\n\", width,height);\n         fprintf(f,\"255\\n\");\n         fclose(f);\n         f = fopen( filename, \"ab\" );  /* reopen in binary append mode */\n         for (y=height-1; y>=0; y--) {\n            for (x=0; x<width; x++) {\n               i = (y*width + x) * 4;\n               fputc(ptr[i], f);   /* write red */\n               fputc(ptr[i+1], f); /* write green */\n               fputc(ptr[i+2], f); /* write blue */\n            }\n         }\n      }\n      else {\n         /*ASCII*/\n         int counter = 0;\n         fprintf(f,\"P3\\n\");\n         fprintf(f,\"# ascii ppm file created by osdemo.c\\n\");\n         fprintf(f,\"%i %i\\n\", width, height);\n         fprintf(f,\"255\\n\");\n         for (y=height-1; y>=0; y--) {\n            for (x=0; x<width; x++) {\n               i = (y*width + x) * 4;\n               fprintf(f, \" %3d %3d %3d\", ptr[i], ptr[i+1], ptr[i+2]);\n               counter++;\n               if (counter % 5 == 0)\n                  fprintf(f, \"\\n\");\n            }\n         }\n      }\n      fclose(f);\n   }\n}\n\n\nstatic GLboolean\ntest(GLenum type, GLint bits, const char *filename)\n{\n   const GLint z = 16, stencil = 0, accum = 0;\n   OSMesaContext ctx;\n   void *buffer;\n   GLint cBits;\n\n   assert(bits == 8 ||\n          bits == 16 ||\n          bits == 32);\n\n   assert(type == GL_UNSIGNED_BYTE ||\n          type == GL_UNSIGNED_SHORT ||\n          type == GL_FLOAT);\n\n   ctx = OSMesaCreateContextExt(OSMESA_BGRA, z, stencil, accum, NULL );\n   if (!ctx) {\n      printf(\"OSMesaCreateContextExt() failed!\\n\");\n      return 0;\n   }\n\n   /* Allocate the image buffer */\n   buffer = malloc(WIDTH * HEIGHT * 4 * bits / 8);\n   if (!buffer) {\n      printf(\"Alloc image buffer failed!\\n\");\n      return 0;\n   }\n\n   /* Bind the buffer to the context and make it current */\n   if (!OSMesaMakeCurrent( ctx, buffer, type, WIDTH, HEIGHT )) {\n      printf(\"OSMesaMakeCurrent (%d bits/channel) failed!\\n\", bits);\n      free(buffer);\n      OSMesaDestroyContext(ctx);\n      return 0;\n   }\n\n   /* sanity checks */\n   glGetIntegerv(GL_RED_BITS, &cBits);\n   if (cBits != bits) {\n      fprintf(stderr, \"Unable to create %d-bit/channel renderbuffer.\\n\", bits);\n      fprintf(stderr, \"May need to recompile Mesa with CHAN_BITS=16 or 32.\\n\");\n      return 0;\n   }\n   glGetIntegerv(GL_GREEN_BITS, &cBits);\n   assert(cBits == bits);\n   glGetIntegerv(GL_BLUE_BITS, &cBits);\n   assert(cBits == bits);\n   glGetIntegerv(GL_ALPHA_BITS, &cBits);\n   assert(cBits == bits);\n\n   if (WriteFiles)\n      printf(\"Rendering %d bit/channel image: %s\\n\", bits, filename);\n   else\n      printf(\"Rendering %d bit/channel image\\n\", bits);\n\n   OSMesaColorClamp(GL_TRUE);\n\n   init_context();\n   render_image();\n   if (Gradient)\n      render_gradient();\n\n   /* Make sure buffered commands are finished! */\n   glFinish();\n\n   if (DisplayImages && filename != NULL) {\n      if (type == GL_UNSIGNED_SHORT) {\n         GLushort *buffer16 = (GLushort *) buffer;\n         GLubyte *buffer8 = (GLubyte *) malloc(WIDTH * HEIGHT * 4);\n         int i;\n         for (i = 0; i < WIDTH * HEIGHT * 4; i++)\n            buffer8[i] = buffer16[i] >> 8;\n         display_image(filename, buffer8, WIDTH, HEIGHT);\n         free(buffer8);\n      }\n      else if (type == GL_FLOAT) {\n         GLfloat *buffer32 = (GLfloat *) buffer;\n         GLubyte *buffer8 = (GLubyte *) malloc(WIDTH * HEIGHT * 4);\n         int i;\n         /* colors may be outside [0,1] so we need to clamp */\n         for (i = 0; i < WIDTH * HEIGHT * 4; i++)\n            buffer8[i] = (GLubyte) (buffer32[i] * 255.0);\n         display_image(filename, buffer8, WIDTH, HEIGHT);\n         free(buffer8);\n      }\n      else {\n         display_image(filename, (const GLubyte *)buffer, WIDTH, HEIGHT);\n      }\n   }\n\n   if (WriteFiles && filename != NULL) {\n      if (type == GL_UNSIGNED_SHORT) {\n         GLushort *buffer16 = (GLushort *) buffer;\n         GLubyte *buffer8 = (GLubyte *) malloc(WIDTH * HEIGHT * 4);\n         int i;\n         for (i = 0; i < WIDTH * HEIGHT * 4; i++)\n            buffer8[i] = buffer16[i] >> 8;\n         write_ppm(filename, buffer8, WIDTH, HEIGHT);\n         free(buffer8);\n      }\n      else if (type == GL_FLOAT) {\n         GLfloat *buffer32 = (GLfloat *) buffer;\n         GLubyte *buffer8 = (GLubyte *) malloc(WIDTH * HEIGHT * 4);\n         int i;\n         /* colors may be outside [0,1] so we need to clamp */\n         for (i = 0; i < WIDTH * HEIGHT * 4; i++)\n            buffer8[i] = (GLubyte) (buffer32[i] * 255.0);\n         write_ppm(filename, buffer8, WIDTH, HEIGHT);\n         free(buffer8);\n      }\n      else {\n         write_ppm(filename, (const GLubyte *)buffer, WIDTH, HEIGHT);\n      }\n   }\n\n   OSMesaDestroyContext(ctx);\n\n   free(buffer);\n\n   return 1;\n}\n\n\nint\nmain( int argc, char *argv[] )\n{\n   int i;\n\n   printf(\"Use -f to write image files\\n\");\n\n   for (i = 1; i < argc; i++) {\n      if (strcmp(argv[i], \"-d\") == 0)\n         DisplayImages = GL_TRUE;\n      else if (strcmp(argv[i], \"-f\") == 0)\n         WriteFiles = GL_TRUE;\n      else if (strcmp(argv[i], \"-g\") == 0)\n         Gradient = GL_TRUE;\n   }\n\n   test(GL_UNSIGNED_BYTE, 8, \"image8.ppm\");\n   test(GL_UNSIGNED_SHORT, 16, \"image16.ppm\");\n   test(GL_FLOAT, 32, \"image32.ppm\");\n\n   return 0;\n}\n"
  },
  {
    "path": "recipes/demos/osdemo/recipe.toml",
    "content": "[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\",\n    \"mesa\",\n    \"mesa-glu\",\n    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\ncp \"${COOKBOOK_SOURCE}/../osdemo.c\" ./osdemo.c\n${CXX} -O2 -I \"${COOKBOOK_SYSROOT}/include\" $LDFLAGS osdemo.c -o osdemo \\\n    -lorbital $(\"${PKG_CONFIG}\" --libs glu) -lz\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\ncp -v \"osdemo\" \"${COOKBOOK_STAGE}/usr/bin/osdemo\"\n\"\"\"\n"
  },
  {
    "path": "recipes/demos/pixelcannon/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/pixelcannon.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo\n\nmkdir -pv \"${COOKBOOK_STAGE}/apps/pixelcannon\"\ncp -Rv \"${COOKBOOK_SOURCE}/assets\" \"${COOKBOOK_STAGE}/apps/pixelcannon\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_SOURCE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/pixelcannon\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"orbital\",\n]\n"
  },
  {
    "path": "recipes/demos/sdl2-gears/gears.c",
    "content": "/* gears.c */\n\n/*\n * 3-D gear wheels.  This program is in the public domain.\n *\n * Brian Paul\n */\n\n/* Conversion to GLUT by Mark J. Kilgard */\n\n#include <SDL2/SDL.h>\n#include <SDL2/SDL_opengl.h>\n#include <SDL2/SDL_image.h>\n#include <SDL2/SDL_mixer.h>\n#include <SDL2/SDL_ttf.h>\n\n#ifndef M_PI\n#define M_PI 3.14159265\n#endif\n\n/**\n\n  Draw a gear wheel.  You'll probably want to call this function when\n  building a display list since we do a lot of trig here.\n\n  Input:  inner_radius - radius of hole at center\n          outer_radius - radius at center of teeth\n          width - width of gear\n          teeth - number of teeth\n          tooth_depth - depth of tooth\n\n **/\n\nstatic void\ngear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,\n     GLint teeth, GLfloat tooth_depth)\n{\n    GLint i;\n    GLfloat r0, r1, r2;\n    GLfloat angle, da;\n    GLfloat u, v, len;\n\n    r0 = inner_radius;\n    r1 = outer_radius - tooth_depth / 2.0;\n    r2 = outer_radius + tooth_depth / 2.0;\n\n    da = 2.0 * M_PI / teeth / 4.0;\n\n    glShadeModel(GL_FLAT);\n\n    glNormal3f(0.0, 0.0, 1.0);\n\n    /* draw front face */\n    glBegin(GL_QUAD_STRIP);\n    for (i = 0; i <= teeth; i++)\n    {\n        angle = i * 2.0 * M_PI / teeth;\n        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);\n\n        glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);\n        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);\n        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);\n    }\n    glEnd();\n\n    /* draw front sides of teeth */\n    glBegin(GL_QUADS);\n    da = 2.0 * M_PI / teeth / 4.0;\n    for (i = 0; i < teeth; i++)\n    {\n        angle = i * 2.0 * M_PI / teeth;\n\n        glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);\n        glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);\n        glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);\n        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);\n    }\n    glEnd();\n\n    glNormal3f(0.0, 0.0, -1.0);\n\n    /* draw back face */\n    glBegin(GL_QUAD_STRIP);\n    for (i = 0; i <= teeth; i++)\n    {\n        angle = i * 2.0 * M_PI / teeth;\n        glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);\n        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);\n        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);\n        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);\n    }\n    glEnd();\n\n    /* draw back sides of teeth */\n    glBegin(GL_QUADS);\n    da = 2.0 * M_PI / teeth / 4.0;\n    for (i = 0; i < teeth; i++)\n    {\n        angle = i * 2.0 * M_PI / teeth;\n\n        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);\n        glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);\n        glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);\n        glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);\n    }\n    glEnd();\n\n    /* draw outward faces of teeth */\n    glBegin(GL_QUAD_STRIP);\n    for (i = 0; i < teeth; i++)\n    {\n        angle = i * 2.0 * M_PI / teeth;\n\n        glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);\n        glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);\n        u = r2 * cos(angle + da) - r1 * cos(angle);\n        v = r2 * sin(angle + da) - r1 * sin(angle);\n        len = sqrt(u * u + v * v);\n        u /= len;\n        v /= len;\n        glNormal3f(v, -u, 0.0);\n        glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);\n        glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);\n        glNormal3f(cos(angle), sin(angle), 0.0);\n        glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);\n        glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);\n        u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);\n        v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);\n        glNormal3f(v, -u, 0.0);\n        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);\n        glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);\n        glNormal3f(cos(angle), sin(angle), 0.0);\n    }\n\n    glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);\n    glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);\n\n    glEnd();\n\n    glShadeModel(GL_SMOOTH);\n\n    /* draw inside radius cylinder */\n    glBegin(GL_QUAD_STRIP);\n    for (i = 0; i <= teeth; i++)\n    {\n        angle = i * 2.0 * M_PI / teeth;\n\n        glNormal3f(-cos(angle), -sin(angle), 0.0);\n        glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);\n        glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);\n    }\n    glEnd();\n}\n\nstatic int width = 800;\nstatic int height = 600;\n\nstatic SDL_Window *window = NULL;\nstatic SDL_GLContext context = NULL;\n\nstatic GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;\nstatic GLint gear1, gear2, gear3;\nstatic GLfloat angle = 0.0;\nstatic GLfloat delta = 2.0f;\n\nstatic void\ndraw(void)\n{\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    glPushMatrix();\n    glRotatef(view_rotx, 1.0, 0.0, 0.0);\n    glRotatef(view_roty, 0.0, 1.0, 0.0);\n    glRotatef(view_rotz, 0.0, 0.0, 1.0);\n\n    glPushMatrix();\n    glTranslatef(-3.0, -2.0, 0.0);\n    glRotatef(angle, 0.0, 0.0, 1.0);\n    glCallList(gear1);\n    glPopMatrix();\n\n    glPushMatrix();\n    glTranslatef(3.1, -2.0, 0.0);\n    glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);\n    glCallList(gear2);\n    glPopMatrix();\n\n    glPushMatrix();\n    glTranslatef(-3.1, 4.2, 0.0);\n    glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);\n    glCallList(gear3);\n    glPopMatrix();\n\n    glPopMatrix();\n}\n\nstatic void\nidle(void)\n{\n    angle += delta;\n    if (angle > 360.0f)\n        angle -= 360.0f;\n\n    draw();\n\n    SDL_GL_SwapWindow(window);\n}\n\n/* new window size or exposure */\nstatic void\nreshape(int width, int height)\n{\n    GLfloat h = (GLfloat)height / (GLfloat)width;\n\n    glViewport(0, 0, (GLint)width, (GLint)height);\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n    glTranslatef(0.0, 0.0, -40.0);\n}\n\nstatic void\ninit(void)\n{\n    static GLfloat pos[4] =\n        {5.0, 5.0, 10.0, 0.0};\n    static GLfloat red[4] =\n        {0.8, 0.1, 0.0, 1.0};\n    static GLfloat green[4] =\n        {0.0, 0.8, 0.2, 1.0};\n    static GLfloat blue[4] =\n        {0.2, 0.2, 1.0, 1.0};\n\n    glLightfv(GL_LIGHT0, GL_POSITION, pos);\n    glEnable(GL_CULL_FACE);\n    glEnable(GL_LIGHTING);\n    glEnable(GL_LIGHT0);\n    glEnable(GL_DEPTH_TEST);\n\n    /* make the gears */\n    gear1 = glGenLists(1);\n    glNewList(gear1, GL_COMPILE);\n    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);\n    gear(1.0, 4.0, 1.0, 20, 0.7);\n    glEndList();\n\n    gear2 = glGenLists(1);\n    glNewList(gear2, GL_COMPILE);\n    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);\n    gear(0.5, 2.0, 2.0, 10, 0.7);\n    glEndList();\n\n    gear3 = glGenLists(1);\n    glNewList(gear3, GL_COMPILE);\n    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);\n    gear(1.3, 2.0, 0.5, 10, 0.7);\n    glEndList();\n\n    glEnable(GL_NORMALIZE);\n}\n\nvoid CheckSDLError(int line)\n{\n    const char *error = SDL_GetError();\n    if (error != \"\")\n    {\n        printf(\"SLD Error: %s\\n\", error);\n\n        if (line != -1)\n            printf(\"\\nLine: %d\\n\", line);\n\n        SDL_ClearError();\n    }\n}\n\nSDL_Surface *image;\nconst char *IMAGE_FILE_NAME = \"/usr/games/sdl2_gears/assets/image.png\";\n\nMix_Music *music = NULL;\nconst char *MUSIC_FILE_NAME = \"/usr/games/sdl2_gears/assets/music.wav\";\n\nTTF_Font *font = NULL;\nconst char *TTF_FILE_NAME = \"/usr/games/sdl2_gears/assets/font.ttf\";\n\nvoid cleanup()\n{\n    if (context != NULL)\n    {\n        SDL_GL_DeleteContext(context);\n        context = NULL;\n    }\n    if (window != NULL)\n    {\n        SDL_DestroyWindow(window);\n        window = NULL;\n    }\n\n    if (image != NULL)\n    {\n        SDL_FreeSurface(image);\n        image = NULL;\n        IMG_Quit();\n    }\n\n    if (music != NULL)\n    {\n        Mix_FreeMusic(music);\n        music = NULL;\n        Mix_CloseAudio();\n    }\n\n    if (font != NULL)\n    {\n        TTF_CloseFont(font);\n        font = NULL;\n    }\n\n    // Shutdown SDL 2\n    SDL_Quit();\n}\n\nint main(int argc, char *argv[])\n{\n    // Main\n    printf(\"Initializing SDL\\n\");\n    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)\n    {\n        printf(\"Failed to init SDL\\n\");\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    // Video / window\n    printf(\"Creating SDL window\\n\");\n    window = SDL_CreateWindow(\n        \"Gears\",\n        -1,\n        -1,\n        width,\n        height,\n        SDL_WINDOW_OPENGL);\n    if (window == NULL)\n    {\n        printf(\"Unable to create window\\n\");\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    printf(\"Creating SDL GL context\\n\");\n    context = SDL_GL_CreateContext(window);\n    if (context == NULL)\n    {\n        printf(\"Unable to create SDL GL context\\n\");\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    init();\n\n    reshape(width, height);\n\n    // Image\n    printf(\"Initializing SDL image supporting formats png and jpeg\\n\");\n    int flags = IMG_INIT_JPG | IMG_INIT_PNG;\n    int initted = IMG_Init(flags);\n    if ((initted & flags) != flags)\n    {\n        printf(\"IMG_Init: Failed to init required jpg and png support: %s\\n\", IMG_GetError());\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    image = IMG_Load(IMAGE_FILE_NAME);\n    if (image == NULL)\n    {\n        printf(\"IMG_Load failed: %s\\n\", IMG_GetError());\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    // Audio\n    printf(\"Opening SDL mixer audio\\n\");\n    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096) < 0)\n    {\n        fprintf(stderr, \"Couldn't open audio mixer: %s\\n\", SDL_GetError());\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    music = Mix_LoadMUS(MUSIC_FILE_NAME);\n    if (music == NULL)\n    {\n        fprintf(stderr, \"Couldn't open audio file %s: %s\\n\", MUSIC_FILE_NAME, SDL_GetError());\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    if (Mix_PlayMusic(music, -1) < 0)\n    {\n        fprintf(stderr, \"Couldn't play music: %s\\n\", SDL_GetError());\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    // TTF\n    printf(\"Initializing TTF\\n\");\n    if (TTF_Init() < 0)\n    {\n        printf(\"Failed to init TTF\\n\");\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    font = TTF_OpenFont(TTF_FILE_NAME, 30);\n    if (font == NULL)\n    {\n        printf(\"Couldn't open TTF file %s: %s\\n\", TTF_FILE_NAME, SDL_GetError());\n        CheckSDLError(__LINE__);\n        cleanup();\n        return -1;\n    }\n\n    int running = 1;\n    SDL_Event event;\n    int playing_audio = 0;\n    while (running)\n    {\n        idle();\n\n        // Loop track\n        Mix_PlayingMusic();\n\n        while (SDL_PollEvent(&event))\n        {\n            if (event.type == SDL_QUIT)\n                running = 0;\n\n            if (event.type == SDL_KEYDOWN)\n            {\n                switch (event.key.keysym.sym)\n                {\n                case SDLK_p:\n                {\n                    if (!Mix_PlayingMusic())\n                    {\n                        if (Mix_PlayMusic(music, -1) < 0)\n                        {\n                            fprintf(stderr, \"Couldn't play music: %s\\n\", SDL_GetError());\n                            CheckSDLError(__LINE__);\n                            cleanup();\n                            return -1;\n                        }\n                    }\n                    else\n                    {\n                        if (Mix_PausedMusic())\n                        {\n                            Mix_ResumeMusic();\n                        }\n                        else\n                        {\n                            Mix_PauseMusic();\n                        }\n                    }\n                    break;\n                }\n                case SDLK_a:\n                case SDLK_LEFT:\n                {\n                    delta -= 0.2f;\n                    break;\n                }\n                case SDLK_d:\n                case SDLK_RIGHT:\n                {\n                    delta += 0.2f;\n                    break;\n                }\n                case SDLK_ESCAPE:\n                {\n                    running = 0;\n                    break;\n                }\n                default:\n                    break;\n                }\n            }\n\n            if (event.type == SDL_MOUSEBUTTONDOWN)\n            {\n                if (event.button.button == SDL_BUTTON_LEFT)\n                {\n                    printf(\"Left mouse btn pressed at position %d,%d\\n\", event.button.x, event.button.y);\n                }\n                else if (event.button.button == SDL_BUTTON_MIDDLE)\n                {\n                    printf(\"Middle mouse btn pressed at position %d,%d\\n\", event.button.x, event.button.y);\n                }\n                else if (event.button.button == SDL_BUTTON_RIGHT)\n                {\n                    printf(\"Right mouse btn pressed at position %d,%d\\n\", event.button.x, event.button.y);\n                }\n            }\n        }\n\n        SDL_Delay(10);\n    }\n\n    cleanup();\n\n    return 0;\n}\n"
  },
  {
    "path": "recipes/demos/sdl2-gears/recipe.toml",
    "content": "[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2-image\",\n    \"sdl2-mixer\",\n    \"sdl2-ttf\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nmkdir -p \"${COOKBOOK_STAGE}/usr/games/sdl2_gears\"\n${CXX} -O2 -I \"${COOKBOOK_SYSROOT}/include\" $LDFLAGS ${COOKBOOK_RECIPE}/gears.c \\\n    -o sdl2_gears -dynamic \\\n    -lSDL2_image -lSDL2_mixer -lSDL2_ttf $(\"${PKG_CONFIG}\" --libs osmesa) \\\n    -lSDL2 -lorbital -lfreetype -lpng -ljpeg -lvorbisfile -lvorbis -logg -lz\ncp -rv \"${COOKBOOK_RECIPE}/assets\" \"${COOKBOOK_STAGE}/usr/games/sdl2_gears/\"\ncp -v sdl2_gears \"${COOKBOOK_STAGE}/usr/games/sdl2_gears/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/demos/winit/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/winit.git\"\nbranch = \"winit-0.29\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_examples cursor_grab drag_window window window_debug\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/autoconf/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/autoconf/autoconf-2.71.tar.xz\"\nblake3 = \"da1cc8af8551c343de9f42af0ae53fd7dff3623487157623892b6cd7e3bb5692\"\n\n[build]\ntemplate = \"configure\"\n\n[package]\ndependencies = [\"perl5\"]\n"
  },
  {
    "path": "recipes/dev/automake/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/automake/automake-1.16.5.tar.xz\"\nblake3 = \"f42cfc333aaaa11f2bcb05b5b0273b8706c820c22f9ba4367f7eb920551695cd\"\n\n[build]\ntemplate = \"configure\"\n\n[package]\ndependencies = [\"perl5\"]\n"
  },
  {
    "path": "recipes/dev/binutils-gdb/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/binutils-gdb\"\nbranch = \"redox-2.43.1\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n  \"libgmp\",\n  \"libmpfr\",\n# TODO: this zlib get linked when boostrapping binutils\n#    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nif [ \"${COOKBOOK_HOST_SYSROOT}\" = \"/usr\" ]; then\n# not specifying --enable-shared as it will link shared deps\nCOOKBOOK_CONFIGURE_FLAGS=( --prefix=/usr --host=\"${GNU_TARGET}\" --program-prefix=\"${COOKBOOK_CROSS_GNU_TARGET:-$GNU_TARGET}-\" )\nfi\n\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --target=\"${COOKBOOK_CROSS_GNU_TARGET:-$GNU_TARGET}\"\n    --enable-default-hash-style=gnu\n    --disable-werror\n#   --with-system-zlib\n)\n\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/clang21/recipe.toml",
    "content": "[source]\nsame_as = \"../llvm21\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"llvm21\",\n]\ndev-dependencies = [\n    \"libstdcxx\", # no idea\n    \"llvm21.dev\",\n    \"llvm21.runtime\",\n    \"host:xz\",\n    \"host:libarchive\",  # workaround for cmake error\n]\nscript = \"\"\"\nDYNAMIC_INIT\nARCH=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n\ngenerate_cookbook_cmake_file $COOKBOOK_HOST_TARGET \"\" \"$COOKBOOK_TOOLCHAIN\" native.cmake\n\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DLLVM_ROOT=\"${COOKBOOK_SYSROOT}\"\n    -DCLANG_LINK_CLANG_DYLIB=ON\n    -DLIBCLANG_BUILD_STATIC=1\n    -DLLVM_BUILD_UTILS=On\n\n# the shared options from llvm\n    -DCMAKE_CXX_FLAGS=\"--std=gnu++11\"\n    -DBUILD_SHARED_LIBS=False\n    -DLLVM_BUILD_EXAMPLES=Off\n    -DLLVM_BUILD_TESTS=Off\n    -DLLVM_DEFAULT_TARGET_TRIPLE=\"${TARGET}\"\n    -DLLVM_ENABLE_LTO=Off\n    -DLLVM_ENABLE_RTTI=On\n    -DLLVM_ENABLE_THREADS=On\n    -DLLVM_INCLUDE_EXAMPLES=Off\n    -DLLVM_INCLUDE_TESTS=Off\n    -DLLVM_OPTIMIZED_TABLEGEN=On\n    -DLLVM_TARGET_ARCH=$ARCH\n    -DLLVM_TOOLS_INSTALL_DIR=bin\n    -DLLVM_UTILS_INSTALL_DIR=bin\n    -DUNIX=1\n)\n\nCOOKBOOK_SOURCE=\"$COOKBOOK_SOURCE/clang\"\n\nif [ \"$TARGET\" = \"$COOKBOOK_HOST_TARGET\" ]; then\n\n    COOKBOOK_CMAKE_FLAGS+=( -DLLVM_TABLEGEN_EXE=${COOKBOOK_TOOLCHAIN}/bin/llvm-tblgen )\n\n    \"${COOKBOOK_CMAKE}\" \"${COOKBOOK_SOURCE}\" \\\n        -DCMAKE_BUILD_TYPE=Release \\\n        -DCMAKE_INSTALL_INCLUDEDIR=include \\\n        -DCMAKE_INSTALL_LIBDIR=lib \\\n        -DCMAKE_INSTALL_OLDINCLUDEDIR=/include \\\n        -DCMAKE_INSTALL_PREFIX=/usr \\\n        -DCMAKE_INSTALL_SBINDIR=bin \\\n        -DCMAKE_TOOLCHAIN_FILE=native.cmake \\\n        -GNinja \\\n        -Wno-dev \\\n        \"${COOKBOOK_CMAKE_FLAGS[@]}\" \\\n        \"$@\"\n\n    # All distros use clever tricks to this problem. I have no idea how I came up with this\n    export PATH=\"$PATH:$COOKBOOK_STAGE/usr/bin\"\n    DESTDIR=\"${COOKBOOK_STAGE}\" \"${COOKBOOK_NINJA}\" install-clang-tblgen\n    \"${COOKBOOK_NINJA}\" -j\"${COOKBOOK_MAKE_JOBS}\"\n    DESTDIR=\"${COOKBOOK_STAGE}\" \"${COOKBOOK_NINJA}\" install -j\"${COOKBOOK_MAKE_JOBS}\"\n\nelse\n\n    COOKBOOK_CMAKE_FLAGS+=(\n        -DCROSS_TOOLCHAIN_FLAGS_NATIVE=\"-DCMAKE_TOOLCHAIN_FILE=$(realpath native.cmake)\"\n        -DCLANG_TABLEGEN_EXE=${COOKBOOK_HOST_SYSROOT}/bin/clang-tblgen\n        -DLLVM_TABLEGEN_EXE=${COOKBOOK_HOST_SYSROOT}/bin/llvm-tblgen\n    )\n    cookbook_cmake\n\nfi\n\n\"\"\"\n\n[[optional-packages]]\nname = \"dev\"\nfiles = [\n    \"usr/include/clang*/**\",\n    \"usr/lib/libclang*.a\",\n    \"usr/lib/cmake/clang/**\",\n]\n"
  },
  {
    "path": "recipes/dev/cmake/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/Kitware/CMake/releases/download/v4.0.3/cmake-4.0.3.tar.gz\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"bzip2\",\n    # \"cppdap\",\n    \"curl\",\n    \"expat\",\n    # \"form\",\n    # \"jsoncpp\",\n    \"libarchive\",\n    # \"liblzma\",\n    # \"librhash\",\n    \"libuv\",\n    \"nghttp2\",\n    \"openssl1\",\n    \"zlib\",\n    \"zstd\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DBUILD_TESTING=Off\n    -DCMAKE_USE_SYSTEM_BZIP2=On\n    -DCMAKE_USE_SYSTEM_CURL=On\n    -DCMAKE_USE_SYSTEM_EXPAT=On\n    -DCMAKE_USE_SYSTEM_LIBARCHIVE=On\n    -DCMAKE_USE_SYSTEM_LIBUV=On\n    -DCMAKE_USE_SYSTEM_NGHTTP2=On\n    -DCMAKE_USE_SYSTEM_ZLIB=On\n    -DCMAKE_USE_SYSTEM_ZSTD=On\n)\ncookbook_cmake\nset -x\nmv -vT \"${COOKBOOK_STAGE}\"/usr/bin \"${COOKBOOK_STAGE}/bin\"\nmv -vT \"${COOKBOOK_STAGE}\"/usr/share \"${COOKBOOK_STAGE}/share\"\nrm -rf \"${COOKBOOK_STAGE}\"/usr/doc\nrmdir -v \"${COOKBOOK_STAGE}\"/usr\nset +x\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/composer/recipe.toml",
    "content": "#TODO must be run using `php $(which composer)`\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -p \"${COOKBOOK_STAGE}\"/usr/bin\nwget -c https://getcomposer.org/download/2.8.12/composer.phar\nchmod a+x composer.phar\ncp composer.phar ${COOKBOOK_STAGE}/usr/bin/composer\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/crates-io-index/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/rust-lang/crates.io-index.git\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ndir=\"${COOKBOOK_STAGE}/home/user/.cargo/registry/index/github.com-1ecc6299db9ec823\"\nmkdir -pv \"${dir}\"\ncp -rv \"${COOKBOOK_SOURCE}/.git\" \"${dir}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/fontconfig/recipe.toml",
    "content": "[source]\ntar = \"https://www.freedesktop.org/software/fontconfig/release/fontconfig-2.16.0.tar.xz\"\nblake3 = \"5c95d48f5b9150f4a06d8acac12c25edaac956007df95a3bf527df02a5908f0e\"\npatches = [\n\t\"redox.patch\"\n]\n[build]\ntemplate = \"meson\"\ndependencies = [\n\t\"expat\",\n\t\"freetype2\",\n\t\"libpng\",\n\t\"zlib\",\n]\ndev-dependencies = [\n\t\"host:gperf\"\n]\nmesonflags = [\n\t\"-Ddoc=disabled\"\n]\n"
  },
  {
    "path": "recipes/dev/fontconfig/redox.patch",
    "content": "diff -ruwN source/src/fccache.c source-new/src/fccache.c\n--- source/src/fccache.c\t2019-06-10 05:36:37.000000000 -0600\n+++ source-new/src/fccache.c\t2019-10-02 19:48:10.459642095 -0600\n@@ -1526,7 +1526,7 @@\n #if defined(_WIN32)\n \t    if (_locking (fd, _LK_LOCK, 1) == -1)\n \t\tgoto bail;\n-#else\n+#elif !defined(__redox__)\n \t    struct flock fl;\n \n \t    fl.l_type = F_WRLCK;\n@@ -1556,7 +1556,7 @@\n     {\n #if defined(_WIN32)\n \t_locking (fd, _LK_UNLCK, 1);\n-#else\n+#elif !defined(__redox__)\n \tstruct flock fl;\n \n \tfl.l_type = F_UNLCK;\ndiff -ruwN source/src/fccharset.c source-new/src/fccharset.c\n--- source/src/fccharset.c\t2018-06-05 04:36:38.000000000 -0600\n+++ source-new/src/fccharset.c\t2019-10-02 19:48:53.082862133 -0600\n@@ -600,7 +600,7 @@\n static FcChar32\n FcCharSetPopCount (FcChar32 c1)\n {\n-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)\n+#if !defined(__redox__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))\n     return __builtin_popcount (c1);\n #else\n     /* hackmem 169 */\n"
  },
  {
    "path": "recipes/dev/gcc13/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/gcc\"\nbranch = \"redox-13.2.0\"\nshallow_clone = true\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_AUTORECONF=autoreconf2.69 autotools_recursive_regenerate -I\"$(realpath ./config)\"\nLIBTOOL_BUILD_AUX=\"${COOKBOOK_LIBTOOL_DIR:-$COOKBOOK_HOST_SYSROOT}\"/share/libtool/build-aux\ncp -fpv \"$LIBTOOL_BUILD_AUX\"/{config.sub,config.guess,install-sh} libiberty/\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libgmp\",\n    \"libmpfr\",\n    \"mpc\",\n# TODO: this zlib get linked when boostrapping gcc\n#    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\nCROSS_GNU_TARGET=${COOKBOOK_CROSS_GNU_TARGET:-$GNU_TARGET}\n\nif [ \"${COOKBOOK_HOST_SYSROOT}\" = \"/usr\" ]; then\n# not specifying --enable-shared as it will link shared deps\nCOOKBOOK_STAGE+=\"/usr\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --prefix=\"\"\n    --host=\"${GNU_TARGET}\"\n    --program-prefix=\"${CROSS_GNU_TARGET}-\"\n    --with-native-system-header-dir=\"/include\"\n    --disable-hosted-libstdcxx\n    --with-sysroot\n    --with-build-sysroot=\"${COOKBOOK_CROSS_SYSROOT:-$COOKBOOK_SYSROOT}\"\n    --disable-bootstrap\n)\nelse\nexport CFLAGS_FOR_TARGET=\"${CPPFLAGS}\" CXXFLAGS_FOR_TARGET=\"${CPPFLAGS}\" LDFLAGS_FOR_TARGET=\"${LDFLAGS}\"\nexport CC_FOR_BUILD=\"$CC_WRAPPER gcc\" CXX_FOR_BUILD=\"$CC_WRAPPER g++\"\nunset CFLAGS CPPFLAGS LDFLAGS\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --with-sysroot=/\n    --with-gmp=\"${COOKBOOK_SYSROOT}/usr\"\n    --with-mpfr=\"${COOKBOOK_SYSROOT}/usr\"\n    --with-mpc=\"${COOKBOOK_SYSROOT}/usr\"\n)\nfi\n\nif [ \"${CROSS_GNU_TARGET}\" = \"riscv64gc-unknown-redox\" ]; then\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --with-arch=rv64gc\n    --with-abi=lp64d\n)\nfi\n\nif [ \"${CROSS_GNU_TARGET}\" != \"i586-unknown-redox\" ]; then\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --enable-frame-pointer\n)\nfi\n\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --target=\"${CROSS_GNU_TARGET}\"\n    --with-linker-hash-style=gnu\n    --enable-languages=c,c++,lto\n    --enable-initfini-array\n    --disable-nls\n    --disable-multilib\n#   --with-system-zlib\n    --enable-host-shared\n    --enable-threads=posix\n    --enable-libstdcxx-threads\n    --with-bugurl=\"https://gitlab.redox-os.org/redox-os/gcc/-/issues\"\n)\n\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\" all-gcc\n\"${COOKBOOK_MAKE}\" install-gcc DESTDIR=\"${COOKBOOK_STAGE}\"\n\n# requires relibc which is not available on bootstrapping\nif [ \"${COOKBOOK_HOST_SYSROOT}\" != \"/usr\" ]; then\n\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\" all-target-libgcc all-target-libstdc++-v3\n\"${COOKBOOK_MAKE}\" install-target-libgcc install-target-libstdc++-v3 DESTDIR=\"${COOKBOOK_STAGE}\"\nln -s \"gcc\" \"${COOKBOOK_STAGE}/usr/bin/cc\"\n# Avoid conflict with libgcc & libstdcxx\nrm -f \"${COOKBOOK_STAGE}\"/usr/lib/libgcc_s.so* \"${COOKBOOK_STAGE}\"/usr/lib/libstdc++.so*\n\nfi\n\"\"\"\n\n[package]\ndependencies = [\n    \"gnu-binutils\"\n]\n\n[[optional-packages]]\nname = \"cxx\"\ndependencies = []\nfiles = [\n    \"usr/bin/*c++\",\n    \"usr/bin/*g++\",\n    \"usr/include/c++/**\",\n    \"usr/lib/*c++*\",\n    \"usr/libexec/gcc/**/cc1plus\",\n    \"usr/share/gcc-*/python/libstdcxx/**\",\n]\n"
  },
  {
    "path": "recipes/dev/gdbserver/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/gdbserver.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/dev/gdk-pixbuf/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnome.org/pub/gnome/sources/gdk-pixbuf/2.44/gdk-pixbuf-2.44.4.tar.xz\"\nblake3 = \"94db7bebffbd6be84a1b58a05771e411e9f7c16b06d73fcedaf0e6c0e552be9c\"\n\n[build]\ndependencies = [\n    \"gettext\",\n    \"glib\",\n    \"libffi\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"pcre2\",\n    \"shared-mime-info\",\n    \"zlib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dbuiltin_loaders=all\",\n    \"-Dinstalled_tests=false\",\n    \"-Dman=false\",\n    \"-Dtests=false\",\n]\n"
  },
  {
    "path": "recipes/dev/git/git.patch",
    "content": "diff -ruwN git-2.13.1/compat/bswap.h source/compat/bswap.h\n--- git-2.13.1/compat/bswap.h\t2017-06-04 19:08:11.000000000 -0600\n+++ source/compat/bswap.h\t2025-04-24 11:20:06.475749424 -0600\n@@ -1,3 +1,7 @@\n+#if defined(__redox__)\n+#include <machine/endian.h>\n+#endif\n+\n /*\n  * Let's make sure we always have a sane definition for ntohl()/htonl().\n  * Some libraries define those as a function call, just to perform byte\ndiff -ruwN git-2.13.1/compat/terminal.c source/compat/terminal.c\n--- git-2.13.1/compat/terminal.c\t2017-06-04 19:08:11.000000000 -0600\n+++ source/compat/terminal.c\t2025-04-18 10:00:11.318697446 -0600\n@@ -137,6 +137,18 @@\n \treturn buf.buf;\n }\n \n+#elif defined(__redox__)\n+\n+ssize_t __getline(char **lptr, size_t *n, FILE *fp);\n+\n+char *git_terminal_prompt(const char *prompt, int echo)\n+{\n+\tchar *line = NULL;\n+\tsize_t n = 0;\n+\t__getline(&line, &n, stdin);\n+\treturn line; // XXX leak\n+}\n+\n #else\n \n char *git_terminal_prompt(const char *prompt, int echo)\ndiff -ruwN git-2.13.1/configure source/configure\n--- git-2.13.1/configure\t2017-06-04 19:08:11.000000000 -0600\n+++ source/configure\t2025-04-18 10:00:11.318697446 -0600\n@@ -6156,7 +6156,7 @@\n ac_res=$ac_cv_search_getaddrinfo\n if test \"$ac_res\" != no; then :\n   test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n-  NO_IPV6=\n+  NO_IPV6=YesPlease\n else\n   NO_IPV6=YesPlease\n fi\ndiff -ruwN git-2.13.1/daemon.c source/daemon.c\n--- git-2.13.1/daemon.c\t2017-06-04 19:08:11.000000000 -0600\n+++ source/daemon.c\t2025-04-18 10:00:11.319697447 -0600\n@@ -71,13 +71,21 @@\n \treturn hi->ip_address.buf;\n }\n \n+#if defined(__redox__)\n+#define LOG_ERR 0\n+#define LOG_INFO 1\n+#endif\n+\n static void logreport(int priority, const char *err, va_list params)\n {\n+#if !defined(__redox__)\n \tif (log_syslog) {\n \t\tchar buf[1024];\n \t\tvsnprintf(buf, sizeof(buf), err, params);\n \t\tsyslog(priority, \"%s\", buf);\n-\t} else {\n+\t} else\n+#endif\n+\t{\n \t\t/*\n \t\t * Since stderr is set to buffered mode, the\n \t\t * logging of different processes will not overlap\n@@ -888,8 +896,12 @@\n \n \tif (!reuseaddr)\n \t\treturn 0;\n+#if defined(__redox__)\n+        return 0;\n+#else\n \treturn setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,\n \t\t\t  &on, sizeof(on));\n+#endif\n }\n \n struct socketlist {\n@@ -1174,11 +1186,7 @@\n \tif (!group_name)\n \t\tc.gid = c.pass->pw_gid;\n \telse {\n-\t\tstruct group *group = getgrnam(group_name);\n-\t\tif (!group)\n \t\t\tdie(\"group not found - %s\", group_name);\n-\n-\t\tc.gid = group->gr_gid;\n \t}\n \n \treturn &c;\n@@ -1348,10 +1356,12 @@\n \t\tusage(daemon_usage);\n \t}\n \n+#if !defined(__redox__)\n \tif (log_syslog) {\n \t\topenlog(\"git-daemon\", LOG_PID, LOG_DAEMON);\n \t\tset_die_routine(daemon_die);\n \t} else\n+#endif\n \t\t/* avoid splitting a message in the middle */\n \t\tsetvbuf(stderr, NULL, _IOFBF, 4096);\n \ndiff -ruwN git-2.13.1/git-compat-util.h source/git-compat-util.h\n--- git-2.13.1/git-compat-util.h\t2017-06-04 19:08:11.000000000 -0600\n+++ source/git-compat-util.h\t2025-04-18 10:00:11.319697447 -0600\n@@ -1,6 +1,18 @@\n #ifndef GIT_COMPAT_UTIL_H\n #define GIT_COMPAT_UTIL_H\n \n+#ifndef SIG_DFL\n+#define SIG_DFL ((void (*)(int))0)\n+#endif\n+\n+#ifndef SIG_IGN\n+#define SIG_IGN ((void (*)(int))1)\n+#endif\n+\n+#ifndef SIG_ERR\n+#define SIG_ERR ((void (*)(int))-1)\n+#endif\n+\n #define _FILE_OFFSET_BITS 64\n \n \n@@ -323,6 +335,14 @@\n #define PATH_SEP ':'\n #endif\n \n+#ifndef DEV_NULL\n+#if defined(__redox__)\n+#define DEV_NULL \"/scheme/null\"\n+#else\n+#define DEV_NULL \"/dev/null\"\n+#endif\n+#endif\n+\n #ifdef HAVE_PATHS_H\n #include <paths.h>\n #endif\ndiff -ruwN git-2.13.1/Makefile source/Makefile\n--- git-2.13.1/Makefile\t2017-06-05 08:08:11.000000000 +0700\n+++ source/Makefile\t2025-09-01 04:41:10.339224568 +0700\n@@ -979,7 +979,7 @@\n BUILTIN_OBJS += builtin/write-tree.o\n \n GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)\n-EXTLIBS =\n+EXTLIBS = -lnghttp2\n \n GIT_USER_AGENT = git/$(GIT_VERSION)\n \n@@ -1802,7 +1802,6 @@\n \n $(BUILT_INS): git$X\n \t$(QUIET_BUILT_IN)$(RM) $@ && \\\n-\tln $< $@ 2>/dev/null || \\\n \tln -s $< $@ 2>/dev/null || \\\n \tcp $< $@\n \n@@ -2096,7 +2095,6 @@\n \n $(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)\n \t$(QUIET_LNCP)$(RM) $@ && \\\n-\tln $< $@ 2>/dev/null || \\\n \tln -s $< $@ 2>/dev/null || \\\n \tcp $< $@\n \n@@ -2449,14 +2447,12 @@\n \tfor p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \\\n \t\t$(RM) \"$$bindir/$$p\" && \\\n \t\ttest -z \"$(NO_INSTALL_HARDLINKS)\" && \\\n-\t\tln \"$$bindir/git$X\" \"$$bindir/$$p\" 2>/dev/null || \\\n \t\tln -s \"git$X\" \"$$bindir/$$p\" 2>/dev/null || \\\n \t\tcp \"$$bindir/git$X\" \"$$bindir/$$p\" || exit; \\\n \tdone && \\\n \tfor p in $(BUILT_INS); do \\\n \t\t$(RM) \"$$execdir/$$p\" && \\\n \t\ttest -z \"$(NO_INSTALL_HARDLINKS)\" && \\\n-\t\tln \"$$execdir/git$X\" \"$$execdir/$$p\" 2>/dev/null || \\\n \t\tln -s \"git$X\" \"$$execdir/$$p\" 2>/dev/null || \\\n \t\tcp \"$$execdir/git$X\" \"$$execdir/$$p\" || exit; \\\n \tdone && \\\n@@ -2464,7 +2460,6 @@\n \tfor p in $$remote_curl_aliases; do \\\n \t\t$(RM) \"$$execdir/$$p\" && \\\n \t\ttest -z \"$(NO_INSTALL_HARDLINKS)\" && \\\n-\t\tln \"$$execdir/git-remote-http$X\" \"$$execdir/$$p\" 2>/dev/null || \\\n \t\tln -s \"git-remote-http$X\" \"$$execdir/$$p\" 2>/dev/null || \\\n \t\tcp \"$$execdir/git-remote-http$X\" \"$$execdir/$$p\" || exit; \\\n \tdone && \\\ndiff -ruwN git-2.13.1/run-command.c source/run-command.c\n--- git-2.13.1/run-command.c\t2017-06-04 19:08:11.000000000 -0600\n+++ source/run-command.c\t2025-04-18 10:00:11.320697447 -0600\n@@ -120,9 +120,9 @@\n #ifndef GIT_WINDOWS_NATIVE\n static inline void dup_devnull(int to)\n {\n-\tint fd = open(\"/dev/null\", O_RDWR);\n+\tint fd = open(DEV_NULL, O_RDWR);\n \tif (fd < 0)\n-\t\tdie_errno(_(\"open /dev/null failed\"));\n+\t\tdie_errno(_(\"open %s failed\"), DEV_NULL);\n \tif (dup2(fd, to) < 0)\n \t\tdie_errno(_(\"dup2(%d,%d) failed\"), fd, to);\n \tclose(fd);\ndiff -ruwN git-2.13.1/setup.c source/setup.c\n--- git-2.13.1/setup.c\t2017-06-05 08:08:11.000000000 +0700\n+++ source/setup.c\t2025-09-01 04:41:10.339224568 +0700\n@@ -1146,11 +1146,11 @@\n /* if any standard file descriptor is missing open it to /dev/null */\n void sanitize_stdfds(void)\n {\n-\tint fd = open(\"/dev/null\", O_RDWR, 0);\n+\tint fd = open(DEV_NULL, O_RDWR, 0);\n \twhile (fd != -1 && fd < 2)\n \t\tfd = dup(fd);\n \tif (fd == -1)\n-\t\tdie_errno(\"open /dev/null or dup failed\");\n+\t\tdie_errno(\"open %s or dup failed\", DEV_NULL);\n \tif (fd > 2)\n \t\tclose(fd);\n }\n@@ -1169,8 +1169,10 @@\n \t\tdefault:\n \t\t\texit(0);\n \t}\n+#if !defined(__redox__)\n \tif (setsid() == -1)\n \t\tdie_errno(\"setsid failed\");\n+#endif\n \tclose(0);\n \tclose(1);\n \tclose(2);\n"
  },
  {
    "path": "recipes/dev/git/recipe.toml",
    "content": "[source]\ntar = \"https://www.kernel.org/pub/software/scm/git/git-2.13.1.tar.xz\"\nblake3 = \"bc78271bffd60c5b8b938d8c08fd74dc2de8d21fbaf8f8e0e3155436d9263f17\"\npatches = [\"git.patch\"]\n\n[build]\ndependencies=[\n    \"curl\",\n    \"expat\",\n    \"nghttp2\",\n    \"openssl3\",\n    \"zlib\"\n]\ntemplate = \"custom\"\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\nDYNAMIC_INIT\nMAKEFLAGS=(\n    NEEDS_SSL_WITH_CURL=1\n    NEEDS_CRYPTO_WITH_SSL=1\n    NO_IPV6=1\n    NO_PREAD=1\n    NO_MMAP=1\n    NO_SETITIMER=1\n    NO_UNIX_SOCKETS=1\n    NEEDS_LIBICONV=\n    NEEDS_LIBRT=\n    BLK_SHA1=1\n    V=1\n)\nexport CURL_CONFIG=\"${COOKBOOK_SYSROOT}/usr/bin/curl-config\"\n./configure \\\n    --host=\"${GNU_TARGET}\" \\\n    --prefix=/usr \\\n    ac_cv_fread_reads_directories=yes \\\n    ac_cv_snprintf_returns_bogus=yes \\\n    ac_cv_lib_curl_curl_global_init=yes\n\"${COOKBOOK_MAKE}\" \"${MAKEFLAGS[@]}\" -j\"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" DESTDIR=\"${COOKBOOK_STAGE}\" \"${MAKEFLAGS[@]}\" install\nrm -rf \"${COOKBOOK_STAGE}/usr/share/man\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"ca-certificates\",\n    \"nghttp2\"\n]\n"
  },
  {
    "path": "recipes/dev/gitoxide/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/Byron/gitoxide.git\"\n\n[build]\ndependencies = [\n    \"openssl1\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\nexport OPENSSL_STATIC=\"true\"\ncookbook_cargo\n\"\"\"\n\n"
  },
  {
    "path": "recipes/dev/gnu-make/recipe.toml",
    "content": "#TODO very basic makefiles are tested to work but needs more testing\n[source]\ntar = \"http://ftp.gnu.org/gnu/make/make-4.4.tar.gz\"\npatches = [\n    \"redox.patch\"\n]\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n# TODO: https://gitlab.redox-os.org/redox-os/redox/-/issues/1753\n    'ac_cv_func_mkfifo=no'\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/gnu-make/redox.patch",
    "content": "diff -ruwN make-4.4/src/arscan.c source/src/arscan.c\n--- make-4.4/src/arscan.c\t2022-10-23 16:52:32.000000000 +0200\n+++ source/src/arscan.c\t2024-08-23 18:28:49.206084084 +0200\n@@ -331,7 +331,7 @@\n #endif\n \n #ifndef WINDOWS32\n-# if !defined (__ANDROID__) && !defined (__BEOS__)\n+# if 0\n #  include <ar.h>\n # else\n    /* These platforms don't have <ar.h> but have archives in the same format\ndiff -ruwN make-4.4/src/getopt1.c source/src/getopt1.c\n--- make-4.4/src/getopt1.c\t2022-10-23 21:52:32.000000000 +0700\n+++ source/src/getopt1.c\t2026-01-24 23:28:34.306706884 +0700\n@@ -48,6 +48,10 @@\n #endif\n #endif\n \n+#ifdef __redox__\n+#define ELIDE_CODE\n+#endif\n+\n #ifndef ELIDE_CODE\n \n \ndiff -ruwN make-4.4/src/getopt.c source/src/getopt.c\n--- make-4.4/src/getopt.c\t2022-10-23 21:52:32.000000000 +0700\n+++ source/src/getopt.c\t2026-01-24 23:21:09.488487860 +0700\n@@ -56,6 +56,10 @@\n # endif\n #endif\n \n+#ifdef __redox__\n+#define ELIDE_CODE\n+#endif\n+\n #ifndef ELIDE_CODE\n \n \n"
  },
  {
    "path": "recipes/dev/hello-world-examples/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/leachim6/hello-world\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/home/user/hello-world-examples\ncp -rv \"${COOKBOOK_SOURCE}\"/[#,a-z] \"${COOKBOOK_STAGE}\"/home/user/hello-world-examples\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/jq/recipe.toml",
    "content": "#TODO undefined reference\n[source]\ntar = \"https://github.com/jqlang/jq/releases/download/jq-1.8.1/jq-1.8.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/dev/lang/gawk/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/gawk.git\"\nupstream = \"https://git.savannah.gnu.org/git/gawk.git\"\nbranch = \"redox\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    ac_cv_func_gethostbyname=no\n    ac_cv_func_connect=no\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/lci/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jD91mZM2/rust-lci\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/dev/libtool/recipe.toml",
    "content": "#TODO can build, not tested\n[source]\ngit = \"https://gitlab.redox-os.org/redox-os/libtool\"\nbranch = \"v2.5.4-redox\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\n# libtool saves absolute path to sysroot which contains nothing\nunset CFLAGS\n\ncp -r \"${COOKBOOK_SOURCE}\"/. ./\n./bootstrap \\\n    --skip-po \\\n    --force \\\n    --gnulib-srcdir=./gnulib\nCOOKBOOK_CONFIGURE=\"./configure\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/lld21/recipe.toml",
    "content": "[source]\nsame_as = \"../llvm21\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"llvm21\",\n    \"zstd\",\n]\ndev-dependencies = [\n    \"llvm21.dev\",\n    \"llvm21.runtime\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nARCH=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n\ngenerate_cookbook_cmake_file $COOKBOOK_HOST_TARGET \"\" \"$COOKBOOK_TOOLCHAIN\" native.cmake\n\nif [ \"$TARGET\" = \"$COOKBOOK_HOST_TARGET\" ]; then\nCOOKBOOK_CMAKE_FLAGS+=( -DLLVM_TABLEGEN_EXE=${COOKBOOK_TOOLCHAIN}/bin/llvm-tblgen )\nelse\nCOOKBOOK_CMAKE_FLAGS+=( -DLLVM_TABLEGEN_EXE=${COOKBOOK_HOST_SYSROOT}/bin/llvm-tblgen )\nfi\n\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DLLVM_ROOT=\"${COOKBOOK_SYSROOT}\"\n    -DCROSS_TOOLCHAIN_FLAGS_NATIVE=\"-DCMAKE_TOOLCHAIN_FILE=$(realpath native.cmake)\"\n    -DLLVM_USE_STATIC_ZSTD=On\n\n# the shared options from llvm\n    -DCMAKE_CXX_FLAGS=\"--std=gnu++11\"\n    -DBUILD_SHARED_LIBS=False\n    -DLLVM_BUILD_EXAMPLES=Off\n    -DLLVM_BUILD_TESTS=Off\n    -DLLVM_DEFAULT_TARGET_TRIPLE=\"${TARGET}\"\n    -DLLVM_ENABLE_LTO=Off\n    -DLLVM_ENABLE_RTTI=On\n    -DLLVM_ENABLE_THREADS=On\n    -DLLVM_INCLUDE_EXAMPLES=Off\n    -DLLVM_INCLUDE_TESTS=Off\n    -DLLVM_OPTIMIZED_TABLEGEN=On\n    -DLLVM_TARGET_ARCH=$ARCH\n    -DLLVM_TOOLS_INSTALL_DIR=bin\n    -DLLVM_UTILS_INSTALL_DIR=bin\n    -DUNIX=1\n)\n\nCOOKBOOK_SOURCE=\"$COOKBOOK_SOURCE/lld\"\n\ncookbook_cmake\n\"\"\"\n\n[[optional-packages]]\nname = \"dev\"\ndependencies = []\nfiles = [\n    \"usr/include/lld*/**\",\n    \"usr/lib/liblld*.a\",\n    \"usr/lib/cmake/lld/**\",\n]\n"
  },
  {
    "path": "recipes/dev/llvm18/native.cmake",
    "content": "set(CMAKE_C_COMPILER cc)\nset(CMAKE_CXX_COMPILER c++)\n"
  },
  {
    "path": "recipes/dev/llvm18/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/llvm-project.git\"\nupstream = \"https://github.com/rust-lang/llvm-project.git\"\nbranch = \"redox-2024-05-11\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\n# https://llvm.org/docs/CMake.html\ncase \"${TARGET}\" in\n    x86-unknown-redox)\n        LLVM_TARGETS_TO_BUILD=\"X86\"\n        ;;\n    x86_64-unknown-redox)\n        LLVM_TARGETS_TO_BUILD=\"X86\"\n        ;;\n    aarch64-unknown-redox)\n        LLVM_TARGETS_TO_BUILD=\"AArch64\"\n        ;;\n    riscv64gc-unknown-redox)\n        LLVM_TARGETS_TO_BUILD=\"RISCV\"\n        ;;\n    *)\n        LLVM_TARGETS_TO_BUILD=\"host\"\n        ;;\nesac\n\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DCMAKE_CXX_FLAGS=\"--std=gnu++11\"\n    -DBUILD_SHARED_LIBS=False\n    -DLLVM_LINK_LLVM_DYLIB=On\n    -DCROSS_TOOLCHAIN_FLAGS_NATIVE=\"-DCMAKE_TOOLCHAIN_FILE=$(realpath \"${COOKBOOK_RECIPE}/native.cmake\")\"\n    -DLLVM_BUILD_BENCHMARKS=Off\n    -DLLVM_BUILD_EXAMPLES=Off\n    -DLLVM_BUILD_TESTS=Off\n    -DLLVM_BUILD_UTILS=Off\n    -DLLVM_DEFAULT_TARGET_TRIPLE=\"${TARGET}\"\n    -DLLVM_ENABLE_LTO=Off\n    -DLLVM_ENABLE_RTTI=On\n    -DLLVM_ENABLE_THREADS=On\n    -DLLVM_ENABLE_ZSTD=Off\n    -DLLVM_INCLUDE_BENCHMARKS=Off\n    -DLLVM_INCLUDE_EXAMPLES=Off\n    -DLLVM_INCLUDE_TESTS=Off\n    -DLLVM_INCLUDE_UTILS=Off\n    -DLLVM_OPTIMIZED_TABLEGEN=On\n    -DLLVM_TARGET_ARCH=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DLLVM_TARGETS_TO_BUILD=\"${LLVM_TARGETS_TO_BUILD}\"\n    -DLLVM_TOOL_LLVM_COV_BUILD=Off\n    -DLLVM_TOOL_LLVM_LTO_BUILD=Off\n    -DLLVM_TOOL_LLVM_LTO2_BUILD=Off\n    -DLLVM_TOOL_LLVM_PROFDATA_BUILD=Off\n    -DLLVM_TOOL_LLVM_RTDYLD_BUILD=Off\n    -DLLVM_TOOL_LLVM_XRAY_BUILD=Off\n    -DLLVM_TOOL_LLI_BUILD=Off\n    -DLLVM_TOOL_LTO_BUILD=Off\n    -DLLVM_TOOLS_INSTALL_DIR=bin\n    -DLLVM_UTILS_INSTALL_DIR=bin\n    -DUNIX=1\n    -DLLVM_ENABLE_PROJECTS=\"llvm\"\n)\n\n# Native tablegen build fails with too many jobs, limit to 16\nCOOKBOOK_MAKE_JOBS=\"$(( ${COOKBOOK_MAKE_JOBS} > 16 ? 16 : ${COOKBOOK_MAKE_JOBS} ))\"\ncookbook_cmake \"${COOKBOOK_SOURCE}/llvm\"\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/llvm21/native.cmake",
    "content": "set(CMAKE_C_COMPILER cc)\nset(CMAKE_CXX_COMPILER c++)\n"
  },
  {
    "path": "recipes/dev/llvm21/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/llvm-project.git\"\nupstream = \"https://github.com/rust-lang/llvm-project.git\"\nbranch = \"redox-2025-10-03\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"zstd\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nARCH=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n\ncase \"${ARCH}\" in\n    x86 | x86_64) LLVM_TARGETS_TO_BUILD=\"X86\";;\n    aarch64) LLVM_TARGETS_TO_BUILD=\"AArch64\";;\n    riscv64gc) LLVM_TARGETS_TO_BUILD=\"RISCV\";;\nesac\n\nif [ \"${COOKBOOK_HOST_SYSROOT}\" = \"/usr\" ]; then\n    LLVM_TARGETS_TO_BUILD=\"X86;AArch64;RISCV\"\nfi\n\n# This just build the LLVM library and tools just enough for Rust, to build the rest of LLVM see\n# https://github.com/llvm/llvm-zorg/blob/main/zorg/buildbot/builders/annotated/standalone-build.sh\n\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DLLVM_BUILD_LLVM_DYLIB=On\n    -DLLVM_LINK_LLVM_DYLIB=On\n    -DLLVM_INCLUDE_UTILS=On\n    -DLLVM_INSTALL_UTILS=On\n    -DLLVM_TOOL_LLVM_COV_BUILD=On\n    -DLLVM_TOOL_LLVM_PROFDATA_BUILD=On\n    -DLLVM_TARGETS_TO_BUILD=\"$LLVM_TARGETS_TO_BUILD\"\n    -DLLVM_ENABLE_ZLIB=Off\n    -DLLVM_USE_STATIC_ZSTD=On\n    -DLLVM_ENABLE_LIBXML2=Off\n\n# the rest of options that shared to clang\n    -DCROSS_TOOLCHAIN_FLAGS_NATIVE=\"-DCMAKE_TOOLCHAIN_FILE=$(realpath \"${COOKBOOK_RECIPE}/native.cmake\")\"\n    -DCMAKE_CXX_FLAGS=\"--std=gnu++11\"\n    -DBUILD_SHARED_LIBS=False\n    -DLLVM_BUILD_EXAMPLES=Off\n    -DLLVM_BUILD_TESTS=Off\n    -DLLVM_DEFAULT_TARGET_TRIPLE=\"${TARGET}\"\n    -DLLVM_ENABLE_LTO=Off\n    -DLLVM_ENABLE_RTTI=On\n    -DLLVM_ENABLE_THREADS=On\n    -DLLVM_INCLUDE_EXAMPLES=Off\n    -DLLVM_INCLUDE_TESTS=Off\n    -DLLVM_OPTIMIZED_TABLEGEN=On\n    -DLLVM_TARGET_ARCH=$ARCH\n    -DLLVM_TOOLS_INSTALL_DIR=bin\n    -DLLVM_UTILS_INSTALL_DIR=bin\n    -DUNIX=1\n)\n\nCOOKBOOK_SOURCE=\"$COOKBOOK_SOURCE/llvm\"\ncookbook_cmake\n\"\"\"\n\n# llvm runtime\n[[optional-packages]]\nname = \"runtime\"\nfiles = [\n    \"usr/bin/**\",\n]\n\n[[optional-packages]]\nname = \"dev\"\ndependencies = [ \".runtime\" ]\nfiles = [\n    \"usr/include/llvm*/**\",\n    \"usr/lib/libLLVM*.a\",\n    \"usr/lib/cmake/llvm/**\",\n]\n"
  },
  {
    "path": "recipes/dev/lua54/recipe.toml",
    "content": "[source]\ntar = \"https://lua.org/ftp/lua-5.4.7.tar.gz\"\nblake3 = \"e51c2f347e3185479d5ff95cae8ac77511db486853269443c56bedaa0a6ae629\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\"${COOKBOOK_MAKE}\" -j\"${COOKBOOK_MAKE_JOBS}\" posix \\\n    AR=\"${AR} rcu\" \\\n    CC=\"${CC} -std=gnu99\" \\\n    RANLIB=\"${RANLIB}\" \\\n    SYSLDFLAGS=\"$LDFLAGS\"\n\n\"${COOKBOOK_MAKE}\" install INSTALL_TOP=\"${COOKBOOK_STAGE}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/luajit/recipe.toml",
    "content": "[source]\ngit = \"https://luajit.org/git/luajit.git\"\nrev = \"a4f56a459a588ae768801074b46ba0adcfb49eb1\"\npatches = [\"redox.patch\"]\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\nrsync -av \"${COOKBOOK_SOURCE}/\" ./\nOS=$(echo \"${TARGET}\" | cut -d - -f3)\n\ncase \"${OS}\" in\n    linux)  SYS=Linux;;\n    redox)  SYS=Redox;;\nesac\n\n${COOKBOOK_MAKE} -j ${COOKBOOK_MAKE_JOBS} install \\\n  PREFIX=\"${COOKBOOK_STAGE}\" \\\n  TARGET_SYS=\"${SYS}\" \\\n  CROSS=\"${GNU_TARGET}-\"\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/luajit/redox.patch",
    "content": "diff --git a/src/Makefile b/src/Makefile\nindex 3a6a4329..450e8fe6 100644\n--- a/src/Makefile\n+++ b/src/Makefile\n@@ -351,6 +351,9 @@ else\n   ifeq (GNU/kFreeBSD,$(TARGET_SYS))\n     TARGET_XLIBS+= -ldl\n   endif\n+  ifeq (Redox,$(TARGET_SYS))\n+    TARGET_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_POSIX\n+  endif\n endif\n endif\n endif\n@@ -367,12 +370,16 @@ ifneq ($(HOST_SYS),$(TARGET_SYS))\n   else\n   ifeq (iOS,$(TARGET_SYS))\n     HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OSX -DTARGET_OS_IPHONE=1\n+  else\n+  ifeq (Redox,$(TARGET_SYS))\n+    HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_POSIX\n   else\n     HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OTHER\n   endif\n   endif\n   endif\n   endif\n+  endif\n endif\n \n ifneq (,$(CCDEBUG))\n"
  },
  {
    "path": "recipes/dev/luarocks/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/luarocks/luarocks.git\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n\"lua54\"\n]\nscript = \"\"\"\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --sysconfdir=$COOKBOOK_SYSROOT\n    --with-lua-include=$COOKBOOK_SYSROOT/include\n    --with-lua-bin=$COOKBOOK_SYSROOT/bin\n    --with-lua-lib=$COOKBOOK_SYSROOT/lib\n)\ncd \"${COOKBOOK_SOURCE}\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/nasm/recipe.toml",
    "content": "[source]\n#TODO: nasm.us is down: tar = \"https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz\"\ntar = \"https://gstreamer.freedesktop.org/src/mirror/nasm-2.14.02.tar.xz\"\nblake3 = \"f66c0cc852c3b9e3321f57c33ef336e17a128bd3d854ee095aae7e6f64629f20\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/dev/patch/01_no_rlimit.patch",
    "content": "diff -ru source/lib/getdtablesize.c source-new/lib/getdtablesize.c\n--- source/lib/getdtablesize.c\t2015-03-06 16:31:45.000000000 -0800\n+++ source-new/lib/getdtablesize.c\t2017-08-08 19:33:33.993874985 -0700\n@@ -106,15 +106,6 @@\n int\n getdtablesize (void)\n {\n-  struct rlimit lim;\n-\n-  if (getrlimit (RLIMIT_NOFILE, &lim) == 0\n-      && 0 <= lim.rlim_cur && lim.rlim_cur <= INT_MAX\n-      && lim.rlim_cur != RLIM_INFINITY\n-      && lim.rlim_cur != RLIM_SAVED_CUR\n-      && lim.rlim_cur != RLIM_SAVED_MAX)\n-    return lim.rlim_cur;\n-\n   return INT_MAX;\n }\n \nOnly in source-new/lib: getdtablesize.c.orig\ndiff -ru source/src/safe.c source-new/src/safe.c\n--- source/src/safe.c\t2015-03-06 16:34:20.000000000 -0800\n+++ source-new/src/safe.c\t2017-08-08 19:33:53.447430811 -0700\n@@ -92,11 +92,7 @@\n \n static void init_dirfd_cache (void)\n {\n-  struct rlimit nofile;\n-\n   max_cached_fds = 8;\n-  if (getrlimit (RLIMIT_NOFILE, &nofile) == 0)\n-    max_cached_fds = MAX (nofile.rlim_cur / 4, max_cached_fds);\n \n   cached_dirfds = hash_initialize (max_cached_fds,\n \t\t\t\t   NULL,\n"
  },
  {
    "path": "recipes/dev/patch/02_no_chown.patch",
    "content": "diff -ru source/src/util.c source-new/src/util.c\n--- source/src/util.c\t2015-03-06 16:34:20.000000000 -0800\n+++ source-new/src/util.c\t2017-08-11 18:24:56.991729200 -0700\n@@ -271,6 +271,7 @@\n \n       /* May fail if we are not privileged to set the file owner, or we are\n          not in group instat.st_gid.  Ignore those errors.  */\n+      /*\n       if ((uid != -1 || gid != -1)\n \t  && safe_lchown (to, uid, gid) != 0\n \t  && (errno != EPERM\n@@ -281,6 +282,7 @@\n \t\t(uid == -1) ? \"owner\" : \"owning group\",\n \t\tS_ISLNK (mode) ? \"symbolic link\" : \"file\",\n \t\tquotearg (to));\n+      */\n     }\n   if (attr & FA_XATTRS)\n     if (copy_attr (from, to) != 0\n"
  },
  {
    "path": "recipes/dev/patch/03_renameat2.patch",
    "content": "--- source-old/lib/renameat2.c\t2018-02-03 05:41:53.000000000 -0700\n+++ source/lib/renameat2.c\t2025-11-01 08:39:54.945513820 -0600\n@@ -70,6 +70,7 @@\n    Obey FLAGS when doing the renaming.  If FLAGS is zero, this\n    function is equivalent to renameat (FD1, SRC, FD2, DST).  */\n \n+#if !defined(__redox__)\n int\n renameat2 (int fd1, char const *src, int fd2, char const *dst,\n            unsigned int flags)\n@@ -225,3 +226,4 @@\n \n #endif /* !HAVE_RENAMEAT */\n }\n+#endif\n"
  },
  {
    "path": "recipes/dev/patch/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.xz\"\nblake3 = \"d46d14c12aa4ea51e356bf92091c368fd871e1d770b94bc29027886737aecd5f\"\npatches = [\n    \"01_no_rlimit.patch\",\n    \"02_no_chown.patch\",\n    \"03_renameat2.patch\",\n]\nscript = \"\"\"\nwget -O build-aux/config.sub \"https://gitlab.redox-os.org/redox-os/gnu-config/-/raw/master/config.sub?inline=false\"\nautoreconf\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"${COOKBOOK_SOURCE}/configure\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --host=\"${TARGET}\"\n    --prefix=\"/\"\n    --build=\"$(gcc -dumpmachine)\"\n)\n\ncookbook_configure\n\n${TARGET}-strip \"${COOKBOOK_STAGE}/bin/\"*\nrm -rf \"${COOKBOOK_STAGE}/share\" \"${COOKBOOK_STAGE}/lib\"\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/pciids/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pciutils/pciids.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ninstall -d \"${COOKBOOK_STAGE}/share/misc/\"\ninstall \"${COOKBOOK_SOURCE}\"/pci.ids \"${COOKBOOK_STAGE}/share/misc/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/php84/recipe.toml",
    "content": "[source]\ntar = \"https://www.php.net/distributions/php-8.4.17.tar.xz\"\nblake3 = \"a8478dddd948d4b26e51c5727ac0895440da76e8ad9be947098a4284ca0b7f2a\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"bzip2\",\n    \"curl\",\n    \"gettext\",\n    \"libffi\",\n    \"libgmp\",\n    \"libavif\",\n    \"libicu\",\n    \"libjpeg\",\n    \"libedit\",\n    \"libonig\",\n    \"libpng\",\n    \"libsodium\",\n    \"libwebp\",\n    \"libxml2\",\n    \"libiconv\",\n    \"libzip\",\n    \"ncursesw\",\n    \"nghttp2\",\n    \"openssl1\",\n    \"openssl3\", # put this after openssl1\n    \"pcre\",\n    \"sqlite3\",\n    \"xz\",\n    \"zlib\",\n    \"zstd\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport SUFFIX=\"84\"\n\nexport CURL_LIBS=\"-lcurl -lnghttp2 -lssl -lcrypto\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --program-suffix=${SUFFIX}\n    --sysconfdir=/etc/php/$SUFFIX\n    --with-config-file-path=/etc/php/$SUFFIX\n    --with-config-file-scan-dir=/etc/php/$SUFFIX/conf.d\n    --with-iconv=\"${COOKBOOK_SYSROOT}/usr\"\n    --disable-opcache\n    --enable-bcmath\n    --enable-calendar\n    --enable-fpm  # need times function\n    --enable-gd\n    --enable-intl\n    --enable-mbstring\n    --with-curl\n    --with-gettext\n    --with-gmp\n    --with-jpeg\n    --with-webp\n    --with-avif\n    --with-ffi\n    --with-libedit\n    --with-openssl\n    --with-sodium\n    --with-zip\n)\n\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\" \"$@\"\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" install \\\n    INSTALL_ROOT=\"${COOKBOOK_STAGE}\" \\\n    datarootdir=/usr/share localstatedir=/var\n\nmv ${COOKBOOK_STAGE}/usr/sbin/* ${COOKBOOK_STAGE}/usr/bin/\nfor bin in \"php-cgi\" \"php-config\" \"php\" \"phpdbg\" \"phpize\" \"php-fpm\"; do\n  ln -s \"$bin$SUFFIX\" ${COOKBOOK_STAGE}/usr/bin/$bin\ndone\n# will not exist on bash but exist on other shell\nrm -f ${COOKBOOK_STAGE}/usr/bin/phar$SUFFIX\ncp ${COOKBOOK_SOURCE}/php.ini* ${COOKBOOK_STAGE}/etc/php/$SUFFIX/\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/php84/redox.patch",
    "content": "diff -ruwN source/configure source-new/configure\n--- source/configure\t2026-01-14 00:17:10.000000000 +0700\n+++ source-new/configure\t2026-01-16 15:56:01.944755811 +0700\n@@ -26007,7 +26007,7 @@\n then :\n   ac_cv_lib_curl_curl_easy_perform=yes\n else case e in #(\n-  e) ac_cv_lib_curl_curl_easy_perform=no ;;\n+  e) ac_cv_lib_curl_curl_easy_perform=yes ;;\n esac\n fi\n rm -f core conftest.err conftest.$ac_objext conftest.beam \\\n@@ -37728,7 +37728,7 @@\n then :\n   php_cv_lib_gd_works=yes\n else case e in #(\n-  e) php_cv_lib_gd_works=no ;;\n+  e) php_cv_lib_gd_works=yes ;;\n esac\n fi\n rm -f core conftest.err conftest.$ac_objext conftest.beam \\\n@@ -40464,7 +40464,7 @@\n   LIBS_SAVED=$LIBS\n   CFLAGS=\"$CFLAGS $GMP_CFLAGS\"\n   LIBS=\"$LIBS $GMP_LIBS\"\n-  gmp_check=no\n+  gmp_check=yes\n   ac_fn_c_check_header_compile \"$LINENO\" \"gmp.h\" \"ac_cv_header_gmp_h\" \"$ac_includes_default\"\n if test \"x$ac_cv_header_gmp_h\" = xyes\n then :\ndiff -ruwN source/ext/phar/Makefile.frag source-new/ext/phar/Makefile.frag\n--- source/ext/phar/Makefile.frag\t2026-01-14 00:17:10.000000000 +0700\n+++ source-new/ext/phar/Makefile.frag\t2026-01-16 15:56:01.946130660 +0700\n@@ -30,7 +30,7 @@\n \t-@test -f $(builddir)/phar/phar.inc || cp $(srcdir)/phar/phar.inc $(builddir)/phar/phar.inc\n \n TEST_PHP_EXECUTABLE = $(shell $(PHP_EXECUTABLE) -v 2>&1)\n-TEST_PHP_EXECUTABLE_RES = $(shell echo \"$(TEST_PHP_EXECUTABLE)\" | grep -c 'Exec format error')\n+TEST_PHP_EXECUTABLE_RES = $(shell echo \"$(TEST_PHP_EXECUTABLE)\" | grep -E -c 'Exec format error|required file not found')\n \n $(builddir)/phar.php: $(srcdir)/build_precommand.php $(srcdir)/phar/*.inc $(srcdir)/phar/*.php $(SAPI_CLI_PATH)\n \t-@(echo \"Generating phar.php\"; \\\ndiff -ruwN source/ext/posix/posix.c source-new/ext/posix/posix.c\n--- source/ext/posix/posix.c\t2026-01-14 00:17:10.000000000 +0700\n+++ source-new/ext/posix/posix.c\t2026-01-16 15:56:01.946290813 +0700\n@@ -375,7 +375,7 @@\n \n \tZEND_PARSE_PARAMETERS_NONE();\n \n-\tif ((ticks = times(&t)) == -1) {\n+\t{\n \t\tPOSIX_G(last_error) = errno;\n \t\tRETURN_FALSE;\n \t}\ndiff -ruwN source/sapi/fpm/fpm/fpm_status.c source-new/sapi/fpm/fpm/fpm_status.c\n--- source/sapi/fpm/fpm/fpm_status.c\t2026-01-14 00:17:10.000000000 +0700\n+++ source-new/sapi/fpm/fpm/fpm_status.c\t2026-01-16 15:57:37.781307156 +0700\n@@ -84,6 +84,7 @@\n \t\t\tcontinue;\n \t\t}\n \t\t/* prevent NaN */\n+#ifdef HAVE_TIMES\n \t\tif (proc_p->cpu_duration.tv_sec == 0 && proc_p->cpu_duration.tv_usec == 0) {\n \t\t\tcpu = 0.;\n \t\t} else {\n@@ -91,6 +92,9 @@\n \t\t\t\t\tproc_p->last_request_cpu.tms_cstime) / fpm_scoreboard_get_tick() /\n \t\t\t\t\t(proc_p->cpu_duration.tv_sec + proc_p->cpu_duration.tv_usec / 1000000.) * 100.;\n \t\t}\n+#else\n+\t\t\tcpu = 0.;\n+#endif\n \n \t\tarray_init(&fpm_proc_stat);\n \t\tadd_assoc_long(&fpm_proc_stat, \"pid\", proc_p->pid);\n@@ -573,11 +577,15 @@\n \t\t\t\t}\n \n \t\t\t\t/* prevent NaN */\n+#ifdef HAVE_TIMES\n \t\t\t\tif (proc->cpu_duration.tv_sec == 0 && proc->cpu_duration.tv_usec == 0) {\n \t\t\t\t\tcpu = 0.;\n \t\t\t\t} else {\n \t\t\t\t\tcpu = (proc->last_request_cpu.tms_utime + proc->last_request_cpu.tms_stime + proc->last_request_cpu.tms_cutime + proc->last_request_cpu.tms_cstime) / fpm_scoreboard_get_tick() / (proc->cpu_duration.tv_sec + proc->cpu_duration.tv_usec / 1000000.) * 100.;\n \t\t\t\t}\n+#else\n+\t\t\t\t\tcpu = 0.;\n+#endif\n \n \t\t\t\tif (proc->request_stage == FPM_REQUEST_ACCEPTING) {\n \t\t\t\t\tduration = proc->duration;\n"
  },
  {
    "path": "recipes/dev/pkg-config/recipe.toml",
    "content": "[source]\ntar = \"https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz\"\nblake3 = \"713372b09a1fafeec130dc9bf812a3880f2a90496af5d2194e508d91ccf667d0\"\nscript = \"\"\"\nGNU_CONFIG_GET config.sub\n\"\"\"\n\n[build]\ndependencies = [\n    \"gettext\",\n    \"glib\",\n    \"libiconv\",\n    \"pcre2\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/python312/recipe.toml",
    "content": "[source]\ntar = \"https://www.python.org/ftp/python/3.12.12/Python-3.12.12.tar.xz\"\nblake3 = \"29636fdae3e0ee8d0fe585e528c9376fe43876f5f3f0f7892140567946fd907b\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"target:bzip2\",\n    \"target:libffi\",\n    \"target:openssl3\",\n    \"target:ncursesw\",\n    \"target:readline\",\n    \"target:sqlite3\",\n    \"target:zlib\",\n    \"target:xz\",\n    \"target:zstd\",\n]\ndev-dependencies = [\n    \"host:python312\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nexport PYTHONDONTWRITEBYTECODE=1\nARCH=\"${TARGET%%-*}\"\nOS=$(echo \"${TARGET}\" | cut -d - -f3-4)\n\nif [ \"$TARGET\" != \"$COOKBOOK_HOST_TARGET\" ]; then\n    COOKBOOK_CONFIGURE_FLAGS=(\n        --prefix=/usr\n        --disable-ipv6\n        --host=${GNU_TARGET}\n        --build=\"$ARCH\"\n        --with-build-python=\"${COOKBOOK_TOOLCHAIN}/usr/bin/python3.12\"\n        --with-ensurepip=install\n        --disable-test-modules\n        --with-ssl-default-suites=openssl\n        ac_cv_file__dev_ptmx=no\n        ac_cv_file__dev_ptc=no\n    )\nelse\n    COOKBOOK_CONFIGURE_FLAGS=(--prefix=/usr)\nfi\n\nif [ \"${COOKBOOK_DYNAMIC}\" != \"1\" ]; then\n    export MODULE_BUILDTYPE=static\n    COOKBOOK_CONFIGURE_FLAGS+=( --enable-shared )\nfi\n\ncookbook_configure\n\n# A same file to save 60MB\n(cd \"${COOKBOOK_STAGE}/usr/lib/python3.12/config-3.12-$ARCH-$OS\" && \\\n    rm -f libpython3.12.a && ln -s ../../libpython3.12.a)\n\"\"\"\n\n[[optional-packages]]\nname = \"dev\"\nfiles = [\n    \"usr/lib/python3.12/config-*/**\",\n    \"usr/lib/libpython*.a\"\n]\n"
  },
  {
    "path": "recipes/dev/python312/redox.patch",
    "content": "diff -ruwN source/configure source-new/configure\n--- source/configure\t2025-10-09 18:07:00.000000000 +0700\n+++ source-new/configure\t2025-12-09 22:14:30.781035339 +0700\n@@ -4283,6 +4283,9 @@\n \t*-*-wasi)\n \t    ac_sys_system=WASI\n \t    ;;\n+\t*-*-redox*)\n+\t\tac_sys_system=Redox\n+\t\t;;\n \t*)\n \t\t# for now, limit cross builds to known configurations\n \t\tMACHDEP=\"unknown\"\n@@ -4307,6 +4310,7 @@\n     case $MACHDEP in\n \taix*) MACHDEP=\"aix\";;\n \tlinux*) MACHDEP=\"linux\";;\n+\tredox*) MACHDEP=\"redox\";;\n \tcygwin*) MACHDEP=\"cygwin\";;\n \tdarwin*) MACHDEP=\"darwin\";;\n \t'')\tMACHDEP=\"unknown\";;\n@@ -4327,7 +4331,7 @@\n \n if test \"$cross_compiling\" = yes; then\n \tcase \"$host\" in\n-\t*-*-linux*)\n+\t*-*-linux*|*-*-redox*)\n \t\tcase \"$host_cpu\" in\n \t\tarm*)\n \t\t\t_host_cpu=arm\n@@ -6762,6 +6766,7 @@\n #undef cris\n #undef fr30\n #undef linux\n+#undef redox\n #undef hppa\n #undef hpux\n #undef i386\n@@ -6907,6 +6912,18 @@\n # endif\n #elif defined(__gnu_hurd__)\n         i386-gnu\n+#elif defined(__redox__)\n+# if defined(__x86_64__)\n+        x86_64-redox\n+# elif defined(__i386__)\n+        i386-redox\n+# elif defined(__aarch64__)\n+        aarch64-redox\n+# elif defined(__riscv)\n+        riscv64-redox\n+# else\n+#   error unknown platform triplet\n+# endif\n #elif defined(__APPLE__)\n         darwin\n #elif defined(__VXWORKS__)\n@@ -7507,7 +7524,7 @@\n \t      PY3LIBRARY=libpython3.so\n \t  fi\n           ;;\n-    Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*)\n+    Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|VxWorks*|Redox*)\n \t  LDLIBRARY='libpython$(LDVERSION).so'\n \t  BLDLIBRARY='-L. -lpython$(LDVERSION)'\n \t  RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\n@@ -12815,7 +12832,7 @@\n \tEmscripten*|WASI*)\n \t\tLDSHARED='$(CC) -shared'\n \t\tLDCXXSHARED='$(CXX) -shared';;\n-\tLinux*|GNU*|QNX*|VxWorks*|Haiku*)\n+\tLinux*|GNU*|QNX*|VxWorks*|Haiku*|Redox*)\n \t\tLDSHARED='$(CC) -shared'\n \t\tLDCXXSHARED='$(CXX) -shared';;\n \tFreeBSD*)\n@@ -12901,7 +12918,7 @@\n \t\t else CCSHARED=\"+z\";\n \t\t fi;;\n \tLinux-android*) ;;\n-\tLinux*|GNU*) CCSHARED=\"-fPIC\";;\n+\tLinux*|GNU*|Redox*) CCSHARED=\"-fPIC\";;\n \tEmscripten*|WASI*)\n \t\tif test \"x$enable_wasm_dynamic_linking\" = xyes\n then :\n@@ -12939,7 +12956,7 @@\n \t    LINKFORSHARED=\"-Wl,-E -Wl,+s\";;\n #\t    LINKFORSHARED=\"-Wl,-E -Wl,+s -Wl,+b\\$(BINLIBDEST)/lib-dynload\";;\n \tLinux-android*) LINKFORSHARED=\"-pie -Xlinker -export-dynamic\";;\n-\tLinux*|GNU*) LINKFORSHARED=\"-Xlinker -export-dynamic\";;\n+\tLinux*|GNU*|Redox*) LINKFORSHARED=\"-Xlinker -export-dynamic\";;\n \t# -u libsys_s pulls in all symbols in libsys\n \tDarwin/*)\n \t\tLINKFORSHARED=\"$extra_undefs -framework CoreFoundation\"\ndiff -ruwN source/Include/pyport.h source-new/Include/pyport.h\n--- source/Include/pyport.h\t2025-10-09 18:07:00.000000000 +0700\n+++ source-new/Include/pyport.h\t2025-12-09 22:14:30.781035339 +0700\n@@ -684,7 +684,7 @@\n #  error \"Py_TRACE_REFS ABI is not compatible with release and debug ABI\"\n #endif\n \n-#if defined(__ANDROID__) || defined(__VXWORKS__)\n+#if defined(__ANDROID__) || defined(__VXWORKS__) || defined(__redox__)\n    // Use UTF-8 as the locale encoding, ignore the LC_CTYPE locale.\n    // See _Py_GetLocaleEncoding(), PyUnicode_DecodeLocale()\n    // and PyUnicode_EncodeLocale().\ndiff -ruwN source/Modules/_cryptmodule.c source-new/Modules/_cryptmodule.c\n--- source/Modules/_cryptmodule.c\t2025-10-09 18:07:00.000000000 +0700\n+++ source-new/Modules/_cryptmodule.c\t2025-12-09 22:14:30.781035339 +0700\n@@ -38,13 +38,7 @@\n /*[clinic end generated code: output=0512284a03d2803c input=0e8edec9c364352b]*/\n {\n     char *crypt_result;\n-#ifdef HAVE_CRYPT_R\n-    struct crypt_data data;\n-    memset(&data, 0, sizeof(data));\n-    crypt_result = crypt_r(word, salt, &data);\n-#else\n     crypt_result = crypt(word, salt);\n-#endif\n     if (crypt_result == NULL) {\n         return PyErr_SetFromErrno(PyExc_OSError);\n     }\ndiff -ruwN source/Modules/resource.c source-new/Modules/resource.c\n--- source/Modules/resource.c\t2025-10-09 18:07:00.000000000 +0700\n+++ source-new/Modules/resource.c\t2025-12-09 22:14:30.781035339 +0700\n@@ -216,7 +216,7 @@\n {\n     struct rlimit rl;\n \n-    if (resource < 0 || resource >= RLIM_NLIMITS) {\n+    if (resource < 0 || resource >= RLIMIT_NLIMITS) {\n         PyErr_SetString(PyExc_ValueError,\n                         \"invalid resource specified\");\n         return NULL;\n@@ -244,7 +244,7 @@\n {\n     struct rlimit rl;\n \n-    if (resource < 0 || resource >= RLIM_NLIMITS) {\n+    if (resource < 0 || resource >= RLIMIT_NLIMITS) {\n         PyErr_SetString(PyExc_ValueError,\n                         \"invalid resource specified\");\n         return NULL;\n@@ -292,7 +292,7 @@\n     struct rlimit old_limit, new_limit;\n     int retval;\n \n-    if (resource < 0 || resource >= RLIM_NLIMITS) {\n+    if (resource < 0 || resource >= RLIMIT_NLIMITS) {\n         PyErr_SetString(PyExc_ValueError,\n                         \"invalid resource specified\");\n         return NULL;\n"
  },
  {
    "path": "recipes/dev/redoxer/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/redoxer\"\nbranch = \"master\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/dev/rust/.gitignore",
    "content": "/llvm-build/\n/llvm-prefix/\n/llvm-source/\n"
  },
  {
    "path": "recipes/dev/rust/config-bootstrap.toml",
    "content": "[llvm]\ndownload-ci-llvm = false\nstatic-libstdcpp = false\nlink-shared = true\n\n[build]\nhost = [\"TARGET\"]\ntarget = [\"TARGET\", \"i586-unknown-redox\", \"x86_64-unknown-redox\", \"aarch64-unknown-redox\", \"riscv64gc-unknown-redox\"]\ncargo-native-static = true\nsubmodules = false\ndocs = false\ntools = [\"cargo\", \"clippy\", \"rustdoc\", \"rustfmt\", \"src\"]\nextended = true\nverbose = 1\n\n[install]\nprefix = \"install\"\nsysconfdir = \"etc\"\n\n[rust]\nbacktrace = false\ncodegen-tests = false\n\n[target.aarch64-unknown-linux-gnu]\nllvm-config = \"COOKBOOK_TOOLCHAIN/bin/llvm-config\"\n\n[target.x86_64-unknown-linux-gnu]\nllvm-config = \"COOKBOOK_TOOLCHAIN/bin/llvm-config\"\n"
  },
  {
    "path": "recipes/dev/rust/config.toml",
    "content": "[llvm]\ndownload-ci-llvm = false\nstatic-libstdcpp = false\nlink-shared = true\n\n[build]\nhost = [\"COOKBOOK_TARGET\"]\ntarget = [\"COOKBOOK_TARGET\"]\nsubmodules = false\ndocs = false\ntools = [\"cargo\", \"clippy\", \"rustdoc\", \"rustfmt\", \"src\"]\nextended = true\nverbose = 1\n\n[install]\nprefix = \"install\"\nsysconfdir = \"etc\"\n\n[rust]\nbacktrace = false\ncodegen-tests = false\n\n[target.COOKBOOK_TARGET]\ncc = \"COOKBOOK_GNU_TARGET-gcc\"\ncxx = \"COOKBOOK_GNU_TARGET-g++\"\nar = \"COOKBOOK_GNU_TARGET-ar\"\nlinker = \"COOKBOOK_GNU_TARGET-gcc\"\nrpath = false\ncrt-static = false\nllvm-config = \"COOKBOOK_SYSROOT/bin/llvm-config\"\n\n[target.aarch64-unknown-linux-gnu]\nllvm-config = \"COOKBOOK_TOOLCHAIN/bin/llvm-config\"\n\n[target.x86_64-unknown-linux-gnu]\nllvm-config = \"COOKBOOK_TOOLCHAIN/bin/llvm-config\"\n"
  },
  {
    "path": "recipes/dev/rust/recipe.toml",
    "content": "[source]\r\ngit = \"https://gitlab.redox-os.org/redox-os/rust.git\"\r\nbranch = \"redox-2025-10-03\"\r\nshallow_clone = true\r\n\r\n[build]\r\ntemplate = \"custom\"\r\ndependencies = [\r\n    \"llvm21\",\r\n    \"zlib\",\r\n    \"curl\",\r\n    \"openssl3\",\r\n]\r\ndev-dependencies = [ \r\n    \"llvm21.dev\",\r\n    \"llvm21.runtime\",\r\n    \"lld21\",\r\n]\r\n\r\nscript = \"\"\"\r\nif [ \"${COOKBOOK_HOST_SYSROOT}\" = \"/usr\" ]; then\r\n\r\ncat ${COOKBOOK_RECIPE}/config-bootstrap.toml > config.toml\r\nsed -i \"s|TARGET|${TARGET}|g\" config.toml\r\nsed -i \"s|COOKBOOK_TOOLCHAIN|${COOKBOOK_TOOLCHAIN}|g\" config.toml\r\n\r\nelse\r\n\r\nDYNAMIC_INIT\r\n# Linker flags for stage2 compiler (host -> target)\r\nARCH=\"${TARGET%%-*}\"\r\nexport CARGO_TARGET_${ARCH^^}_UNKNOWN_REDOX_RUSTFLAGS=\"${RUSTFLAGS}\" # Rust\r\n# Hack for Rust errorneusly running `llvm-config --version` on cross compiled llvm-config\r\ncat \"${COOKBOOK_ROOT}/bin/${TARGET}-llvm-config\" > \"${COOKBOOK_SYSROOT}/bin/llvm-config\"\r\n# Hack for Rust stage1 being dynamically linked with LLVM in prefix toolchain\r\nexport LD_LIBRARY_PATH=\"${COOKBOOK_HOST_SYSROOT}/lib:${LD_LIBRARY_PATH}\"\r\n# Linker flags for stage1 compiler (host -> host)\r\nexport RUSTFLAGS_BOOTSTRAP=\"\\\r\n-Clink-args=-L${COOKBOOK_HOST_SYSROOT}/lib \\\r\n-Clink-args=-Wl,-rpath-link,${COOKBOOK_HOST_SYSROOT}/lib\"\r\nexport CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS=\"${RUSTFLAGS_BOOTSTRAP}\"\r\nexport CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS=\"${RUSTFLAGS_BOOTSTRAP}\"\r\n\r\ncat ${COOKBOOK_RECIPE}/config.toml > config.toml\r\nsed -i \"s|COOKBOOK_SYSROOT|${COOKBOOK_SYSROOT}|g\" config.toml\r\nsed -i \"s|COOKBOOK_TOOLCHAIN|${COOKBOOK_HOST_SYSROOT}|g\" config.toml\r\nsed -i \"s|COOKBOOK_TARGET|${TARGET}|g\" config.toml\r\nsed -i \"s|COOKBOOK_GNU_TARGET|${GNU_TARGET}|g\" config.toml\r\n\r\nfi\r\n\r\n# Don't poison the stage1 compiler (host -> host)\r\nunset AR AS CC CXX LD LDFLAGS NM OBJCOPY OBJDUMP RANLIB READELF RUSTFLAGS CARGO_ENCODED_RUSTFLAGS STRIP\r\n\r\npython3 \"${COOKBOOK_SOURCE}/x.py\" install \\\r\n    --config config.toml \\\r\n    --jobs ${COOKBOOK_MAKE_JOBS}\r\n\r\nmkdir -p \"${COOKBOOK_STAGE}\"/usr\r\nrsync -av --delete \"${COOKBOOK_BUILD}\"/install/* \"${COOKBOOK_STAGE}\"/usr/\r\nrm -rf \"${COOKBOOK_STAGE}\"/usr/lib/rustlib/*.log\r\n\r\n# workaround for rust.lld, needed by e.g. compiling bootloader\r\n# https://github.com/rust-lang/rust/issues/143076#issuecomment-3011710678\r\nLLD_DIR=\"${COOKBOOK_STAGE}/usr/lib/rustlib/$TARGET/bin\"\r\nmkdir -p $LLD_DIR/gcc-ld\r\ncp ${COOKBOOK_SYSROOT}/usr/bin/lld $LLD_DIR/rust-lld\r\nln -s rust-lld $LLD_DIR/wasm-component-ld\r\nln -s ../rust-lld $LLD_DIR/gcc-ld/ld.lld\r\nln -s ../rust-lld $LLD_DIR/gcc-ld/ld64.lld\r\nln -s ../rust-lld $LLD_DIR/gcc-ld/lld-link\r\nln -s ../rust-lld $LLD_DIR/gcc-ld/wasm-ld\r\nln -s ../../../libLLVM.so.21.1 $LLD_DIR/../lib/libLLVM.so.21.1\r\n\"\"\"\r\n\r\n[[optional-packages]]\r\nname = \"doc\"\r\nfiles = [\r\n    \"usr/share/doc/**\",\r\n]\r\n"
  },
  {
    "path": "recipes/dev/rustpython/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/RustPython/RustPython\"\n# newer rev requires 'bits/libc-header-start.h' for bindgen\nrev = \"2025-10-13-main-51\"\nshallow_clone = true\npatches = [\n  \"redox.patch\"\n]\n\n[build]\ndependencies = [\n  \"openssl3\",\n  \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\nexport BUILDTIME_RUSTPYTHONPATH=/lib/rustpython\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\nexport ZLIB_STATIC=1\ncookbook_cargo --features ssl\nmkdir -p \"${COOKBOOK_STAGE}/lib\"\nrsync -aE \\\n  --exclude 'test/' \\\n  --exclude '__pycache__/' \\\n  --exclude '*.pyc' \\\n  --exclude '/README.md' \\\n  \"${COOKBOOK_SOURCE}\"/Lib/ \"${COOKBOOK_STAGE}/lib/rustpython\"\n\"\"\"\n"
  },
  {
    "path": "recipes/dev/rustpython/redox.patch",
    "content": "diff --git a/stdlib/src/posixsubprocess.rs b/stdlib/src/posixsubprocess.rs\nindex 7f418c899..4da6a6858 100644\n--- a/stdlib/src/posixsubprocess.rs\n+++ b/stdlib/src/posixsubprocess.rs\n@@ -441,15 +441,14 @@ fn close_dir_fds(keep: KeepFds<'_>) -> nix::Result<()> {\n fn close_filetable_fds(keep: KeepFds<'_>) -> nix::Result<()> {\n     use nix::fcntl;\n     use std::os::fd::{FromRawFd, OwnedFd};\n-    let fd = fcntl::open(\n+    let filetable = fcntl::open(\n         c\"/scheme/thisproc/current/filetable\",\n         fcntl::OFlag::O_RDONLY,\n         nix::sys::stat::Mode::empty(),\n     )?;\n-    let filetable = unsafe { OwnedFd::from_raw_fd(fd) };\n     let read_one = || -> nix::Result<_> {\n         let mut byte = 0;\n-        let n = nix::unistd::read(filetable.as_raw_fd(), std::slice::from_mut(&mut byte))?;\n+        let n = nix::unistd::read(&filetable, std::slice::from_mut(&mut byte))?;\n         Ok((n > 0).then_some(byte))\n     };\n     while let Some(c) = read_one()? {\n"
  },
  {
    "path": "recipes/doc/book/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/book.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ndir=\"${COOKBOOK_STAGE}/usr/share/book\"\nmkdir -pv \"${dir}\"\nmdbook build --dest-dir \"${dir}\" \"${COOKBOOK_SOURCE}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/emulators/dosbox/01_redox.patch",
    "content": "diff -rupNw source-original/include/cross.h source/include/cross.h\n--- source-original/include/cross.h\t2010-05-10 19:43:54.000000000 +0200\n+++ source/include/cross.h\t2018-05-04 21:14:40.397157710 +0200\n@@ -64,7 +64,7 @@\n //Solaris maybe others\n #if defined (DB_HAVE_NO_POWF)\n #include <math.h>\n-static inline float powf (float x, float y) { return (float) pow (x,y); }\n+//static inline float powf (float x, float y) { return (float) pow (x,y); }\n #endif\n \n class Cross {\ndiff -rupNw source-original/src/gui/sdlmain.cpp source/src/gui/sdlmain.cpp\n--- source-original/src/gui/sdlmain.cpp\t2010-05-10 19:43:54.000000000 +0200\n+++ source/src/gui/sdlmain.cpp\t2018-05-04 21:15:31.937672555 +0200\n@@ -1518,7 +1518,7 @@ void Config_Add_SDL() {\n \tPstring = sdl_sec->Add_path(\"mapperfile\",Property::Changeable::Always,MAPPERFILE);\n \tPstring->Set_help(\"File used to load/save the key/event mappings from. Resetmapper only works with the defaul value.\");\n \n-\tPbool = sdl_sec->Add_bool(\"usescancodes\",Property::Changeable::Always,true);\n+\tPbool = sdl_sec->Add_bool(\"usescancodes\",Property::Changeable::Always,false);\n \tPbool->Set_help(\"Avoid usage of symkeys, might not work on all operating systems.\");\n }\n \n"
  },
  {
    "path": "recipes/emulators/dosbox/manifest",
    "content": "name=DOSBox\ncategory=Games\nbinary=/bin/dosbox\nicon=/ui/icons/apps/dosbox.png\n"
  },
  {
    "path": "recipes/emulators/dosbox/recipe.toml",
    "content": "[source]\ntar = \"https://sourceforge.net/projects/dosbox/files/dosbox/0.74-3/dosbox-0.74-3.tar.gz/download\"\nblake3 = \"8bc50ffdba20579fb3080a0dca32cb939c8a3c19259aed026482c6ac069b0007\"\npatches = [\"01_redox.patch\"]\nscript = \"\"\"\n./autogen.sh\nGNU_CONFIG_GET config.sub\n\"\"\"\n\n[build]\ndependencies = [\n    \"liborbital\",\n    \"sdl1\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include/SDL\"\nexport CPPFLAGS=\"${CPPFLAGS} -I${COOKBOOK_SYSROOT}/include/SDL\"\nexport LDFLAGS+=\" -lorbital\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-opengl\n    --disable-sdltest\n    --with-sdl-prefix=\"${COOKBOOK_SYSROOT}\"\n)\ncookbook_configure\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/dosbox\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/apps\"\ncp -v \"${COOKBOOK_RECIPE}/icon.png\" \"${COOKBOOK_STAGE}/usr/share/icons/apps/dosbox.png\"\n\"\"\"\n"
  },
  {
    "path": "recipes/emulators/flycast/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/flycast.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"curl\",\n    \"libiconv\",\n    \"liborbital\",\n    \"mesa\",\n    \"nghttp2\",\n    \"openssl1\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/usr/include/SDL2\"\nexport CXXFLAGS=\"${CXXFLAGS} -D_GLIBCXX_USE_C99_MATH_TR1=1 -I${COOKBOOK_SYSROOT}/usr/include/SDL2\"\n#TODO: don't use this\nexport SDL_LIBS=\"-lSDL2 -lorbital $(\"${TARGET}-pkg-config\" --libs osmesa) -lstdc++\"\n#TODO: don't add curl\nexport SDL_LIBS=\"${SDL_LIBS} -lcurl -lnghttp2 -lssl -lcrypto\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_VERBOSE_MAKEFILE=On\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DCMAKE_INSTALL_PREFIX=\"/usr\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DREDOX=1\n    -DUNIX=1\n    -DUSE_HOST_LIBZIP=OFF\n    -DUSE_OPENMP=OFF\n    -DUSE_VULKAN=OFF\n    -DZLIB_LIBRARY=\"-lz\"\n\n    # Hacks for cmake errors\n    -DHAVE___INT8_LIBZIP=False\n    -DHAVE___INT16_LIBZIP=False\n    -DHAVE___INT32_LIBZIP=False\n    -DHAVE___INT64_LIBZIP=False\n    -DHAVE_FICLONERANGE=False\n    -DHAVE_NULLABLE=False\n\n    # Hack for Threads\n    -DCMAKE_THREAD_LIBS_INIT=\"-lc\"\n    -DCMAKE_HAVE_THREADS_LIBRARY=1\n    -DCMAKE_USE_WIN32_THREADS_INIT=0\n    -DCMAKE_USE_PTHREADS_INIT=1\n    -DTHREADS_PREFER_PTHREAD_FLAG=ON\n\n    \"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n# appstream generation broken\nrm -rf \"${COOKBOOK_STAGE}/usr/share/metainfo\"\n\"\"\"\n"
  },
  {
    "path": "recipes/emulators/libretro-super/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/libretro-super.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"zlib\",\n]\nscript = \"\"\"\nCORES=(\n    snes9x\n)\n\npushd \"${COOKBOOK_SOURCE}\"\n./libretro-fetch.sh \"${CORES[@]}\"\npopd\n\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\nexport platform=Redox\nexport STATIC_LINKING=1\n./libretro-build.sh \"${CORES[@]}\"\n./libretro-install.sh \"${COOKBOOK_STAGE}/share/libretro\"\n\"\"\"\n"
  },
  {
    "path": "recipes/emulators/mednafen/recipe.toml",
    "content": "[source]\ntar = \"https://mednafen.github.io/releases/files/mednafen-1.29.0.tar.xz\"\nblake3 = \"c75c1044cdc9328b2349915a67972d6135c77eb53eb0d995788f22b7daacf79b\"\npatches = [\n    \"redox.patch\",\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    #TODO: libflac\n    \"libiconv\",\n    \"liborbital\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport SDL_LIBS=\"-lSDL2 -lorbital $(\"${TARGET}-pkg-config\" --libs osmesa) -lstdc++\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --without-libflac\n)\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/emulators/mednafen/redox.patch",
    "content": "diff -ruwN source-old/src/sound/SwiftResampler.cpp source/src/sound/SwiftResampler.cpp\n--- source-old/src/sound/SwiftResampler.cpp\t2022-01-18 14:16:23.000000000 -0700\n+++ source/src/sound/SwiftResampler.cpp\t2022-12-16 20:01:02.263159230 -0700\n@@ -608,6 +608,9 @@\n \n  if(hp_tc > 0)\n  {\n+#ifndef M_E\n+#define M_E 2.7182818284590452354\n+#endif\n   double tdm = (pow(2.0 - pow(M_E, -1.0), 1.0 / (hp_tc * output_rate)) - 1.0);\n \n   //printf(\"%f\\n\", tdm);\n"
  },
  {
    "path": "recipes/emulators/mgba/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mgba-emu/mgba/archive/0.10.5.tar.gz\"\nblake3 = \"a1b9e797a5058f5264d276805aef5643b7ea460916e491a0098ba32d87f1519e\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\"libiconv\", \"liborbital\", \"libpng\", \"pixman\", \"sdl1\", \"zlib\"]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_QT=OFF\",\n    \"-DBUILD_SHARED=ON\",\n    \"-DBUILD_STATIC=OFF\",\n    \"-DUSE_SQLITE3=OFF\",\n    \"-DUSE_DEBUGGERS=OFF\",\n    \"-DBUILD_SDL=ON\",\n    \"-DSDL_VERSION=1.2\",\n    \"-DSDL_LIBRARY=-lSDL -lorbital\",\n]\n"
  },
  {
    "path": "recipes/emulators/mgba/redox.patch",
    "content": "diff -ruwN mgba-0.10.5/src/third-party/zlib/contrib/minizip/ioapi.h source/src/third-party/zlib/contrib/minizip/ioapi.h\n--- mgba-0.10.5/src/third-party/zlib/contrib/minizip/ioapi.h\t2025-03-08 20:09:26.000000000 -0700\n+++ source/src/third-party/zlib/contrib/minizip/ioapi.h\t2025-06-13 13:07:13.489517096 -0600\n@@ -50,7 +50,7 @@\n #define ftello64 ftell\n #define fseeko64 fseek\n #else\n-#ifdef __FreeBSD__\n+#if defined(__FreeBSD__) || defined(__redox__)\n #define fopen64 fopen\n #define ftello64 ftello\n #define fseeko64 fseeko\n"
  },
  {
    "path": "recipes/emulators/retroarch/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/retroarch.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\",\n    \"libretro-super\",\n    \"mesa\",\n    \"openssl1\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\npushd \"${COOKBOOK_SOURCE}\"\n./fetch-submodules.sh\npopd\n\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n# For now, we will statically link with the snes9x libretro\nmkdir -pv \"${COOKBOOK_SYSROOT}/lib\"\ncp -v \"${COOKBOOK_SYSROOT}/share/libretro/snes9x_libretro.a\" \"${COOKBOOK_SYSROOT}/lib/libretro.a\"\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --host=\"${TARGET}\"\n    --prefix=\"/\"\n    --disable-builtinzlib # conflicts with zlib\n    --disable-discord # does not link\n    --disable-dylib\n    --disable-dynamic\n    --disable-netplaydiscovery # missing ifaddrs.h\n    --disable-thread_storage # crash in pthread_setspecific called by sthread_tls_set\n    --disable-threads # prevents hang\n    --enable-opengl\n    --enable-sdl2\n    --enable-ssl\n    --enable-zlib\n    --with-libretro=\"-lretro -lstdc++ -lz\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/emulators/rs-nes/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/rs-nes.git\"\n#git_upstream = \"https://github.com/bgourlie/rs-nes.git\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"orbital\"\n]\n"
  },
  {
    "path": "recipes/emulators/rust64/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/rust64.git\"\n#git_upstream = \"https://github.com/kondrak/rust64.git\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"orbital\"\n]\n"
  },
  {
    "path": "recipes/emulators/rustual-boy/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/rustual-boy.git\"\nupstream = \"https://github.com/emu-rs/rustual-boy.git\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/rustual-boy-cli\"\ncookbook_cargo\n\"\"\"\n\n[package]\ndependencies = [\n    \"orbital\",\n]"
  },
  {
    "path": "recipes/emulators/rvvm/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/LekKit/RVVM.git\"\nupstream = \"https://github.com/LekKit/RVVM\"\n\n[build]\ntemplate = \"custom\"\n\n# SDL2 is tough to link statically, use SDL1 for now\ndependencies = [\n    \"sdl1\",\n    \"liborbital\",\n]\n\nscript = \"\"\"\n\nexport BUILDDIR=\"${COOKBOOK_BUILD}\"\nexport DESTDIR=\"${COOKBOOK_STAGE}\"\n\n# Redox currently doesn't support dynamic library loading\nexport LDFLAGS=\"${LDFLAGS} $(pkg-config --libs sdl)\"\n\n# Networking is currently broken on Redox (missing setsockopt?)\nexport USE_NET=0\n\n# Use SDL1\nexport USE_SDL=1\n\n# Building a shared library is currently broken on Redox\nexport USE_LIB=0\n\nexport OS=Redox\n\n# Let's goo\n\"${COOKBOOK_MAKE}\" install -C \"${COOKBOOK_SOURCE}\"\n\n\"\"\"\n"
  },
  {
    "path": "recipes/emulators/scummvm/recipe.toml",
    "content": "[source]\ntar = \"https://downloads.scummvm.org/frs/scummvm/2.0.0/scummvm-2.0.0.tar.xz\"\nblake3 = \"02e6791fd43ad3cb4238c07d23350ca1459a0f692689e585dba1d46648f64327\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\nGNU_CONFIG_GET config.sub\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1\",\n    \"liborbital\",\n    \"freetype2\",\n    \"zlib\",\n    \"libpng\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nexport LDFLAGS+=\" -lorbital\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --host=\"${TARGET}\"\n    --prefix=\"/usr\"\n    --with-sdl-prefix=\"${COOKBOOK_SYSROOT}\"\n    --with-freetype2-prefix=\"${COOKBOOK_SYSROOT}\"\n    --with-png-prefix=\"${COOKBOOK_SYSROOT}\"\n    --with-zlib-prefix=\"${COOKBOOK_SYSROOT}\"\n    --disable-timidity\n    --disable-mt32emu\n)\n\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/emulators/scummvm/redox.patch",
    "content": "diff -rupNw source-original/common/stream.cpp source/common/stream.cpp\n--- source-original/common/stream.cpp\t2017-12-08 23:21:10.000000000 +0100\n+++ source/common/stream.cpp\t2018-12-06 02:01:50.454108198 +0100\n@@ -95,7 +95,7 @@ bool MemoryReadStream::seek(int32 offs,\n \t\tbreak;\n \t}\n \t// Post-Condition\n-\tassert(_pos <= _size);\n+\t//assert(_pos <= _size);\n \n \t// Reset end-of-stream flag on a successful seek\n \t_eos = false;\ndiff -rupNw source-original/configure source/configure\n--- source-original/configure\t2017-12-08 23:21:13.000000000 +0100\n+++ source/configure\t2018-12-06 02:01:50.458108239 +0100\n@@ -3610,7 +3610,7 @@ case $_host_os in\n \tamigaos* | cygwin* | dreamcast | ds | gamecube | mingw* | n64 | ps2 | ps3 | psp2 | psp | wii | wince)\n \t\t_posix=no\n \t\t;;\n-\t3ds | android | androidsdl | beos* | bsd* | darwin* | freebsd* | gnu* | gph-linux | haiku* | hpux* | iphone | ios7 | irix*| k*bsd*-gnu* | linux* | maemo | mint* | netbsd* | openbsd* | riscos | solaris* | sunos* | uclinux* | webos)\n+\t3ds | android | androidsdl | beos* | bsd* | darwin* | freebsd* | gnu* | gph-linux | haiku* | hpux* | iphone | ios7 | irix*| k*bsd*-gnu* | linux* | maemo | mint* | netbsd* | openbsd* | riscos | redox* | solaris* | sunos* | uclinux* | webos)\n \t\t_posix=yes\n \t\t;;\n \tos2-emx*)\n"
  },
  {
    "path": "recipes/files/hf/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/sorairolake/hf\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/fonts/dejavu/recipe.toml",
    "content": "[source]\ntar=\"http://sourceforge.net/projects/dejavu/files/dejavu/2.37/dejavu-fonts-ttf-2.37.tar.bz2\"\nblake3=\"b702bac8a0f8e0802758549da3b4d8041c3c83c3894e1e8a960eab53af18cce8\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n#TODO: Mono style included in Sans directory\nfor style in Sans Serif\ndo\n    DEST=\"${COOKBOOK_STAGE}/usr/share/fonts/${style}/DejaVu\"\n    mkdir -pv \"${DEST}\"\n    cp -v \"${COOKBOOK_SOURCE}/ttf/DejaVu${style}\"*\".ttf\" \"${DEST}\"\ndone\n\"\"\"\n"
  },
  {
    "path": "recipes/fonts/freefont/recipe.toml",
    "content": "[source]\ntar=\"https://ftp.gnu.org/gnu/freefont/freefont-otf-20120503.tar.gz\"\nblake3=\"e950397741d84981106cf648fbc143c7827b61d637c86c916232d47aabdfe253\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nfor style in Mono Sans Serif\ndo\n    DEST=\"${COOKBOOK_STAGE}/usr/share/fonts/${style}/FreeFont\"\n    mkdir -pv \"${DEST}\"\n    cp -v \"${COOKBOOK_SOURCE}/Free${style}\"*\".otf\" \"${DEST}\"\ndone\n\"\"\"\n"
  },
  {
    "path": "recipes/fonts/ibm-plex/recipe.toml",
    "content": "[source]\ntar=\"https://github.com/IBM/plex/archive/refs/tags/v6.3.0.tar.gz\"\nblake3=\"6c67f5bf8069762eea1e31f5cca5b4e6f57ea1151b34b338046c7976072ccdef\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nfor style in Mono Sans Serif\ndo\n    DEST=\"${COOKBOOK_STAGE}/usr/share/fonts/${style}/IBM-Plex\"\n    mkdir -pv \"${DEST}\"\n    cp -v \"${COOKBOOK_SOURCE}/IBM-Plex-${style}/fonts/complete/ttf/\"*\".ttf\" \"${DEST}\"\ndone\n\"\"\"\n"
  },
  {
    "path": "recipes/fonts/intel-one-mono/recipe.toml",
    "content": "[source]\ntar=\"https://github.com/intel/intel-one-mono/archive/refs/tags/V1.3.0.tar.gz\"\nblake3=\"9caff71b0a9fe8627253c55889964612ea4ae144584a283cd2fe88b7a14a4140\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDEST=\"${COOKBOOK_STAGE}/usr/share/fonts/Mono/Intel-One\"\nmkdir -pv \"${DEST}\"\ncp -v \"${COOKBOOK_SOURCE}/fonts/ttf/\"*\".ttf\" \"${DEST}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/fonts/noto-color-emoji/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/googlefonts/noto-emoji\"\nrev = \"e8073ab740292f8d5f19b5de144087ac58044d06\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDEST=\"${COOKBOOK_STAGE}/usr/share/fonts/Emoji/Noto\"\nmkdir -pv \"${DEST}\"\ncp -v \"${COOKBOOK_SOURCE}/fonts/NotoColorEmoji.ttf\" \"${DEST}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/fonts/ttf-hack/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/source-foundry/Hack/releases/download/v3.003/Hack-v3.003-ttf.tar.xz\"\nblake3 = \"acd40f61f6f512b0808d4bf530ab4aeb5a8ec3aa1f65bf5a1d08964d1bc3d044\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nfor file in \"${COOKBOOK_SOURCE}\"/*.ttf; do\n    install -D -m 644 \"$file\" \"${COOKBOOK_STAGE}/usr/share/fonts/Mono/Hack/$(basename \"$file\")\"\ndone\n\"\"\""
  },
  {
    "path": "recipes/games/classicube/manifest",
    "content": "name=ClassiCube\ncategory=Games\nbinary=/usr/games/classicube/ClassiCube\nicon=/ui/icons/apps/classicube.png\n"
  },
  {
    "path": "recipes/games/classicube/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/ClassiCube.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\" -C src redox\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/games/classicube\"\ncp -v \"src/ClassiCube\" \"${COOKBOOK_STAGE}/usr/games/classicube\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/classicube\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/apps\"\ncp -v \"${COOKBOOK_SOURCE}/misc/CCicon.png\" \"${COOKBOOK_STAGE}/usr/share/icons/apps/classicube.png\"\n\"\"\"\n"
  },
  {
    "path": "recipes/games/devilutionx/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/diasurgical/devilutionX/archive/refs/tags/1.5.4.tar.gz\"\nblake3 = \"d4a61ff3a7c69d86a29158918aad48ab9c4866c6a22a3e8da5feadbb7d23b3ca\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"bzip2\",\n    \"libiconv\",\n    \"liborbital\",\n    \"sdl1\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DBUILD_TESTING=OFF\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=ON\n    -DCMAKE_CXX_COMPILER=\"${TARGET}-g++\"\n    -DCMAKE_C_COMPILER=\"${TARGET}-gcc\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_VERBOSE_MAKEFILE=ON\n    -DDEVILUTIONX_SYSTEM_BZIP2=ON\n    -DDEVILUTIONX_SYSTEM_ZLIB=ON\n    -DNONET=ON\n    -DSDL_LIBRARY=\"-lSDL -lorbital\"\n    -DUSE_SDL1=ON\n    \"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\nmkdir -v \"${COOKBOOK_STAGE}/bin\"\ncp -v devilutionx \"${COOKBOOK_STAGE}/bin\"\n\"\"\"\n"
  },
  {
    "path": "recipes/games/eduke32/manifest",
    "content": "name=EDuke32\ncategory=Games\nbinary=/usr/games/eduke32\nicon=/ui/icons/apps/eduke32.png\n"
  },
  {
    "path": "recipes/games/eduke32/recipe.toml",
    "content": "[source]\ntar = \"https://dukeworld.com/eduke32/synthesis/20181010-7067/eduke32_src_20181010-7067.tar.xz\"\nblake3 = \"b0b759fe9ca51849f42669e4832ae1ae1f9ad7938529769108f7cf6a6a176558\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n  \"sdl1\",\n  \"sdl1-mixer\",\n  \"liborbital\",\n  \"libiconv\",\n  \"libogg\",\n  \"libvorbis\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\n# Copy source to build directory\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include -I${COOKBOOK_SYSROOT}/include/SDL\"\nexport SDLCONFIG=\"${COOKBOOK_SYSROOT}/bin/sdl-config --prefix=${COOKBOOK_SYSROOT}\"\n\nPLATFORM=REDOX \"${COOKBOOK_MAKE}\" -j\"$COOKBOOK_MAKE_JOBS\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/games\"\ncp -v ./eduke32 \"${COOKBOOK_STAGE}/usr/games/eduke32\"\ncp -v ./mapster32 \"${COOKBOOK_STAGE}/usr/games/mapster32\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/eduke32\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/apps\"\ncp -v \"${COOKBOOK_RECIPE}/icon.png\" \"${COOKBOOK_STAGE}/usr/share/icons/apps/eduke32.png\"\n\"\"\"\n"
  },
  {
    "path": "recipes/games/eduke32/redox.patch",
    "content": "diff -rupwN source/Common.mak source-new/Common.mak\n--- source/Common.mak\t2018-07-14 15:36:44.000000000 -0600\n+++ source-new/Common.mak\t2023-01-20 10:38:24.948044222 -0700\n@@ -93,7 +93,7 @@ endif\n \n ##### Makefile meta-settings\n \n-PRETTY_OUTPUT := 1\n+PRETTY_OUTPUT := 0\n \n NULLSTREAM := /dev/null\n \n@@ -172,6 +172,10 @@ ifeq ($(PLATFORM),WII)\n     CCFULLPATH = $(DEVKITPPC)/bin/$(CC)\n endif\n \n+ifeq ($(PLATFORM),REDOX)\n+    CROSS := $(TARGET)-\n+endif\n+\n CC := $(CROSS)gcc$(CROSS_SUFFIX)\n CXX := $(CROSS)g++$(CROSS_SUFFIX)\n \n@@ -383,6 +387,16 @@ else ifeq ($(PLATFORM),$(filter $(PLATFO\n     override NOASM := 1\n else ifeq ($(PLATFORM),$(filter $(PLATFORM),BEOS SKYOS))\n     override NOASM := 1\n+else ifeq ($(PLATFORM),REDOX)\n+    override HAVE_FLAC := 0\n+    override HAVE_GTK2 := 0\n+    override HAVE_XMP := 0\n+    override MIXERTYPE := SDL\n+    override NETCODE := 0\n+    override NOASM := 1\n+    override USE_OPENGL := 0\n+    OPTOPT := -mtune=generic\n+    SDL_TARGET := 1\n endif\n \n ifneq (i386,$(strip $(IMPLICIT_ARCH)))\n@@ -868,7 +882,7 @@ ifeq ($(RENDERTYPE),SDL)\n         SDLCONFIG := sdl2-config\n         SDLNAME := SDL2\n     else ifeq ($(SDL_TARGET),1)\n-        SDLCONFIG := sdl-config\n+        #SDLCONFIG := sdl-config\n         SDLNAME := SDL\n         ifeq (0,$(RELEASE))\n             COMPILERFLAGS += -DNOSDLPARACHUTE\n@@ -957,9 +971,11 @@ else ifeq ($(PLATFORM),WII)\n     LIBS += -laesnd_tueidj -lfat -lwiiuse -lbte -lwiikeyboard -logc\n else ifeq ($(SUBPLATFORM),LINUX)\n     LIBS += -lrt\n+else ifeq ($(PLATFORM),REDOX)\n+    LIBS += -lorbital -lvorbisfile -lvorbis -logg\n endif\n \n-ifeq (,$(filter $(PLATFORM),WINDOWS WII))\n+ifeq (,$(filter $(PLATFORM),WINDOWS WII REDOX))\n     ifneq ($(PLATFORM),BSD)\n         LIBS += -ldl\n     endif\nBinary files source/.Common.mak.swp and source-new/.Common.mak.swp differ\ndiff -rupwN source/source/build/include/compat.h source-new/source/build/include/compat.h\n--- source/source/build/include/compat.h\t2018-10-06 23:21:24.000000000 -0600\n+++ source-new/source/build/include/compat.h\t2023-01-20 10:31:10.843745693 -0700\n@@ -7,6 +7,9 @@\n \n #pragma once\n \n+#  define B_LITTLE_ENDIAN 1\n+#  define B_BIG_ENDIAN    0\n+\n #ifdef _WIN32\r\n # include \"windows_inc.h\"\r\n #endif\r\n@@ -400,6 +403,7 @@ defined __x86_64__ || defined __amd64__\n #include <stdlib.h>\n #include <stdio.h>\n #include <string.h>\n+#include <strings.h>\n \n #include <math.h>\n #include <float.h>\n@@ -542,8 +546,8 @@ typedef FILE BFILE;\n # define BS_IWRITE S_IWUSR\n # define BS_IREAD  S_IRUSR\n #else\n-# define BS_IWRITE S_IWRITE\n-# define BS_IREAD  S_IREAD\n+# define BS_IWRITE S_IWUSR\n+# define BS_IREAD  S_IRUSR\n #endif\n \n #if defined(__cplusplus) && defined(_MSC_VER)\ndiff -rupwN source/source/build/src/baselayer.cpp source-new/source/build/src/baselayer.cpp\n--- source/source/build/src/baselayer.cpp\t2018-10-06 23:21:43.000000000 -0600\n+++ source-new/source/build/src/baselayer.cpp\t2023-01-20 10:31:49.591772332 -0700\n@@ -498,7 +498,7 @@ int32_t baselayer_init(void)\n \n void maybe_redirect_outputs(void)\n {\n-#if !(defined __APPLE__ && defined __BIG_ENDIAN__)\n+#if 0\n     char *argp;\n \n     // pipe standard outputs to files\ndiff -rupwN source/source/build/src/sdlayer.cpp source-new/source/build/src/sdlayer.cpp\n--- source/source/build/src/sdlayer.cpp\t2018-10-06 23:23:44.000000000 -0600\n+++ source-new/source/build/src/sdlayer.cpp\t2023-01-20 10:30:49.223730830 -0700\n@@ -305,7 +305,7 @@ void wm_setapptitle(const char *name)\n //\n \n /* XXX: libexecinfo could be used on systems without gnu libc. */\n-#if !defined _WIN32 && defined __GNUC__ && !defined __OpenBSD__ && !(defined __APPLE__ && defined __BIG_ENDIAN__) && !defined GEKKO && !defined EDUKE32_TOUCH_DEVICES && !defined __OPENDINGUX__\n+#if 0\n # define PRINTSTACKONSEGV 1\n # include <execinfo.h>\n #endif\ndiff -rupwN source/source/duke3d/src/common.cpp source-new/source/duke3d/src/common.cpp\n--- source/source/duke3d/src/common.cpp\t2018-10-06 23:20:23.000000000 -0600\n+++ source-new/source/duke3d/src/common.cpp\t2023-01-20 10:30:49.223730830 -0700\n@@ -1173,6 +1173,7 @@ int32_t S_OpenAudio(const char *fn, char\n     Bfree(testfn);\n     return origfp;\n }\n+#endif\n \n void Duke_CommonCleanup(void)\n {\n@@ -1181,4 +1182,3 @@ void Duke_CommonCleanup(void)\n     DO_FREE_AND_NULL(g_rtsNamePtr);\n }\n \n-#endif\ndiff -rupwN source/source/duke3d/src/game.cpp source-new/source/duke3d/src/game.cpp\n--- source/source/duke3d/src/game.cpp\t2018-10-06 23:23:48.000000000 -0600\n+++ source-new/source/duke3d/src/game.cpp\t2023-01-20 10:30:49.223730830 -0700\n@@ -6697,7 +6697,7 @@ MAIN_LOOP_RESTART:\n             static char buf[128];\n #ifndef GEKKO\n             int32_t flag = 1;\n-            ioctl(0, FIONBIO, &flag);\n+            //ioctl(0, FIONBIO, &flag);\n #endif\n             if ((nb = read(0, &ch, 1)) > 0 && bufpos < sizeof(buf))\n             {\ndiff -rupwN source/source/enet/include/enet/unix.h source-new/source/enet/include/enet/unix.h\n--- source/source/enet/include/enet/unix.h\t2014-06-16 17:16:08.000000000 -0600\n+++ source-new/source/enet/include/enet/unix.h\t2023-01-20 10:30:49.223730830 -0700\n@@ -6,6 +6,7 @@\n #define __ENET_UNIX_H__\n \n #include <stdlib.h>\n+#include <sys/select.h>\n #include <sys/time.h>\n #include <sys/types.h>\n #if defined(GEKKO)\n"
  },
  {
    "path": "recipes/games/freeciv/recipe.toml",
    "content": "[source]\ntar = \"https://files.freeciv.org/stable/freeciv-3.1.4.tar.xz\"\nblake3 = \"212630af5e50fb72662ca62a71cdd57318d0cf309b53e46377dd24c8199923a4\"\n\n[build]\ndependencies = [\n    \"curl\",\n    \"freetype2\",\n    \"libiconv\",\n    \"libicu\",\n    \"liborbital\",\n    \"libjpeg\",\n    \"libpng\",\n    \"openssl1\",\n    \"mesa\",\n    \"nghttp2\",\n    \"sdl2\",\n    \"sdl2-gfx\",\n    \"sdl2-image\",\n    \"sdl2-ttf\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport CURL_LIBS=\"-lcurl -lnghttp2 -lssl -lcrypto\"\nexport CURL_MIME_API_LIBS=\"${CURL_LIBS}\"\nexport ICU_LIBS=\"-licuuc -licudata -lstdc++\"\nexport SDL2_LIBS=\"\\\n    -lSDL2_gfx \\\n    -lSDL2_image \\\n    -lSDL2_ttf \\\n    -lSDL2 \\\n    -lorbital \\\n    $(\"${PKG_CONFIG}\" --libs osmesa) \\\n    -ljpeg \\\n    -lpng \\\n    -lz \\\n\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --enable-fcdb=no\n    --enable-fcmp=no\n    --enable-ipv6=no\n    --enable-client=sdl2\n    ac_cv_lib_SDL2_gfx_rotozoomSurface=yes\n    ac_cv_lib_SDL2_image_IMG_Load=yes\n    ac_cv_lib_SDL2_ttf_TTF_OpenFont=yes\n)\nexport V=1\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/games/freedoom/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/freedoom.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/games\" \"${COOKBOOK_STAGE}/share/games/doom\" \"${COOKBOOK_STAGE}/usr/share/ui/apps\" \"${COOKBOOK_STAGE}/usr/share/icons/apps\"\nfor file in \"${COOKBOOK_SOURCE}/\"*.wad\ndo\n    game=\"$(basename \"$file\" .wad)\"\n\n    wad=\"/share/games/doom/$game.wad\"\n    cp -v \"$file\" \"${COOKBOOK_STAGE}$wad\"\n\n    bin=\"/usr/games/$game\"\n    echo \"#!/bin/ion\" > \"${COOKBOOK_STAGE}$bin\"\n    echo \"/usr/games/prboom -geom 800x600 -vidmode 32 -iwad $wad\" >> \"${COOKBOOK_STAGE}$bin\"\n    chmod +x \"${COOKBOOK_STAGE}$bin\"\n\n    echo \"name=$game\" | sed 's/freedoom/FreeDOOM: Phase /' | sed 's/doom1/DOOM (Shareware)/' > \"${COOKBOOK_STAGE}/usr/share/ui/apps/$game\"\n    echo \"category=Games\" >> \"${COOKBOOK_STAGE}/usr/share/ui/apps/$game\"\n    echo \"binary=/usr/games/$game\" >> \"${COOKBOOK_STAGE}/usr/share/ui/apps/$game\"\n    echo \"icon=/ui/icons/apps/$game.png\" >> \"${COOKBOOK_STAGE}/usr/share/ui/apps/$game\"\n\n    cp -v \"${COOKBOOK_SOURCE}/$game.png\" \"${COOKBOOK_STAGE}/usr/share/icons/apps/$game.png\"\ndone\n\"\"\"\n\n[package]\ndependencies = [\n    \"ion\",\n    \"prboom\",\n]\n"
  },
  {
    "path": "recipes/games/game-2048/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/2048-rs.git\"\n#git_upstream = \"https://github.com/pierrechevalier83/2048-rs.git\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/games/gigalomania/manifest",
    "content": "name=Gigalomania\ncategory=Games\nbinary=/usr/games/gigalomania/gigalomania\nicon=/ui/icons/apps/gigalomania.png\n"
  },
  {
    "path": "recipes/games/gigalomania/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/gigalomania.git\"\nbranch = \"master\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1-mixer\",\n    \"sdl1-image\",\n    \"sdl1\",\n    \"liborbital\",\n    \"libogg\",\n    \"libpng\",\n    \"libjpeg\",\n    \"libvorbis\",\n    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\nexport CPPHOST=\"${TARGET}-g++\"\n\n\"${COOKBOOK_MAKE}\" all -j\"${COOKBOOK_MAKE_JOBS}\"\n\n\"${COOKBOOK_MAKE}\" VERBOSE=1 DESTDIR=\"${COOKBOOK_STAGE}/usr\" install\n\nrm -rf \"${COOKBOOK_STAGE}/bundle\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/gigalomania\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/apps\"\ncp -v \"gigalomania64.png\" \"${COOKBOOK_STAGE}/usr/share/icons/apps/gigalomania.png\"\n\"\"\""
  },
  {
    "path": "recipes/games/hematite/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/hematite.git\"\nbranch = \"redox\"\nupstream = \"https://github.com/PistonDevelopers/hematite.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"mesa\",\n    \"zlib\"\n]\nscript = \"\"\"\ncargo rustc \\\n    --target \"$TARGET\" \\\n    --release \\\n    --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n    -- \\\n    -L \"${COOKBOK_SYSROOT}/lib\" \\\n    -C link-args=\"-Wl,-Bstatic $(\"${TARGET}-pkg-config\" --libs osmesa) -lz -lstdc++ -lc -lgcc\"\nmkdir -pv \"${COOKBOOK_STAGE}/bin\"\ncp -v \"target/${TARGET}/release/hematite\" \"${COOKBOOK_STAGE}/bin/hematite\"\n\"\"\"\n"
  },
  {
    "path": "recipes/games/neverball/manifest-neverball",
    "content": "name=Neverball\ncategory=Games\nbinary=/usr/games/neverball/neverball\nicon=/ui/icons/apps/neverball.png\n"
  },
  {
    "path": "recipes/games/neverball/manifest-neverputt",
    "content": "name=Neverputt\ncategory=Games\nbinary=/usr/games/neverball/neverputt\nicon=/ui/icons/apps/neverputt.png\n"
  },
  {
    "path": "recipes/games/neverball/recipe.toml",
    "content": "[source]\ntar = \"https://neverball.org/neverball-1.6.0.tar.gz\"\nblake3 = \"74f3b68595f475e89fd2ca8b5fc349837ff36fbbe141f321dfc232dbf8fccf51\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"freetype2\",\n    \"libjpeg\",\n    \"libvorbis\",\n    \"sdl2\",\n    \"sdl2-ttf\",\n]\ndev-dependencies = [\n    \"host:neverball-sols\"\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n\"${COOKBOOK_MAKE}\" -j\"${COOKBOOK_MAKE_JOBS}\" ENABLE_FS=stdio ENABLE_NLS=0 neverball neverputt\n\n# Create install directories\nmkdir -pv \"${COOKBOOK_STAGE}/usr/games/neverball\" \"${COOKBOOK_STAGE}/usr/share/ui/apps\" \"${COOKBOOK_STAGE}/usr/share/icons/apps\"\n\n# Copy assets\ncp -rv ${COOKBOOK_TOOLCHAIN}/usr/games/neverball/data \"${COOKBOOK_STAGE}/usr/games/neverball\"\n\n# For each game\nfor bin in neverball neverputt\ndo\n    # Install binary\n    \"${STRIP}\" -v \"${bin}\" -o \"${COOKBOOK_STAGE}/usr/games/neverball/${bin}\"\n\n    # Install manifest\n    cp -v \"${COOKBOOK_RECIPE}/manifest-${bin}\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/${bin}\"\n\n    # Install icon\n    cp -v \"dist/${bin}_64.png\" \"${COOKBOOK_STAGE}/usr/share/icons/apps/${bin}.png\"\ndone\n\"\"\"\n"
  },
  {
    "path": "recipes/games/neverball/redox.patch",
    "content": "diff -ruwN neverball-1.6.0/Makefile source/Makefile\n--- neverball-1.6.0/Makefile\t2014-05-21 07:21:43.000000000 -0600\n+++ source/Makefile\t2023-09-09 20:03:22.113348963 -0600\n@@ -38,11 +38,11 @@\n ifeq ($(DEBUG),1)\n \tCFLAGS   := -g\n \tCXXFLAGS := -g\n-\tCPPFLAGS :=\n+\tCPPFLAGS +=\n else\n \tCFLAGS   := -O2\n \tCXXFLAGS := -O2\n-\tCPPFLAGS := -DNDEBUG\n+\tCPPFLAGS += -DNDEBUG\n endif\n \n #------------------------------------------------------------------------------\n@@ -64,8 +64,8 @@\n \n # Preprocessor...\n \n-SDL_CPPFLAGS := $(shell sdl2-config --cflags)\n-PNG_CPPFLAGS := $(shell libpng-config --cflags)\n+SDL_CPPFLAGS := $(shell $(PKG_CONFIG) sdl2 --cflags)\n+PNG_CPPFLAGS := $(shell $(PKG_CONFIG) libpng --cflags)\n \n ALL_CPPFLAGS := $(SDL_CPPFLAGS) $(PNG_CPPFLAGS) -Ishare\n \n@@ -124,8 +124,8 @@\n #------------------------------------------------------------------------------\n # Libraries\n \n-SDL_LIBS := $(shell sdl2-config --libs)\n-PNG_LIBS := $(shell libpng-config --libs)\n+SDL_LIBS := $(shell $(PKG_CONFIG) sdl2 --libs)\n+PNG_LIBS := $(shell $(PKG_CONFIG) libpng --libs)\n \n ifeq ($(ENABLE_FS),stdio)\n FS_LIBS :=\n@@ -148,7 +148,7 @@\n endif\n endif\n \n-OGL_LIBS := -lGL\n+OGL_LIBS := -lorbital $(shell $(PKG_CONFIG) osmesa --libs)\n \n ifeq ($(PLATFORM),mingw)\n \tifneq ($(ENABLE_NLS),0)\n@@ -175,8 +175,8 @@\n \t                                           /usr/local/lib))\n endif\n \n-OGG_LIBS := -lvorbisfile\n-TTF_LIBS := -lSDL2_ttf\n+OGG_LIBS := $(shell $(PKG_CONFIG) ogg vorbis vorbisfile --libs)\n+TTF_LIBS := $(shell $(PKG_CONFIG) SDL2_ttf --libs) -lfreetype\n \n ALL_LIBS := $(HMD_LIBS) $(TILT_LIBS) $(INTL_LIBS) $(TTF_LIBS) \\\n \t$(OGG_LIBS) $(SDL_LIBS) $(OGL_LIBS) $(BASE_LIBS)\n@@ -411,11 +411,11 @@\n \n all : $(BALL_TARG) $(PUTT_TARG) $(MAPC_TARG) sols locales desktops\n \n-ifeq ($(ENABLE_HMD),libovr)\n+#ifeq ($(ENABLE_HMD),libovr)\n LINK := $(CXX) $(ALL_CXXFLAGS)\n-else\n-LINK := $(CC) $(ALL_CFLAGS)\n-endif\n+#else\n+#LINK := $(CC) $(ALL_CFLAGS)\n+#endif\n \n $(BALL_TARG) : $(BALL_OBJS)\n \t$(LINK) -o $(BALL_TARG) $(BALL_OBJS) $(LDFLAGS) $(ALL_LIBS)\ndiff -ruwN neverball-1.6.0/share/text.h source/share/text.h\n--- neverball-1.6.0/share/text.h\t2014-05-21 07:21:43.000000000 -0600\n+++ source/share/text.h\t2023-09-09 20:02:10.117248865 -0600\n@@ -15,7 +15,7 @@\n \n /*---------------------------------------------------------------------------*/\n \n-char text_input[MAXSTR];\n+extern char text_input[MAXSTR];\n \n void text_input_start(void (*cb)(int typing));\n void text_input_stop(void);\n"
  },
  {
    "path": "recipes/games/neverball-sols/recipe.toml",
    "content": "[source]\nsame_as = \"../neverball\"\n\n[build]\ndependencies = [\n    \"libjpeg\",\n    \"libogg\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n\"${COOKBOOK_MAKE}\" -j\"${COOKBOOK_MAKE_JOBS}\" ENABLE_FS=stdio PKG_CONFIG=\"pkg-config\" CC=\"cc\" mapc sols\n\n# Copy assets\nmkdir -p \"${COOKBOOK_STAGE}/usr/games/neverball\"\ncp -rv data \"${COOKBOOK_STAGE}/usr/games/neverball\"\n\"\"\"\n"
  },
  {
    "path": "recipes/games/openjazz/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/AlisterT/openjazz/archive/refs/tags/20240919.tar.gz\"\nblake3 = \"c419066dd7bf50510c5ef0746fc47450ab8f5a17a0010a1bc0ad67d0e63538da\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\",\n    \"libiconv\",\n    \"sdl1\",\n    \"zlib\",\n]\nscript = \"\"\"\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include\"\nexport CXXFLAGS=\"${CXXFLAGS} -I${COOKBOOK_SYSROOT}/include\"\nexport DATAPATH=\"/usr/share/games/openjazz/\"\n\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=ON\n    -DCMAKE_CXX_COMPILER=\"${TARGET}-g++\"\n    -DCMAKE_C_COMPILER=\"${TARGET}-gcc\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_VERBOSE_MAKEFILE=ON\n    -DLEGACY_SDL=ON\n    -DSDL_LIBRARY=\"-lSDL -lorbital\"\n    -DNETWORK=ON\n    \"${COOKBOOK_SOURCE}\"\n)\n\ncookbook_configure\n\nASSETS_DIR=\"${COOKBOOK_STAGE}${DATAPATH}\"\nINSTALL_DIR=\"${COOKBOOK_STAGE}/usr/games\"\nICON_DIR=\"${COOKBOOK_STAGE}/usr/share/icons/apps\"\nMAN_ROOT=\"${COOKBOOK_STAGE}/usr/share/man\"\nmkdir -p \"${ASSETS_DIR}\" \"${INSTALL_DIR}\" \"${ICON_DIR}\" \"${MAN_ROOT}\"\n\ncp -v \"${COOKBOOK_SOURCE}/res/unix/OpenJazz.png\" \"${ICON_DIR}\"\n# TODO: Man pages need to be compiled\n# cp -v \"${COOKBOOK_SOURCE}/res/unix/OpenJazz.6\" \"${MAN_ROOT}/man6\"\nmv OpenJazz \"${INSTALL_DIR}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/games/openjk/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/OpenJK\"\nupstream = \"https://github.com/JACoders/OpenJK.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libjpeg\",\n    \"liborbital\",\n    \"libpng\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include -I${COOKBOOK_SYSROOT}/include/SDL2\"\nexport CXXFLAGS=\"${CXXFLAGS} -I${COOKBOOK_SYSROOT}/include -I${COOKBOOK_SYSROOT}/include/SDL2\"\ncat > redox.cmake <<EOF\n# the name of the target operating system\nset(CMAKE_SYSTEM_NAME Generic)\nset(CMAKE_SYSTEM_PROCESSOR \"${TARGET%%-*}\")\n\n# which compilers to use for C and C++\nset(CMAKE_C_COMPILER \"${TARGET}-gcc\")\nset(CMAKE_CXX_COMPILER \"${TARGET}-g++\")\n\n# where is the target environment located\nset(CMAKE_FIND_ROOT_PATH \"${COOKBOOK_SYSROOT}\")\n\n# adjust the default behavior of the FIND_XXX() commands:\n# search programs in the host environment\nset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n\n# search headers, libraries, and packages in the target environment\nset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\nEOF\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_TOOLCHAIN_FILE=redox.cmake\n    -DCMAKE_VERBOSE_MAKEFILE=On\n    -DJPEG_INCLUDE_DIR=\"${COOKBOOK_SYSROOT}/include\"\n    -DJPEG_LIBRARY=\"-ljpeg\"\n    -DPNG_PNG_INCLUDE_DIR=\"${COOKBOOK_SYSROOT}/include\"\n    -DPNG_LIBRARY=\"-lpng\"\n    -DSDL2_LIBRARIES=\"-lSDL2 -lorbital $(\"${TARGET}-pkg-config\" --libs osmesa)\"\n    -DZLIB_INCLUDE_DIR=\"${COOKBOOK_SYSROOT}/include\"\n    -DZLIB_LIBRARY=\"-lz\"\n    \"${COOKBOOK_SOURCE}\"\n)\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\" openjk_sp.x86_64\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/JediAcademy\"\ncp -v openjk_sp.x86_64 \"${COOKBOOK_STAGE}/home/user/JediAcademy\"\n\"\"\"\n"
  },
  {
    "path": "recipes/games/openttd/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/OpenTTD/OpenTTD.git\"\n#TODO: fix issues with this: branch = \"release/1.8\"\nrev = \"231402fb4bea0a0d6a16cef90764d9e7aa699c53\"\nshallow_clone = true\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"freetype2\",\n    \"liborbital\",\n    \"libpng\",\n    \"sdl1\",\n    \"xz\",\n    \"zlib\",\n]\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n# Unsure if the bundle dir is necessary\n# Or why the installation differs\n# Could be unnecessary\n./configure \\\\\n    --build=\"$(gcc -dumpmachine)\" \\\\\n    --host=\"${TARGET}\" \\\\\n    --prefix=\"\" \\\\\n    --enable-static \\\\\n    --without-liblzo2 \\\\\n    --disable-network \\\\\n    --without-threads\n\nmake VERBOSE=1 -j\"$(nproc)\"\n\ndest=\"${COOKBOOK_STAGE}\"\nbundledir=\"$dest/bundle\"\n\nmake VERBOSE=1 ROOT_DIR=\"./\" BUNDLE_DIR=\"$bundledir\" INSTALL_DIR=\"$dest/usr\" install\nrm -rf \"$bundledir\"\n\nif [ -d \"${COOKBOOK_STAGE}/usr/bin\" ]\nthen\n    find \"${COOKBOOK_STAGE}/usr/bin\" -type f -exec \"${TARGET}-strip\" -v {} ';'\nfi\n\"\"\"\n"
  },
  {
    "path": "recipes/games/openttd/redox.patch",
    "content": "diff -ruw source/config.lib source-new/config.lib\n--- source/config.lib\t2019-06-19 08:34:01.122040101 -0600\n+++ source-new/config.lib\t2019-06-27 16:41:18.749553078 -0600\n@@ -1458,7 +1458,8 @@\n \t\t\tfi\n \t\tfi\n \n-\t\thas_rdynamic=`$1 -dumpspecs | grep rdynamic`\n+\t\t#TODO has_rdynamic=`$1 -dumpspecs | grep rdynamic`\n+\t\thas_rdynamic=\"\"\n \t\tif [ -n \"$has_rdynamic\" ]; then\n \t\t\t# rdynamic is used to get useful stack traces from crash reports.\n \t\t\tflags=\"$flags -rdynamic\"\n@@ -1486,7 +1487,7 @@\n \t# Special CXXFlags for HOST\n \tCXXFLAGS=\"$CXXFLAGS\"\n \t# Libs to compile. In fact this is just LDFLAGS\n-\tLIBS=\"-lstdc++\"\n+\tLIBS=\"-lstdc++ -lSDL -lorbital\"\n \t# LDFLAGS used for HOST\n \tLDFLAGS=\"$LDFLAGS\"\n \t# FEATURES for HOST (lto)\ndiff -ruw source/src/music/extmidi.cpp source-new/src/music/extmidi.cpp\n--- source/src/music/extmidi.cpp\t2019-06-19 08:34:01.278040813 -0600\n+++ source-new/src/music/extmidi.cpp\t2019-06-27 16:39:06.400266392 -0600\n@@ -115,7 +115,11 @@\n \tswitch (this->pid) {\n \t\tcase 0: {\n \t\t\tclose(0);\n+#if defined(__redox__)\n+\t\t\tint d = open(\"null:\", O_RDONLY);\n+#else\n \t\t\tint d = open(\"/dev/null\", O_RDONLY);\n+#endif\n \t\t\tif (d != -1 && dup2(d, 1) != -1 && dup2(d, 2) != -1) {\n \t\t\t\texecvp(this->params[0], this->params);\n \t\t\t}\ndiff -ruw source/src/os/unix/unix.cpp source-new/src/os/unix/unix.cpp\n--- source/src/os/unix/unix.cpp\t2019-06-19 08:34:01.294040885 -0600\n+++ source-new/src/os/unix/unix.cpp\t2019-06-27 16:39:06.400266392 -0600\n@@ -69,12 +69,12 @@\n \n bool FiosIsRoot(const char *path)\n {\n-#if !defined(__MORPHOS__) && !defined(__AMIGAOS__)\n+#if !defined(__redox__)\n \treturn path[1] == '\\0';\n #else\n-\t/* On MorphOS or AmigaOS paths look like: \"Volume:directory/subdirectory\" */\n+\t/* On Redox paths look like: \"scheme:/directory/subdirectory\" */\n \tconst char *s = strchr(path, ':');\n-\treturn s != NULL && s[1] == '\\0';\n+\treturn (s != NULL) && (strlen(s) == 2) && (s[1] == '/') && (s[2] == '\\0');\n #endif\n }\n \n@@ -106,10 +106,10 @@\n {\n \tchar filename[MAX_PATH];\n \tint res;\n-#if defined(__MORPHOS__) || defined(__AMIGAOS__)\n-\t/* On MorphOS or AmigaOS paths look like: \"Volume:directory/subdirectory\" */\n+#if defined(__redox__)\n+\t/* On Redox paths look like: \"scheme:/directory/subdirectory\" */\n \tif (FiosIsRoot(path)) {\n-\t\tres = seprintf(filename, lastof(filename), \"%s:%s\", path, ent->d_name);\n+\t\tres = seprintf(filename, lastof(filename), \"%s%s\", path, ent->d_name);\n \t} else // XXX - only next line!\n #else\n \tassert(path[strlen(path) - 1] == PATHSEPCHAR);\n@@ -370,7 +370,7 @@\n \tif (child_pid != 0) return;\n \n \tconst char *args[3];\n-\targs[0] = \"xdg-open\";\n+\targs[0] = \"netsurf-fb\";\n \targs[1] = url;\n \targs[2] = NULL;\n \texecvp(args[0], const_cast<char * const *>(args));\ndiff -ruw source/src/rev.cpp.in source-new/src/rev.cpp.in\n--- source/src/rev.cpp.in\t2019-06-19 08:34:01.298040904 -0600\n+++ source-new/src/rev.cpp.in\t2019-06-27 16:39:06.400266392 -0600\n@@ -57,7 +57,7 @@\n  * (compiling from sources without any version control software)\n  * and 2 is for modified revision.\n  */\n-const byte _openttd_revision_modified = !!MODIFIED!!;\n+const byte _openttd_revision_modified = 2;\n \n /**\n  * The NewGRF revision of OTTD:\ndiff -ruw source/src/stdafx.h source-new/src/stdafx.h\n--- source/src/stdafx.h\t2019-06-19 08:34:01.334041067 -0600\n+++ source-new/src/stdafx.h\t2019-06-27 16:39:06.400266392 -0600\n@@ -12,6 +12,9 @@\n #ifndef STDAFX_H\n #define STDAFX_H\n \n+#include <strings.h>\n+#include <alloca.h>\n+\n #if defined(__APPLE__)\n \t#include \"os/macosx/osx_stdafx.h\"\n #endif /* __APPLE__ */\ndiff -ruw source/src/string.cpp source-new/src/string.cpp\n--- source/src/string.cpp\t2019-06-19 08:34:01.334041067 -0600\n+++ source-new/src/string.cpp\t2019-06-27 16:39:06.400266392 -0600\n@@ -528,7 +528,7 @@\n \treturn length;\n }\n \n-#ifdef DEFINE_STRCASESTR\n+#if 0\n char *strcasestr(const char *haystack, const char *needle)\n {\n \tsize_t hay_len = strlen(haystack);\n"
  },
  {
    "path": "recipes/games/openttd-opengfx/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/openttd-opengfx.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/share/games/openttd/baseset/opengfx\"\ncp -Rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/share/games/openttd/baseset/opengfx\"\n\"\"\""
  },
  {
    "path": "recipes/games/openttd-openmsx/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/openttd-openmsx.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/share/games/openttd/baseset/openmsx\"\ncp -Rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/share/games/openttd/baseset/openmsx\"\n\"\"\""
  },
  {
    "path": "recipes/games/openttd-opensfx/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/openttd-opensfx.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/share/games/openttd/baseset/opensfx\"\ncp -Rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/share/games/openttd/baseset/opensfx\"\n\"\"\""
  },
  {
    "path": "recipes/games/opentyrian/manifest",
    "content": "name=OpenTyrian\ncategory=Games\nbinary=/usr/games/opentyrian\nicon=/ui/icons/apps/opentyrian.png\n"
  },
  {
    "path": "recipes/games/opentyrian/recipe.toml",
    "content": "# Version date: 02-August-2024\n#\n# Notes:\n# As Tyrian is an ancient, sprite based game, the code isn't updated\n# super frequently. So instead of just pinning the version to the last\n# official release in 2022, I'm pulling from main because it's unlikely\n# anything will break. The last two commits were small fixes, one in 2023\n# and one in 2024.\n\n[source]\ngit = \"https://github.com/opentyrian/opentyrian\"\npatches = [ \"redox.patch\" ]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n    # \"sdl2-net\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\n# Build system is only a standalone Makefile\nCOOKBOOK_CONFIGURE=\"true\"\nCOOKBOOK_CONFIGURE_FLAGS=\"\"\n\n# See Makefile for variables to override\nexport PKG_CONFIG=\"${TARGET}-pkg-config\"\nASSETSDIR=\"${COOKBOOK_STAGE}/usr/share/games/tyrian\"\nexport WITH_NETWORK=false\nexport REDOX_OVERRIDE=true\nexport prefix=\"/usr\"\nexport bindir=\"${prefix}/games\"\nexport icondir=\"/usr/share/icons/apps\"\nexport gamesdir=\"${prefix}/share/games\"\n\nif [ \"${COOKBOOK_DYNAMIC}\" == \"1\" ]; then\n    LDFLAGS+=\" -lstdc++\"\nfi\n\n# Prepare the sources and download Tyrian (freeware)\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" \"${COOKBOOK_RECIPE}/tyrian21.zip.sha\" ./\nmkdir -p \"${ASSETSDIR}\"\ncurl -OL https://camanis.net/tyrian/tyrian21.zip\nsha256sum -c tyrian21.zip.sha\nunzip -jd \"${ASSETSDIR}\" tyrian21.zip\n\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/games/opentyrian/redox.patch",
    "content": "Binary files source/.git/index and source-new/.git/index differ\ndiff '--color=auto' -rupwN source/Makefile source-new/Makefile\n--- source/Makefile\t2024-10-21 02:46:06.720225834 -0400\n+++ source-new/Makefile\t2024-10-25 01:03:37.283351544 -0400\n@@ -5,10 +5,11 @@ ifneq ($(filter Msys Cygwin, $(shell una\n     TYRIAN_DIR = C:\\\\TYRIAN\n else\n     PLATFORM := UNIX\n-    TYRIAN_DIR = $(gamesdir)/tyrian\n+    TYRIAN_DIR ?= $(gamesdir)/tyrian\n endif\n \n-WITH_NETWORK := true\n+WITH_NETWORK ?= true\n+REDOX_OVERRIDE ?= false\n \n ################################################################################\n \n@@ -114,11 +115,15 @@ installdirs :\n \tmkdir -p $(DESTDIR)$(docdir)\n \tmkdir -p $(DESTDIR)$(man6dir)\n \tmkdir -p $(DESTDIR)$(desktopdir)\n-\tmkdir -p $(DESTDIR)$(icondir)/hicolor/22x22/apps\n-\tmkdir -p $(DESTDIR)$(icondir)/hicolor/24x24/apps\n-\tmkdir -p $(DESTDIR)$(icondir)/hicolor/32x32/apps\n-\tmkdir -p $(DESTDIR)$(icondir)/hicolor/48x48/apps\n-\tmkdir -p $(DESTDIR)$(icondir)/hicolor/128x128/apps\n+\tif [ \"$(REDOX_OVERRIDE)\" = \"true\" ]; then\\\n+\t\tmkdir -p $(DESTDIR)$(icondir);\\\n+\telse\\\n+\t\tmkdir -p $(DESTDIR)$(icondir)/hicolor/22x22/apps;\\\n+\t\tmkdir -p $(DESTDIR)$(icondir)/hicolor/24x24/apps;\\\n+\t\tmkdir -p $(DESTDIR)$(icondir)/hicolor/32x32/apps;\\\n+\t\tmkdir -p $(DESTDIR)$(icondir)/hicolor/48x48/apps;\\\n+\t\tmkdir -p $(DESTDIR)$(icondir)/hicolor/128x128/apps;\\\n+\tfi;\\\n \n .PHONY : install\n install : $(TARGET) installdirs\n@@ -126,11 +131,15 @@ install : $(TARGET) installdirs\n \t$(INSTALL_DATA) NEWS README $(DESTDIR)$(docdir)/\n \t$(INSTALL_DATA) linux/man/opentyrian.6 $(DESTDIR)$(man6dir)/opentyrian$(man6ext)\n \t$(INSTALL_DATA) linux/opentyrian.desktop $(DESTDIR)$(desktopdir)/\n-\t$(INSTALL_DATA) linux/icons/tyrian-22.png $(DESTDIR)$(icondir)/hicolor/22x22/apps/opentyrian.png\n-\t$(INSTALL_DATA) linux/icons/tyrian-24.png $(DESTDIR)$(icondir)/hicolor/24x24/apps/opentyrian.png\n-\t$(INSTALL_DATA) linux/icons/tyrian-32.png $(DESTDIR)$(icondir)/hicolor/32x32/apps/opentyrian.png\n-\t$(INSTALL_DATA) linux/icons/tyrian-48.png $(DESTDIR)$(icondir)/hicolor/48x48/apps/opentyrian.png\n-\t$(INSTALL_DATA) linux/icons/tyrian-128.png $(DESTDIR)$(icondir)/hicolor/128x128/apps/opentyrian.png\n+\tif [ \"$(REDOX_OVERRIDE)\" = \"true\" ]; then\\\n+\t\t$(INSTALL_DATA) linux/icons/tyrian-32.png $(DESTDIR)$(icondir)/opentyrian.png;\\\n+\telse\\\n+\t\t$(INSTALL_DATA) linux/icons/tyrian-22.png $(DESTDIR)$(icondir)/hicolor/22x22/apps/opentyrian.png;\\\n+\t\t$(INSTALL_DATA) linux/icons/tyrian-24.png $(DESTDIR)$(icondir)/hicolor/24x24/apps/opentyrian.png;\\\n+\t\t$(INSTALL_DATA) linux/icons/tyrian-32.png $(DESTDIR)$(icondir)/hicolor/32x32/apps/opentyrian.png;\\\n+\t\t$(INSTALL_DATA) linux/icons/tyrian-48.png $(DESTDIR)$(icondir)/hicolor/48x48/apps/opentyrian.png;\\\n+\t\t$(INSTALL_DATA) linux/icons/tyrian-128.png $(DESTDIR)$(icondir)/hicolor/128x128/apps/opentyrian.png;\\\n+\tfi;\\\n \n .PHONY : uninstall\n uninstall :\n"
  },
  {
    "path": "recipes/games/opentyrian/tyrian21.zip.sha",
    "content": "7790d09a2a3addcd33c66ef063d5900eb81cc9c342f4807eb8356364dd1d9277  tyrian21.zip\n"
  },
  {
    "path": "recipes/games/prboom/01_redox.patch",
    "content": "diff -burpN source-original/src/m_misc.c source/src/m_misc.c\n--- source-original/src/m_misc.c\t2008-11-09 10:13:04.000000000 -0700\n+++ source/src/m_misc.c\t2024-09-07 10:09:06.890301682 -0600\n@@ -954,6 +954,12 @@ void M_LoadDefaults (void)\n   // read the file in, overriding any set defaults\n \n   f = fopen (defaultfile, \"r\");\n+#if defined(__redox__)\n+  if (f) {\n+      printf(\"disabling load of config file on redox\\n\");\n+      f = NULL;\n+  }\n+#endif\n   if (f)\n     {\n     while (!feof(f))\n"
  },
  {
    "path": "recipes/games/prboom/recipe.toml",
    "content": "[source]\ntar = \"https://downloads.sourceforge.net/project/prboom/prboom%20stable/2.5.0/prboom-2.5.0.tar.gz\"\nblake3 = \"24c1b9b5aa15fd73e59162055f2c6d8faa82759b76ddfca9828cd2a5c8dc6b2a\"\nscript = \"\"\"\nautotools_recursive_regenerate\nwget -O autotools/config.sub \"https://gitlab.redox-os.org/redox-os/gnu-config/-/raw/master/config.sub?inline=false\"\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n  \"sdl1\",\n  \"liborbital\", \n  \"sdl1-mixer\",\n  \"libogg\",\n  \"libvorbis\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport MIXER_LIBS=\"-lSDL_mixer -lvorbisfile -lvorbis -logg\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n  --disable-cpu-opt\n  --disable-i386-asm\n  --disable-gl\n  --disable-sdltest\n  --without-net\n  --with-sdl-prefix=\"${COOKBOOK_SYSROOT}\"\n  ac_cv_lib_SDL_mixer_Mix_OpenAudio=yes\n  ac_cv_type_gid_t=yes\n  ac_cv_type_uid_t=yes\n)\ncookbook_configure\n\"\"\"\n\n"
  },
  {
    "path": "recipes/games/quakespasm/manifest",
    "content": "name=QuakeSpasm\ncategory=Games\nbinary=/usr/games/quakespasm\nicon=/ui/icons/apps/quakespasm.png\n"
  },
  {
    "path": "recipes/games/quakespasm/recipe.toml",
    "content": "# TODO: Promote\n\n# Version: 0.96.3\n# Version date: 31-July-2024 \n\n[source]\ngit = \"https://github.com/sezero/quakespasm\"\nrev = \"cc32abe09ed417ce3be10af300d2dc2f686349ba\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n  \"libiconv\",\n  \"libogg\",\n  \"liborbital\",\n  \"libvorbis\",\n  \"mesa\",\n  # \"sdl1\",\n  \"sdl2\",\n  \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\n# Skip configuring because QuakeSpasm uses a custom build system\nCOOKBOOK_CONFIGURE=\"true\"\nCOOKBOOK_CONFIGURE_FLAGS=\"\"\n\n# Ensure the build system is aware of Redox\n# The build system uses sdl-config for Unix, but SDL recommends using pkg-config\nexport HOST_OS=\"redox\"\nexport PKG_CONFIG=\"${TARGET}-pkg-config\"\n\n# Config options for the Makefile. Set as necessary (see Makefile).\n# MP3 is disabled because libmad doesn't compile at the moment\n# Other options weren't tested, but SDL and SDL2 both compile fine\nexport USE_SDL2=1\nexport USE_CODEC_MP3=0\nexport DO_USERDIRS=1\n\nif [ \"${COOKBOOK_DYNAMIC}\" == \"1\" ]; then\n    LDFLAGS+=\" -lstdc++\"\nfi\n\n# Source is in Quake/ and icons are in Misc/\nrsync -av --delete \"${COOKBOOK_SOURCE}/Quake/\" \"${COOKBOOK_SOURCE}/Misc\" ./\n\n# According to frantic grepping, the Redox build system doesn't apply patches to git\ngit apply \"${COOKBOOK_RECIPE}/redox.patch\"\n\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/games/quakespasm/redox.patch",
    "content": "diff '--color=auto' -rupwN source/Makefile source-new/Makefile\n--- source/Makefile\t2024-10-15 21:21:14.824589882 -0400\n+++ source-new/Makefile\t2024-10-16 00:42:27.651948743 -0400\n@@ -4,28 +4,34 @@\n # \"make SDL_CONFIG=/path/to/sdl-config\" for unusual SDL installations.\n # \"make DO_USERDIRS=1\" to enable user directories support\n \n+# Base install directory\n+DESTDIR ?= \"/\"\n+INSTALLDIR = \"${DESTDIR}/usr/games/\"\n+DATADIR = \"${DESTDIR}/usr/share/games/quake1/id1/\"\n+ICODIR = \"${DESTDIR}/usr/share/icons/apps/\"\n+\n # Enable/Disable user directories support\n-DO_USERDIRS=0\n+DO_USERDIRS ?= 0\n \n ### Enable/Disable SDL2\n-USE_SDL2=0\n+USE_SDL2 ?= 0\n \n ### Enable/Disable codecs for streaming music support\n-USE_CODEC_WAVE=1\n-USE_CODEC_FLAC=0\n-USE_CODEC_MP3=1\n-USE_CODEC_VORBIS=1\n-USE_CODEC_OPUS=0\n+USE_CODEC_WAVE ?= 1\n+USE_CODEC_FLAC ?= 0\n+USE_CODEC_MP3 ?= 1\n+USE_CODEC_VORBIS ?= 1\n+USE_CODEC_OPUS ?= 0\n # either xmp or mikmod (or modplug)\n-USE_CODEC_MIKMOD=0\n-USE_CODEC_XMP=0\n-USE_CODEC_MODPLUG=0\n-USE_CODEC_UMX=0\n+USE_CODEC_MIKMOD ?= 0\n+USE_CODEC_XMP ?= 0\n+USE_CODEC_MODPLUG ?= 0\n+USE_CODEC_UMX ?= 0\n \n # which library to use for mp3 decoding: mad or mpg123\n-MP3LIB=mad\n+MP3LIB ?= mad\n # which library to use for ogg decoding: vorbis or tremor\n-VORBISLIB=vorbis\n+VORBISLIB ?= vorbis\n \n # ---------------------------\n # Helper functions\n@@ -35,7 +41,7 @@ check_gcc = $(shell if echo | $(CC) $(1)\n \n # ---------------------------\n \n-HOST_OS = $(shell uname|sed -e s/_.*//|tr '[:upper:]' '[:lower:]')\n+HOST_OS ?= $(shell uname|sed -e s/_.*//|tr '[:upper:]' '[:lower:]')\n \n DEBUG ?= 0\n \n@@ -49,7 +55,7 @@ LINKER = $(CC)\n STRIP ?= strip\n PKG_CONFIG ?= pkg-config\n \n-CPUFLAGS=\n+CPUFLAGS ?=\n LDFLAGS?=\n DFLAGS ?=\n CFLAGS ?= -Wall -Wno-trigraphs -MMD\n@@ -81,11 +87,19 @@ endif\n \n ifeq ($(USE_SDL2),1)\n SDL_CONFIG ?= sdl2-config\n+SDL_VERSION = sdl2\n else\n SDL_CONFIG ?= sdl-config\n+SDL_VERSION = sdl\n endif\n+\n+ifeq ($(HOST_OS),redox)\n+SDL_CFLAGS = $(shell $(PKG_CONFIG) --cflags $(SDL_VERSION))\n+SDL_LIBS = $(shell $(PKG_CONFIG) --libs $(SDL_VERSION))\n+else\n SDL_CFLAGS = $(shell $(SDL_CONFIG) --cflags)\n SDL_LIBS   = $(shell $(SDL_CONFIG) --libs)\n+endif\n \n NET_LIBS   =\n ifeq ($(HOST_OS),sunos)\n@@ -164,6 +178,8 @@ endif\n \n ifeq ($(HOST_OS),haiku)\n COMMON_LIBS= -lGL\n+else ifeq ($(HOST_OS),redox)\n+COMMON_LIBS= -lorbital $(shell $(PKG_CONFIG) --libs osmesa zlib)\n else\n COMMON_LIBS= -lGL -lm\n endif\n@@ -290,7 +306,10 @@ install:\tquakespasm\n \tcp quakespasm.pak $(QS_APP_DIR)\n else\n install:\tquakespasm\n-\tcp quakespasm /usr/local/games/quake\n+\tmkdir -p \"${INSTALLDIR}\" \"${DATADIR}\" \"${ICODIR}\"\n+\tcp quakespasm \"${INSTALLDIR}/quakespasm\"\n+\t# xxx Probably requires resizing\n+\tcp Misc/QuakeSpasm_512.png \"${ICODIR}/quakespasm.png\"\n endif\n \n sinclude $(OBJS:.o=.d)\n"
  },
  {
    "path": "recipes/games/redox-games/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/games.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/games/sm64ex/.gitignore",
    "content": "/baserom.us.z64\n"
  },
  {
    "path": "recipes/games/sm64ex/manifest",
    "content": "name=Super Mario 64 EX\ncategory=Games\nbinary=/bin/sm64\nicon=/ui/icons/apps/sm64ex.png\n"
  },
  {
    "path": "recipes/games/sm64ex/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/sm64ex.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n# You must find your own ROM\ncp -v \"${COOKBOOK_RECIPE}/baserom.us.z64\" baserom.us.z64\n\n#TODO: do this in cook instead\nunset AR AS CC CXX LD NM OBJCOPY OBJDUMP RANLIB READELF STRIP\n\nexport REDOX_CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include\"\nexport REDOX_LDFLAGS=\"${LDFLAGS}\"\nunset CFLAGS LDFLAGS\n\nexport CROSS=\"${TARGET}-\"\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\nmkdir -p \"${COOKBOOK_STAGE}/bin\"\ncp -v build/us_pc/sm64.us.f3dex2e \"${COOKBOOK_STAGE}/bin/sm64\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/sm64ex\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/apps\"\nwget -O \"${COOKBOOK_STAGE}/usr/share/icons/apps/sm64ex.png\" https://evilgames.eu/texture-packs/thumb/sm64-reloaded.png\n\"\"\"\n"
  },
  {
    "path": "recipes/games/sopwith/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/fragglet/sdl-sopwith/releases/download/sdl-sopwith-1.8.4/sopwith-1.8.4.tar.gz\"\nblake3 = \"44e1404a9c4bea257d7778d2a4b1512231603a74b0a7b18eac5d18f36730ed3e\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1\",\n    \"liborbital\",\n    \"libiconv\",\n]\nscript = \"\"\"\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include/SDL\"\nexport LIBS=\"-lSDL -lorbital\" # TODO: Uses sdl-config instead of pkg-config\n\n# For some reason, cook_configure breaks spectacularly on this\n# We will just copy instead\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\nwget -O autotools/config.sub \"https://gitlab.redox-os.org/redox-os/gnu-config/-/raw/master/config.sub?inline=false\"\n\n./configure \\\\\n    --build=\"$(gcc -dumpmachine)\" \\\\\n    --host=\"${TARGET}\" \\\\\n    --prefix=\"\" \\\\\n    --with-sdl-prefix=\"${COOKBOOK_SYSROOT}\"\n\nmake -j\"$(nproc)\"\n\nmake DESTDIR=\"${COOKBOOK_STAGE}\" install\n\"\"\""
  },
  {
    "path": "recipes/games/spacecadetpinball/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/xTibor/SpaceCadetPinball.git\"\nupstream = \"https://github.com/k4zmu2a/SpaceCadetPinball.git\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libogg\",\n    \"liborbital\",\n    \"libvorbis\",\n    \"mesa\",\n    \"sdl2\",\n    \"sdl2-mixer\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DSDL2_INCLUDE_DIR=\"${COOKBOOK_SYSROOT}/include/SDL2\"\n    -DSDL2_LIBRARY=\"-lSDL2_mixer -lvorbisfile -lvorbis -logg -lSDL2 -lorbital $(\"${TARGET}-pkg-config\" --libs osmesa)\"\n    -DSDL2_MIXER_INCLUDE_DIR=\"${COOKBOOK_SYSROOT}/include/SDL2\"\n    -DSDL2_MIXER_LIBRARY=\"SDL2_mixer\"\n)\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/graphics/procedural-wallpapers-rs/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/lukas-kirschner/procedural-wallpapers-rs.git\"\n\n[build]\ntemplate = \"cargo\"\ncargopath = \"procedural_wallpapers\"\n"
  },
  {
    "path": "recipes/groups/auto-test/auto-test.ion",
    "content": "#!/usr/bin/env ion\nexport RUST_BACKTRACE=full\ncd /home/user/acid\ncargo test\nbash /root/relibc-tests/run.sh\nos-test-runner"
  },
  {
    "path": "recipes/groups/auto-test/recipe.toml",
    "content": "# Meta-package for automated testing of essential test suites\n# Smaller test suites are executed first to catch possible bugs or regressions faster\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\ncp -rv \"${COOKBOOK_RECIPE}/auto-test.ion\" \"${COOKBOOK_STAGE}/usr/bin/auto-test\"\nchmod a+x \"${COOKBOOK_STAGE}/usr/bin/auto-test\"\n\"\"\"\n[package]\ndependencies = [\n    \"acid\",\n    \"coreutils\",\n    \"ion\",\n    \"os-test-bins\",\n    \"relibc-tests-bins\",\n]\n"
  },
  {
    "path": "recipes/groups/demo/recipe.toml",
    "content": "# demo variant meta-package\n[package]\ndependencies = [\n    \"desktop\",\n    \"periodictable\",\n    \"intel-one-mono\",\n    \"gnu-grep\",\n    \"htop\",\n    \"ripgrep\",\n    \"terminfo\",\n    \"vim\",\n    \"dosbox\",\n    \"freedoom\",\n    \"neverball\",\n    \"prboom\",\n    \"redox-games\",\n    \"sopwith\",\n    \"orbclient\",\n    \"pixelcannon\",\n    \"rodioplay\",\n    \"freepats\",\n]\n"
  },
  {
    "path": "recipes/groups/desktop/recipe.toml",
    "content": "# desktop variant meta-package\n[package]\ndependencies = [\n    \"server\",\n    \"cosmic-edit\",\n    \"cosmic-files\",\n    \"cosmic-icons\",\n    \"cosmic-term\",\n    \"dejavu\",\n    \"freefont\",\n    \"hicolor-icon-theme\",\n    \"installer-gui\",\n    \"netsurf\",\n    \"orbdata\",\n    \"orbital\",\n    \"orbutils\",\n    \"patchelf\",\n    \"pop-icon-theme\",\n    \"shared-mime-info\",\n]\n"
  },
  {
    "path": "recipes/groups/dev-essential/recipe.toml",
    "content": "[package]\ndependencies = [\n    \"autoconf\",\n    \"automake\",\n    \"gcc13\",\n    \"gcc13.cxx\",\n    \"gnu-binutils\",\n    \"gnu-make\",\n    \"gnu-grep\",\n    \"perl5\",\n    \"python312\",\n    \"ripgrep\",\n    \"lua54\",\n    \"nasm\",\n    \"patch\",\n    \"pkg-config\",\n    \"rust\",\n    \"sed\",\n]\n"
  },
  {
    "path": "recipes/groups/dev-redox/recipe.toml",
    "content": "[package]\ndependencies = [\n    \"dev-essential\",\n    \"redox-tests\",\n    \"exampled\",\n    \"gdbserver\",\n    \"libgmp\",\n    \"libiconv\",\n    \"liborbital\",\n    \"libsodium\",\n    \"libxml2\",\n    \"ncursesw\",\n    \"nghttp2\",\n    \"openssl3\",\n    \"orbclient\",\n    \"pcre\",\n    \"terminfo\",\n    \"xz\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/groups/llvm21-common/recipe.toml",
    "content": "[package]\ndependencies = [\n    \"clang21\",\n    \"llvm21\",\n    \"llvm21.runtime\",\n    \"lld21\",\n]\n"
  },
  {
    "path": "recipes/groups/mate-common/recipe.toml",
    "content": "[package]\ndependencies = [\n    \"caja\",\n    \"marco\",\n    \"mate-control-center\",\n    \"mate-icon-theme\",\n    \"mate-panel\",\n    \"mate-session-manager\",\n    \"mate-settings-daemon\",\n    \"mate-terminal\",\n]\n"
  },
  {
    "path": "recipes/groups/redox-tests/recipe.toml",
    "content": "[package]\ndependencies = [\n    \"acid\",\n    \"acid-bins\",\n    \"auto-test\",\n    \"hello-redox\",\n    \"os-test\",\n    \"os-test-bins\",\n    \"openposixtestsuite\",\n    \"redox-posix-tests\",\n    \"relibc-tests\",\n    \"relibc-tests-bins\",\n    \"vttest\",\n]\n"
  },
  {
    "path": "recipes/groups/server/recipe.toml",
    "content": "# server variant meta-package\n[package]\ndependencies = [\n    \"bash\",\n    \"bottom\",\n    \"ca-certificates\",\n    #\"contain\",\n    \"coreutils\",\n    \"curl\",\n    \"diffutils\",\n    \"extrautils\",\n    \"findutils\",\n    \"git\",\n    \"installer\",\n    \"ion\",\n    \"kibi\",\n]\n"
  },
  {
    "path": "recipes/groups/sys/recipe.toml",
    "content": "[package]\ndependencies = [\n    \"bootloader\",\n    \"kernel\",\n    \"relibc\",\n    \"base\",\n    \"coreutils\",\n    \"base-initfs\",\n]\n"
  },
  {
    "path": "recipes/groups/sys-gui/recipe.toml",
    "content": "[package]\ndependencies = [\n    \"orbital\",\n    \"orbdata\",\n    \"orbutils\",\n]\n"
  },
  {
    "path": "recipes/groups/x11-full/recipe.toml",
    "content": "[package]\ndependencies = [\n    \"x11-minimal\",\n    \"twm\",\n    \"xev\",\n    \"xeyes\",\n    \"xkbutils\",\n    \"xterm\",\n]\n"
  },
  {
    "path": "recipes/groups/x11-minimal/recipe.toml",
    "content": "[package]\ndependencies = [\n    \"xinit\",\n    \"xkbcomp\",\n    \"xkeyboard-config\",\n    \"xserver-xorg\",\n    \"xserver-xorg-video-orbital\",\n]\n"
  },
  {
    "path": "recipes/gui/installer-gui/manifest",
    "content": "name=Redox Installer\ncategory=System\nbinary=/usr/bin/redox_installer_gui\nicon=/usr/share/icons/Pop/48x48/apps/system-os-installer.svg\nauthor=Jeremy Soller\ndescription=GUI Installer for Redox\n"
  },
  {
    "path": "recipes/gui/installer-gui/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/installer-gui.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/redox-installer-gui\"\n\"\"\"\n"
  },
  {
    "path": "recipes/gui/orbdata/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/orbdata.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncp -rv \"${COOKBOOK_SOURCE}/\"* \"${COOKBOOK_STAGE}/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/gui/orbital/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/orbital.git\"\n\n[build]\ntemplate = \"cargo\"\n\n[package]\ndependencies = [\n    \"orbdata\"\n]\n"
  },
  {
    "path": "recipes/gui/orbterm/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/orbterm.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui\"\ncp -rv \"${COOKBOOK_SOURCE}/apps\" \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\n\ncookbook_cargo\n\"\"\"\n\n[package]\ndependencies = [\n    \"orbital\"\n]\n"
  },
  {
    "path": "recipes/gui/orbutils/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/orbutils.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui\"\ncp -rv \"${COOKBOOK_SOURCE}/apps\" \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\n\nCOOKBOOK_CARGO_PATH=\"orbutils\" cookbook_cargo\nCOOKBOOK_CARGO_PATH=\"launcher\" cookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/gui/orbutils-background/recipe.toml",
    "content": "[source]\nsame_as = \"../orbutils\"\n\n[build]\ntemplate = \"cargo\"\ncargopath = \"orbutils\"\ncargoflags = [\n    \"--bin background\"\n]\n\n[package]\ndependencies = [\n    \"orbital\"\n]\n"
  },
  {
    "path": "recipes/icons/cosmic-icons/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/cosmic-icons.git\"\nrev = \"f93dcdfa1060c2cf3f8cf0b56b0338292edcafa5\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncd \"${COOKBOOK_SOURCE}\"\njust rootdir=\"${COOKBOOK_STAGE}\" prefix=\"\" install\n\"\"\"\n"
  },
  {
    "path": "recipes/icons/hicolor-icon-theme/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.freedesktop.org/xdg/default-icon-theme.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmeson setup --reconfigure -Dprefix=/usr . \"${COOKBOOK_SOURCE}\"\nenv DESTDIR=\"${COOKBOOK_STAGE}\" meson install\n\"\"\"\n"
  },
  {
    "path": "recipes/icons/pop-icon-theme/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/icon-theme.git\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmeson setup -Dprefix=/ . \"${COOKBOOK_SOURCE}\"\nenv DESTDIR=\"${COOKBOOK_STAGE}\" meson install\n\"\"\"\n\n[[optional-packages]]\nname = \"cursors\"\nfiles = [\n    \"share/icons/Pop/cursors**\",\n    \"share/icons/Pop/cursor.theme\",\n]\n\n"
  },
  {
    "path": "recipes/libs/atk/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/atk/2.38/atk-2.38.0.tar.xz\"\nblake3 = \"cbc1b7ba03009ee5cc0e646d8a86117e0d65bf8d105f2e8714fbde0299a8012e\"\nscript = \"\"\"\nGNU_CONFIG_GET config.sub\n\"\"\"\n\n[build]\ndependencies = [\n    \"gettext\",\n    \"glib\",\n    #TODO \"gobject-introspection\",\n    \"libffi\",\n    \"libiconv\",\n    \"pcre2\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson -Dintrospection=false\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/cairo/recipe.toml",
    "content": "[source]\ntar = \"https://www.cairographics.org/releases/cairo-1.18.4.tar.xz\"\nblake3 = \"b9fa14e02f85ec4e72396c62236c98502d04dbbdf8daf01ab9557a1c7aa7106e\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n\t\"expat\",\n\t\"freetype2\",\n\t\"fontconfig\",\n    \"gettext\",\n    \"glib\",\n    \"libffi\",\n    \"libiconv\",\n\t\"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"pcre2\",\n\t\"pixman\",\n    \"x11proto\",\n\t\"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n#TODO: fix mutex implementation\n#TODO: why are math defines missing?\nCFLAGS=\"${CFLAGS} -DCAIRO_NO_MUTEX=1 -DM_SQRT2=1.41421356237309504880 -DM_LN2=0.69314718055994530942\"\ncookbook_meson \\\n    -Dxlib-xcb=enabled \\\n    -Dtests=disabled\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/cairo/redox.patch",
    "content": "diff -ruwN cairo-1.18.4/meson.build source/meson.build\n--- cairo-1.18.4/meson.build\t2025-03-08 05:35:35.000000000 -0700\n+++ source/meson.build\t2025-05-04 18:07:04.594213814 -0600\n@@ -440,13 +440,13 @@\n if feature_conf.get('CAIRO_HAS_XCB_SURFACE', 0) == 1\n   xcbshm_dep = dependency('xcb-shm', required: get_option('xcb'))\n   if xcbshm_dep.found()\n-    feature_conf.set('CAIRO_HAS_XCB_SHM_FUNCTIONS', 1)\n-    deps += [xcbshm_dep]\n-    built_features += [{\n-      'name': 'cairo-xcb-shm',\n-      'description': 'XCB/SHM functions',\n-      'deps': [xcbshm_dep],\n-    }]\n+    #feature_conf.set('CAIRO_HAS_XCB_SHM_FUNCTIONS', 1)\n+    #deps += [xcbshm_dep]\n+    #built_features += [{\n+    #  'name': 'cairo-xcb-shm',\n+    #  'description': 'XCB/SHM functions',\n+    #  'deps': [xcbshm_dep],\n+    #}]\n   endif\n endif\n \ndiff -ruwN cairo-1.18.4/perf/Makefile.in source/perf/Makefile.in\n--- cairo-1.18.4/perf/Makefile.in\t1969-12-31 17:00:00.000000000 -0700\n+++ source/perf/Makefile.in\t2025-05-01 12:52:11.400963345 -0600\n@@ -0,0 +1,3 @@\n+all:\n+\n+install:\ndiff -ruwN cairo-1.18.4/src/cairo-ps-surface.c source/src/cairo-ps-surface.c\n--- cairo-1.18.4/src/cairo-ps-surface.c\t2025-03-08 05:35:35.000000000 -0700\n+++ source/src/cairo-ps-surface.c\t2025-05-04 18:08:43.821264417 -0600\n@@ -102,7 +102,7 @@\n #define DEBUG_FALLBACK(s)\n #endif\n \n-#ifndef HAVE_CTIME_R\n+#if !defined(HAVE_CTIME_R) && !defined(__redox__)\n static char *ctime_r(const time_t *timep, char *buf)\n {\n     (void)buf;\ndiff -ruwN cairo-1.18.4/test/Makefile.in source/test/Makefile.in\n--- cairo-1.18.4/test/Makefile.in\t1969-12-31 17:00:00.000000000 -0700\n+++ source/test/Makefile.in\t2025-05-01 12:52:11.400963345 -0600\n@@ -0,0 +1,3 @@\n+all:\n+\n+install:\n"
  },
  {
    "path": "recipes/libs/duktape/recipe.toml",
    "content": "[source]\ntar = \"https://duktape.org/duktape-2.7.0.tar.xz\"\nblake3 = \"b0a17da888847bc9c73624ae3ba7f858ec327a9bbce9d287aee6a2489e518448\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\nsed -i \"s/= gcc/= ${TARGET}-gcc/g\" Makefile.cmdline\n\n\"${COOKBOOK_MAKE}\" -f Makefile.cmdline -j\"$COOKBOOK_MAKE_JOBS\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\ncp ./duk \"${COOKBOOK_STAGE}/usr/bin/duk\"\n\"\"\""
  },
  {
    "path": "recipes/libs/expat/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/libexpat/libexpat/releases/download/R_2_5_0/expat-2.5.0.tar.xz\"\nblake3 = \"ea89dd9a5a2e48d5e44fed38554b36a8f2e365a5091a99d08e30bfb1c15dda5e\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --without-docbook\n    --without-examples\n    --without-tests\n    --without-xmlwf\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/ffmpeg6/binutils-2.41.patch",
    "content": "From effadce6c756247ea8bae32dc13bb3e6f464f0eb Mon Sep 17 00:00:00 2001\nFrom: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>\nDate: Sun, 16 Jul 2023 18:18:02 +0300\nSubject: [PATCH] avcodec/x86/mathops: clip constants used with shift\n instructions within inline assembly\n\nFixes assembling with binutil as >= 2.41\n\nSigned-off-by: James Almer <jamrial@gmail.com>\n---\n libavcodec/x86/mathops.h | 26 +++++++++++++++++++++++---\n 1 file changed, 23 insertions(+), 3 deletions(-)\n\ndiff --git a/libavcodec/x86/mathops.h b/libavcodec/x86/mathops.h\nindex 6298f5ed19..ca7e2dffc1 100644\n--- a/libavcodec/x86/mathops.h\n+++ b/libavcodec/x86/mathops.h\n@@ -35,12 +35,20 @@\n static av_always_inline av_const int MULL(int a, int b, unsigned shift)\n {\n     int rt, dummy;\n+    if (__builtin_constant_p(shift))\n     __asm__ (\n         \"imull %3               \\n\\t\"\n         \"shrdl %4, %%edx, %%eax \\n\\t\"\n         :\"=a\"(rt), \"=d\"(dummy)\n-        :\"a\"(a), \"rm\"(b), \"ci\"((uint8_t)shift)\n+        :\"a\"(a), \"rm\"(b), \"i\"(shift & 0x1F)\n     );\n+    else\n+        __asm__ (\n+            \"imull %3               \\n\\t\"\n+            \"shrdl %4, %%edx, %%eax \\n\\t\"\n+            :\"=a\"(rt), \"=d\"(dummy)\n+            :\"a\"(a), \"rm\"(b), \"c\"((uint8_t)shift)\n+        );\n     return rt;\n }\n \n@@ -113,19 +121,31 @@ __asm__ volatile(\\\n // avoid +32 for shift optimization (gcc should do that ...)\n #define NEG_SSR32 NEG_SSR32\n static inline  int32_t NEG_SSR32( int32_t a, int8_t s){\n+    if (__builtin_constant_p(s))\n     __asm__ (\"sarl %1, %0\\n\\t\"\n          : \"+r\" (a)\n-         : \"ic\" ((uint8_t)(-s))\n+         : \"i\" (-s & 0x1F)\n     );\n+    else\n+        __asm__ (\"sarl %1, %0\\n\\t\"\n+               : \"+r\" (a)\n+               : \"c\" ((uint8_t)(-s))\n+        );\n     return a;\n }\n \n #define NEG_USR32 NEG_USR32\n static inline uint32_t NEG_USR32(uint32_t a, int8_t s){\n+    if (__builtin_constant_p(s))\n     __asm__ (\"shrl %1, %0\\n\\t\"\n          : \"+r\" (a)\n-         : \"ic\" ((uint8_t)(-s))\n+         : \"i\" (-s & 0x1F)\n     );\n+    else\n+        __asm__ (\"shrl %1, %0\\n\\t\"\n+               : \"+r\" (a)\n+               : \"c\" ((uint8_t)(-s))\n+        );\n     return a;\n }\n \n-- \n2.30.2\n\n"
  },
  {
    "path": "recipes/libs/ffmpeg6/ffmpeg.patch",
    "content": "diff -rupN source-original/configure source/configure\n--- source-original/configure\t2018-03-04 11:13:59.000000000 +0100\n+++ source/configure\t2018-03-04 11:18:10.026033282 +0100\n@@ -5141,6 +5141,8 @@ case $target_os in\n         ;;\n     minix)\n         ;;\n+    redox)\n+        ;;\n     none)\n         ;;\n     *)\ndiff -rupN source-original/fftools/ffmpeg.c source/fftools/ffmpeg.c\n--- source-original/fftools/ffmpeg.c\t2018-03-04 11:13:59.000000000 +0100\n+++ source/fftools/ffmpeg.c\t2018-03-04 11:45:38.326394016 +0100\n@@ -91,7 +91,7 @@\n \n #if HAVE_TERMIOS_H\n #include <fcntl.h>\n-#include <sys/ioctl.h>\n+//#include <sys/ioctl.h>\n #include <sys/time.h>\n #include <termios.h>\n #elif HAVE_KBHIT\n"
  },
  {
    "path": "recipes/libs/ffmpeg6/manifest",
    "content": "name=ffplay\nbinary=/usr/bin/ffplay\naccept=*.mp3\naccept=*.ogg\naccept=*.opus\naccept=*.m4a\naccept=*.flac\naccept=*.wav\naccept=*.mp4\naccept=*.mkv\naccept=*.webm\naccept=*.3gp\naccept=*.mov\nauthor=FFMPEG Developers\ndescription=FFMPEG Media Player\n"
  },
  {
    "path": "recipes/libs/ffmpeg6/recipe.toml",
    "content": "[source]\ntar = \"https://ffmpeg.org/releases/ffmpeg-6.0.tar.xz\"\nblake3 = \"4879074c357102f85932673044c57c144b0c188ae58edec2a115965536ee340f\"\npatches = [\n    \"ffmpeg.patch\",\n    \"binutils-2.41.patch\",\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nexport LDFLAGS=\"$LDFLAGS -lSDL2 -lorbital -lOSMesa -lstdc++\"\nARCH=\"${TARGET%%-*}\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --enable-cross-compile\n    --target-os=redox\n    --arch=\"${ARCH}\"\n    --cross_prefix=\"${TARGET}-\"\n    --prefix=/usr\n    --disable-doc\n    --enable-shared\n    --disable-static\n    --disable-network\n    --enable-sdl2\n    --enable-zlib\n    --enable-encoder=png\n    --enable-decoder=png\n)\ncookbook_configure\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/ffplay\"\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/freetype2/recipe.toml",
    "content": "[source]\ntar = \"https://sourceforge.net/projects/freetype/files/freetype2/2.13.3/freetype-2.13.3.tar.xz/download\"\nblake3 = \"07a01894ccdb584943ce817b57341a8595ce9a92bfaa77c602ec4757dfabd5e2\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libpng\",\n    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\ncookbook_meson\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/fribidi/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/fribidi/fribidi/releases/download/v1.0.16/fribidi-1.0.16.tar.xz\"\nblake3 = \"c16ee250f73f149d7d52dc7d285eb73ac755bad7907d237391e23f429b2b71d5\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson -Dbin=false -Dtests=false\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/glib/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/glib/2.87/glib-2.87.0.tar.xz\"\nblake3 = \"26b77ae24bc02f85d1c6742fe601167b056085f117cda70da7b805cefa6195e9\"\npatches = [\n    \"redox.patch\",\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gettext\",\n    \"libffi\",\n    \"libiconv\",\n    \"pcre2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Ddefault_library=shared \\\n    -Dxattr=false\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/glib/redox.patch",
    "content": "diff -ruwN glib-2.87.0/fuzzing/fuzz_resolver.c source/fuzzing/fuzz_resolver.c\n--- glib-2.87.0/fuzzing/fuzz_resolver.c\t2025-11-03 19:42:10.000000000 +0700\n+++ source/fuzzing/fuzz_resolver.c\t2026-02-19 13:53:45.717898735 +0700\n@@ -29,7 +29,7 @@\n                  gint          rrtype)\n {\n   /* g_resolver_records_from_res_query() is only available on Unix */\n-#ifdef G_OS_UNIX\n+#if defined(G_OS_UNIX) && !defined(__redox__)\n   GList *record_list = NULL;\n \n   /* Data too long? */\ndiff -ruwN glib-2.87.0/gio/gcredentialsprivate.h source/gio/gcredentialsprivate.h\n--- glib-2.87.0/gio/gcredentialsprivate.h\t2025-11-03 19:42:10.000000000 +0700\n+++ source/gio/gcredentialsprivate.h\t2026-02-19 13:53:45.717995965 +0700\n@@ -104,7 +104,7 @@\n  */\n #undef G_CREDENTIALS_HAS_PID\n \n-#ifdef __linux__\n+#if defined(__linux__) || defined(__redox__)\n #define G_CREDENTIALS_SUPPORTED 1\n #define G_CREDENTIALS_USE_LINUX_UCRED 1\n #define G_CREDENTIALS_NATIVE_TYPE G_CREDENTIALS_TYPE_LINUX_UCRED\ndiff -ruwN glib-2.87.0/gio/glocalfile.c source/gio/glocalfile.c\n--- glib-2.87.0/gio/glocalfile.c\t2025-11-03 19:42:10.000000000 +0700\n+++ source/gio/glocalfile.c\t2026-02-19 13:53:45.718204283 +0700\n@@ -47,6 +47,10 @@\n #include <sys/mount.h>\n #endif\n \n+#if defined(__redox__)\n+#undef AT_FDCWD\n+#endif\n+\n #ifndef O_BINARY\n #define O_BINARY 0\n #endif\ndiff -ruwN glib-2.87.0/gio/gnetworking.h.in source/gio/gnetworking.h.in\n--- glib-2.87.0/gio/gnetworking.h.in\t2025-11-03 19:42:10.000000000 +0700\n+++ source/gio/gnetworking.h.in\t2026-02-19 13:53:45.718380100 +0700\n@@ -40,13 +40,17 @@\n #include <netdb.h>\n #include <netinet/in.h>\n #include <netinet/tcp.h>\n+#if !defined(__redox__)\n #include <resolv.h>\n+#endif\n #include <sys/socket.h>\n #include <sys/un.h>\n #include <net/if.h>\n \n #include <arpa/inet.h>\n+#if !defined(__redox__)\n #include <arpa/nameser.h>\n+#endif\n @NAMESER_COMPAT_INCLUDE@\n \n #ifndef __GI_SCANNER__\ndiff -ruwN glib-2.87.0/gio/gsocket.c source/gio/gsocket.c\n--- glib-2.87.0/gio/gsocket.c\t2025-11-03 19:42:10.000000000 +0700\n+++ source/gio/gsocket.c\t2026-03-05 11:29:00.807439664 +0700\n@@ -3133,7 +3133,8 @@\n \t{\n \t  int errsv = get_socket_errno ();\n \n-\t  if (errsv == EINTR)\n+    // TODO: uds connect() in redox is blocking\n+\t  if (errsv == EINTR || errsv == EAGAIN)\n \t    continue;\n \n #ifndef G_OS_WIN32\ndiff -ruwN glib-2.87.0/gio/gthreadedresolver.c source/gio/gthreadedresolver.c\n--- glib-2.87.0/gio/gthreadedresolver.c\t2025-11-03 05:42:10.000000000 -0700\n+++ source/gio/gthreadedresolver.c\t2026-01-15 18:35:07.059664185 -0700\n@@ -698,7 +698,7 @@\n }\n \n \n-#if defined(G_OS_UNIX)\n+#if defined(G_OS_UNIX) && !defined(__redox__)\n \n #if defined __BIONIC__ && !defined BIND_4_COMPAT\n /* Copy from bionic/libc/private/arpa_nameser_compat.h\n@@ -1393,7 +1393,11 @@\n {\n   GList *records;\n \n-#if defined(G_OS_UNIX)\n+#if defined(__redox__)\n+  g_set_error (error, G_RESOLVER_ERROR, G_RESOLVER_ERROR_INTERNAL,\n+                _(\"No support for resolving “%s” on redox\"), rrname);\n+  return NULL;\n+#elif defined(G_OS_UNIX)\n   gint len = 512;\n   gint herr;\n   GByteArray *answer;\ndiff -ruwN glib-2.87.0/gio/gunixconnection.c source/gio/gunixconnection.c\n--- glib-2.87.0/gio/gunixconnection.c\t2025-11-03 05:42:10.000000000 -0700\n+++ source/gio/gunixconnection.c\t2026-01-15 18:35:07.059895298 -0700\n@@ -496,7 +496,7 @@\n   GSocket *socket;\n   gint n;\n   gssize num_bytes_read;\n-#ifdef __linux__\n+#if defined(__linux__) || defined(__redox__)\n   gboolean turn_off_so_passcreds;\n #endif\n \n@@ -512,7 +512,7 @@\n    * already. We also need to turn it off when we're done.  See\n    * #617483 for more discussion.\n    */\n-#ifdef __linux__\n+#if defined(__linux__) || defined(__redox__)\n   {\n     gint opt_val;\n \n@@ -626,7 +626,7 @@\n \n  out:\n \n-#ifdef __linux__\n+#if defined(__linux__) || defined(__redox__)\n   if (turn_off_so_passcreds)\n     {\n       if (!g_socket_set_option (socket,\ndiff -ruwN glib-2.87.0/gio/gunixmounts.c source/gio/gunixmounts.c\n--- glib-2.87.0/gio/gunixmounts.c\t2025-11-03 05:42:10.000000000 -0700\n+++ source/gio/gunixmounts.c\t2026-01-15 18:35:07.060167680 -0700\n@@ -1114,7 +1114,7 @@\n }\n \n /* QNX {{{2 */\n-#elif defined (HAVE_QNX)\n+#elif defined (HAVE_QNX) || defined(__redox__)\n \n static char *\n get_mtab_monitor_file (void)\n@@ -1758,6 +1758,28 @@\n   return NULL;\n }\n \n+#elif defined(__redox__)\n+\n+static GUnixMountPoint **\n+_g_unix_mount_points_get_from_file (const char *table_path,\n+                                    uint64_t   *time_read_out,\n+                                    size_t     *n_points_out)\n+{\n+  /* Not supported on Redox. */\n+  if (time_read_out != NULL)\n+    *time_read_out = 0;\n+  if (n_points_out != NULL)\n+    *n_points_out = 0;\n+  return NULL;\n+}\n+\n+static GList *\n+_g_get_unix_mount_points (void)\n+{\n+  /* Not supported on Redox. */\n+  return NULL;\n+}\n+\n /* Common code {{{2 */\n #else\n #error No g_get_mount_table() implementation for system\ndiff -ruwN glib-2.87.0/gio/meson.build source/gio/meson.build\n--- glib-2.87.0/gio/meson.build\t2025-11-03 19:42:10.000000000 +0700\n+++ source/gio/meson.build\t2026-02-19 13:53:45.718994535 +0700\n@@ -18,7 +18,7 @@\n \n gnetworking_h_nameser_compat_include = ''\n \n-if host_system not in ['windows', 'android']\n+if host_system not in ['windows', 'android', 'redox']\n   # Don't check for C_IN on Android since it does not define it in public\n   # headers, we define it ourselves wherever necessary\n   if not cc.compiles('''#include <sys/types.h>\n@@ -39,7 +39,7 @@\n \n network_libs = [ ]\n network_args = [ ]\n-if host_system != 'windows'\n+if host_system not in ['windows', 'redox']\n   # res_query()\n   res_query_test = '''#include <resolv.h>\n                       int main (int argc, char ** argv) {\ndiff -ruwN glib-2.87.0/gio/tests/gdbus-server-auth.c source/gio/tests/gdbus-server-auth.c\n--- glib-2.87.0/gio/tests/gdbus-server-auth.c\t2025-11-03 19:42:10.000000000 +0700\n+++ source/gio/tests/gdbus-server-auth.c\t2026-02-19 13:53:45.719091042 +0700\n@@ -243,7 +243,7 @@\n     }\n   else    /* We should prefer EXTERNAL whenever it is allowed. */\n     {\n-#ifdef __linux__\n+#if defined(__linux__) || defined(__redox__)\n       /* We know that both GDBus and libdbus support full credentials-passing\n        * on Linux. */\n       g_assert_cmpint (uid, ==, getuid ());\ndiff -ruwN glib-2.87.0/glib/glib-unix.c source/glib/glib-unix.c\n--- glib-2.87.0/glib/glib-unix.c\t2025-11-03 19:42:10.000000000 +0700\n+++ source/glib/glib-unix.c\t2026-02-19 13:53:45.719219012 +0700\n@@ -74,6 +74,10 @@\n #include <sys/user.h>\n #endif  /* defined (__FreeBSD__ )*/\n \n+#if defined(__redox__)\n+#include <sys/redox.h>\n+#endif\n+\n G_STATIC_ASSERT (sizeof (ssize_t) == GLIB_SIZEOF_SSIZE_T);\n G_STATIC_ASSERT (G_ALIGNOF (gssize) == G_ALIGNOF (ssize_t));\n G_STATIC_ASSERT (G_SIGNEDNESS_OF (ssize_t) == 1);\n@@ -1004,6 +1008,20 @@\n   g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOSYS,\n                \"g_unix_fd_query_path() not supported on HURD\");\n   return NULL;\n+#elif defined(__redox__)\n+  char file_path[PATH_MAX] = {0};\n+\n+  if (redox_fpath (fd, file_path, PATH_MAX) < 0)\n+    {\n+      int errsv = errno;\n+\n+      g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errsv),\n+                   \"Error querying file information for FD %d: %s\",\n+                   fd, g_strerror (errsv));\n+      return NULL;\n+    }\n+\n+  return g_strdup (file_path);\n #else\n   #error \"g_unix_fd_query_path() not supported on this platform\"\n #endif\ndiff -ruwN glib-2.87.0/glib/gstrfuncs.c source/glib/gstrfuncs.c\n--- glib-2.87.0/glib/gstrfuncs.c\t2025-11-03 19:42:10.000000000 +0700\n+++ source/glib/gstrfuncs.c\t2026-02-19 13:53:45.719384853 +0700\n@@ -707,7 +707,7 @@\n \n   gchar *fail_pos;\n   gdouble val;\n-#ifndef __BIONIC__\n+#if !defined(__BIONIC__) && !defined(__redox__)\n   struct lconv *locale_data;\n #endif\n   const char *decimal_point;\n@@ -720,7 +720,7 @@\n \n   fail_pos = NULL;\n \n-#ifndef __BIONIC__\n+#if !defined(__BIONIC__) && !defined(__redox__)\n   locale_data = localeconv ();\n   decimal_point = locale_data->decimal_point;\n   decimal_point_len = strlen (decimal_point);\n@@ -931,7 +931,7 @@\n \n   return buffer;\n #else\n-#ifndef __BIONIC__\n+#if !defined(__BIONIC__) && !defined(__redox__)\n   struct lconv *locale_data;\n #endif\n   const char *decimal_point;\n@@ -964,7 +964,7 @@\n \n   _g_snprintf (buffer, buf_len, format, d);\n \n-#ifndef __BIONIC__\n+#if !defined(__BIONIC__) && !defined(__redox__)\n   locale_data = localeconv ();\n   decimal_point = locale_data->decimal_point;\n   decimal_point_len = strlen (decimal_point);\n"
  },
  {
    "path": "recipes/libs/gstreamer/recipe.toml",
    "content": "[source]\ntar = \"https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/1.24.12/gstreamer-1.24.12.tar.gz\"\nblake3 = \"181daf73050f7472ec656e7461b7f67028d6002c1133870576033a32e43a364f\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"bzip2\",\n    \"cairo\",\n    \"curl\",\n    \"expat\",\n    #TODO: \"ffmpeg6\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"harfbuzz\",\n    \"libass\",\n    \"libffi\",\n    \"libgmp\",\n    \"libiconv\",\n    \"libicu\",\n    \"libjpeg\",\n    \"libmodplug1\",\n    \"libnettle\",\n    \"libogg\",\n    \"libpng\",\n    \"libpsl\",\n    \"libpthread-stubs\",\n    \"libsndfile\",\n    \"libsoup\",\n    \"libvorbis\",\n    \"libwebp\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    #TODO: \"libxdamage\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxi\",\n    \"libxml2\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"nghttp2\",\n    #TODO: \"openal\",\n    \"openssl1\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"sqlite3\",\n    \"x11proto\",\n    \"xextproto\",\n    \"xz\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nexport GLIB_GENMARSHAL=\"$(which glib-genmarshal)\"\nexport GLIB_MKENUMS=\"$(which glib-mkenums)\"\n\nCFLAGS=\"${CFLAGS} -DM_LN2=0.69314718055994530942\"\ncookbook_meson \\\n    -Ddevtools=disabled \\\n    -Dexamples=disabled \\\n    -Dlibav=disabled \\\n    -Dlibnice=disabled \\\n    -Dorc=disabled \\\n    -Dtests=disabled \\\n    -Dtools=enabled \\\n    -Dgstreamer:check=disabled \\\n    -Dgstreamer:coretracers=disabled \\\n    -Dgst-plugins-bad:shm=disabled \\\n    -Dgst-plugins-base:xshm=disabled \\\n    -Dgst-plugins-good:ximagesrc-xshm=disabled\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/gstreamer/redox.patch",
    "content": "diff -ruw gstreamer-1.24.12/subprojects/gst-plugins-bad/ext/dtls/gstdtlsconnection.c source/subprojects/gst-plugins-bad/ext/dtls/gstdtlsconnection.c\n--- gstreamer-1.24.12/subprojects/gst-plugins-bad/ext/dtls/gstdtlsconnection.c\t2025-01-29 13:12:29.000000000 -0700\n+++ source/subprojects/gst-plugins-bad/ext/dtls/gstdtlsconnection.c\t2026-02-10 19:13:12.530288659 -0700\n@@ -49,6 +49,10 @@\n #include <errno.h>\n #endif\n \n+#if defined(__redox__)\n+#include <sys/time.h> // For struct timeval\n+#endif\n+\n GST_DEBUG_CATEGORY_STATIC (gst_dtls_connection_debug);\n #define GST_CAT_DEFAULT gst_dtls_connection_debug\n \ndiff -ruw gstreamer-1.24.12/subprojects/gst-plugins-base/gst-libs/gst/tag/meson.build source/subprojects/gst-plugins-base/gst-libs/gst/tag/meson.build\n--- gstreamer-1.24.12/subprojects/gst-plugins-base/gst-libs/gst/tag/meson.build\t2025-01-29 13:12:29.000000000 -0700\n+++ source/subprojects/gst-plugins-base/gst-libs/gst/tag/meson.build\t2026-02-10 19:09:53.259120404 -0700\n@@ -136,10 +136,10 @@\n     install: false)\n endif\n \n-executable('mklicensestables', 'mklicensestables.c',\n-  c_args : gst_plugins_base_args,\n-  include_directories: [configinc],\n-  dependencies : [tag_dep, gst_base_dep],\n-  install : false)\n+#executable('mklicensestables', 'mklicensestables.c',\n+#  c_args : gst_plugins_base_args,\n+#  include_directories: [configinc],\n+#  dependencies : [tag_dep, gst_base_dep],\n+#  install : false)\n \n gst_tag_dir = meson.current_source_dir()\nOnly in source/subprojects/gst-plugins-base/gst-libs/gst/tag: meson.build.orig\n"
  },
  {
    "path": "recipes/libs/harfbuzz/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/harfbuzz/harfbuzz/releases/download/11.0.1/harfbuzz-11.0.1.tar.xz\"\nblake3 = \"51f0edaaf2e9b7a7176d3252f15d03d409ef7ad35f77b050c407de89f85b77c5\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"freetype2\",\n    \"gettext\",\n    \"glib\",\n    \"libffi\",\n    \"libiconv\",\n    \"libicu\",\n    \"libpng\",\n    \"pcre2\",\n    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Ddocs=disabled \\\n    -Dtests=disabled\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/jansson/jansson.patch",
    "content": "diff -ru source-new/config.sub source/config.sub\n--- source-new/config.sub\t2017-11-06 18:59:18.499577613 -0800\n+++ source/config.sub\t2017-11-02 19:26:02.253397873 -0700\n@@ -1368,7 +1368,7 @@\n \t# The portable systems comes first.\n \t# Each alternative MUST END IN A *, to match a version number.\n \t# -sysv* is not here because it comes later, after sysvr4.\n-\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n+\t-gnu* | -bsd* | -redox* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n \t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n \t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \\\n \t      | -sym* | -kopensolaris* | -plan9* \\\n"
  },
  {
    "path": "recipes/libs/jansson/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/akheron/jansson/releases/download/v2.10/jansson-2.10.tar.gz\"\nblake3 = \"3c74f374a6c7ac5e323f72d87e49e5309ca922ca26cfe4992873b31f28776624\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libarchive/recipe.toml",
    "content": "[source]\ntar = \"https://libarchive.org/downloads/libarchive-3.6.2.tar.xz\"\nblake3 = \"f98695fe81235a74fa3fc2c3ba0f0d4f13ea15f9be3850b83e304cf5d78be710\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/libs/libarchive/redox.patch",
    "content": "diff -ruwN source/configure source-new/configure\n--- source/configure\t2022-12-09 20:38:47.000000000 +0700\n+++ source-new/configure\t2025-09-14 17:17:50.138530195 +0700\n@@ -19039,7 +19039,8 @@\n ac_fn_c_check_func \"$LINENO\" \"fstatat\" \"ac_cv_func_fstatat\"\n if test \"x$ac_cv_func_fstatat\" = xyes\n then :\n-  printf \"%s\\n\" \"#define HAVE_FSTATAT 1\" >>confdefs.h\n+#  When fstatat works, remove this patch\n+#  printf \"%s\\n\" \"#define HAVE_FSTATAT 1\" >>confdefs.h\n \n fi\n ac_fn_c_check_func \"$LINENO\" \"fstatfs\" \"ac_cv_func_fstatfs\"\n"
  },
  {
    "path": "recipes/libs/libatomic/recipe.toml",
    "content": "[source]\nsame_as = \"../../dev/gcc13\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libgmp\",\n    \"libmpfr\",\n    \"mpc\",\n    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE=\"${COOKBOOK_SOURCE}/libatomic/configure\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libcosmic/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/libcosmic.git\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages cosmic\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libffi/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/libffi/libffi/releases/download/v3.4.5/libffi-3.4.5.tar.gz\"\nblake3 = \"f9a2cfe1d2ac8d211c18c99f9cfafe5537925101bfb92c2d44d844680dd82264\"\nscript = \"\"\"\nDYNAMIC_INIT\ncp ${COOKBOOK_HOST_SYSROOT}/share/aclocal/libtool.m4 ./m4/\ncp -fp ${COOKBOOK_HOST_SYSROOT}/share/libtool/build-aux/ltmain.sh ./\ncp ${COOKBOOK_HOST_SYSROOT}/share/aclocal/ltversion.m4 ./m4/\n\nautotools_recursive_regenerate -I$(realpath ./m4)\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/libs/libflac/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/xiph/flac/releases/download/1.5.0/flac-1.5.0.tar.xz\"\nblake3 = \"2adca3cd8da4b577ebb9c12e73c91cf6f6a7feb7485b3f003853b82710bada84\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libogg\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --with-ogg=\"${COOKBOOK_SYSROOT}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libgcc/recipe.toml",
    "content": "[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -p \"${COOKBOOK_STAGE}/lib\"\ncp -av ${COOKBOOK_HOST_SYSROOT}/${GNU_TARGET}/lib/libgcc_s.so* ${COOKBOOK_STAGE}/lib/\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libgmp/recipe.toml",
    "content": "# GNU Multiple Precision Arithmetic Library (GMP) is a free and open source\n# library for arbitrary-precision arithmetic, operating on signed integers,\n# rational numbers, and floating-point numbers.\n\n[source]\ntar = \"https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz\"\nblake3 = \"fffe4996713928ae19331c8ef39129e46d3bf5b7182820656fd4639435cd83a4\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n# libgmp fails to regenerate autotools when building for host toolchain\n# To workaround this, the source is copied to the build dir and autotools is\n# only regenerated when not building for the host\nrsync -a --delete \"${COOKBOOK_SOURCE}/\" ./\nCOOKBOOK_SOURCE=\"${COOKBOOK_BUILD}\"\nif [ \"$TARGET\" != \"$COOKBOOK_HOST_TARGET\" ]; then\n    autotools_recursive_regenerate\n    # need to invoke configure in specific way to make shared libs work\n    ./configure --host=\"${GNU_TARGET}\" --prefix=\"/usr\"\n    COOKBOOK_CONFIGURE=true\nfi\n\nDYNAMIC_STATIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libiconv/01_redox.patch",
    "content": "diff '--color=auto' -ur source/srclib/getprogname.c source-new/srclib/getprogname.c\n--- source/srclib/getprogname.c\t2022-01-04 19:33:29.000000000 +1100\n+++ source-new/srclib/getprogname.c\t2024-11-24 00:42:48.384997609 +1100\n@@ -28,6 +28,14 @@\n # include <string.h>\n #endif\n \n+#if defined(__redox__)\n+# include <string.h>\n+# include <unistd.h>\n+# include <stdio.h>\n+# include <fcntl.h>\n+# include <limits.h>\n+#endif\n+\n #ifdef __MVS__\n # ifndef _OPEN_SYS\n #  define _OPEN_SYS\n@@ -287,6 +295,17 @@\n       close (fd);\n     }\n   return \"?\";\n+# elif defined(__redox__)\n+  char filename[PATH_MAX];\n+  int fd = open (\"sys:exe\", O_RDONLY);\n+  if (fd > 0) {\n+    int len = read(fd, filename, PATH_MAX-1);\n+    if (len > 0) {\n+       filename[len] = '\\0';\n+       return strdup(filename);\n+    }\n+  }\n+  return NULL;\n # else\n #  error \"getprogname module not ported to this OS\"\n # endif\n"
  },
  {
    "path": "recipes/libs/libiconv/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/libiconv/libiconv-1.17.tar.gz\"\nblake3 = \"820b3b9fd3e2181bfb95475f01e9a3451e6d751e4f8c98ebcdcca1d8aa720f7f\"\npatches = [\n    \"01_redox.patch\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncp ${COOKBOOK_HOST_SYSROOT}/share/aclocal/libtool.m4 ./m4/\ncp ${COOKBOOK_HOST_SYSROOT}/share/aclocal/libtool.m4 ./libcharset/m4/\ncp -fp ${COOKBOOK_HOST_SYSROOT}/share/libtool/build-aux/ltmain.sh ./build-aux/\ncp -fp ${COOKBOOK_HOST_SYSROOT}/share/libtool/build-aux/ltmain.sh ./libcharset/build-aux/\ncp ${COOKBOOK_HOST_SYSROOT}/share/aclocal/ltversion.m4 ./m4/\ncp ${COOKBOOK_HOST_SYSROOT}/share/aclocal/ltversion.m4 ./libcharset/m4/\n\nautotools_recursive_regenerate -I$(realpath ./m4) -I$(realpath ./srcm4)\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    ac_cv_have_decl_program_invocation_name=no\n)\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/libs/libjpeg/recipe.toml",
    "content": "# libjpeg-turbo is compatible with libjpeg\n[source]\ntar = \"https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/3.1.0/libjpeg-turbo-3.1.0.tar.gz\"\nblake3 = \"3efc14da55c56fc0a6a50f109d9e1ee8a91f5ae7dd17a21d3aebe04a65f3ee96\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libmodplug1/recipe.toml",
    "content": "[source]\ntar = \"https://pilotfiber.dl.sourceforge.net/project/modplug-xmms/libmodplug/0.8.9.0/libmodplug-0.8.9.0.tar.gz\"\nblake3 = \"01d71f7fe4e1abeb848db02b74c70ab2fd51e824f5ea7e9e18631571a76c3592\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libmpfr/recipe.toml",
    "content": "[source]\ntar = \"https://www.mpfr.org/mpfr-current/mpfr-4.2.2.tar.xz\"\nblake3 = \"11d59d061ef8db588650bc7dc5172594a6e5aad013994801c6f63011a62b191d\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libgmp\",\n]\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/libs/libnettle/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/nettle/nettle-3.9.1.tar.gz\"\nblake3 = \"e4bfbda32f4fdf5ed96c152efe3a3867193b690faa5378d02a2a6fd052ee3393\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libgmp\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libogg/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/xiph/ogg/releases/download/v1.3.4/libogg-1.3.4.tar.xz\"\nblake3 = \"1cffbe7c498555ddfdb1390d7a38179c4bead6129ea37b1b1d54f3a76b816304\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/libs/libopus/recipe.toml",
    "content": "[source]\ntar = \"https://downloads.xiph.org/releases/opus/opus-1.6.1.tar.gz\"\nblake3 = \"874bd7d28e24f10d88105c7d846a2e5bf085284af91a0ee36b05674a8f78e759\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n# Redox does not support any of the aarch64 run-time cpu capability detection\n# APIs supported by libopus\ncase \"${TARGET}\" in\n    aarch64-*-redox) COOKBOOK_CONFIGURE_FLAGS+=(--disable-rtcd);;\nesac\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/liborbital/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/liborbital.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\"${COOKBOOK_CARGO}\" build --release\n# other than x86_64 this will trigger error because of lacking .so files, which is fine\n\"${COOKBOOK_MAKE}\" install HOST=\"${TARGET}\" DESTDIR=\"${COOKBOOK_STAGE}\" || true\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libpng/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/pnggroup/libpng/archive/refs/tags/v1.6.46.tar.gz\"\nblake3 = \"36f4bbb48c70975116b00ab0cff577931b96f703b2774ac3b33131d001419435\"\nscript = \"\"\"\nDYNAMIC_INIT\nchmod +w config.sub\nGNU_CONFIG_GET config.sub\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\"zlib\"]\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libpsl/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/rockdaboot/libpsl/releases/download/0.21.5/libpsl-0.21.5.tar.lz\"\nblake3 = \"91318b7b876b12ff4649b7a0d6f6ed4ab1ab44f48a49508c8978ab7b4ccf3298\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libsodium/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/jedisct1/libsodium/archive/1.0.16.tar.gz\"\nblake3 = \"2482633f872c173f9a42e6badb44c3efb042e783e664fdf8b1046babfa2405e7\"\nscript = \"\"\"\nautotools_recursive_regenerate\nwget -O build-aux/config.sub \"https://gitlab.redox-os.org/redox-os/gnu-config/-/raw/master/config.sub?inline=false\"\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libssh2/recipe.toml",
    "content": "[source]\ntar = \"https://www.libssh2.org/download/libssh2-1.10.0.tar.gz\"\nblake3 = \"2447216ce82c1d22301456bb02f60dfb6688f1461417b90f900c099a87f1292f\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\" \n\n[build]\ntemplate = \"custom\"\ndependencies = [\"openssl1\"]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/libs/libstdcxx/recipe.toml",
    "content": "[build]\ntemplate = \"custom\"\nscript = \"\"\"\nif [ \"$TARGET\" != \"$COOKBOOK_HOST_TARGET\" ]; then\nmkdir -p \"${COOKBOOK_STAGE}/lib\"\ncp -av ${COOKBOOK_HOST_SYSROOT}/${GNU_TARGET}/lib/libstdc++.so* ${COOKBOOK_STAGE}/lib/\nfi\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libstdcxx-v3/recipe.toml",
    "content": "[source]\nsame_as = \"../../dev/gcc13\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\n\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --enable-threads=posix\n    --enable-libstdcxx-threads\n)\n\n# TODO: Investigate why mutex is not available in riscv64\nif [ \"${TARGET}\" = \"riscv64gc-unknown-redox\" ]; then\nCOOKBOOK_CONFIGURE_FLAGS+=( --without-libstdcxx-zoneinfo )\nfi\n\nCPPINCLUDE=\"${COOKBOOK_HOST_SYSROOT}/$TARGET/include/c++/13.2.0\"\nexport CPPFLAGS+=\" -I${CPPINCLUDE} -I${CPPINCLUDE}/$TARGET/bits\"\nCOOKBOOK_CONFIGURE=\"${COOKBOOK_SOURCE}/libstdc++-v3/configure\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/liburcu/0001-Fix-compilation-on-Redox-OS.patch",
    "content": "From: bjorn3 <17426603+bjorn3@users.noreply.github.com>\nDate: Sat, 6 Dec 2025 15:59:20 +0100\nSubject: [PATCH] Fix compilation on Redox OS\n\n---\n include/urcu/syscall-compat.h | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/include/urcu/syscall-compat.h b/include/urcu/syscall-compat.h\nindex 23b266e..2c3b03f 100644\n--- a/include/urcu/syscall-compat.h\n+++ b/include/urcu/syscall-compat.h\n@@ -33,7 +33,8 @@\n #include <syscall.h>\n \n #elif defined(__CYGWIN__) || defined(__APPLE__) || \\\n-\tdefined(__FreeBSD__) || defined(__DragonFly__)\n+\tdefined(__FreeBSD__) || defined(__DragonFly__) || \\\n+\tdefined(__redox__)\n /* Don't include anything on these platforms. */\n \n #else\n-- \n2.47.3\n\n"
  },
  {
    "path": "recipes/libs/liburcu/recipe.toml",
    "content": "[source]\ntar = \"https://lttng.org/files/urcu/userspace-rcu-0.14.0.tar.bz2\"\npatches = [\"0001-Fix-compilation-on-Redox-OS.patch\"]\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/libs/libuv/recipe.toml",
    "content": "[source]\ntar = \"https://dist.libuv.org/dist/v1.51.0/libuv-v1.51.0.tar.gz\"\nblake3 = \"e8b5e68bc2d0776ac4ea67df59d694fca58d5cc570c103443a2284e723d01fc2\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DBUILD_TESTING=Off\n)\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/libuv/redox.patch",
    "content": "diff -ruwN source/CMakeLists.txt source-new/CMakeLists.txt\n--- source/CMakeLists.txt\t2025-04-25 16:50:27.000000000 +0700\n+++ source-new/CMakeLists.txt\t2025-10-10 11:19:40.329762962 +0700\n@@ -1,3 +1,4 @@\n+set (CMAKE_CXX_STANDARD 99)\n cmake_minimum_required(VERSION 3.10)\n \n if(POLICY CMP0091)\n@@ -323,6 +324,18 @@\n        src/unix/hurd.c)\n endif()\n \n+\n+if(CMAKE_SYSTEM_NAME STREQUAL \"UnixPaths\") # Redox\n+  list(APPEND uv_libraries dl)\n+  list(APPEND uv_sources\n+       src/unix/no-fsevents.c\n+       src/unix/proctitle.c\n+       src/unix/posix-hrtime.c\n+       src/unix/posix-poll.c\n+       src/unix/redox.c\n+  )\n+endif()\n+\n if(CMAKE_SYSTEM_NAME STREQUAL \"Linux\")\n   list(APPEND uv_defines _GNU_SOURCE _POSIX_C_SOURCE=200112)\n   list(APPEND uv_libraries dl rt)\ndiff -ruwN source/include/uv/unix.h source-new/include/uv/unix.h\n--- source/include/uv/unix.h\t2025-04-25 16:50:27.000000000 +0700\n+++ source-new/include/uv/unix.h\t2025-10-10 11:18:29.024386515 +0700\n@@ -66,6 +66,7 @@\n       defined(__MSYS__)   || \\\n       defined(__HAIKU__)  || \\\n       defined(__QNX__)    || \\\n+      defined(__redox__)  || \\\n       defined(__GNU__)\n # include \"uv/posix.h\"\n #endif\ndiff -ruwN source/src/unix/core.c source-new/src/unix/core.c\n--- source/src/unix/core.c\t2025-04-25 16:50:27.000000000 +0700\n+++ source-new/src/unix/core.c\t2025-10-10 11:23:22.143824390 +0700\n@@ -110,6 +110,10 @@\n # include <sanitizer/linux_syscall_hooks.h>\n #endif\n \n+#if defined(__redox__)\n+#define MSG_CMSG_CLOEXEC  0x40000000 //linux specific flag\n+#endif\n+\n static void uv__run_pending(uv_loop_t* loop);\n \n /* Verify that uv_buf_t is ABI-compatible with struct iovec. */\n@@ -722,7 +726,8 @@\n     defined(__FreeBSD__)   || \\\n     defined(__NetBSD__)    || \\\n     defined(__OpenBSD__)   || \\\n-    defined(__linux__)\n+    defined(__linux__)     || \\\n+    defined(__redox__)\n   ssize_t rc;\n   rc = recvmsg(fd, msg, flags | MSG_CMSG_CLOEXEC);\n   if (rc == -1)\n@@ -1644,6 +1649,11 @@\n  * So the output parameter priority is actually the nice value.\n */\n int uv_thread_getpriority(uv_thread_t tid, int* priority) {\n+#ifdef __redox__\n+  if (priority == NULL)\n+    return UV_EINVAL;\n+  *priority = 0;\n+#else\n   int r;\n   int policy;\n   struct sched_param param;\n@@ -1670,6 +1680,7 @@\n #endif\n \n   *priority = param.sched_priority;\n+#endif\n   return 0;\n }\n \n@@ -1695,7 +1706,7 @@\n  * If the function fails, the return value is non-zero.\n */\n int uv_thread_setpriority(uv_thread_t tid, int priority) {\n-#if !defined(__GNU__)\n+#if !defined(__GNU__) && !defined(__redox__)\n   int r;\n   int min;\n   int max;\ndiff -ruwN source/src/unix/fs.c source-new/src/unix/fs.c\n--- source/src/unix/fs.c\t2025-04-25 16:50:27.000000000 +0700\n+++ source-new/src/unix/fs.c\t2025-10-10 11:18:29.024993834 +0700\n@@ -77,7 +77,8 @@\n       defined(__MVS__)    || \\\n       defined(__NetBSD__) || \\\n       defined(__HAIKU__)  || \\\n-      defined(__QNX__)\n+      defined(__QNX__)    || \\\n+      defined(__redox__)\n # include <sys/statvfs.h>\n #else\n # include <sys/statfs.h>\n@@ -683,13 +684,13 @@\n     defined(__MVS__)    || \\\n     defined(__NetBSD__) || \\\n     defined(__HAIKU__)  || \\\n-    defined(__QNX__)\n+    defined(__QNX__)    || \\\n+    defined(__redox__)\n   struct statvfs buf;\n \n   if (0 != statvfs(req->path, &buf))\n #else\n   struct statfs buf;\n-\n   if (0 != statfs(req->path, &buf))\n #endif /* defined(__sun) */\n     return -1;\n@@ -705,7 +706,8 @@\n     defined(__OpenBSD__)  || \\\n     defined(__NetBSD__)   || \\\n     defined(__HAIKU__)    || \\\n-    defined(__QNX__)\n+    defined(__QNX__)      || \\\n+    defined(__redox__)\n   stat_fs->f_type = 0;  /* f_type is not supported. */\n #else\n   stat_fs->f_type = buf.f_type;\ndiff -ruwN source/src/unix/proctitle.c source-new/src/unix/proctitle.c\n--- source/src/unix/proctitle.c\t2025-04-25 16:50:27.000000000 +0700\n+++ source-new/src/unix/proctitle.c\t2025-10-10 11:18:29.025229760 +0700\n@@ -30,7 +30,13 @@\n   size_t cap;  /* Maximum capacity. Computed once in uv_setup_args(). */\n };\n \n+#if defined(__redox__)\n+void uv__set_process_title(const char* title) {\n+  // requires sys/prctl\n+}\n+#else\n extern void uv__set_process_title(const char* title);\n+#endif\n \n static uv_mutex_t process_title_mutex;\n static uv_once_t process_title_mutex_once = UV_ONCE_INIT;\ndiff -ruwN source/src/unix/redox.c source-new/src/unix/redox.c\n--- source/src/unix/redox.c\t1970-01-01 07:00:00.000000000 +0700\n+++ source-new/src/unix/redox.c\t2025-10-10 11:18:29.028345924 +0700\n@@ -0,0 +1,104 @@\n+/* Copyright libuv contributors. All rights reserved.\n+  *\n+  * Permission is hereby granted, free of charge, to any person obtaining a copy\n+  * of this software and associated documentation files (the \"Software\"), to\n+  * deal in the Software without restriction, including without limitation the\n+  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n+  * sell copies of the Software, and to permit persons to whom the Software is\n+  * furnished to do so, subject to the following conditions:\n+  *\n+  * The above copyright notice and this permission notice shall be included in\n+  * all copies or substantial portions of the Software.\n+  *\n+  * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n+  * IN THE SOFTWARE.\n+  */\n+\n+#include \"uv.h\"\n+#include \"internal.h\"\n+\n+#include <errno.h> \n+#include <string.h>\n+#include <stdio.h>\n+\n+static void\n+get_mem_info(uint64_t* totalmem, uint64_t* freemem) {\n+    *totalmem = 0;\n+    *freemem = 0;\n+}\n+\n+\n+void uv_loadavg(double avg[3]) {\n+  avg[0] = 0.0;\n+  avg[1] = 0.0;\n+  avg[2] = 0.0;\n+}\n+\n+\n+int uv_exepath(char* buffer, size_t* size) {\n+  if (buffer == NULL || size == NULL || *size == 0) {\n+    return UV_EINVAL;\n+  }\n+  FILE* fp = fopen(\"/scheme/sys/exe\", \"r\");\n+  if (fp == NULL) {\n+    return -errno;\n+  }\n+  if (fgets(buffer, *size, fp) == NULL) {\n+    fclose(fp);\n+    return UV_EIO;\n+  }\n+  fclose(fp);\n+  buffer[strcspn(buffer, \"\\r\\n\")] = '\\0';\n+  *size = strlen(buffer);\n+  return 0;\n+}\n+\n+int uv_interface_addresses(uv_interface_address_t** addresses, int* count) {\n+  *count = 0;\n+  return 0;\n+}\n+\n+\n+uint64_t uv_get_free_memory(void) {\n+    return 0;\n+}\n+\n+\n+uint64_t uv_get_total_memory(void) {\n+  return 0;\n+}\n+\n+\n+uint64_t uv_get_constrained_memory(void) {\n+  return 0;\n+}\n+\n+\n+uint64_t uv_get_available_memory(void) {\n+  return uv_get_free_memory();\n+}\n+\n+\n+int uv_resident_set_memory(size_t* rss) {\n+  return 0;\n+}\n+\n+\n+int uv_uptime(double* uptime) {\n+  return 0;\n+}\n+\n+\n+int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {\n+  *count = 0;\n+  return 0;\n+}\n+\n+void uv_free_interface_addresses(uv_interface_address_t* addresses,\n+    int count) {\n+}\ndiff -ruwN source/src/unix/stream.c source-new/src/unix/stream.c\n--- source/src/unix/stream.c\t2025-04-25 16:50:27.000000000 +0700\n+++ source-new/src/unix/stream.c\t2025-10-10 11:18:29.028522718 +0700\n@@ -29,7 +29,14 @@\n #include <errno.h>\n \n #include <sys/types.h>\n+#if defined(__redox__)\n+#define _GNU_SOURCE\n+#include <stdint.h>\n #include <sys/socket.h>\n+#include <netinet/in.h>\n+#else\n+#include <sys/socket.h>\n+#endif\n #include <sys/uio.h>\n #include <sys/un.h>\n #include <unistd.h>\n@@ -39,6 +46,7 @@\n # include <sys/event.h>\n # include <sys/time.h>\n # include <sys/select.h>\n+#endif\n \n /* Forward declaration */\n typedef struct uv__stream_select_s uv__stream_select_t;\n@@ -58,7 +66,6 @@\n   fd_set* swrite;\n   size_t swrite_sz;\n };\n-#endif /* defined(__APPLE__) */\n \n union uv__cmsg {\n   struct cmsghdr hdr;\ndiff -ruwN source/src/unix/tcp.c source-new/src/unix/tcp.c\n--- source/src/unix/tcp.c\t2025-04-25 16:50:27.000000000 +0700\n+++ source-new/src/unix/tcp.c\t2025-10-10 11:26:03.504101758 +0700\n@@ -31,7 +31,7 @@\n #include <sys/socket.h>\n \n /* ifaddrs is not implemented on AIX and IBM i PASE */\n-#if !defined(_AIX)\n+#if !defined(_AIX) && !defined(__redox__)\n #include <ifaddrs.h>\n #endif\n \n@@ -228,7 +228,7 @@\n static int uv__ipv6_link_local_scope_id(void) {\n   struct sockaddr_in6* a6;\n   int rv;\n-#if defined(_AIX)\n+#if defined(_AIX) || defined(__redox__)\n   /* AIX & IBM i do not have ifaddrs\n    * so fallback to use uv_interface_addresses */\n   uv_interface_address_t* interfaces;\n@@ -268,7 +268,7 @@\n   }\n \n   freeifaddrs(ifa);\n-#endif /* defined(_AIX) */\n+#endif /* defined(_AIX) || defined(__redox__) */\n \n   return rv;\n }\ndiff -ruwN source/src/unix/thread.c source-new/src/unix/thread.c\n--- source/src/unix/thread.c\t2025-04-25 16:50:27.000000000 +0700\n+++ source-new/src/unix/thread.c\t2025-10-10 11:25:10.712328011 +0700\n@@ -897,7 +897,7 @@\n     abort();\n }\n \n-#if defined(_AIX) || defined(__MVS__) || defined(__PASE__)\n+#if defined(_AIX) || defined(__redox__) || defined(__MVS__) || defined(__PASE__)\n int uv__thread_setname(const char* name) {\n   return UV_ENOSYS;\n }\n@@ -937,6 +937,7 @@\n \n #if (defined(__ANDROID_API__) && __ANDROID_API__ < 26) || \\\n     defined(_AIX) || \\\n+    defined(__redox__) || \\\n     defined(__MVS__) || \\\n     defined(__PASE__)\n int uv__thread_getname(uv_thread_t* tid, char* name, size_t size) {\ndiff -ruwN source/src/unix/udp.c source-new/src/unix/udp.c\n--- source/src/unix/udp.c\t2025-04-25 16:50:27.000000000 +0700\n+++ source-new/src/unix/udp.c\t2025-10-10 11:18:29.028778883 +0700\n@@ -31,6 +31,12 @@\n #include <xti.h>\n #endif\n #include <sys/un.h>\n+#if defined(__redox__)\n+#include <netinet/in.h>\n+#include <netinet/ip.h>\n+#include <sys/socket.h>\n+#include <arpa/inet.h>\n+#endif\n \n #if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP)\n # define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP\n"
  },
  {
    "path": "recipes/libs/libvorbis/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/xiph/vorbis/releases/download/v1.3.7/libvorbis-1.3.7.tar.xz\"\nblake3 = \"c67f3f74ec26d93a5571c4404a64eb6e6587d7d77b46b552f7b410f5bc5b1f03\"\nscript = \"\"\"\nDYNAMIC_INIT\nGNU_CONFIG_GET config.sub\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libogg\"\n]\n"
  },
  {
    "path": "recipes/libs/libxml2/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/libxml2/2.11/libxml2-2.11.3.tar.xz\"\nblake3 = \"0653d3750576299c4cb88740942165671b576ff93019f3d669b3f37136225ab7\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"xz\",\n    \"zlib\"\n]\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --without-python\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/lua-compat-53/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/lunarmodules/lua-compat-5.3.git\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"lua54\"\n]\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/include\"\ncp -r \"$COOKBOOK_SOURCE/c-api/.\" \"${COOKBOOK_STAGE}/include\"\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/luv/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/luvit/luv.git\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libuv\",\n    \"luajit\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DWITH_LUA_ENGINE=Luajit\n    -DLUA_BUILD_TYPE=System\n    -DWITH_SHARED_LIBUV=On\n)\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/mesa/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/mesa.git\"\nupstream = \"https://gitlab.freedesktop.org/mesa/mesa\"\nbranch = \"redox-24.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"expat\",\n    \"libdrm\",\n    \"liborbital\",\n    \"llvm21\",\n    \"zlib\",\n]\ndev-dependencies = [\n    \"llvm21.dev\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\n#TODO: Should be CPPFLAGS but cookbook_meson isn't reading it\nexport CFLAGS+=\" -DHAVE_PTHREAD=1 -I${COOKBOOK_SYSROOT}/include/libdrm\"\nexport LLVM_CONFIG=\"${TARGET}-llvm-config\"\nexport LDFLAGS+=\" -lorbital\"\n\nif [ \"${COOKBOOK_DYNAMIC}\" == \"1\" ]; then\n    COOKBOOK_MESON_FLAGS+=(-Dshared-llvm=enabled)\nelse\n    COOKBOOK_MESON_FLAGS+=(-Dshared-llvm=disabled)\nfi\n\ncookbook_meson \\\n    -Ddri-drivers-path=/usr/lib/dri \\\n    -Degl=enabled \\\n    -Dglx=disabled \\\n    -Dllvm=enabled \\\n    -Dosmesa=true \\\n    -Dplatforms=redox \\\n    -Dshader-cache=disabled \\\n    -Dvulkan-drivers=swrast\n\n# Hack to add LLVM libs, the list can be seen from meson log and check for matches $(\"${LLVM_CONFIG}\" --libs)\nLLVMLIBS=\"-lLLVMBitReader -lLLVMCore -lLLVMExecutionEngine -lLLVMInstCombine -lLLVMMCDisassembler\" \nLLVMLIBS+=\" -lLLVMMCJIT -lLLVMScalarOpts -lLLVMTransformUtils -lLLVMCoroutines -lLLVMLTO\"\nsed -i \"s/ -lOSMesa / -lOSMesa ${LLVMLIBS} -lstdc++ /\" \"${COOKBOOK_STAGE}/usr/lib/pkgconfig/osmesa.pc\"\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/mesa-glu/recipe.toml",
    "content": "[source]\ntar = \"https://archive.mesa3d.org/glu/glu-9.0.3.tar.xz\"\nblake3 = \"beed1665ed983540e7502289ec50c7e66d840820af3e9ef21c9c4a7e9686ab9f\"\n\n[build]\ndependencies = [\"mesa\"]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\ncookbook_meson -Dgl_provider=osmesa\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/mpc/recipe.toml",
    "content": " # C library for the arithmetic of complex numbers with arbitrarily high\n # precision and correct rounding of the result.\n\n[source]\ntar = \"https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libgmp\",\n    \"libmpfr\",\n]\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/libs/ncurses/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/ncurses/ncurses-6.6.tar.gz\"\nblake3 = \"0d1c9fdf53c0ca4bd66ba707d49a079d2dd6f5a960cdec74a56e29952c4ffe73\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-db-install\n    --disable-stripping\n    --without-ada\n    --without-manpages\n    --without-tests\n    --enable-pc-files\n    --with-terminfo-dirs=/usr/share/terminfo\n    --with-pkg-config-libdir=/usr/lib/pkgconfig\n    cf_cv_func_mkstemp=yes\n)\nif [ \"${COOKBOOK_DYNAMIC}\" == \"1\" ]\nthen\n    COOKBOOK_CONFIGURE_FLAGS+=(--with-shared)\nfi\ncookbook_configure\n\"\"\"\n\n[package]\ndependencies = [\n    \"terminfo\",\n]\n"
  },
  {
    "path": "recipes/libs/ncurses/redox.patch",
    "content": "diff -ruwN source/configure source-new/configure\n--- source/configure\t2022-11-06 04:13:26.000000000 +0700\n+++ source-new/configure\t2026-02-17 13:42:38.449890407 +0700\n@@ -3480,8 +3480,6 @@\n echo $ECHO_N \"checking if $CXX works... $ECHO_C\" >&6\n \n \t\tsave_CPPFLAGS=\"$CPPFLAGS\"\n-\t\teval cf_includedir=${includedir}\n-\t\tCPPFLAGS=\"$CPPFLAGS -I${cf_includedir}\"\n \n cat >\"conftest.$ac_ext\" <<_ACEOF\n #line 3487 \"configure\"\n@@ -6386,7 +6384,7 @@\n \t\tfi\n \t\tcf_cv_rm_so_locs=yes\n \t\t;;\n-\t(linux*|gnu*|k*bsd*-gnu)\n+\t(linux*|gnu*|k*bsd*-gnu|redox*)\n \t\tif test \"$DFT_LWR_MODEL\" = \"shared\" && test -n \"$LD_RPATH_OPT\" ; then\n \t\t\tLOCAL_LDFLAGS=\"${LD_RPATH_OPT}\\$(LOCAL_LIBDIR)\"\n \t\t\tLOCAL_LDFLAGS2=\"$LOCAL_LDFLAGS\"\n"
  },
  {
    "path": "recipes/libs/ncursesw/recipe.toml",
    "content": "[source]\nsame_as = \"../ncurses\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-db-install\n    --disable-ext-colors\n    --disable-stripping\n    --enable-widec\n    --without-ada\n    --without-manpages\n    --without-tests\n    --enable-pc-files\n    --with-terminfo-dirs=/usr/share/terminfo\n    --with-pkg-config-libdir=/usr/lib/pkgconfig\n    cf_cv_func_mkstemp=yes\n    cf_cv_wint_t=yes\n)\nif [ \"${COOKBOOK_DYNAMIC}\" == \"1\" ]\nthen\n    COOKBOOK_CONFIGURE_FLAGS+=(--with-shared)\nfi\ncookbook_configure\n\"\"\"\n\n[package]\ndependencies = [\n    \"terminfo\",\n]\n"
  },
  {
    "path": "recipes/libs/nghttp2/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/nghttp2/nghttp2/releases/download/v1.64.0/nghttp2-1.64.0.tar.xz\"\nblake3 = \"1bbc08de4816769d800c42f501a00c1ba3f5efa1b76e1f65d2e5bdf3aa30354d\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --enable-lib-only\n)\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/libs/openssl1/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/openssl.git\"\nbranch = \"redox-v1\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nARCH=\"${TARGET%%-*}\"\nOS=$(echo \"${TARGET}\" | cut -d - -f3)\nCOOKBOOK_CONFIGURE=\"${COOKBOOK_SOURCE}/Configure\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    threads\n    no-dgram\n    \"${OS}-${ARCH}\"\n    --prefix=\"/\"\n)\n\nif [ \"${COOKBOOK_DYNAMIC}\" = \"1\" ]; then\n    COOKBOOK_CONFIGURE_FLAGS+=(shared)\nelse\n    COOKBOOK_CONFIGURE_FLAGS+=(no-shared)\nfi\n\nexport CC=\"${CC_WRAPPER} ${GNU_TARGET}-gcc\"\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\n\"${COOKBOOK_MAKE}\" -j\"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" install_sw install_ssldirs DESTDIR=\"${COOKBOOK_STAGE}\"\nrm -rfv \"${COOKBOOK_STAGE}/\"{share,ssl}\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/opusfile/recipe.toml",
    "content": "[source]\ntar = \"https://downloads.xiph.org/releases/opus/opusfile-0.12.tar.gz\"\nblake3 = \"1b6a5c371a0ea2ae8e37ab2e921388dfef9252dbf7f60045192dabbdd898f2bf\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"openssl3\",\n    \"libogg\",\n    \"libopus\",\n]\n\n[package]\ndependencies = [\n    \"ca-certificates\"\n]\n"
  },
  {
    "path": "recipes/libs/pango/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/pango/1.56/pango-1.56.3.tar.xz\"\nblake3 = \"78542feaaf007c1d648b94c4e9b6655ed7515d27ce434766aea99bef886c21ac\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gettext\",\n    \"glib\",\n    \"harfbuzz\",\n    \"libffi\",\n    \"libiconv\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxft\",\n    \"libxrender\",\n    \"pcre\",\n    \"pcre2\",\n    \"pixman\",\n    \"x11proto\",\n    \"xcb-proto\",\n    \"xextproto\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Dbuild-examples=false \\\n    -Dbuild-testsuite=false\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/pango/redox.patch",
    "content": "diff -ruwN pango-1.56.3/meson.build source/meson.build\n--- pango-1.56.3/meson.build\t2025-03-16 05:45:47.000000000 -0600\n+++ source/meson.build\t2025-05-01 13:51:05.834742120 -0600\n@@ -551,8 +551,8 @@\n pango_inc = include_directories('pango')\n \n subdir('pango')\n-subdir('utils')\n-subdir('tools')\n+#TODO: fails to build on Redox: subdir('utils')\n+#TODO: fails to build on Redox: subdir('tools')\n subdir('docs')\n if get_option('build-testsuite')\n   subdir('tests')\n"
  },
  {
    "path": "recipes/libs/pcre/recipe.toml",
    "content": "[source]\ntar = \"https://mirrors.gigenet.com/OSDN//sfnet/p/pc/pcre/pcre/8.42/pcre-8.42.tar.gz\"\nblake3 = \"12d515ba12a816994def6b1e7196b5783fd2cfe495733a9167fa4d71dbe10248\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/pcre/redox.patch",
    "content": "diff -ruwN source/pcretest.c source-new/pcretest.c\n--- source/pcretest.c\t2017-06-13 10:49:46.000000000 -0600\n+++ source-new/pcretest.c\t2019-01-05 11:04:15.198224299 -0700\n@@ -3168,7 +3168,7 @@\n       ((stack_size = get_value((pcre_uint8 *)argv[op+1], &endptr)),\n         *endptr == 0))\n     {\n-#if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS)\n+#if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS) || defined(__redox__)\n     printf(\"PCRE: -S not supported on this OS\\n\");\n     exit(1);\n #else\n@@ -5770,4 +5770,3 @@\n }\n \n /* End of pcretest.c */\n-\n"
  },
  {
    "path": "recipes/libs/pcre2/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.45/pcre2-10.45.tar.bz2\"\nblake3 = \"aea544846f9a03c1ec62c9f8d1c9a4187cc3cce557e53e6876eb6a58c7cdd9fe\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/pixman/recipe.toml",
    "content": "[source]\ntar = \"https://www.cairographics.org/releases/pixman-0.46.0.tar.xz\"\nblake3 = \"379369245a0bbd13784bf550c87622964a6aba87edf598ffa137dc10201746e0\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson -Dtests=disabled\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/pixman/redox.patch",
    "content": "diff -ruwN source/test/fence-image-self-test.c source-new/test/fence-image-self-test.c\n--- source/test/fence-image-self-test.c\t2018-04-11 06:07:58.000000000 -0600\n+++ source-new/test/fence-image-self-test.c\t2019-01-06 15:29:38.878720123 -0700\n@@ -29,7 +29,7 @@\n #include \"utils.h\"\n \n \n-#if FENCE_MALLOC_ACTIVE && defined (HAVE_SIGACTION)\n+#if FENCE_MALLOC_ACTIVE && defined (HAVE_SIGACTION) && !defined(__redox__)\n \n #include <stdlib.h>\n #include <stdio.h>\n"
  },
  {
    "path": "recipes/libs/readline/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/readline/readline-8.3.tar.gz\"\nblake3 = \"7109f094062bda387a0c16b4875375b96e36437bebbbd8d8f91bb27ba01d687f\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncursesw\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\nOS=$(echo \"${TARGET}\" | cut -d - -f3)\nif [ \"${OS}\" = \"redox\" ]; then\n    ln -s \"libhistory.so.8\" \"${COOKBOOK_STAGE}\"/usr/lib/libhistory.so\n    ln -s \"libreadline.so.8\" \"${COOKBOOK_STAGE}\"/usr/lib/libreadline.so\n    patchelf --add-needed libncursesw.so \"${COOKBOOK_STAGE}/usr/lib/libreadline.so.8\"\nfi\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/redox-fatfs/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/redox-fatfs.git\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/libs/sdl-gfx/recipe.toml",
    "content": "[source]\ntar = \"https://sourceforge.net/projects/sdlgfx/files/SDL_gfx-2.0.25.tar.gz\"\nblake3 = \"e6f571a38e51d369b010f4b10eb35b95e3d2edae2edd796241c47ea8376581e6\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\n./autogen.sh\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1\",\n    \"liborbital\",\n    \"libiconv\",\n]\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --prefix=/\n    --build=\"$(gcc -dumpmachine)\"\n    --host=\"${TARGET}\"\n    --disable-shared\n)\n\ncookbook_configure\n\nrm -f \"${COOKBOOK_STAGE}/lib/\"*.la\n\"\"\""
  },
  {
    "path": "recipes/libs/sdl-gfx/redox.patch",
    "content": "--- source/config.sub\t2013-10-27 23:04:13.000000000 +0100\n+++ build/config.sub\t2019-08-13 10:13:07.072063540 +0200\n@@ -125,7 +125,7 @@ case $maybe_os in\n   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \\\n   linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \\\n   knetbsd*-gnu* | netbsd*-gnu* | \\\n-  kopensolaris*-gnu* | \\\n+  kopensolaris*-gnu* | redox* | \\\n   storm-chaos* | os2-emx* | rtmk-nova*)\n     os=-$maybe_os\n     basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n@@ -1346,7 +1346,7 @@ case $os in\n \t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n \t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n \t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \\\n-\t      | -sym* | -kopensolaris* \\\n+\t      | -sym* | -kopensolaris* | -redox* \\\n \t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n \t      | -aos* | -aros* \\\n \t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n"
  },
  {
    "path": "recipes/libs/sdl1/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/sdl1.2.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\"\n]\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-loadso\n    --disable-pulseaudio\n    --disable-video-x11\n    --enable-clock_gettime\n    --enable-pthread-sem\n    --enable-redoxaudio\n    --enable-video-orbital\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/sdl1-image/recipe.toml",
    "content": "[source]\ntar = \"https://www.libsdl.org/projects/SDL_image/release/SDL_image-1.2.12.tar.gz\"\nblake3 = \"731a6f8cad9fff22c82394bd1c0c34ce4aa60fa8923f3755a3e3239f1e269389\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\n./autogen.sh\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1\",\n    \"liborbital\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"zlib\"\n]\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-sdltest\n    --enable-png\n    --enable-jpg\n)\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/libs/sdl1-image/redox.patch",
    "content": "diff -rupNw source-original/config.sub source/config.sub\n--- source-original/config.sub\t2012-01-19 07:30:05.000000000 +0100\n+++ source/config.sub\t2018-05-01 17:31:52.766229515 +0200\n@@ -1276,7 +1276,7 @@ case $os in\n \t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n \t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n \t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \\\n-\t      | -kopensolaris* \\\n+\t      | -kopensolaris* | -redox* \\\n \t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n \t      | -aos* | -aros* \\\n \t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\"
  },
  {
    "path": "recipes/libs/sdl1-mixer/recipe.toml",
    "content": "[source]\ntar = \"https://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.12.tar.gz\"\nblake3 = \"ef23bab2d42250dfdc51ce6939ee7b393973ff11a0dd3481f32180b489d2661c\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\n./autogen.sh\n\"\"\"\n\n[build]\ndependencies = [\n    \"libogg\",\n    \"liborbital\",\n    \"libvorbis\",\n    \"sdl1\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport LIBS=\"-lvorbis -logg\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --enable-music-ogg\n    --enable-music-midi\n    --disable-sdltest\n    --disable-music-cmd\n    --disable-music-mp3\n    --disable-smpegtest\n    --disable-music-mod\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/sdl1-mixer/redox.patch",
    "content": "diff -ruwN source/build-scripts/config.sub source-new/build-scripts/config.sub\n--- source/build-scripts/config.sub\t2012-01-15 15:01:05.000000000 -0700\n+++ source-new/build-scripts/config.sub\t2022-11-20 12:23:50.849108724 -0700\n@@ -1276,7 +1276,7 @@\n \t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n \t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n \t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \\\n-\t      | -kopensolaris* \\\n+\t      | -kopensolaris* | -redox* \\\n \t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n \t      | -aos* | -aros* \\\n \t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\ndiff -ruwN source/Makefile.in source-new/Makefile.in\n--- source/Makefile.in\t2012-01-15 15:01:04.000000000 -0700\n+++ source-new/Makefile.in\t2022-11-20 12:23:50.849108724 -0700\n@@ -66,10 +66,10 @@\n \t$(LIBTOOL) --mode=link $(CC) -o $@ $(OBJECTS) $(VERSION_OBJECTS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LT_LDFLAGS)\n \n $(objects)/playwave$(EXE): $(objects)/playwave.lo $(objects)/$(TARGET)\n-\t$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playwave.lo $(SDL_CFLAGS) $(SDL_LIBS) $(objects)/$(TARGET)\n+\t$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playwave.lo $(SDL_CFLAGS) $(SDL_LIBS) $(objects)/$(TARGET) --static\n \n $(objects)/playmus$(EXE): $(objects)/playmus.lo $(objects)/$(TARGET)\n-\t$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playmus.lo $(SDL_CFLAGS) $(SDL_LIBS) $(objects)/$(TARGET)\n+\t$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playmus.lo $(SDL_CFLAGS) $(SDL_LIBS) $(objects)/$(TARGET) --static\n \n install: all install-hdrs install-lib #install-bin\n install-hdrs:\ndiff -ruwN source/timidity/config.h source-new/timidity/config.h\n--- source/timidity/config.h\t2012-01-15 15:01:05.000000000 -0700\n+++ source-new/timidity/config.h\t2022-11-20 12:26:04.067581857 -0700\n@@ -162,6 +162,7 @@\n    then specify the library directory in the configuration file. */\n #define CONFIG_FILE\t\"timidity.cfg\"\n #define CONFIG_FILE_ETC \"/etc/timidity.cfg\"\n+#define CONFIG_FILE_ETC_TIMIDITY_FREEPATS \"/etc/timidity/freepats.cfg\"\n \n #if defined(__WIN32__) || defined(__OS2__)\n #define DEFAULT_PATH\t\"C:\\\\TIMIDITY\"\ndiff -ruwN source/timidity/timidity.c source-new/timidity/timidity.c\n--- source/timidity/timidity.c\t2012-01-15 15:01:05.000000000 -0700\n+++ source-new/timidity/timidity.c\t2022-11-20 12:26:42.248290658 -0700\n@@ -286,10 +286,12 @@\n   if (!env || read_config_file(env)<0) {\n     if (read_config_file(CONFIG_FILE)<0) {\n       if (read_config_file(CONFIG_FILE_ETC)<0) {\n+        if (read_config_file(CONFIG_FILE_ETC_TIMIDITY_FREEPATS)<0) {\n         return(-1);\n       }\n     }\n   }\n+  }\n \n   if (channels < 1 || channels == 3 || channels == 5 || channels > 6) return(-1);\n \n"
  },
  {
    "path": "recipes/libs/sdl1-ttf/recipe.toml",
    "content": "[source]\ntar = \"https://www.libsdl.org/projects/SDL_ttf/release/SDL_ttf-2.0.11.tar.gz\"\nblake3 = \"a684e57553e43b55ab28b064d1d5d44b8749299f259da31a62d671fc1d5505ee\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\n./autogen.sh\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1\",\n    \"liborbital\",\n    \"freetype2\",\n    \"libpng\",\n    \"zlib\",\n]\nscript = \"\"\"\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include/freetype2\"\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --prefix=/\n    --build=\"$(gcc -dumpmachine)\"\n    --host=\"${TARGET}\"\n    --disable-shared\n)\n\ncookbook_configure\n\nrm -f \"${COOKBOOK_STAGE}/lib/\"*.la\n\"\"\""
  },
  {
    "path": "recipes/libs/sdl1-ttf/redox.patch",
    "content": "diff -ruw source/config.sub source-new/config.sub\n--- source/config.sub\t2012-01-14 21:44:08.000000000 -0700\n+++ source-new/config.sub\t2018-12-10 12:17:28.136784814 -0700\n@@ -1276,7 +1276,7 @@\n \t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n \t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n \t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \\\n-\t      | -kopensolaris* \\\n+\t      | -kopensolaris* | -redox* \\\n \t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n \t      | -aos* | -aros* \\\n \t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\nOnly in source-new: config.sub.orig\ndiff -ruw source/configure.in source-new/configure.in\n--- source/configure.in\t2012-01-14 21:44:08.000000000 -0700\n+++ source-new/configure.in\t2018-12-10 12:17:12.724883206 -0700\n@@ -91,38 +91,13 @@\n AM_CONDITIONAL(USE_VERSION_RC, test x$use_version_rc = xtrue)\n \n dnl Check for the FreeType 2 library\n-dnl\n-dnl Get the cflags and libraries from the freetype-config script\n-dnl\n-AC_ARG_WITH(freetype-prefix,[  --with-freetype-prefix=PFX   Prefix where FREETYPE is \n-installed (optional)],\n-            freetype_prefix=\"$withval\", freetype_prefix=\"\")\n-AC_ARG_WITH(freetype-exec-prefix,[  --with-freetype-exec-prefix=PFX Exec prefix \n-where FREETYPE is installed (optional)],\n-            freetype_exec_prefix=\"$withval\", freetype_exec_prefix=\"\")\n-\n-if test x$freetype_exec_prefix != x ; then\n-     freetype_args=\"$freetype_args --exec-prefix=$freetype_exec_prefix\"\n-     if test x${FREETYPE_CONFIG+set} != xset ; then\n-        FREETYPE_CONFIG=$freetype_exec_prefix/bin/freetype-config\n-     fi\n-fi\n-if test x$freetype_prefix != x ; then\n-     freetype_args=\"$freetype_args --prefix=$freetype_prefix\"\n-     if test x${FREETYPE_CONFIG+set} != xset ; then\n-        FREETYPE_CONFIG=$freetype_prefix/bin/freetype-config\n-     fi\n-fi\n-AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no)\n-no_freetype=\"\"\n-if test \"$FREETYPE_CONFIG\" = \"no\" ; then\n-    AC_MSG_ERROR([\n-*** Unable to find FreeType2 library (http://www.freetype.org/)\n+#PKG_CHECK_MODULES([FT2], [freetype2 >= 7.0.1], [], [dnl\n+#    AC_CHECK_FT2(,,[AC_MSG_ERROR([dnl\n+#*** Unable to find FreeType2 library (http://www.freetype.org/)])]\n+#    )\n+#])\n-])\n-else\n-    CFLAGS=\"$CFLAGS `$FREETYPE_CONFIG $freetypeconf_args --cflags`\"\n-    LIBS=\"$LIBS `$FREETYPE_CONFIG $freetypeconf_args --libs`\"\n-fi\n+CFLAGS=\"$CFLAGS $FT2_CFLAGS\"\n+LIBS=\"$LIBS $FT2_LIBS -lfreetype -lpng -lz\"\n \n dnl Check for SDL\n SDL_VERSION=1.2.4\n"
  },
  {
    "path": "recipes/libs/sdl2/recipe.toml",
    "content": "#TODO: TEST\n[source]\ngit = \"https://gitlab.redox-os.org/redox-os/sdl2.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\",\n    \"mesa\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport LDFLAGS=\"${LDFLAGS} -lorbital -lOSMesa -lstdc++\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-pulseaudio\n    --disable-video-x11\n    --enable-audio\n    --enable-dummyaudio\n    --enable-redoxaudio\n    --enable-threads\n    --enable-video-orbital\n)\ncookbook_configure\n\n# Hack to add OSMesa\nsed -i \"s/Requires:/Requires: osmesa >= 8.0.0/\" \"${COOKBOOK_STAGE}/usr/lib/pkgconfig/sdl2.pc\"\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/sdl2-gfx/recipe.toml",
    "content": "[source]\ntar = \"http://www.ferzkopp.net/Software/SDL2_gfx/SDL2_gfx-1.0.4.tar.gz\"\nblake3 = \"2e9bd2dc0f004349b51418f33219ebf5cd69f25ed0ba660373652a662cbb857c\"\nscript = \"\"\"\nGNU_CONFIG_GET config.sub\n\"\"\"\n\n[build]\ndependencies = [\n    \"freetype2\",\n    \"liborbital\",\n    \"libpng\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport SDL_LIBS=\"-lSDL2 -lorbital $(\"${PKG_CONFIG}\" --libs osmesa) -lpng -lz -lm -lpthread -lstdc++\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-sdltest\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/sdl2-image/recipe.toml",
    "content": "[source]\ntar = \"https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.4.tar.gz\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libjpeg\",\n    \"liborbital\",\n    \"libpng\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport SDL_LIBS=\"-lSDL2 -lorbital $(\"${TARGET}-pkg-config\" --libs osmesa) -lstdc++\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --prefix=/usr\n    --host=\"${TARGET}\"\n    --disable-sdltest\n    --enable-shared\n    --enable-png\n    --enable-jpg\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/sdl2-mixer/recipe.toml",
    "content": "[source]\ntar = \"https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.8.1.tar.gz\"\nblake3 = \"fa0798ce7ffdb5f89545311292374e5b7af479df8bc99a4aacfb40d2ab2f8384\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n  \"sdl2\",\n  \"liborbital\",\n  \"mesa\",\n  \"zlib\",\n  \"libogg\",\n  \"libvorbis\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nexport SDL_LIBS=\"-lSDL2 -lorbital -lOSMesa -lvorbis -logg -lz -lm -lpthread -lstdc++\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --prefix=/\n    --host=\"${TARGET}\"\n    --disable-sdltest\n    --enable-music-ogg\n    --disable-music-cmd\n    --disable-music-mp3\n    --disable-smpegtest\n    --disable-music-midi\n    --disable-music-mod\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/sdl2-mixer/redox.patch",
    "content": "diff -ruw source/Makefile.in source-new/Makefile.in\n--- source/Makefile.in\t2018-10-31 08:58:59.000000000 -0600\n+++ source-new/Makefile.in\t2019-06-19 15:23:18.015149749 -0600\n@@ -65,10 +65,10 @@\n \t$(LIBTOOL) --mode=link $(CC) -o $@ $(OBJECTS) $(VERSION_OBJECTS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LT_LDFLAGS)\n \n $(objects)/playwave$(EXE): $(objects)/playwave.lo $(objects)/$(TARGET)\n-\t$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playwave.lo $(SDL_CFLAGS) $(objects)/$(TARGET) $(SDL_LIBS) $(LDFLAGS)\n+\t$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playwave.lo $(SDL_CFLAGS) $(objects)/$(TARGET) $(SDL_LIBS) $(LDFLAGS) --static\n \n $(objects)/playmus$(EXE): $(objects)/playmus.lo $(objects)/$(TARGET)\n-\t$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playmus.lo $(SDL_CFLAGS) $(objects)/$(TARGET) $(SDL_LIBS) $(LDFLAGS)\n+\t$(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playmus.lo $(SDL_CFLAGS) $(objects)/$(TARGET) $(SDL_LIBS) $(LDFLAGS) --static\n \n install: all install-hdrs install-lib #install-bin\n install-hdrs:\n"
  },
  {
    "path": "recipes/libs/sdl2-ttf/recipe.toml",
    "content": "[source]\ntar = \"https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-2.0.15.tar.gz\"\nblake3 = \"9814a07f33a3501b414f0fc7fa962e7d7ffc56748406f3798b7698b8d7e7fe12\"\nscript = \"\"\"\nDYNAMIC_INIT\n./autogen.sh\n\"\"\"\n\n[build]\ndependencies = [\n    \"expat\",\n    \"freetype2\",\n    \"libdrm\",\n    \"liborbital\",\n    \"libpng\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport SDL_LIBS=\"-lSDL2 -lorbital $(\"${PKG_CONFIG}\" --libs osmesa) -lpng -lz -lm -lpthread -lstdc++\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-sdltest\n    --enable-opengl\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/termcap/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --prefix=\"${COOKBOOK_STAGE}/usr\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/unibilium/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/neovim/unibilium/archive/refs/tags/v2.1.2.tar.gz\"\nblake3 = \"856a7593a412942f4716bb55bfdd225f3ce92cb013b9d4a44693255f0570b1c7\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/libs/utf8proc/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/JuliaStrings/utf8proc/archive/refs/tags/v2.10.0.tar.gz\"\nblake3 = \"6f675db5d1ae55ad0825351ba9c58a5b5c24c862f559cc7bfed1cb63c1185594\"\n\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/libs/zlib/recipe.toml",
    "content": "[source]\ntar = \"https://www.zlib.net/fossils/zlib-1.3.tar.gz\"\nblake3 = \"ec1abc6f672a7a6ee6f49ba544cc9529f73121b478310473be44fee22a140ebf\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS=(--prefix=\"/usr\")\nif [ \"${COOKBOOK_DYNAMIC}\" == \"1\" ]\nthen\n    COOKBOOK_CONFIGURE_FLAGS+=(--shared)\nelse\n    COOKBOOK_CONFIGURE_FLAGS+=(--static)\nfi\n# See https://stackoverflow.com/questions/21396988/zlib-build-not-configuring-properly-with-cross-compiler-ignores-ar.\nenv CHOST=\"${TARGET}\" \"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\n\"${COOKBOOK_MAKE}\" -j \"$(nproc)\"\n\"${COOKBOOK_MAKE}\" install DESTDIR=\"${COOKBOOK_STAGE}\"\nsolib=\"${COOKBOOK_STAGE}/usr/lib/libz.so.1.3\"\nif [ -e \"${solib}\" ]\nthen\n    patchelf --set-soname 'libz.so.1.3' \"${solib}\"\nfi\n\"\"\""
  },
  {
    "path": "recipes/math/orbcalculator/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/orbcalculator.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/net/download/curl/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/curl.git\"\nbranch = \"redox-8.6\"\nupstream = \"https://github.com/curl/curl.git\"\n\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    #TODO: git fails to build when this is a dependency: \"libpsl\",\n    \"nghttp2\",\n    \"openssl3\",\n    \"zlib\",\n]\ncmakeflags = [\n    \"-DCURL_DISABLE_FTP=On\",\n    \"-DCURL_DISABLE_TFTP=On\",\n    \"-DENABLE_IPV6=Off\",\n    \"-DCURL_DISABLE_NTLM=On\",\n    \"-DENABLE_THREADED_RESOLVER=Off\",\n    \"-DCURL_CA_PATH=/etc/ssl/certs\",\n    \"-DUSE_NGHTTP2=On\",\n    \"-DCURL_USE_OPENSSL=On\",\n    \"-DUSE_ZLIB=On\",\n    \"-DCURL_USE_LIBPSL=Off\",\n]\n\n[package]\ndependencies = [\n    \"ca-certificates\"\n]\n"
  },
  {
    "path": "recipes/net/download/wget/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/wget/wget-1.21.4.tar.gz\"\n[build]\ndependencies = [\n    \"openssl3\",\n]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--with-ssl=openssl\"\n]\n"
  },
  {
    "path": "recipes/net/http/simple-http-server/recipe.toml",
    "content": "[source]\r\ngit = \"https://github.com/TheWaWaR/simple-http-server\"\r\n[build]\r\ntemplate = \"custom\"\r\ndependencies = [\r\n    \"openssl1\",\r\n]\r\nscript = \"\"\"\r\nDYNAMIC_INIT\r\ncookbook_cargo\r\n\"\"\"\r\n"
  },
  {
    "path": "recipes/net/nginx/recipe.toml",
    "content": "#TODO FastCGI not working\n[source]\ntar = \"https://nginx.org/download/nginx-1.28.0.tar.gz\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"pcre\",\n    \"openssl3\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}\"/* ./\nARCH=\"${TARGET%%-*}\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --crossbuild=Redox:$ARCH\n    --with-cc=\"$CC\"\n    --with-cc-opt=\"$CFLAGS $CPPFLAGS\"\n    --with-ld-opt=\"$LDFLAGS\"\n    --sbin-path=/usr/bin/nginx \n    --modules-path=/usr/lib/nginx/modules\n    --conf-path=/etc/nginx/nginx.conf\n    --error-log-path=/var/log/nginx/error.log\n    --http-log-path=/var/log/nginx/access.log \n    --http-client-body-temp-path=/var/lib/nginx/body \n    --http-proxy-temp-path=/var/lib/nginx/proxy \n    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \n    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \n    --http-scgi-temp-path=/var/lib/nginx/scgi \n    --pid-path=/var/run/nginx.pid\n    --lock-path=/var/lock/nginx.lock\n    --user=nginx\n    --group=nginx\n    --with-compat\n    --with-debug\n    --with-pcre\n    --with-pcre-jit\n    --with-stream\n    --with-stream_realip_module\n    --with-stream_ssl_module\n    --with-stream_ssl_preread_module\n    --with-threads\n    --with-http_ssl_module\n    --with-http_v2_module\n    --with-http_v3_module\n    --with-http_realip_module\n    --with-http_gzip_static_module\n    --with-http_stub_status_module\n    --with-http_addition_module\n)\n\nunset AR AS CC CXX LD LDFLAGS NM OBJCOPY OBJDUMP RANLIB READELF RUSTFLAGS STRIP\n\ncookbook_configure\n\nmkdir -p \"$COOKBOOK_STAGE\"/var/lib/nginx/{body,proxy,fastcgi,uwsgi,scgi} \\\n \"$COOKBOOK_STAGE\"/var/log/nginx/\n#TODO: pkgar don't track empty directories\ntouch \"$COOKBOOK_STAGE\"/var/lib/nginx/{body,proxy,fastcgi,uwsgi,scgi}/.tmp \\\n \"$COOKBOOK_STAGE\"/var/log/nginx/.tmp\n\"\"\"\n"
  },
  {
    "path": "recipes/net/nginx/redox.patch",
    "content": "diff -ruwN source/auto/cc/clang source-new/auto/cc/clang\n--- source/auto/cc/clang\t2025-04-23 18:48:54.000000000 +0700\n+++ source-new/auto/cc/clang\t2026-02-24 07:55:59.340299231 +0700\n@@ -88,9 +88,6 @@\n     CFLAGS=\"$CFLAGS -Wno-deprecated-declarations\"\n fi\n \n-# stop on warning\n-CFLAGS=\"$CFLAGS -Werror\"\n-\n # debug\n CFLAGS=\"$CFLAGS -g\"\n \ndiff -ruwN source/auto/cc/gcc source-new/auto/cc/gcc\n--- source/auto/cc/gcc\t2025-04-23 18:48:54.000000000 +0700\n+++ source-new/auto/cc/gcc\t2026-02-24 07:56:03.156908192 +0700\n@@ -165,9 +165,6 @@\n esac\n \n \n-# stop on warning\n-CFLAGS=\"$CFLAGS -Werror\"\n-\n # debug\n CFLAGS=\"$CFLAGS -g\"\n \ndiff -ruwN source/auto/feature source-new/auto/feature\n--- source/auto/feature\t2025-04-23 18:48:54.000000000 +0700\n+++ source-new/auto/feature\t2025-09-16 02:44:58.617532926 +0700\n@@ -53,7 +53,7 @@\n \n         yes)\n             # /bin/sh is used to intercept \"Killed\" or \"Abort trap\" messages\n-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then\n+            #if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then\n                 echo \" found\"\n                 ngx_found=yes\n \n@@ -61,9 +61,9 @@\n                     have=$ngx_have_feature . auto/have\n                 fi\n \n-            else\n-                echo \" found but is not working\"\n-            fi\n+            #else\n+            #    echo \" found but is not working\"\n+            #fi\n         ;;\n \n         value)\ndiff -ruwN source/auto/types/sizeof source-new/auto/types/sizeof\n--- source/auto/types/sizeof\t2025-04-23 18:48:54.000000000 +0700\n+++ source-new/auto/types/sizeof\t2025-09-16 02:44:58.618532943 +0700\n@@ -33,7 +33,7 @@\n END\n \n \n-ngx_test=\"$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \\\n+ngx_test=\"gcc $CC_TEST_FLAGS $CC_AUX_FLAGS \\\n           -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs\"\n \n eval \"$ngx_test >> $NGX_AUTOCONF_ERR 2>&1\"\ndiff -ruwN source/auto/types/typedef source-new/auto/types/typedef\n--- source/auto/types/typedef\t2025-04-23 18:48:54.000000000 +0700\n+++ source-new/auto/types/typedef\t2025-09-16 02:44:58.618532943 +0700\n@@ -34,7 +34,7 @@\n \n END\n \n-    ngx_test=\"$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \\\n+    ngx_test=\"gcc $CC_TEST_FLAGS $CC_AUX_FLAGS \\\n               -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs\"\n \n     eval \"$ngx_test >> $NGX_AUTOCONF_ERR 2>&1\"\ndiff -ruwN source/src/os/unix/ngx_process.c source-new/src/os/unix/ngx_process.c\n--- source/src/os/unix/ngx_process.c\t2025-04-23 18:48:54.000000000 +0700\n+++ source-new/src/os/unix/ngx_process.c\t2025-09-16 02:44:58.618532943 +0700\n@@ -143,6 +143,7 @@\n         }\n \n         on = 1;\n+        /*\n         if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) {\n             ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,\n                           \"ioctl(FIOASYNC) failed while spawning \\\"%s\\\"\", name);\n@@ -156,6 +157,7 @@\n             ngx_close_channel(ngx_processes[s].channel, cycle->log);\n             return NGX_INVALID_PID;\n         }\n+        */\n \n         if (fcntl(ngx_processes[s].channel[0], F_SETFD, FD_CLOEXEC) == -1) {\n             ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,\ndiff -ruwN source/src/os/unix/ngx_process_cycle.c source-new/src/os/unix/ngx_process_cycle.c\n--- source/src/os/unix/ngx_process_cycle.c\t2025-04-23 18:48:54.000000000 +0700\n+++ source-new/src/os/unix/ngx_process_cycle.c\t2025-09-27 02:17:21.509383985 +0700\n@@ -804,11 +804,13 @@\n             exit(2);\n         }\n \n+        /*\n         if (initgroups(ccf->username, ccf->group) == -1) {\n             ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,\n                           \"initgroups(%s, %d) failed\",\n                           ccf->username, ccf->group);\n         }\n+        */\n \n #if (NGX_HAVE_PR_SET_KEEPCAPS && NGX_HAVE_CAPABILITIES)\n         if (ccf->transparent && ccf->user) {\n"
  },
  {
    "path": "recipes/net/openssh/recipe.toml",
    "content": "#TODO lack of resolv.h, expect dns not working\n#TODO lack of utmpx.h, expect no way to track login in sshd\n[source]\ntar = \"https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz\"\npatches = [\n    \"redox.patch\",\n]\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n    \"zlib\",\n    \"zstd\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-strip\n    --sysconfdir=/etc/ssh\n)\nexport CFLAGS+=\" -DSYSTEMD_NOTIFY=1\"\ncookbook_configure\nmv \"${COOKBOOK_STAGE}\"/usr/sbin/sshd \"${COOKBOOK_STAGE}\"/usr/bin/sshd\nrmdir \"${COOKBOOK_STAGE}\"/usr/sbin\n\n# Extracted from `make host-key-force`\n# TODO: Postscript to generate this\n# ssh-keygen -t dsa -f \"${COOKBOOK_STAGE}\"/etc/ssh/ssh_host_dsa_key -N \"\"\n# ssh-keygen -t rsa -f \"${COOKBOOK_STAGE}\"/etc/ssh/ssh_host_rsa_key -N \"\"\n# ssh-keygen -t ed25519 -f \"${COOKBOOK_STAGE}\"/etc/ssh/ssh_host_ed25519_key -N \"\"\n# ssh-keygen -t ecdsa -f \"${COOKBOOK_STAGE}\"/etc/ssh/ssh_host_ecdsa_key -N \"\"\n\nCONFIG_FILE=\"${COOKBOOK_STAGE}\"/etc/ssh/sshd_config\n\n# ipv6 is not working yet\nsed -i \"s/#AddressFamily any/AddressFamily inet/g\" \"${CONFIG_FILE}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/net/openssh/redox.patch",
    "content": "diff -ruwN source/configure source-new/configure\n--- source/configure\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/configure\t2025-09-06 23:54:58.147442355 +0700\n@@ -12606,6 +12606,10 @@\n printf \"%s\\n\" \"#define BROKEN_POLL 1\" >>confdefs.h\n \n \t;;\n+*-*-redox)\n+\n+  # todo\n+\t;;\n mips-sony-bsd|mips-sony-newsos4)\n \n printf \"%s\\n\" \"#define NEED_SETPGRP 1\" >>confdefs.h\ndiff -ruwN source/defines.h source-new/defines.h\n--- source/defines.h\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/defines.h\t2025-09-07 01:35:40.209700338 +0700\n@@ -52,6 +52,18 @@\n #define IPPORT_RESERVED 0\n #endif\n \n+#ifndef IPPORT_RESERVED\n+#define IPPORT_RESERVED 1024\n+#endif\n+\n+#ifndef IN_LOOPBACKNET\n+#define IN_LOOPBACKNET 127\n+#endif\n+\n+#ifndef MAXDNAME\n+#define MAXDNAME 256\n+#endif\n+\n /*\n  * Definitions for IP type of service (ip_tos)\n  */\n@@ -454,19 +466,21 @@\n # define _PATH_DEVNULL \"/dev/null\"\n #endif\n \n-/* user may have set a different path */\n-#if defined(_PATH_MAILDIR) && defined(MAIL_DIRECTORY)\n-# undef _PATH_MAILDIR\n-#endif /* defined(_PATH_MAILDIR) && defined(MAIL_DIRECTORY) */\n-\n-#ifdef MAIL_DIRECTORY\n-# define _PATH_MAILDIR MAIL_DIRECTORY\n+#ifndef _PATH_MAILDIR\n+# define _PATH_MAILDIR \"/var/mail\"\n #endif\n \n #ifndef _PATH_NOLOGIN\n # define _PATH_NOLOGIN \"/etc/nologin\"\n #endif\n \n+#ifndef ST_RDONLY\n+#define ST_RDONLY\t1\n+#endif\n+#ifndef ST_NOSUID\n+#define ST_NOSUID\t2\n+#endif\n+\n /* Define this to be the path of the xauth program. */\n #ifdef XAUTH_PATH\n #define _PATH_XAUTH XAUTH_PATH\ndiff -ruwN source/hostfile.c source-new/hostfile.c\n--- source/hostfile.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/hostfile.c\t2025-09-06 21:09:36.555438339 +0700\n@@ -44,7 +44,9 @@\n #include <netinet/in.h>\n \n #include <errno.h>\n+#ifndef __redox__\n #include <resolv.h>\n+#endif\n #include <stdarg.h>\n #include <stdio.h>\n #include <stdlib.h>\ndiff -ruwN source/loginrec.c source-new/loginrec.c\n--- source/loginrec.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/loginrec.c\t2025-09-06 21:09:36.556438304 +0700\n@@ -1033,7 +1033,7 @@\n \t\treturn (0);\n \t}\n # else\n-\tif (!utmpx_write_direct(li, &ut)) {\n+\tif (!utmpx_write_direct(li, &utx)) {\n \t\tlogit(\"%s: utmp_write_direct() failed\", __func__);\n \t\treturn (0);\n \t}\ndiff -ruwN source/loginrec.h source-new/loginrec.h\n--- source/loginrec.h\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/loginrec.h\t2025-09-06 21:09:36.556438304 +0700\n@@ -30,6 +30,7 @@\n  **/\n \n #include \"includes.h\"\n+#include \"openbsd-compat/utmpx.h\"\n \n struct ssh;\n \ndiff -ruwN source/misc.c source-new/misc.c\n--- source/misc.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/misc.c\t2025-09-07 01:21:42.201992304 +0700\n@@ -2843,7 +2843,6 @@\n \t\t\terror(\"%s: dup2: %s\", tag, strerror(errno));\n \t\t\t_exit(1);\n \t\t}\n-\t\tclosefrom(STDERR_FILENO + 1);\n \n \t\tif (geteuid() == 0 &&\n \t\t    initgroups(pw->pw_name, pw->pw_gid) == -1) {\ndiff -ruwN source/monitor.c source-new/monitor.c\n--- source/monitor.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/monitor.c\t2025-09-07 00:46:23.435378053 +0700\n@@ -484,18 +484,19 @@\n \t\tpfd[0].events = POLLIN;\n \t\tpfd[1].fd = pmonitor->m_log_recvfd;\n \t\tpfd[1].events = pfd[1].fd == -1 ? 0 : POLLIN;\n-\t\tif (poll(pfd, pfd[1].fd == -1 ? 1 : 2, -1) == -1) {\n+\t\t// redox can't handle timeout -1 (the poll stuck)\n+\t\tif (poll(pfd, pfd[1].fd == -1 ? 1 : 2, 1000) == -1) {\n \t\t\tif (errno == EINTR || errno == EAGAIN)\n \t\t\t\tcontinue;\n \t\t\tfatal_f(\"poll: %s\", strerror(errno));\n \t\t}\n \t\tif (pfd[1].revents) {\n+\n \t\t\t/*\n \t\t\t * Drain all log messages before processing next\n \t\t\t * monitor request.\n \t\t\t */\n \t\t\tmonitor_read_log(pmonitor);\n-\t\t\tcontinue;\n \t\t}\n \t\tif (pfd[0].revents)\n \t\t\tbreak;  /* Continues below */\n@@ -1577,7 +1578,8 @@\n \tres = pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, sizeof(s->tty));\n \tif (res == 0)\n \t\tgoto error;\n-\tpty_setowner(authctxt->pw, s->tty);\n+\t// non sense in redox\n+\t// pty_setowner(authctxt->pw, s->tty);\n \n \tif ((r = sshbuf_put_u32(m, 1)) != 0 ||\n \t    (r = sshbuf_put_cstring(m, s->tty)) != 0)\ndiff -ruwN source/openbsd-compat/bsd-statvfs.h source-new/openbsd-compat/bsd-statvfs.h\n--- source/openbsd-compat/bsd-statvfs.h\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/openbsd-compat/bsd-statvfs.h\t2025-09-06 21:09:36.556438304 +0700\n@@ -37,13 +37,6 @@\n typedef unsigned long fsfilcnt_t;\n #endif\n \n-#ifndef ST_RDONLY\n-#define ST_RDONLY\t1\n-#endif\n-#ifndef ST_NOSUID\n-#define ST_NOSUID\t2\n-#endif\n-\n \t/* as defined in IEEE Std 1003.1, 2004 Edition */\n struct statvfs {\n \tunsigned long f_bsize;\t/* File system block size. */\ndiff -ruwN source/openbsd-compat/getrrsetbyname.c source-new/openbsd-compat/getrrsetbyname.c\n--- source/openbsd-compat/getrrsetbyname.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/openbsd-compat/getrrsetbyname.c\t2025-09-06 21:09:36.556438304 +0700\n@@ -67,6 +67,52 @@\n #endif\n #define _THREAD_PRIVATE(a,b,c) (c)\n \n+#ifdef __redox__\n+\n+#include <sys/types.h>\n+#include <stdint.h>\n+\n+/*\n+ * Minimalist replacement for <resolv.h> for systems that lack it,\n+ * such as Redox OS. This provides the basic structures needed by\n+ * the OpenSSH compatibility layer.\n+ */\n+\n+// Define necessary constants\n+#define MAXNS           3   /* max # name servers we'll track */\n+#define MAXDNSRCH       6   /* max # domains in search path */\n+#define MAXRESOLVSORT   10  /* number of nets to sort on */\n+#define MAXDNAME        256 /* max length of a domain name */\n+\n+/*\n+ * A simplified, portable version of the resolver state structure.\n+ * Glibc-specific fields, hooks, and complex unions have been removed.\n+ */\n+struct __res_state {\n+    int   retrans;                /* retransmission time interval */\n+    int   retry;                  /* number of times to retransmit */\n+    unsigned long options;        /* option flags */\n+    int   nscount;                /* number of name servers */\n+    struct sockaddr_in nsaddr_list[MAXNS]; /* address of name servers */\n+    unsigned short id;            /* current message id */\n+    char *dnsrch[MAXDNSRCH + 1];  /* components of domain to search */\n+    char  defdname[MAXDNAME];     /* default domain name */\n+    \n+    struct {\n+        struct in_addr addr;\n+        uint32_t       mask;\n+    } sort_list[MAXRESOLVSORT];\n+    \n+    int   res_h_errno;            /* last error code for this context */\n+    \n+    // Simplified bitfields, removing glibc internals\n+    unsigned ndots : 4;           /* threshold for initial abs. query */\n+    unsigned nsort : 4;           /* number of elements in sort_list[] */\n+};\n+\n+typedef struct __res_state *res_state;\n+#endif /* __redox */\n+\n #ifndef HAVE__RES_EXTERN\n struct __res_state _res;\n #endif\n@@ -167,6 +213,24 @@\n \tstruct dns_rr\t\t*next;\n };\n \n+#ifdef __redox__\n+typedef struct {\n+    uint16_t id;\n+    uint8_t  rd : 1;\n+    uint8_t  tc : 1;\n+    uint8_t  aa : 1;\n+    uint8_t  opcode : 4;\n+    uint8_t  qr : 1;\n+    uint8_t  rcode : 4;\n+    uint8_t  z : 3;\n+    uint8_t  ra : 1;\n+    uint16_t qdcount;\n+    uint16_t ancount;\n+    uint16_t nscount;\n+    uint16_t arcount;\n+} HEADER;\n+#endif\n+\n struct dns_response {\n \tHEADER\t\t\theader;\n \tstruct dns_query\t*query;\n@@ -221,10 +285,10 @@\n \t}\n \n \t/* initialize resolver */\n-\tif ((_resp->options & RES_INIT) == 0 && res_init() == -1) {\n+\t// if (res_init() == -1) {\n \t\tresult = ERRSET_FAIL;\n \t\tgoto fail;\n-\t}\n+\t// }\n \n #ifdef DEBUG\n \t_resp->options |= RES_DEBUG;\n@@ -482,12 +546,12 @@\n \t\t\tprev->next = curr;\n \n \t\t/* name */\n-\t\tlength = dn_expand(answer, answer + size, *cp, name,\n-\t\t    sizeof(name));\n-\t\tif (length < 0) {\n+\t\t// length = dn_expand(answer, answer + size, *cp, name,\n+\t\t//     sizeof(name));\n+\t\t// if (length < 0) {\n \t\t\tfree_dns_query(head);\n \t\t\treturn (NULL);\n-\t\t}\n+\t\t// }\n \t\tcurr->name = strdup(name);\n \t\tif (curr->name == NULL) {\n \t\t\tfree_dns_query(head);\n@@ -542,12 +606,12 @@\n \t\t\tprev->next = curr;\n \n \t\t/* name */\n-\t\tlength = dn_expand(answer, answer + size, *cp, name,\n-\t\t    sizeof(name));\n-\t\tif (length < 0) {\n+\t\t// length = dn_expand(answer, answer + size, *cp, name,\n+\t\t//     sizeof(name));\n+\t\t// if (length < 0) {\n \t\t\tfree_dns_rr(head);\n \t\t\treturn (NULL);\n-\t\t}\n+\t\t// }\n \t\tcurr->name = strdup(name);\n \t\tif (curr->name == NULL) {\n \t\t\tfree_dns_rr(head);\ndiff -ruwN source/openbsd-compat/getrrsetbyname.h source-new/openbsd-compat/getrrsetbyname.h\n--- source/openbsd-compat/getrrsetbyname.h\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/openbsd-compat/getrrsetbyname.h\t2025-09-06 21:09:36.557438268 +0700\n@@ -54,9 +54,13 @@\n \n #include <sys/types.h>\n #include <netinet/in.h>\n+#ifndef __redox__\n #include <arpa/nameser.h>\n+#endif\n #include <netdb.h>\n+#ifndef __redox__\n #include <resolv.h>\n+#endif\n \n #ifndef HFIXEDSZ\n #define HFIXEDSZ 12\ndiff -ruwN source/openbsd-compat/inet_ntop.c source-new/openbsd-compat/inet_ntop.c\n--- source/openbsd-compat/inet_ntop.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/openbsd-compat/inet_ntop.c\t2025-09-06 21:09:36.557438268 +0700\n@@ -26,7 +26,9 @@\n #include <sys/socket.h>\n #include <netinet/in.h>\n #include <arpa/inet.h>\n+#ifndef __redox__\n #include <arpa/nameser.h>\n+#endif\n #include <string.h>\n #include <errno.h>\n #include <stdio.h>\ndiff -ruwN source/openbsd-compat/openbsd-compat.h source-new/openbsd-compat/openbsd-compat.h\n--- source/openbsd-compat/openbsd-compat.h\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/openbsd-compat/openbsd-compat.h\t2025-09-06 21:09:36.557438268 +0700\n@@ -36,6 +36,8 @@\n \n #include <stddef.h>  /* for wchar_t */\n \n+#include \"getopt.h\"\n+\n /* OpenBSD function replacements */\n #include \"base64.h\"\n #include \"sigact.h\"\ndiff -ruwN source/openbsd-compat/utmpx.c source-new/openbsd-compat/utmpx.c\n--- source/openbsd-compat/utmpx.c\t1970-01-01 07:00:00.000000000 +0700\n+++ source-new/openbsd-compat/utmpx.c\t2025-09-06 21:09:36.557438268 +0700\n@@ -0,0 +1,13 @@\n+#include \"utmpx.h\"\n+#include <stddef.h> // For NULL\n+\n+#ifdef __redox__\n+\n+void endutxent(void) { /* Do nothing */ }\n+struct utmpx *getutxent(void) { return NULL; }\n+struct utmpx *getutxid(const struct utmpx *ut) { return NULL; }\n+struct utmpx *getutxline(const struct utmpx *ut) { return NULL; }\n+struct utmpx *pututxline(const struct utmpx *ut) { return NULL; }\n+void setutxent(void) { /* Do nothing */ }\n+\n+#endif\n\\ No newline at end of file\ndiff -ruwN source/openbsd-compat/utmpx.h source-new/openbsd-compat/utmpx.h\n--- source/openbsd-compat/utmpx.h\t1970-01-01 07:00:00.000000000 +0700\n+++ source-new/openbsd-compat/utmpx.h\t2025-09-06 21:09:36.557438268 +0700\n@@ -0,0 +1,69 @@\n+#ifndef _COMPAT_UTMPX_H\n+#define _COMPAT_UTMPX_H\n+#ifdef __redox__\n+#include <sys/types.h>\n+#include <sys/time.h>\n+\n+#ifdef __cplusplus\n+extern \"C\" {\n+#endif\n+\n+/*\n+ * This header provides a POSIX-compliant definition of the utmpx structure\n+ * and related functions for systems that lack a native <utmpx.h>, such as Redox OS.\n+ */\n+\n+// Define standard sizes for character arrays, based on common practice (e.g., Linux)\n+#define UT_LINESIZE   32\n+#define UT_NAMESIZE   32\n+#define UT_HOSTSIZE   256\n+#define UT_IDSIZE     4\n+\n+/*\n+ * The utmpx structure, containing user accounting information.\n+ */\n+struct utmpx {\n+    char            ut_user[UT_NAMESIZE]; /* User login name */\n+    char            ut_id[UT_IDSIZE];     /* Unspecified terminal id */\n+    char            ut_line[UT_LINESIZE]; /* Device name of tty */\n+    pid_t           ut_pid;               /* Process ID */\n+    short           ut_type;              /* Type of entry */\n+    struct timeval  ut_tv;                /* Time entry was made */\n+    // Non-standard but very common fields, often needed for compatibility\n+    char            ut_host[UT_HOSTSIZE]; /* Host name for remote login */\n+    // Padding to align the structure, if necessary\n+    char            __padding[16];\n+};\n+\n+/*\n+ * Symbolic constants for the ut_type field.\n+ */\n+#define EMPTY           0 /* No valid user accounting information */\n+#define BOOT_TIME       1 /* Time of system boot */\n+#define OLD_TIME        2 /* Time when system clock changed */\n+#define NEW_TIME        3 /* Time after system clock changed */\n+#define USER_PROCESS    4 /* A user process */\n+#define INIT_PROCESS    5 /* A process spawned by the init process */\n+#define LOGIN_PROCESS   6 /* The session leader of a logged-in user */\n+#define DEAD_PROCESS    7 /* A session leader who has exited */\n+\n+/*\n+ * Function prototypes for utmpx database manipulation.\n+ *\n+ * NOTE: These are stubs. Since Redox OS does not have a utmp/utmpx\n+ * database, these functions won't have a real implementation. They\n+ * are declared here to satisfy the linker.\n+ */\n+void          endutxent(void);\n+struct utmpx *getutxent(void);\n+struct utmpx *getutxid(const struct utmpx *);\n+struct utmpx *getutxline(const struct utmpx *);\n+struct utmpx *pututxline(const struct utmpx *);\n+void          setutxent(void);\n+\n+#ifdef __cplusplus\n+}\n+#endif\n+\n+#endif /* __redox__ */\n+#endif /* _COMPAT_UTMPX_H */\n\\ No newline at end of file\ndiff -ruwN source/readconf.c source-new/readconf.c\n--- source/readconf.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/readconf.c\t2025-09-07 01:21:42.201992304 +0700\n@@ -554,7 +554,6 @@\n \n \t\tif (stdfd_devnull(1, 1, 0) == -1)\n \t\t\tfatal_f(\"stdfd_devnull failed\");\n-\t\tclosefrom(STDERR_FILENO + 1);\n \n \t\targv[0] = shell;\n \t\targv[1] = \"-c\";\ndiff -ruwN source/readpass.c source-new/readpass.c\n--- source/readpass.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/readpass.c\t2025-09-07 01:21:42.201992304 +0700\n@@ -278,7 +278,6 @@\n \tif (pid == 0) {\n \t\tif (stdfd_devnull(1, 1, 0) == -1)\n \t\t\tfatal_f(\"stdfd_devnull failed\");\n-\t\tclosefrom(STDERR_FILENO + 1);\n \t\tsetenv(\"SSH_ASKPASS_PROMPT\", \"none\", 1); /* hint to UI */\n \t\texeclp(askpass, askpass, prompt, (char *)NULL);\n \t\terror_f(\"exec(%s): %s\", askpass, strerror(errno));\ndiff -ruwN source/regress/netcat.c source-new/regress/netcat.c\n--- source/regress/netcat.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/regress/netcat.c\t2025-09-06 21:09:36.558438233 +0700\n@@ -1384,7 +1384,9 @@\n #include <stdlib.h>\n #include <string.h>\n #include <unistd.h>\n+#ifndef __redox__\n #include <resolv.h>\n+#endif\n \n #define SOCKS_PORT\t\"1080\"\n #define HTTP_PROXY_PORT\t\"3128\"\ndiff -ruwN source/session.c source-new/session.c\n--- source/session.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/session.c\t2025-09-07 01:22:43.637928015 +0700\n@@ -1365,10 +1365,12 @@\n \t\t\texit(1);\n \t\t}\n \t\t/* Initialize the group list. */\n+#ifndef __redox__\n \t\tif (initgroups(pw->pw_name, pw->pw_gid) < 0) {\n \t\t\tperror(\"initgroups\");\n \t\t\texit(1);\n \t\t}\n+#endif\n \t\tendgrent();\n #endif\n \n@@ -1490,7 +1492,6 @@\n \t * initgroups, because at least on Solaris 2.3 it leaves file\n \t * descriptors open.\n \t */\n-\tclosefrom(STDERR_FILENO + 1);\n }\n \n /*\n@@ -1624,7 +1625,6 @@\n \t\t\texit(1);\n \t}\n \n-\tclosefrom(STDERR_FILENO + 1);\n \n \tdo_rc_files(ssh, s, shell);\n \ndiff -ruwN source/sshbuf-misc.c source-new/sshbuf-misc.c\n--- source/sshbuf-misc.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/sshbuf-misc.c\t2025-09-06 21:09:36.559438198 +0700\n@@ -28,7 +28,9 @@\n #include <stdio.h>\n #include <limits.h>\n #include <string.h>\n+#ifndef __redox__\n #include <resolv.h>\n+#endif\n #include <ctype.h>\n #include <unistd.h>\n \ndiff -ruwN source/ssh.c source-new/ssh.c\n--- source/ssh.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/ssh.c\t2025-09-07 01:22:43.638928030 +0700\n@@ -689,7 +689,6 @@\n \t * Discard other fds that are hanging around. These can cause problem\n \t * with backgrounded ssh processes started by ControlPersist.\n \t */\n-\tclosefrom(STDERR_FILENO + 1);\n \n \t__progname = ssh_get_progname(av[0]);\n \ndiff -ruwN source/sshconnect2.c source-new/sshconnect2.c\n--- source/sshconnect2.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/sshconnect2.c\t2025-09-07 01:22:58.683157171 +0700\n@@ -2057,7 +2057,6 @@\n \t\tsock = STDERR_FILENO + 1;\n \t\tif (fcntl(sock, F_SETFD, 0) == -1) /* keep the socket on exec */\n \t\t\tdebug3_f(\"fcntl F_SETFD: %s\", strerror(errno));\n-\t\tclosefrom(sock + 1);\n \n \t\tdebug3_f(\"[child] pid=%ld, exec %s\",\n \t\t    (long)getpid(), _PATH_SSH_KEY_SIGN);\ndiff -ruwN source/sshd.c source-new/sshd.c\n--- source/sshd.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/sshd.c\t2025-09-07 01:39:34.681252169 +0700\n@@ -1222,7 +1222,7 @@\n \t\tdebug(\"setgroups(): %.200s\", strerror(errno));\n \n \t/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */\n-\tsanitise_stdfd();\n+\t// sanitise_stdfd();\n \n \t/* Initialize configuration options to their default values. */\n \tinitialize_server_options(&options);\n@@ -1344,7 +1344,6 @@\n \tif (!test_flag && !do_dump_cfg && !path_absolute(av[0]))\n \t\tfatal(\"sshd requires execution with an absolute path\");\n \n-\tclosefrom(STDERR_FILENO + 1);\n \n \t/* Reserve fds we'll need later for reexec things */\n \tif ((devnull = open(_PATH_DEVNULL, O_RDWR)) == -1)\n@@ -1482,13 +1481,13 @@\n \t\t\t    options.host_key_files[i]);\n \t\t\tkey->sk_flags &= ~SSH_SK_USER_PRESENCE_REQD;\n \t\t}\n-\t\tif (r == 0 && key != NULL &&\n-\t\t    (r = sshkey_shield_private(key)) != 0) {\n-\t\t\tdo_log2_r(r, ll, \"Unable to shield host key \\\"%s\\\"\",\n-\t\t\t    options.host_key_files[i]);\n-\t\t\tsshkey_free(key);\n-\t\t\tkey = NULL;\n-\t\t}\n+\t\t// if (r == 0 && key != NULL &&\n+\t\t//     (r = sshkey_shield_private(key)) != 0) {\n+\t\t// \tdo_log2_r(r, ll, \"Unable to shield host key \\\"%s\\\"\",\n+\t\t// \t    options.host_key_files[i]);\n+\t\t// \tsshkey_free(key);\n+\t\t// \tkey = NULL;\n+\t\t// }\n \t\tif ((r = sshkey_load_public(options.host_key_files[i],\n \t\t    &pubkey, NULL)) != 0 && r != SSH_ERR_SYSTEM_ERROR)\n \t\t\tdo_log2_r(r, ll, \"Unable to load host key \\\"%s\\\"\",\n@@ -1600,8 +1599,7 @@\n \t}\n \n \t/* Ensure privsep directory is correctly configured. */\n-\tneed_chroot = ((getuid() == 0 || geteuid() == 0) ||\n-\t    options.kerberos_authentication);\n+\tneed_chroot = 0;// ((getuid() == 0 || geteuid() == 0) || options.kerberos_authentication);\n \tif ((getpwnam(SSH_PRIVSEP_USER)) == NULL && need_chroot) {\n \t\tfatal(\"Privilege separation user %s does not exist\",\n \t\t    SSH_PRIVSEP_USER);\n@@ -1773,7 +1771,7 @@\n \t\tclose(startup_pipe);\n \t}\n \tlog_redirect_stderr_to(NULL);\n-\tclosefrom(REEXEC_MIN_FREE_FD);\n+\t// closefrom(REEXEC_MIN_FREE_FD);\n \n \tssh_signal(SIGHUP, SIG_IGN); /* avoid reset to SIG_DFL */\n \texecv(rexec_argv[0], rexec_argv);\ndiff -ruwN source/sshd-session.c source-new/sshd-session.c\n--- source/sshd-session.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/sshd-session.c\t2025-09-06 21:15:43.796191268 +0700\n@@ -1031,7 +1031,7 @@\n \tif (!rexeced_flag)\n \t\tfatal(\"sshd-session should not be executed directly\");\n \n-\tclosefrom(REEXEC_MIN_FREE_FD);\n+\t// closefrom(REEXEC_MIN_FREE_FD);\n \n \tseed_rng();\n \n@@ -1073,7 +1073,7 @@\n \toptions.timing_secret = timing_secret;\n \n \t/* Store privilege separation user for later use if required. */\n-\tprivsep_chroot = (getuid() == 0 || geteuid() == 0);\n+\tprivsep_chroot = 0;// (getuid() == 0 || geteuid() == 0);\n \tif ((privsep_pw = getpwnam(SSH_PRIVSEP_USER)) == NULL) {\n \t\tif (privsep_chroot || options.kerberos_authentication)\n \t\t\tfatal(\"Privilege separation user %s does not exist\",\ndiff -ruwN source/sshkey.c source-new/sshkey.c\n--- source/sshkey.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/sshkey.c\t2025-09-06 21:09:36.567437916 +0700\n@@ -43,7 +43,9 @@\n #include <stdio.h>\n #include <stdlib.h>\n #include <string.h>\n+#ifndef __redox__\n #include <resolv.h>\n+#endif\n #include <time.h>\n #ifdef HAVE_UTIL_H\n #include <util.h>\ndiff -ruwN source/ssh-sk-client.c source-new/ssh-sk-client.c\n--- source/ssh-sk-client.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/ssh-sk-client.c\t2025-09-07 01:21:42.201992304 +0700\n@@ -91,7 +91,6 @@\n \t\t}\n \t\tclose(pair[0]);\n \t\tclose(pair[1]);\n-\t\tclosefrom(STDERR_FILENO + 1);\n \t\tdebug_f(\"starting %s %s\", helper,\n \t\t    verbosity == NULL ? \"\" : verbosity);\n \t\texeclp(helper, helper, verbosity, (char *)NULL);\ndiff -ruwN source/ssh-sk-helper.c source-new/ssh-sk-helper.c\n--- source/ssh-sk-helper.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/ssh-sk-helper.c\t2025-09-07 01:22:43.638928030 +0700\n@@ -303,7 +303,6 @@\n \t * Rearrange our file descriptors a little; we don't trust the\n \t * providers not to fiddle with stdin/out.\n \t */\n-\tclosefrom(STDERR_FILENO + 1);\n \tif ((in = dup(STDIN_FILENO)) == -1 || (out = dup(STDOUT_FILENO)) == -1)\n \t\tfatal(\"%s: dup: %s\", __progname, strerror(errno));\n \tclose(STDIN_FILENO);\ndiff -ruwN source/uidswap.c source-new/uidswap.c\n--- source/uidswap.c\t2024-07-01 11:36:28.000000000 +0700\n+++ source-new/uidswap.c\t2025-09-07 00:01:52.531094834 +0700\n@@ -37,7 +37,7 @@\n  * POSIX saved uids or not.\n  */\n \n-#if defined(_POSIX_SAVED_IDS) && !defined(BROKEN_SAVED_UIDS)\n+#if !defined(BROKEN_SAVED_UIDS)\n /* Lets assume that posix saved ids also work with seteuid, even though that\n    is not part of the posix specification. */\n #define SAVED_IDS_WORK_WITH_SETEUID\n@@ -83,6 +83,9 @@\n \tprivileged = 1;\n \ttemporarily_use_uid_effective = 1;\n \n+\t// getgroups broken in redox\n+#ifndef __redox__\n+\n \tsaved_egroupslen = getgroups(0, NULL);\n \tif (saved_egroupslen == -1)\n \t\tfatal(\"getgroups: %.100s\", strerror(errno));\n@@ -119,6 +122,7 @@\n \t/* Set the effective uid to the given (unprivileged) uid. */\n \tif (setgroups(user_groupslen, user_groups) == -1)\n \t\tfatal(\"setgroups: %.100s\", strerror(errno));\n+#endif\n #ifndef SAVED_IDS_WORK_WITH_SETEUID\n \t/* Propagate the privileged gid to all of our gids. */\n \tif (setgid(getegid()) == -1)\n@@ -168,8 +172,11 @@\n \t\tfatal(\"%s: setgid failed: %s\", __func__, strerror(errno));\n #endif /* SAVED_IDS_WORK_WITH_SETEUID */\n \n+\t// setgroups broken in redox\n+#ifndef __redox__\n \tif (setgroups(saved_egroupslen, saved_egroups) == -1)\n \t\tfatal(\"setgroups: %.100s\", strerror(errno));\n+#endif\n \ttemporarily_use_uid_effective = 0;\n }\n \n"
  },
  {
    "path": "recipes/net/redox-ssh/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/redox-ssh.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/net/rsync/recipe.toml",
    "content": "[source]\ntar = \"https://download.samba.org/pub/rsync/src/rsync-3.4.1.tar.gz\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"zstd\",\n    \"lz4\",\n    \"openssl1\",\n    \"xxhash\",\n]\n"
  },
  {
    "path": "recipes/net/rsync/redox.patch",
    "content": "diff -ruwN source/rsync.h source-new/rsync.h\n--- source/rsync.h\t2025-01-16 02:21:54.000000000 +0700\n+++ source-new/rsync.h\t2025-09-08 12:18:06.427647717 +0700\n@@ -483,6 +483,21 @@\n #include <sys/sysmacros.h>\n #endif\n \n+#ifdef __redox__\n+\n+// no sys/sysmacros.h, probably no problem\n+#include <sys/types.h>\n+#define major(dev) (0)\n+#define minor(dev) (0)\n+#define makedev(maj, min) (0)\n+\n+// no openat yet\n+#undef O_NOFOLLOW\n+#undef O_DIRECTORY\n+#undef AT_FDCWD\n+\n+#endif\n+\n #ifdef MAKEDEV_TAKES_3_ARGS\n #define MAKEDEV(devmajor,devminor) makedev(0,devmajor,devminor)\n #else\n"
  },
  {
    "path": "recipes/other/ca-certificates/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/ca-certificates.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/etc/ssl\"\ncp -rv \"${COOKBOOK_SOURCE}/certs\" \"${COOKBOOK_STAGE}/etc/ssl/certs\"\n#TODO: remove deprecated location after all recipes are fixed\nln -s etc/ssl \"${COOKBOOK_STAGE}/ssl\"\n\"\"\"\n"
  },
  {
    "path": "recipes/other/cookbook/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/redox.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo\n\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/cookbook\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user/cookbook\"\n\"\"\"\n\n[package]\n# Dependencies below does not include Rust / GCC\n#   because it will be downloaded as prefix binary.\ndependencies = [\n    \"autoconf\",\n    \"automake\",\n    \"git\",\n    \"cbindgen\",\n    \"gnu-binutils\",\n    \"gnu-grep\",\n    \"gnu-make\",\n    \"installer\",\n    \"nasm\",\n    \"pkg-config\",\n    \"pkgar\",\n    \"python312\",\n    \"sed\",\n    \"wget\",\n]\n"
  },
  {
    "path": "recipes/other/generaluser-gs/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/generaluser-gs.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/generaluser-gs\"\ncp -Rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/usr/share/generaluser-gs\"\n\"\"\"\n"
  },
  {
    "path": "recipes/other/jeremy/recipe.toml",
    "content": "# This is a private repository that sets up my user\n[source]\ngit = \"https://gitlab.redox-os.org/jackpot51/jeremy.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home\"\ncp -rv \"${COOKBOOK_SOURCE}\" \"${COOKBOOK_STAGE}/home/user\"\nrm -rf \"${COOKBOOK_STAGE}/home/user/.git\"\n\"\"\"\n"
  },
  {
    "path": "recipes/other/myfiles/recipe.toml",
    "content": "[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user\"\n\"\"\"\n"
  },
  {
    "path": "recipes/other/rustconf2025/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/rustconf2025.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -p \"${COOKBOOK_STAGE}/home/user\"\ncp -v \"${COOKBOOK_SOURCE}/\"*.pdf \"${COOKBOOK_STAGE}/home/user\"\n\"\"\"\n"
  },
  {
    "path": "recipes/other/shared-mime-info/recipe.toml",
    "content": "# This does not build update-mime-database to avoid bringing in C code to Redox\n[source]\ntar = \"https://gitlab.freedesktop.org/xdg/shared-mime-info/-/archive/2.4/shared-mime-info-2.4.tar.gz\"\nblake3 = \"ad130f2f923ab3d5455c643e6257abf3598339fdd134ad0fac4e5dbbbf070eb9\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -p \"${COOKBOOK_STAGE}/usr/share/mime/packages\"\nmsgfmt --xml \\\n    --template=\"${COOKBOOK_SOURCE}/data/freedesktop.org.xml.in\" \\\n    -d \"${COOKBOOK_SOURCE}/po\" \\\n    -o \"${COOKBOOK_STAGE}/usr/share/mime/packages/freedesktop.org.xml\"\nupdate-mime-database -V \"${COOKBOOK_STAGE}/usr/share/mime\"\nmkdir -p \"${COOKBOOK_STAGE}/usr/share/pkgconfig\"\ncat > \"${COOKBOOK_STAGE}/usr/share/pkgconfig/shared-mime-info.pc\" <<EOF\nprefix=/usr\n\nName: shared-mime-info\nDescription: Freedesktop common MIME database\nVersion: 2.4\nRequires:\nLibs:\nCflags:\nEOF\n\"\"\"\n"
  },
  {
    "path": "recipes/other/terminfo/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/sajattack/terminfo\"\nbranch = \"master\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n# only copy common TERM envar\nmkdir -p ${COOKBOOK_STAGE}/share/terminfo/{a,d,l,s,t,v,x}\ncp -r ${COOKBOOK_SOURCE}/tabset ${COOKBOOK_STAGE}/share/\ncp ${COOKBOOK_SOURCE}/terminfo/a/ansi{,-*} ${COOKBOOK_STAGE}/share/terminfo/a/\ncp ${COOKBOOK_SOURCE}/terminfo/d/dumb{,-*} ${COOKBOOK_STAGE}/share/terminfo/d/\ncp ${COOKBOOK_SOURCE}/terminfo/l/linux{,-*} ${COOKBOOK_STAGE}/share/terminfo/l/\ncp ${COOKBOOK_SOURCE}/terminfo/s/screen{,-*} ${COOKBOOK_STAGE}/share/terminfo/s/\ncp ${COOKBOOK_SOURCE}/terminfo/t/tmux{,-*} ${COOKBOOK_STAGE}/share/terminfo/t/\ncp ${COOKBOOK_SOURCE}/terminfo/v/vt100{,-*} ${COOKBOOK_STAGE}/share/terminfo/v/\ncp ${COOKBOOK_SOURCE}/terminfo/x/xterm{,-*} ${COOKBOOK_STAGE}/share/terminfo/x/\n\"\"\"\n"
  },
  {
    "path": "recipes/shells/bash/etc/bash.bashrc",
    "content": "# System-wide .bashrc file for interactive bash(1) shells.\n\n# To enable the settings / commands in this file for login shells as well,\n# this file has to be sourced in /etc/profile.\n\n# If not running interactively, don't do anything\n[ -z \"$PS1\" ] && return\n\n# check the window size after each command and, if necessary,\n# update the values of LINES and COLUMNS.\nshopt -s checkwinsize\n\n# TODO: redox_chroot\nif [ -z \"${redox_chroot:-}\" ] && [ -r /etc/redox_chroot ]; then\n    redox_chroot=$(cat /etc/redox_chroot)\nfi\n\n# set a fancy prompt (non-color, overwrite the one in /etc/profile)\n# but only if not SUDOing and have SUDO_PS1 set; then assume smart user.\nif ! [ -n \"${SUDO_USER}\" -a -n \"${SUDO_PS1}\" ]; then\n  PS1='${redox_chroot:+($redox_chroot)}\\u@\\h:\\w\\$ '\nfi\n\n# Commented out, don't overwrite xterm -T \"title\" -n \"icontitle\" by default.\n# If this is an xterm set the title to user@host:dir\n#case \"$TERM\" in\n#xterm*|rxvt*)\n#    PROMPT_COMMAND='echo -ne \"\\033]0;${USER}@${HOSTNAME}: ${PWD}\\007\"'\n#    ;;\n#*)\n#    ;;\n#esac\n\n# enable bash completion in interactive shells\n#if ! shopt -oq posix; then\n# if [ -f /etc/bash_completion ]; then\n#   . /etc/bash_completion\n# fi\n#fi\n"
  },
  {
    "path": "recipes/shells/bash/etc/profile",
    "content": "# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))\n# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).\n\nif [ \"${PS1-}\" ]; then\n  if [ \"${BASH-}\" ] && [ \"$BASH\" != \"/bin/sh\" ]; then\n    # The file bash.bashrc already sets the default PS1.\n    # PS1='\\h:\\w\\$ '\n    if [ -f /etc/bash.bashrc ]; then\n      . /etc/bash.bashrc\n    fi\n  else\n    if [ \"$(id -u)\" -eq 0 ]; then\n      PS1='# '\n    else\n      PS1='$ '\n    fi\n  fi\nfi\n\nif [ -d /etc/profile.d ]; then\n  for i in /etc/profile.d/*.sh; do\n    if [ -r $i ]; then\n      . $i\n    fi\n  done\n  unset i\nfi\n"
  },
  {
    "path": "recipes/shells/bash/etc/skel/.bashrc",
    "content": "# ~/.bashrc: executed by bash(1) for non-login shells.\n\n# If not running interactively, don't do anything\ncase $- in\n    *i*) ;;\n      *) return;;\nesac\n\n# don't put duplicate lines or lines starting with space in the history.\n# See bash(1) for more options\nHISTCONTROL=ignoreboth\n\n# append to the history file, don't overwrite it\nshopt -s histappend\n\n# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)\nHISTSIZE=1000\nHISTFILESIZE=2000\n\n# check the window size after each command and, if necessary,\n# update the values of LINES and COLUMNS.\nshopt -s checkwinsize\n\n# If set, the pattern \"**\" used in a pathname expansion context will\n# match all files and zero or more directories and subdirectories.\n#shopt -s globstar\n\n# make less more friendly for non-text input files, see lesspipe(1)\n[ -x /usr/bin/lesspipe ] && eval \"$(SHELL=/bin/sh lesspipe)\"\n\n# set a fancy prompt (non-color, unless we know we \"want\" color)\ncase \"$TERM\" in\n    xterm-color|*-256color) color_prompt=yes;;\nesac\n\n# uncomment for a colored prompt, if the terminal has the capability; turned\n# off by default to not distract the user: the focus in a terminal window\n# should be on the output of commands, not on the prompt\n#force_color_prompt=yes\n\nif [ -n \"$force_color_prompt\" ]; then\n    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then\n        # We have color support; assume it's compliant with Ecma-48\n        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such\n        # a case would tend to support setf rather than setaf.)\n        color_prompt=yes\n    else\n        color_prompt=\n    fi\nfi\n\nif [ \"$color_prompt\" = yes ]; then\n    PS1='${redox_chroot:+($redox_chroot)}\\[\\033[01;32m\\]\\u@\\h\\[\\033[00m\\]:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ '\nelse\n    PS1='${redox_chroot:+($redox_chroot)}\\u@\\h:\\w\\$ '\nfi\nunset color_prompt force_color_prompt\n\n# enable color support of ls and also add handy aliases\nif [ -x /usr/bin/dircolors ]; then\n    test -r ~/.dircolors && eval \"$(dircolors -b ~/.dircolors)\" || eval \"$(dircolors -b)\"\n    alias ls='ls --color=auto'\n    #alias dir='dir --color=auto'\n    #alias vdir='vdir --color=auto'\n\n    alias grep='grep --color=auto'\n    alias fgrep='fgrep --color=auto'\n    alias egrep='egrep --color=auto'\nfi\n\n# colored GCC warnings and errors\n#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'\n\n# some more ls aliases\nalias ll='ls -alF'\nalias la='ls -A'\nalias l='ls -CF'\n\n# TODO\n# Add an \"alert\" alias for long running commands.  Use like so:\n#   sleep 10; alert\n# alias alert='notify-send --urgency=low -i \"$([ $? = 0 ] && echo terminal || echo error)\" \"$(history|tail -n1|sed -e '\\''s/^\\s*[0-9]\\+\\s*//;s/[;&|]\\s*alert$//'\\'')\"'\n\n# Alias definitions.\n# You may want to put all your additions into a separate file like\n# ~/.bash_aliases, instead of adding them here directly.\n\nif [ -f ~/.bash_aliases ]; then\n    . ~/.bash_aliases\nfi\n\n# enable programmable completion features (you don't need to enable\n# this, if it's already enabled in /etc/bash.bashrc and /etc/profile\n# sources /etc/bash.bashrc).\nif ! shopt -oq posix; then\n if [ -f /etc/bash_completion ]; then\n   . /etc/bash_completion\n fi\nfi\n"
  },
  {
    "path": "recipes/shells/bash/etc/skel/.profile",
    "content": "# ~/.profile: executed by the command interpreter for login shells.\n# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login\n# exists.\n\n# the default umask is set in /etc/profile; for setting the umask\n# for ssh logins, install and configure the libpam-umask package.\n#umask 022\n\n# if running bash\nif [ -n \"$BASH_VERSION\" ]; then\n    # include .bashrc if it exists\n    if [ -f \"$HOME/.bashrc\" ]; then\n        . \"$HOME/.bashrc\"\n    fi\nfi\n\n# set PATH so it includes user's private bin if it exists\nif [ -d \"$HOME/bin\" ] ; then\n    PATH=\"$HOME/bin:$PATH\"\nfi\n\n# set PATH so it includes user's private bin if it exists\nif [ -d \"$HOME/.local/bin\" ] ; then\n    PATH=\"$HOME/.local/bin:$PATH\"\nfi\n"
  },
  {
    "path": "recipes/shells/bash/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/bash/bash-5.2.15.tar.gz\"\nblake3 = \"c1548e3f2a9b6de5296e18c28b3d2007985e647273e03f039efd3e489edaa41f\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"termcap\",\n]\nscript = \"\"\"\n# compiled statically\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    bash_cv_func_sigsetjmp=no\n    bash_cv_getenv_redef=no\n    --enable-static-link # This ensures loadables are not built, which will fail\n)\nCOOKBOOK_MAKE_JOBS=1 # workaround for parallel make bugs\ncookbook_configure\nln -s \"bash\" \"${COOKBOOK_STAGE}/usr/bin/sh\"\ncp -r \"${COOKBOOK_RECIPE}/etc\" \"${COOKBOOK_STAGE}/etc\"\n\"\"\"\n"
  },
  {
    "path": "recipes/shells/bash/redox.patch",
    "content": "diff -ruwN source/bashline.c source-new/bashline.c\n--- source/bashline.c\t2022-04-18 05:37:12.000000000 +0700\n+++ source-new/bashline.c\t2025-09-01 04:36:35.272926519 +0700\n@@ -2645,7 +2645,7 @@\n      const char *text;\n      int state;\n {\n-#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GRP_H)\n+#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GRP_H) || defined(__redox__)\n   return ((char *)NULL);\n #else\n   static char *gname = (char *)NULL;\ndiff -ruwN source/builtins/ulimit.def source-new/builtins/ulimit.def\n--- source/builtins/ulimit.def\t2021-11-05 20:19:53.000000000 +0700\n+++ source-new/builtins/ulimit.def\t2025-09-01 04:36:35.272926519 +0700\n@@ -609,7 +609,7 @@\n       }\n   else\n     {\n-#if defined (HAVE_RESOURCE)\n+#if defined (HAVE_RESOURCE) && !defined(__redox__)\n       if (getrlimit (limits[ind].parameter, &limit) < 0)\n \treturn -1;\n #  if defined (HPUX9)\ndiff -ruwN source/config-top.h source-new/config-top.h\n--- source/config-top.h\t2021-11-05 20:11:12.000000000 +0700\n+++ source-new/config-top.h\t2025-09-19 21:55:55.439030906 +0700\n@@ -199,3 +199,6 @@\n /* Undefine or define to 0 if you don't want to allow associative array\n    assignment using a compound list of key-value pairs. */\n #define ASSOC_KVPAIR_ASSIGNMENT 1\n+\n+/* Don't check for a valid inode number when pattern matching on Redox */\n+#define BROKEN_DIRENT_D_INO 1\ndiff -ruwN source/configure source-new/configure\n--- source/configure\t2022-09-23 21:13:22.000000000 +0700\n+++ source-new/configure\t2025-09-01 04:52:47.542177017 +0700\n@@ -3298,6 +3298,7 @@\n *-nsk*)\t\topt_bash_malloc=no ;;\t# HP NonStop\n *-haiku*)\topt_bash_malloc=no ;;\t# Haiku OS\n *-genode*)\topt_bash_malloc=no ;;\t# Genode has no sbrk\n+*-redox*)\topt_bash_malloc=no ;;\t# Redox OS\n esac\n \n # memory scrambling on free()\ndiff -ruwN source/configure.ac source-new/configure.ac\n--- source/configure.ac\t2022-09-23 21:12:27.000000000 +0700\n+++ source-new/configure.ac\t2025-09-01 04:36:35.275926660 +0700\n@@ -92,6 +92,7 @@\n *-nsk*)\t\topt_bash_malloc=no ;;\t# HP NonStop\n *-haiku*)\topt_bash_malloc=no ;;\t# Haiku OS\n *-genode*)\topt_bash_malloc=no ;;\t# Genode has no sbrk\n+*-redox*)\topt_bash_malloc=no ;;\t# Redox OS\n esac\n \n # memory scrambling on free()\ndiff -ruwN source/execute_cmd.c source-new/execute_cmd.c\n--- source/execute_cmd.c\t2022-12-14 00:09:02.000000000 +0700\n+++ source-new/execute_cmd.c\t2025-09-01 04:36:35.275926660 +0700\n@@ -1379,11 +1379,11 @@\n   nullcmd = (command == 0) || (command->type == cm_simple && command->value.Simple->words == 0 && command->value.Simple->redirects == 0);\n   if (posixly_correct && nullcmd)\n     {\n-#if defined (HAVE_GETRUSAGE)\n+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)\n       selfb.ru_utime.tv_sec = kidsb.ru_utime.tv_sec = selfb.ru_stime.tv_sec = kidsb.ru_stime.tv_sec = 0;\n       selfb.ru_utime.tv_usec = kidsb.ru_utime.tv_usec = selfb.ru_stime.tv_usec = kidsb.ru_stime.tv_usec = 0;\n       before = shellstart;\n-#else\n+#elif defined (HAVE_TIMES)\n       before.tms_utime = before.tms_stime = before.tms_cutime = before.tms_cstime = 0;\n       tbefore = shell_start_time;\n #endif\ndiff -ruwN source/general.c source-new/general.c\n--- source/general.c\t2022-11-24 05:10:12.000000000 +0700\n+++ source-new/general.c\t2025-09-19 17:09:24.754782168 +0700\n@@ -589,6 +589,7 @@\n void\n check_dev_tty ()\n {\n+#if !defined(__redox__)\n   int tty_fd;\n   char *tty;\n \n@@ -603,6 +604,7 @@\n     }\n   if (tty_fd >= 0)\n     close (tty_fd);\n+#endif\n }\n \n /* Return 1 if PATH1 and PATH2 are the same file.  This is kind of\ndiff -ruwN source/include/posixwait.h source-new/include/posixwait.h\n--- source/include/posixwait.h\t2019-03-30 00:25:52.000000000 +0700\n+++ source-new/include/posixwait.h\t2025-09-01 04:36:35.276926707 +0700\n@@ -34,7 +34,7 @@\n \n /* How to get the status of a job.  For Posix, this is just an\n    int, but for other systems we have to crack the union wait. */\n-#if !defined (_POSIX_VERSION)\n+#if 0\n typedef union wait WAIT;\n #  define WSTATUS(t)  (t.w_status)\n #else /* _POSIX_VERSION */\n@@ -50,7 +50,7 @@\n \n /* More Posix P1003.1 definitions.  In the POSIX versions, the parameter is\n    passed as an `int', in the non-POSIX version, as `union wait'. */\n-#if defined (_POSIX_VERSION)\n+#if 1\n \n #  if !defined (WSTOPSIG)\n #    define WSTOPSIG(s)       ((s) >> 8)\ndiff --color -ruwN source/jobs.c source-new/jobs.c\n--- source/jobs.c\t2022-12-14 00:09:02.000000000 +0700\n+++ source-new/jobs.c\t2026-02-09 23:29:28.811403291 +0700\n@@ -4417,9 +4417,11 @@\n \t{\n \t  shell_pgrp = getpid ();\n \t  setpgid (0, shell_pgrp);\n+  }\n+\n+    // shell pgrep is not set automatically on Redox\n \t  if (shell_tty != -1)\n \t    tcsetpgrp (shell_tty, shell_pgrp);\n-\t}\n \n       tty_sigs = 0;\n       while ((terminal_pgrp = tcgetpgrp (shell_tty)) != -1)\ndiff -ruwN source/lib/readline/input.c source-new/lib/readline/input.c\n--- source/lib/readline/input.c\t2022-04-09 02:43:24.000000000 +0700\n+++ source-new/lib/readline/input.c\t2025-09-01 04:36:35.276926707 +0700\n@@ -805,7 +805,7 @@\n   int result;\n   unsigned char c;\n   int fd;\n-#if defined (HAVE_PSELECT)\n+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)\n   sigset_t empty_set;\n   fd_set readfds;\n #endif\ndiff -ruwN source/lib/readline/terminal.c source-new/lib/readline/terminal.c\n--- source/lib/readline/terminal.c\t2022-04-05 21:44:17.000000000 +0700\n+++ source-new/lib/readline/terminal.c\t2025-09-01 04:36:35.286927174 +0700\n@@ -102,7 +102,7 @@\n \n static int tcap_initialized;\n \n-#if !defined (__linux__) && !defined (NCURSES_VERSION)\n+#if !defined (__linux__) && !defined (NCURSES_VERSION) && !defined (__redox__)\n #  if defined (__EMX__) || defined (NEED_EXTERN_PC)\n extern \n #  endif /* __EMX__ || NEED_EXTERN_PC */\ndiff -ruwN source/lib/sh/getcwd.c source-new/lib/sh/getcwd.c\n--- source/lib/sh/getcwd.c\t2012-03-10 22:48:50.000000000 +0700\n+++ source-new/lib/sh/getcwd.c\t2025-09-01 04:36:35.286927174 +0700\n@@ -20,7 +20,7 @@\n \n #include <config.h>\n \n-#if !defined (HAVE_GETCWD)\n+#if !defined (HAVE_GETCWD) && !defined(__redox__)\n \n #if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)\n   #pragma alloca\ndiff -ruwN source/lib/sh/input_avail.c source-new/lib/sh/input_avail.c\n--- source/lib/sh/input_avail.c\t2021-05-24 22:16:33.000000000 +0700\n+++ source-new/lib/sh/input_avail.c\t2025-09-01 04:36:35.298927735 +0700\n@@ -33,7 +33,7 @@\n #  include <sys/file.h>\n #endif /* HAVE_SYS_FILE_H */\n \n-#if defined (HAVE_PSELECT)\n+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)\n #  include <signal.h>\n #endif\n \ndiff -ruwN source/lib/sh/strtoimax.c source-new/lib/sh/strtoimax.c\n--- source/lib/sh/strtoimax.c\t2021-09-10 21:32:35.000000000 +0700\n+++ source-new/lib/sh/strtoimax.c\t2025-09-01 04:36:35.301927876 +0700\n@@ -55,6 +55,8 @@\n extern long long strtoll PARAMS((const char *, char **, int));\n #endif\n \n+#if !defined (__redox__)\n+\n #ifdef strtoimax\n #undef strtoimax\n #endif\n@@ -79,6 +81,8 @@\n   return (strtol (ptr, endptr, base));\n }\n \n+#endif\n+\n #ifdef TESTING\n # include <stdio.h>\n int\ndiff -ruwN source/parse.y source-new/parse.y\n--- source/parse.y\t2022-12-14 00:09:02.000000000 +0700\n+++ source-new/parse.y\t2025-09-01 04:36:35.302927923 +0700\n@@ -2625,6 +2625,7 @@\n       parser_state |= PST_ENDALIAS;\n       /* We need to do this to make sure last_shell_getc_is_singlebyte returns\n \t true, since we are returning a single-byte space. */\n+#if defined (HANDLE_MULTIBYTE)\n       if (shell_input_line_index == shell_input_line_len && last_shell_getc_is_singlebyte == 0)\n \t{\n #if 0\n@@ -2638,6 +2639,7 @@\n \t  shell_input_line_property[shell_input_line_index - 1] = 1;\n #endif\n \t}\n+#endif /* HANDLE_MULTIBYTE */\n       return ' ';\t/* END_ALIAS */\n     }\n #endif\ndiff -ruwN source/y.tab.c source-new/y.tab.c\n--- source/y.tab.c\t2022-12-14 00:09:02.000000000 +0700\n+++ source-new/y.tab.c\t2025-09-01 04:36:35.307928157 +0700\n@@ -4936,6 +4936,7 @@\n       parser_state |= PST_ENDALIAS;\n       /* We need to do this to make sure last_shell_getc_is_singlebyte returns\n \t true, since we are returning a single-byte space. */\n+#if defined (HANDLE_MULTIBYTE)\n       if (shell_input_line_index == shell_input_line_len && last_shell_getc_is_singlebyte == 0)\n \t{\n #if 0\n@@ -4949,6 +4950,7 @@\n \t  shell_input_line_property[shell_input_line_index - 1] = 1;\n #endif\n \t}\n+#endif /* HANDLE_MULTIBYTE */\n       return ' ';\t/* END_ALIAS */\n     }\n #endif\n"
  },
  {
    "path": "recipes/shells/nushell/recipe.toml",
    "content": "#TODO: Reduce crate patches\n[source]\ngit = \"https://github.com/nushell/nushell\"\nrev = \"172a070a4bbeff15a289813bc73d4628a3032210\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n  \"openssl1\"\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/shells/nushell/redox.patch",
    "content": "diff --git a/Cargo.lock b/Cargo.lock\nindex 96aeafeae..01486a61d 100644\n--- a/Cargo.lock\n+++ b/Cargo.lock\n@@ -180,14 +180,11 @@ source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4\"\n dependencies = [\n  \"clipboard-win\",\n- \"core-graphics\",\n- \"image\",\n  \"log\",\n- \"objc2 0.5.2\",\n+ \"objc2\",\n  \"objc2-app-kit\",\n  \"objc2-foundation\",\n  \"parking_lot\",\n- \"windows-sys 0.48.0\",\n  \"wl-clipboard-rs\",\n  \"x11rb\",\n ]\n@@ -884,16 +881,7 @@ version = \"0.5.1\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f\"\n dependencies = [\n- \"objc2 0.5.2\",\n-]\n-\n-[[package]]\n-name = \"block2\"\n-version = \"0.6.2\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5\"\n-dependencies = [\n- \"objc2 0.6.3\",\n+ \"objc2\",\n ]\n \n [[package]]\n@@ -987,12 +975,6 @@ version = \"1.5.0\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b\"\n \n-[[package]]\n-name = \"byteorder-lite\"\n-version = \"0.1.0\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495\"\n-\n [[package]]\n name = \"bytes\"\n version = \"1.11.1\"\n@@ -1438,30 +1420,6 @@ version = \"0.8.7\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b\"\n \n-[[package]]\n-name = \"core-graphics\"\n-version = \"0.23.2\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081\"\n-dependencies = [\n- \"bitflags 1.3.2\",\n- \"core-foundation 0.9.4\",\n- \"core-graphics-types\",\n- \"foreign-types 0.5.0\",\n- \"libc\",\n-]\n-\n-[[package]]\n-name = \"core-graphics-types\"\n-version = \"0.1.3\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf\"\n-dependencies = [\n- \"bitflags 1.3.2\",\n- \"core-foundation 0.9.4\",\n- \"libc\",\n-]\n-\n [[package]]\n name = \"cpufeatures\"\n version = \"0.2.17\"\n@@ -1639,17 +1597,6 @@ dependencies = [\n  \"memchr\",\n ]\n \n-[[package]]\n-name = \"ctrlc\"\n-version = \"3.5.1\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790\"\n-dependencies = [\n- \"dispatch2\",\n- \"nix 0.30.1\",\n- \"windows-sys 0.61.0\",\n-]\n-\n [[package]]\n name = \"curl\"\n version = \"0.4.47\"\n@@ -1881,18 +1828,6 @@ dependencies = [\n  \"windows-sys 0.61.0\",\n ]\n \n-[[package]]\n-name = \"dispatch2\"\n-version = \"0.3.0\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec\"\n-dependencies = [\n- \"bitflags 2.10.0\",\n- \"block2 0.6.2\",\n- \"libc\",\n- \"objc2 0.6.3\",\n-]\n-\n [[package]]\n name = \"displaydoc\"\n version = \"0.2.5\"\n@@ -2016,7 +1951,6 @@ version = \"0.11.1\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"e49905ece098e793ca21a019598e9efc9a66459ad1d76bd7619e771a42dae2fc\"\n dependencies = [\n- \"arboard\",\n  \"crossterm 0.29.0\",\n  \"edit\",\n  \"edtui-jagged\",\n@@ -2228,26 +2162,6 @@ version = \"2.3.0\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be\"\n \n-[[package]]\n-name = \"fax\"\n-version = \"0.2.6\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab\"\n-dependencies = [\n- \"fax_derive\",\n-]\n-\n-[[package]]\n-name = \"fax_derive\"\n-version = \"0.2.0\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d\"\n-dependencies = [\n- \"proc-macro2\",\n- \"quote\",\n- \"syn 2.0.114\",\n-]\n-\n [[package]]\n name = \"fd-lock\"\n version = \"4.0.2\"\n@@ -2259,15 +2173,6 @@ dependencies = [\n  \"windows-sys 0.52.0\",\n ]\n \n-[[package]]\n-name = \"fdeflate\"\n-version = \"0.3.7\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c\"\n-dependencies = [\n- \"simd-adler32\",\n-]\n-\n [[package]]\n name = \"file-id\"\n version = \"0.2.2\"\n@@ -2408,28 +2313,7 @@ version = \"0.3.2\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1\"\n dependencies = [\n- \"foreign-types-shared 0.1.1\",\n-]\n-\n-[[package]]\n-name = \"foreign-types\"\n-version = \"0.5.0\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965\"\n-dependencies = [\n- \"foreign-types-macros\",\n- \"foreign-types-shared 0.3.1\",\n-]\n-\n-[[package]]\n-name = \"foreign-types-macros\"\n-version = \"0.2.3\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742\"\n-dependencies = [\n- \"proc-macro2\",\n- \"quote\",\n- \"syn 2.0.114\",\n+ \"foreign-types-shared\",\n ]\n \n [[package]]\n@@ -2438,12 +2322,6 @@ version = \"0.1.1\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b\"\n \n-[[package]]\n-name = \"foreign-types-shared\"\n-version = \"0.3.1\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b\"\n-\n [[package]]\n name = \"form_urlencoded\"\n version = \"1.2.2\"\n@@ -2711,17 +2589,6 @@ dependencies = [\n  \"tracing\",\n ]\n \n-[[package]]\n-name = \"half\"\n-version = \"2.7.1\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b\"\n-dependencies = [\n- \"cfg-if\",\n- \"crunchy\",\n- \"zerocopy 0.8.34\",\n-]\n-\n [[package]]\n name = \"halfbrown\"\n version = \"0.4.0\"\n@@ -3154,20 +3021,6 @@ dependencies = [\n  \"icu_properties\",\n ]\n \n-[[package]]\n-name = \"image\"\n-version = \"0.25.9\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a\"\n-dependencies = [\n- \"bytemuck\",\n- \"byteorder-lite\",\n- \"moxcms\",\n- \"num-traits\",\n- \"png\",\n- \"tiff\",\n-]\n-\n [[package]]\n name = \"indexmap\"\n version = \"2.13.0\"\n@@ -3932,7 +3785,6 @@ source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\"\n dependencies = [\n  \"adler2\",\n- \"simd-adler32\",\n ]\n \n [[package]]\n@@ -3982,16 +3834,6 @@ dependencies = [\n  \"tokio\",\n ]\n \n-[[package]]\n-name = \"moxcms\"\n-version = \"0.7.11\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97\"\n-dependencies = [\n- \"num-traits\",\n- \"pxfm\",\n-]\n-\n [[package]]\n name = \"multipart-rs\"\n version = \"0.1.13\"\n@@ -4119,7 +3961,6 @@ version = \"0.110.1\"\n dependencies = [\n  \"assert_cmd\",\n  \"crossterm 0.29.0\",\n- \"ctrlc\",\n  \"dirs\",\n  \"fancy-regex\",\n  \"lexopt\",\n@@ -5043,15 +4884,6 @@ dependencies = [\n  \"objc2-encode\",\n ]\n \n-[[package]]\n-name = \"objc2\"\n-version = \"0.6.3\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05\"\n-dependencies = [\n- \"objc2-encode\",\n-]\n-\n [[package]]\n name = \"objc2-app-kit\"\n version = \"0.2.2\"\n@@ -5059,9 +4891,9 @@ source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff\"\n dependencies = [\n  \"bitflags 2.10.0\",\n- \"block2 0.5.1\",\n+ \"block2\",\n  \"libc\",\n- \"objc2 0.5.2\",\n+ \"objc2\",\n  \"objc2-core-data\",\n  \"objc2-core-image\",\n  \"objc2-foundation\",\n@@ -5075,8 +4907,8 @@ source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef\"\n dependencies = [\n  \"bitflags 2.10.0\",\n- \"block2 0.5.1\",\n- \"objc2 0.5.2\",\n+ \"block2\",\n+ \"objc2\",\n  \"objc2-foundation\",\n ]\n \n@@ -5095,8 +4927,8 @@ version = \"0.2.2\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80\"\n dependencies = [\n- \"block2 0.5.1\",\n- \"objc2 0.5.2\",\n+ \"block2\",\n+ \"objc2\",\n  \"objc2-foundation\",\n  \"objc2-metal\",\n ]\n@@ -5114,9 +4946,9 @@ source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8\"\n dependencies = [\n  \"bitflags 2.10.0\",\n- \"block2 0.5.1\",\n+ \"block2\",\n  \"libc\",\n- \"objc2 0.5.2\",\n+ \"objc2\",\n ]\n \n [[package]]\n@@ -5136,8 +4968,8 @@ source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6\"\n dependencies = [\n  \"bitflags 2.10.0\",\n- \"block2 0.5.1\",\n- \"objc2 0.5.2\",\n+ \"block2\",\n+ \"objc2\",\n  \"objc2-foundation\",\n ]\n \n@@ -5148,8 +4980,8 @@ source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a\"\n dependencies = [\n  \"bitflags 2.10.0\",\n- \"block2 0.5.1\",\n- \"objc2 0.5.2\",\n+ \"block2\",\n+ \"objc2\",\n  \"objc2-foundation\",\n  \"objc2-metal\",\n ]\n@@ -5241,7 +5073,7 @@ checksum = \"fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da\"\n dependencies = [\n  \"bitflags 2.10.0\",\n  \"cfg-if\",\n- \"foreign-types 0.3.2\",\n+ \"foreign-types\",\n  \"libc\",\n  \"once_cell\",\n  \"openssl-macros\",\n@@ -5638,19 +5470,6 @@ dependencies = [\n  \"time\",\n ]\n \n-[[package]]\n-name = \"png\"\n-version = \"0.18.0\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0\"\n-dependencies = [\n- \"bitflags 2.10.0\",\n- \"crc32fast\",\n- \"fdeflate\",\n- \"flate2\",\n- \"miniz_oxide\",\n-]\n-\n [[package]]\n name = \"polars\"\n version = \"0.52.0\"\n@@ -6392,27 +6211,12 @@ dependencies = [\n  \"thiserror 1.0.69\",\n ]\n \n-[[package]]\n-name = \"pxfm\"\n-version = \"0.1.27\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8\"\n-dependencies = [\n- \"num-traits\",\n-]\n-\n [[package]]\n name = \"quick-error\"\n version = \"1.2.3\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0\"\n \n-[[package]]\n-name = \"quick-error\"\n-version = \"2.0.1\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3\"\n-\n [[package]]\n name = \"quick-xml\"\n version = \"0.36.2\"\n@@ -7948,7 +7752,7 @@ source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"36e39da5d30887b5690e29de4c5ebb8ddff64ebd9933f98a01daaa4fd11b36ea\"\n dependencies = [\n  \"peresil\",\n- \"quick-error 1.2.3\",\n+ \"quick-error\",\n  \"sxd-document\",\n ]\n \n@@ -8169,20 +7973,6 @@ dependencies = [\n  \"once_cell\",\n ]\n \n-[[package]]\n-name = \"tiff\"\n-version = \"0.10.3\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f\"\n-dependencies = [\n- \"fax\",\n- \"flate2\",\n- \"half\",\n- \"quick-error 2.0.1\",\n- \"weezl\",\n- \"zune-jpeg\",\n-]\n-\n [[package]]\n name = \"time\"\n version = \"0.3.47\"\n@@ -8510,7 +8300,7 @@ dependencies = [\n  \"chrono\",\n  \"libc\",\n  \"log\",\n- \"objc2 0.5.2\",\n+ \"objc2\",\n  \"objc2-foundation\",\n  \"once_cell\",\n  \"percent-encoding\",\n@@ -9353,12 +9143,6 @@ dependencies = [\n  \"rustls-pki-types\",\n ]\n \n-[[package]]\n-name = \"weezl\"\n-version = \"0.1.12\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88\"\n-\n [[package]]\n name = \"which\"\n version = \"4.4.2\"\n@@ -10242,18 +10026,3 @@ dependencies = [\n  \"cc\",\n  \"pkg-config\",\n ]\n-\n-[[package]]\n-name = \"zune-core\"\n-version = \"0.4.12\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a\"\n-\n-[[package]]\n-name = \"zune-jpeg\"\n-version = \"0.4.21\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713\"\n-dependencies = [\n- \"zune-core\",\n-]\ndiff --git a/Cargo.toml b/Cargo.toml\nindex 1ec173b6d..4c9293791 100644\n--- a/Cargo.toml\n+++ b/Cargo.toml\n@@ -89,7 +89,6 @@ chrono-tz = \"0.10\"\n crossbeam-channel = \"0.5.15\"\n crossterm = \"0.29.0\"\n csv = \"1.4\"\n-ctrlc = \"3.5\"\n devicons = \"0.6.12\"\n dialoguer = { default-features = false, version = \"0.12\" }\n digest = { default-features = false, version = \"0.10\" }\n@@ -248,7 +247,6 @@ nu-mcp = { path = \"./crates/nu-mcp\", version = \"0.110.1\", optional = true }\n reedline = { workspace = true, features = [\"bashisms\"] }\n \n crossterm = { workspace = true }\n-ctrlc = { workspace = true }\n dirs = { workspace = true }\n log = { workspace = true }\n lexopt = { workspace = true }\ndiff --git a/crates/nu-command/src/default_context.rs b/crates/nu-command/src/default_context.rs\nindex fcc7fa3f9..a80237429 100644\n--- a/crates/nu-command/src/default_context.rs\n+++ b/crates/nu-command/src/default_context.rs\n@@ -271,9 +271,6 @@ pub fn add_shell_command_context(mut engine_state: EngineState) -> EngineState {\n             Whoami,\n         };\n \n-        #[cfg(all(unix, feature = \"os\"))]\n-        bind_command! { ULimit };\n-\n         #[cfg(all(unix, feature = \"os\"))]\n         bind_command! { UMask };\n \ndiff --git a/crates/nu-command/src/filesystem/ls.rs b/crates/nu-command/src/filesystem/ls.rs\nindex 554ec0fd9..7aae4bdc3 100644\n--- a/crates/nu-command/src/filesystem/ls.rs\n+++ b/crates/nu-command/src/filesystem/ls.rs\n@@ -773,20 +773,12 @@ pub(crate) fn dir_entry_dict(\n \n             record.push(\n                 \"user\",\n-                if let Some(user) = users::get_user_by_uid(md.uid().into()) {\n-                    Value::string(user.name, span)\n-                } else {\n-                    Value::int(md.uid().into(), span)\n-                },\n+                Value::int(md.uid().into(), span)\n             );\n \n             record.push(\n                 \"group\",\n-                if let Some(group) = users::get_group_by_gid(md.gid().into()) {\n-                    Value::string(group.name, span)\n-                } else {\n-                    Value::int(md.gid().into(), span)\n-                },\n+                Value::int(md.gid().into(), span)\n             );\n         }\n     }\ndiff --git a/crates/nu-command/src/filesystem/ucp.rs b/crates/nu-command/src/filesystem/ucp.rs\nindex 2198911e6..b193dab2c 100644\n--- a/crates/nu-command/src/filesystem/ucp.rs\n+++ b/crates/nu-command/src/filesystem/ucp.rs\n@@ -320,7 +320,8 @@ fn make_attributes(preserve: Option<Value>) -> Result<uu_cp::Attributes, ShellEr\n                 target_os = \"android\",\n                 target_os = \"macos\",\n                 target_os = \"netbsd\",\n-                target_os = \"openbsd\"\n+                target_os = \"openbsd\",\n+                target_os = \"redox\",\n             ))]\n             ownership: ATTR_UNSET,\n             mode: ATTR_UNSET,\n@@ -342,7 +343,8 @@ fn make_attributes(preserve: Option<Value>) -> Result<uu_cp::Attributes, ShellEr\n                 target_os = \"android\",\n                 target_os = \"macos\",\n                 target_os = \"netbsd\",\n-                target_os = \"openbsd\"\n+                target_os = \"openbsd\",\n+                target_os = \"redox\",\n             ))]\n             ownership: ATTR_UNSET,\n             timestamps: ATTR_UNSET,\ndiff --git a/crates/nu-command/src/platform/mod.rs b/crates/nu-command/src/platform/mod.rs\nindex 624587747..38f026dcb 100644\n--- a/crates/nu-command/src/platform/mod.rs\n+++ b/crates/nu-command/src/platform/mod.rs\n@@ -6,8 +6,6 @@ mod kill;\n mod sleep;\n mod term;\n #[cfg(unix)]\n-mod ulimit;\n-#[cfg(unix)]\n mod umask_;\n mod whoami;\n \n@@ -21,7 +19,5 @@ pub use kill::Kill;\n pub use sleep::Sleep;\n pub use term::{Term, TermQuery, TermSize};\n #[cfg(unix)]\n-pub use ulimit::ULimit;\n-#[cfg(unix)]\n pub use umask_::UMask;\n pub use whoami::Whoami;\ndiff --git a/crates/nu-explore/Cargo.toml b/crates/nu-explore/Cargo.toml\nindex 4375ca1d5..f8848f7a1 100644\n--- a/crates/nu-explore/Cargo.toml\n+++ b/crates/nu-explore/Cargo.toml\n@@ -38,7 +38,6 @@ serde_json = { workspace = true, features = [\"preserve_order\"] }\n strip-ansi-escapes = { workspace = true }\n edtui = { version = \"0.11.1\", default-features = false, features = [\n     \"system-editor\",\n-    \"arboard\",\n ] }\n tui-tree-widget = \"0.24\"\n unicode-segmentation = { workspace = true }\ndiff --git a/crates/nu-utils/src/filesystem.rs b/crates/nu-utils/src/filesystem.rs\nindex 6766e0cb9..ed340aedf 100644\n--- a/crates/nu-utils/src/filesystem.rs\n+++ b/crates/nu-utils/src/filesystem.rs\n@@ -40,15 +40,7 @@ pub fn have_permission(dir: impl AsRef<Path>) -> PermissionResult {\n \n #[cfg(unix)]\n pub mod users {\n-    use nix::unistd::{Gid, Group, Uid, User};\n-\n-    pub fn get_user_by_uid(uid: Uid) -> Option<User> {\n-        User::from_uid(uid).ok().flatten()\n-    }\n-\n-    pub fn get_group_by_gid(gid: Gid) -> Option<Group> {\n-        Group::from_gid(gid).ok().flatten()\n-    }\n+    use nix::unistd::{Gid, Uid};\n \n     pub fn get_current_uid() -> Uid {\n         Uid::current()\n@@ -60,7 +52,7 @@ pub mod users {\n \n     #[cfg(not(any(target_os = \"linux\", target_os = \"freebsd\", target_os = \"android\")))]\n     pub fn get_current_username() -> Option<String> {\n-        get_user_by_uid(get_current_uid()).map(|user| user.name)\n+        None\n     }\n \n     #[cfg(any(target_os = \"linux\", target_os = \"freebsd\", target_os = \"android\"))]\n@@ -127,22 +119,7 @@ pub mod users {\n             nix::libc::getgrouplist(name.as_ptr(), gid.as_raw(), buff.as_mut_ptr(), &mut count)\n         };\n \n-        if res < 0 {\n-            None\n-        } else {\n-            buff.truncate(count as usize);\n-            buff.sort_unstable();\n-            buff.dedup();\n-            // allow trivial cast: on macos i is i32, on linux it's already gid_t\n-            #[allow(trivial_numeric_casts)]\n-            Some(\n-                buff.into_iter()\n-                    .map(|id| Gid::from_raw(id as gid_t))\n-                    .filter_map(get_group_by_gid)\n-                    .map(|group| group.gid)\n-                    .collect(),\n-            )\n-        }\n+        None\n     }\n }\n \ndiff --git a/rust-toolchain.toml b/rust-toolchain.toml\ndeleted file mode 100644\nindex 37ca9dfd1..000000000\n--- a/rust-toolchain.toml\n+++ /dev/null\n@@ -1,17 +0,0 @@\n-# So, you want to update the Rust toolchain...\n-# The key is making sure all our dependencies support the version of Rust we're using,\n-# and that nushell compiles on all the platforms tested in our CI.\n-\n-# Here's some documentation on how to use this file:\n-# https://rust-lang.github.io/rustup/overrides.html#the-toolchain-file\n-\n-[toolchain]\n-# The default profile includes rustc, rust-std, cargo, rust-docs, rustfmt and clippy.\n-# https://rust-lang.github.io/rustup/concepts/profiles.html\n-profile = \"default\"\n-# The current plan is to be 2 releases behind the latest stable release. So, if the\n-# latest stable release is 1.72.0, the channel should be 1.70.0. We want to do this\n-# so that we give repo maintainers and package managers a chance to update to a more\n-# recent version of rust. However, if there is a \"cool new feature\" that we want to\n-# use in nushell, we may opt to use the bleeding edge stable version of rust.\n-channel = \"1.91.1\"\ndiff --git a/src/signals.rs b/src/signals.rs\nindex c3a4b8379..d5be1009c 100644\n--- a/src/signals.rs\n+++ b/src/signals.rs\n@@ -25,10 +25,4 @@ pub(crate) fn ctrlc_protection(engine_state: &mut EngineState) {\n         .expect(\"Failed to register interrupt signal handler\");\n \n     engine_state.signal_handlers = Some(signal_handlers.clone());\n-\n-    ctrlc::set_handler(move || {\n-        interrupt.store(true, Ordering::Relaxed);\n-        signal_handlers.run(SignalAction::Interrupt);\n-    })\n-    .expect(\"Error setting Ctrl-C handler\");\n }\n"
  },
  {
    "path": "recipes/sound/freepats/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/freepats.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/share/freepats\"\ncp -Rv \"${COOKBOOK_SOURCE}/\"* \"${COOKBOOK_STAGE}/share/freepats\"\nmkdir -pv \"${COOKBOOK_STAGE}/etc/timidity\"\necho \"dir /share/freepats\" > \"${COOKBOOK_STAGE}/etc/timidity/freepats.cfg\"\necho \"source /share/freepats/freepats.cfg\" >> \"${COOKBOOK_STAGE}/etc/timidity/freepats.cfg\"\n\"\"\"\n"
  },
  {
    "path": "recipes/sound/rodioplay/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/rodioplay.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/sound/timidity/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/timidity.git\"\nbranch = \"redox\"\nscript = \"\"\"\nautoreconf -f -i\n\nwget -O autoconf/config.sub \"https://gitlab.redox-os.org/redox-os/gnu-config/-/raw/master/config.sub?inline=false\"\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nexport LDFLAGS=\"-static\"\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --build=\"$(gcc -dumpmachine)\"\n    --host=\"${TARGET}\"\n    --prefix=\"\"\n    --enable-vt100\n)\n\ncookbook_configure\n\n# Create configuration files\nmkdir -pv \"${COOKBOOK_STAGE}/etc/timidity\"\necho \"soundfont /share/generaluser-gs/generaluser-gs.sf2\" >> \"${COOKBOOK_STAGE}/etc/timidity/timidity.cfg\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/share/timidity\"\necho \"soundfont /share/generaluser-gs/generaluser-gs.sf2\" >> \"${COOKBOOK_STAGE}/share/timidity/timidity.cfg\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"generaluser-gs\",\n]"
  },
  {
    "path": "recipes/terminal/bash-completion/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/scop/bash-completion/releases/download/2.17.0/bash-completion-2.17.0.tar.xz\"\nb3sum = \"5d6725f3baea16467f9a360dde24fb1b9ed1cd3c4e9eb7a3b959d94864a98429\"\n\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--prefix=/\",\n]\n\n[package]\ndependencies = [\n    \"sed\",\n]\n"
  },
  {
    "path": "recipes/terminal/pls/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pls-rs/pls\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/terminal/zoxide/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/ajeetdsouza/zoxide\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tests/acid/recipe.toml",
    "content": "# Due to necessary write permission for compilation the filesystem path of source code installation is an exception\n# where the package manager can't switch between system-wide and user paths\n[source]\ngit = \"https://gitlab.redox-os.org/redox-os/acid.git\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/acid\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user/acid\"\n\"\"\"\n[package]\ndependencies = [\"rust\"]\n"
  },
  {
    "path": "recipes/tests/acid-bins/recipe.toml",
    "content": "[source]\nsame_as = \"../acid\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tests/benchmarks/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/benchmarks\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/benchmarks\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/share/benchmarks\n\"\"\"\n\n[package]\ndependencies = [\n    \"iperf3\"\n]\n"
  },
  {
    "path": "recipes/tests/hello-redox/files/test.c",
    "content": "#include <stdio.h>\n\nint main(void) {\n\tprintf(\"Hello, Redox!\\\\n\");\n}\n"
  },
  {
    "path": "recipes/tests/hello-redox/files/test.cpp",
    "content": "#include <iostream>\n\nint main()\n{\n   std::cout << \"Hello, Redox!\" << std::endl;\n}\n"
  },
  {
    "path": "recipes/tests/hello-redox/files/test.go",
    "content": "package main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"Hello, Redox!\")\n}\n"
  },
  {
    "path": "recipes/tests/hello-redox/files/test.java",
    "content": "public class Java {\n\tpublic static void main(String[] args) {\n\t\tSystem.out.println(\"Hello Redox\");\n\t}\n}\n"
  },
  {
    "path": "recipes/tests/hello-redox/files/test.js",
    "content": "console.log(\"Hello Redox\");\n"
  },
  {
    "path": "recipes/tests/hello-redox/files/test.lua",
    "content": "print(\"Hello, Redox!\")\n"
  },
  {
    "path": "recipes/tests/hello-redox/files/test.py",
    "content": "print(\"Hello, Redox!\")\n"
  },
  {
    "path": "recipes/tests/hello-redox/files/test.rs",
    "content": "fn main() {\n    println!(\"Hello, Redox!\");\n}\n"
  },
  {
    "path": "recipes/tests/hello-redox/files/test.zig",
    "content": "const std = @import(\"std\");\n\npub fn main() !void {\n    std.debug.print(\"Hello, Redox!\\n\", .{});\n}\n"
  },
  {
    "path": "recipes/tests/hello-redox/recipe.toml",
    "content": "# Due to necessary write permission for compilation the filesystem path of source code installation is an exception\n# where the package manager can't switch between system-wide and user paths\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/hello-redox\"\ncp -rv \"${COOKBOOK_RECIPE}\"/files/* \"${COOKBOOK_STAGE}/home/user/hello-redox\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tests/iperf3/recipe.toml",
    "content": "[source]\ntar = \"https://downloads.es.net/pub/iperf/iperf-3.20.tar.gz\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/tests/openposixtestsuite/recipe.toml",
    "content": "# Due to necessary write permission for compilation the filesystem path of source code installation is an exception\n# where the package manager can't switch between system-wide and user paths\n[source]\ngit = \"https://gitlab.redox-os.org/redox-os/openposixtestsuite.git\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/openposixtestsuite\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user/openposixtestsuite\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"gcc13\",\n    \"gnu-binutils\",\n    \"gnu-make\",\n    \"sed\",\n]\n\n"
  },
  {
    "path": "recipes/tests/os-test/recipe.toml",
    "content": "# Due to necessary write permission for compilation the filesystem path of source code installation is an exception\n# where the package manager can't switch between system-wide and user paths\n# TODO remove gnu-grep when extrautils grep supports grep -E\n[source]\ngit = \"https://gitlab.com/sortix/os-test\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/os-test\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user/os-test\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"gcc13\",\n    \"gnu-binutils\",\n    \"gnu-grep\",\n    \"gnu-make\",\n    \"libarchive\",\n    \"sed\",\n]\n"
  },
  {
    "path": "recipes/tests/os-test-bins/recipe.toml",
    "content": "[source]\nsame_as = \"../os-test\"\n\n[build]\ndependencies = [\n    \"gettext\",\n    \"libarchive\",\n    \"libiconv\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\n# Copy source to /usr/share/os-test\nmkdir -p \"${COOKBOOK_STAGE}/usr/share/os-test\"\ncd \"${COOKBOOK_STAGE}/usr/share/os-test\"\nrsync -a \"${COOKBOOK_SOURCE}/\" \"./\"\n\n# Pre-compile tests for Redox\nmake OS=Redox \\\n    CC=\"${CC_WRAPPER} ${GNU_TARGET}-gcc\" \\\n    CFLAGS=\"-I${COOKBOOK_SYSROOT}/include\" \\\n    CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include\" \\\n    LDFLAGS=\"-L${COOKBOOK_SYSROOT}/lib\" \\\n    EXTRA_LDFLAGS= \\\n    CC_FOR_BUILD=\"${CC_WRAPPER} cc\" \\\n    CFLAGS_FOR_BUILD= \\\n    CPPFLAGS_FOR_BUILD= \\\n    LDFLAGS_FOR_BUILD= \\\n    -j \"${COOKBOOK_MAKE_JOBS}\" \\\n    all\n\nskips=(\n    # These tests hang\n    basic/poll/poll\n    basic/pthread/pthread_barrierattr_setpshared\n    basic/pthread/pthread_cancel\n    basic/pthread/pthread_cleanup_pop\n    basic/pthread/pthread_cleanup_push\n    basic/pthread/pthread_condattr_setpshared\n    basic/pthread/pthread_mutex_consistent\n    basic/pthread/pthread_rwlock_timedrdlock\n    basic/pthread/pthread_rwlock_timedwrlock\n    basic/pthread/pthread_setcanceltype\n    basic/pthread/pthread_testcancel\n    basic/sys_select/select\n    basic/sys_time/select\n    basic/sys_wait/waitpid\n    signal/ppoll-block-sleep-raise-write\n    signal/ppoll-block-sleep-write-raise\n)\n\nfor skip in \"${skips[@]}\"\ndo\n    mkdir -p out.known/redox/\"$(dirname \"${skip}\")\"\n    echo \"skipped\" > out.known/redox/\"${skip}.out\"\ndone\n\ncp -t out -R out.known/redox\n\n# Create runner script\nmkdir -p \"${COOKBOOK_STAGE}/usr/bin\"\ncat > \"${COOKBOOK_STAGE}/usr/bin/os-test-runner\" <<EOF\n#!/usr/bin/env bash\nset -e\ncd /usr/share/os-test\n\necho \"Ensuring executables are newer than sources\"\nfind . -type f -perm /111 -exec touch '{}' ';'\n\necho \"Ensuring outputs are newer than sources and executables\"\nfind out -type f -exec touch '{}' ';'\n\nmake test\nmake html\nmake json\nEOF\nchmod +x \"${COOKBOOK_STAGE}/usr/bin/os-test-runner\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"gcc13\",\n    \"gnu-binutils\",\n    \"gnu-grep\",\n    \"gnu-make\",\n    \"libarchive\",\n    \"sed\",\n]\n"
  },
  {
    "path": "recipes/tests/os-test-result/recipe.toml",
    "content": "[source]\nsame_as = \"../os-test\"\n\n[build]\ntemplate = \"custom\"\ndev-dependencies = [\n    \"host:redoxer\",\n# allows rebuilding relibc without updating prefix\n    \"relibc\",\n    \"gnu-grep\",\n    \"libarchive\",\n]\nscript = \"\"\"\nif [ \"$TARGET\" = \"$COOKBOOK_HOST_TARGET\" ]; then\n# TODO: libc conflict on toolchain\nexport LD_LIBRARY_PATH=\"/lib/${GNU_TARGET}:${LD_LIBRARY_PATH}\"\nfi\n\nrsync -a \"${COOKBOOK_SOURCE}/\" ./\nos=$(echo \"${TARGET}\" | cut -d - -f3)\ncase \"$os\" in\n    linux)  OS=Linux;;\n    redox)  OS=Redox;;\nesac\n\n# allows linking to relibc instead of prefix/host libc\nexport CC=\"env LIBRARY_PATH=${COOKBOOK_SYSROOT}/lib ${GNU_TARGET}-gcc\"\nexport CFLAGS=\"\\\n-nostdinc \\\n-nostdlib \\\n-isystem ${COOKBOOK_SYSROOT}/include \\\n-static \\\n--sysroot ${COOKBOOK_SYSROOT} \\\n${COOKBOOK_SYSROOT}/lib/crt0.o \\\n${COOKBOOK_SYSROOT}/lib/crti.o \\\n${COOKBOOK_SYSROOT}/lib/crtn.o \\\n${COOKBOOK_SYSROOT}/lib/libc.a \\\n\"\n\nmake OS=${OS} CC=\"${CC}\" CFLAGS=\"${CFLAGS}\" CPPFLAGS= \\\n        LDFLAGS= EXTRA_LDFLAGS= \\\n        CC_FOR_BUILD=\"${CC_WRAPPER} cc\" CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \\\n        LDFLAGS_FOR_BUILD= -j ${COOKBOOK_MAKE_JOBS} all\n\nskips=(\n    # Skip hanging tests on Linux/Redox with relibc\n    basic/stdio/putc_unlocked\n)\n\nif [ \"$OS\" = \"Redox\" ]; then\nskips+=(\n    # Skip hanging tests on Redox with relibc\n    # https://gitlab.redox-os.org/redox-os/redox/-/issues/1752\n    basic/sys_socket/accept\n    basic/sys_socket/recv\n    basic/sys_socket/send\n    basic/sys_socket/shutdown\n    signal/ppoll-block-close\n    signal/ppoll-block-close-raise\n    signal/ppoll-block-raise\n    signal/ppoll-block-sleep-raise-write\n    signal/ppoll-block-sleep-raise\n    signal/ppoll-block-sleep-write-raise\n)\nfi\n\nfor skip in \"${skips[@]}\"\ndo\n    mkdir -p out.known/${os}/\"$(dirname \"${skip}\")\"\n    echo \"skipped\" > out.known/${os}/\"${skip}.out\"\ndone\n\ncp -t out -R out.known/${os}\n\npostinstall () {\nmake OS=${OS} CC_FOR_BUILD=\"${CC_WRAPPER} cc\" \\\n        CFLAGS_FOR_BUILD= CPPFLAGS_FOR_BUILD= \\\n        LDFLAGS_FOR_BUILD= html json jsonl\n\n    mkdir -p ${COOKBOOK_STAGE}/share/os-test\n    cp -a out ${COOKBOOK_STAGE}/share/os-test/out\n    cp -a html ${COOKBOOK_STAGE}/share/os-test/html\n    cp -a os-test.json ${COOKBOOK_STAGE}/share/os-test/os-test.json\n    cp -a os-test.jsonl ${COOKBOOK_STAGE}/share/os-test/os-test.jsonl\n}\n\nif [ \"$TARGET\" = \"$COOKBOOK_HOST_TARGET\" ]; then\n    make test\n    postinstall\nelse\n    # bash: gnu-make crashes randomly but can continue\n    # issues with multi-core and make jobs\n    # https://gitlab.redox-os.org/redox-os/relibc/-/issues/240\n    # https://gitlab.redox-os.org/redox-os/redox/-/issues/1753\n    export REDOXER_QEMU_ARGS=\"-smp 1\"\n    # make: jobs doesn't work yet\n    redoxer exec --folder . --folder \"${COOKBOOK_SYSROOT}/usr/:/usr\" --artifact out:/root/out \\\n        bash -c \"until make test; do echo retrying; done\"\n    postinstall\nfi\n\"\"\"\n"
  },
  {
    "path": "recipes/tests/redox-posix-tests/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/redox-posix-tests.git\"\n\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/redox-posix-tests\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user/redox-posix-tests\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"gcc13\",\n    \"gnu-binutils\",\n    \"gnu-make\",\n]\n\n"
  },
  {
    "path": "recipes/tests/relibc-tests/recipe.toml",
    "content": "# Due to necessary write permission for compilation the filesystem path of source code installation is an exception\n# where the package manager can't switch between system-wide and user paths\n[source]\nsame_as = \"../../core/relibc\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/relibc-tests\"\ncp -rv \"${COOKBOOK_SOURCE}/tests\" \"${COOKBOOK_STAGE}/home/user/relibc-tests\"\n\"\"\"\n\n[package]\ndependencies = [\"gcc13\"]\n"
  },
  {
    "path": "recipes/tests/relibc-tests-bins/recipe.toml",
    "content": "[source]\nsame_as = \"../../core/relibc\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nPACKAGE_PATH=\"tests\" cookbook_cargo\n\nDYNAMIC_INIT\nSRC=${COOKBOOK_SOURCE}/tests\nEXPECTSRC=${SRC}/expected/bins_dynamic\nDST=${COOKBOOK_STAGE}/root/relibc-tests\nCFLAGS+=\" -I${SRC}\"\nLDFLAGS+=\" -Wl,-rpath=\\\\$ORIGIN\"\npushd ${SRC}\nif [ -z \"$TESTBIN\" ]; then\nfor file in **/*.c; do\n    filename=\"${file%.*}\"\n    mkdir -p $(dirname $DST/$filename)\n    # adding \"true\" because compilation can fail\n    ${CC} ${CFLAGS} ${LDFLAGS} \"$SRC/$file\" -o \"$DST/$filename\" -Wall || true\n    if [[ -f \"${EXPECTSRC}/$filename.stdout\" ]]; then\n        echo \"relibc-tests ./$filename\" >> $DST/run.sh\n    else\n        echo \"relibc-tests -s./$filename\" >> $DST/run.sh\n    fi\ndone\nrsync -a ${EXPECTSRC} ${DST}/expected\npopd\nelse\n    mkdir -p $(dirname $DST/$TESTBIN) $(dirname $DST/expected/$TESTBIN)\n    ${CC} ${CFLAGS} ${LDFLAGS} \"$SRC/$TESTBIN.c\" -o \"$DST/$TESTBIN\" -Wall\n    if [[ -f \"${EXPECTSRC}/$TESTBIN.stdout\" ]]; then\n        cp ${EXPECTSRC}/$TESTBIN.{stdout,stderr} $(dirname $DST/expected/$TESTBIN)\n    fi\nfi\n\nif [ -n \"$TESTBIN\" ]; then\nif [[ -f \"${EXPECTSRC}/$TESTBIN.stdout\" ]]; then\n\"${COOKBOOK_REDOXER}\" write-exec sh -c \"cd /root/relibc-tests; relibc-tests ./$TESTBIN\"\nelse\n\"${COOKBOOK_REDOXER}\" write-exec sh -c \"cd /root/relibc-tests; relibc-tests -s./$TESTBIN\"\nfi\nfi\n\"\"\"\n"
  },
  {
    "path": "recipes/tests/schedrs/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/akshitgaur2005/schedrs.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tests/sysbench/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/akopytov/sysbench.git\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\nDYNAMIC_INIT\nautoreconf -fvi -I${COOKBOOK_HOST_SYSROOT}/share/aclocal\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\"luajit\"]\n\nscript = \"\"\"\nDYNAMIC_INIT\nexport CFLAGS+=\" -I${COOKBOOK_SYSROOT}/include/luajit-2.1\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n  --without-mysql\n  --with-system-luajit\n)\ncookbook_configure\n\"\"\"\n\n[package]\ndependencies = [\"luajit\"]\n"
  },
  {
    "path": "recipes/tests/sysbench/redox.patch",
    "content": "--- a/src/lua/internal/Makefile.am\n+++ b/src/lua/internal/Makefile.am\n@@ -26,7 +26,7 @@ SUFFIXES = .lua .lua.h\n\n .lua.lua.h:\n \t@echo \"Creating $@ from $<\"\n-\t@var=$$(echo $< | sed 's/\\./_/g')\t&& \\\n+\t@var=$$(basename $< | sed 's/\\./_/g')\t&& \\\n \t( echo \"unsigned char $${var}[] =\" \t&& \\\n \tsed -e 's/\\\\/\\\\\\\\/g'\t\t\t\\\n \t    -e 's/\"/\\\\\"/g'\t\t\t\\\n"
  },
  {
    "path": "recipes/tests/vttest/recipe.toml",
    "content": "[source]\ntar = \"https://invisible-island.net/archives/vttest/vttest-20140305.tgz\"\nblake3 = \"b515b9a5e1f1498ed99e1a1c172fbcfdf2b7a214e185bd2005cc994407ded89e\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\nGNU_CONFIG_GET config.sub\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nexport LDFLAGS=\"-static\"\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --build=\"$(gcc -dumpmachine)\"\n    --host=\"${TARGET}\"\n    --prefix=\"\"\n)\n\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/tests/vttest/redox.patch",
    "content": "diff -u source_original/main.c source/main.c\n--- source_original/main.c\t2014-01-16 22:15:19.000000000 +0100\n+++ source/main.c\t2017-10-30 18:31:22.365280877 +0100\n@@ -1295,8 +1295,8 @@\n void\n initterminal(int pn)\n {\n-  init_ttymodes(pn);\n-  setup_terminal(\"\");\n+  //init_ttymodes(pn);\n+  //setup_terminal(\"\");\n }\n\n   /* Set up my personal prejudices      */\nCommon subdirectories: source_original/package and source/package\ndiff -u source_original/unix_io.c source/unix_io.c\n--- source_original/unix_io.c\t2014-01-16 23:11:39.000000000 +0100\n+++ source/unix_io.c\t2017-10-30 18:48:13.927899071 +0100\n@@ -40,17 +40,17 @@\n   lval = last_char;\n   brkrd = FALSE;\n   reading = TRUE;\n-#ifdef HAVE_ALARM\n-  signal(SIGALRM, give_up);\n-  alarm(60);    /* timeout after 1 minute, in case user's keyboard is hung */\n-#endif\n+//#ifdef HAVE_ALARM\n+//  signal(SIGALRM, give_up);\n+//  alarm(60);    /* timeout after 1 minute, in case user's keyboard is hung */\n+//#endif\n   if (read(0, &one_byte, (size_t) 1) < 0)\n     ch = EOF;\n   else\n     ch = (int) one_byte;\n-#ifdef HAVE_ALARM\n-  alarm(0);\n-#endif\n+//#ifdef HAVE_ALARM\n+//  alarm(0);\n+//#endif\n   reading = FALSE;\n #ifdef DEBUG\n   {\n@@ -178,21 +178,21 @@\n void\n inflush(void)\n {\n-  int val;\n-\n-#ifdef HAVE_RDCHK\n-  while (rdchk(0))\n-    read(0, &val, 1);\n-#else\n-#if USE_FIONREAD\n-  int l1;\n-  ioctl(0, FIONREAD, &l1);\n-  while (l1-- > 0L)\n-    read(0, &val, (size_t) 1);\n-#else\n-  while (read(2, &val, (size_t) 1) > 0) ;\n-#endif\n-#endif\n+//  int val;\n+//\n+//#ifdef HAVE_RDCHK\n+//  while (rdchk(0))\n+//    read(0, &val, 1);\n+//#else\n+//#if USE_FIONREAD\n+//  int l1;\n+//  ioctl(0, FIONREAD, &l1);\n+//  while (l1-- > 0L)\n+//    read(0, &val, (size_t) 1);\n+//#else\n+//  while (read(2, &val, (size_t) 1) > 0) ;\n+//#endif\n+//#endif\n }\n\n void\n"
  },
  {
    "path": "recipes/tools/bzip2/pkgconfig",
    "content": "prefix=/usr\nexec_prefix=${prefix}\nlibdir=${exec_prefix}/lib\nincludedir=${prefix}/include\n\nName: bzip2\nDescription: A file compression library\nVersion: 1.0.8\nLibs: -L${libdir} -lbz2\nCflags: -I${includedir}"
  },
  {
    "path": "recipes/tools/bzip2/recipe.toml",
    "content": "[source]\ntar = \"https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz\"\nblake3 = \"97af3f520629c65fe41292f77e6ca798fe594d7987bfb2aebe7c6fcdc7ab5ed2\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\n# This installs the static library regardless of config options\n# The static lib is preferred according to the README because it's faster\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\"${COOKBOOK_MAKE}\" -j\"${COOKBOOK_MAKE_JOBS}\" \\\n    AR=\"${AR}\" \\\n    CC=\"${CC}\" \\\n    RANLIB=\"${RANLIB}\" \\\n    PREFIX=\"${COOKBOOK_STAGE}\" \\\n    install\n\n# However, distros distribute libbz2 as well so we'll support it too\n# Linking the lib fails if we don't rebuild the objects from earlier\n\"${COOKBOOK_MAKE}\" clean\n\n# This DOES NOT build/clobber the binaries already built above\n\"${COOKBOOK_MAKE}\" -f Makefile-libbz2_so \\\n    -j\"${COOKBOOK_MAKE_JOBS}\" \\\n    AR=\"${AR}\" \\\n    CC=\"${CC}\" \\\n    RANLIB=\"${RANLIB}\" \\\n    PREFIX=\"${COOKBOOK_STAGE}\"\n\ncp -av libbz2.so* \"${COOKBOOK_STAGE}/lib\"\nln -sr \"${COOKBOOK_STAGE}/lib/libbz2.so.1.0\" \"${COOKBOOK_STAGE}/lib/libbz2.so.1\"\nln -sr \"${COOKBOOK_STAGE}/lib/libbz2.so.1.0\" \"${COOKBOOK_STAGE}/lib/libbz2.so\"\n\nmkdir -p \"${COOKBOOK_STAGE}/lib/pkgconfig\"\ncp \"${COOKBOOK_RECIPE}/pkgconfig\" \"${COOKBOOK_STAGE}/lib/pkgconfig/bzip2.pc\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/cleye/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/cleye.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/cosmic-edit/manifest",
    "content": "name=COSMIC Text Editor\nbinary=/bin/cosmic-edit\nicon=/ui/icons/apps/accessories-text-editor.png\naccept=*.asm\naccept=*.conf\naccept=*.html\naccept=*.ion\naccept=*.list\naccept=*.lua\naccept=*.md\naccept=*.rc\naccept=*.rs\naccept=*.sh\naccept=*.toml\naccept=*.txt\nauthor=Jeremy Soller\ndescription=COSMIC Text Editor\n"
  },
  {
    "path": "recipes/tools/cosmic-edit/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/cosmic-edit.git\"\nbranch = \"master\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gettext\",\n    \"libxkbcommon\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport GETTEXT_DIR=\"${COOKBOOK_SYSROOT}/usr\"\ncookbook_cargo --no-default-features\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/30_cosmic-edit\"\n#TODO: install with just?\nAPPID=\"com.system76.CosmicEdit\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/applications/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.desktop\" \"${COOKBOOK_STAGE}/usr/share/applications/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.metainfo.xml\" \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/\"\ncp -rv \"${COOKBOOK_SOURCE}/res/icons/hicolor/\" \"${COOKBOOK_STAGE}/usr/share/icons/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/cosmic-files/manifest",
    "content": "name=COSMIC File Manager\nbinary=/bin/cosmic-files\nicon=/ui/icons/apps/system-file-manager.png\nauthor=Jeremy Soller\ndescription=COSMIC File Manager\n"
  },
  {
    "path": "recipes/tools/cosmic-files/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/cosmic-files.git\"\nbranch = \"master\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gettext\",\n    \"libxkbcommon\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport GETTEXT_DIR=\"${COOKBOOK_SYSROOT}/usr\"\ncookbook_cargo --no-default-features\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin/\"\ncp -v \"target/${TARGET}/release/cosmic-files\" \"${COOKBOOK_STAGE}/usr/bin/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps/\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/20_cosmic-files\"\n#TODO: install with just?\nAPPID=\"com.system76.CosmicFiles\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/applications/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.desktop\" \"${COOKBOOK_STAGE}/usr/share/applications/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.metainfo.xml\" \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/\"\ncp -rv \"${COOKBOOK_SOURCE}/res/icons/hicolor/\" \"${COOKBOOK_STAGE}/usr/share/icons/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/cosmic-reader/manifest",
    "content": "name=COSMIC Reader\nbinary=/bin/cosmic-reader\nicon=/ui/icons/apps/accessories-text-editor.png\naccept=*.pdf\nauthor=Jeremy Soller\ndescription=COSMIC Reader\n"
  },
  {
    "path": "recipes/tools/cosmic-reader/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/cosmic-reader.git\"\nbranch = \"master\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"libpng\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport BINDGEN_EXTRA_CLANG_ARGS=\"--sysroot=${COOKBOOK_HOST_SYSROOT}/${GNU_TARGET} -I${COOKBOOK_HOST_SYSROOT}/${GNU_TARGET}/include\"\n\"${COOKBOOK_CARGO}\" rustc \\\n    --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n    --release \\\n    --bin cosmic-reader \\\n    --no-default-features \\\n    --features mupdf \\\n    -- \\\n    -C link-args=\"-lpng -lexpat\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin/\"\ncp -v \"target/${TARGET}/release/cosmic-reader\" \"${COOKBOOK_STAGE}/usr/bin/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/40_cosmic-reader\"\n#TODO: install with just?\nAPPID=\"com.system76.CosmicReader\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/applications/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.desktop\" \"${COOKBOOK_STAGE}/usr/share/applications/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/thumbnailers/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.thumbnailer\" \"${COOKBOOK_STAGE}/usr/share/thumbnailers/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/\"\ncp -rv \"${COOKBOOK_SOURCE}/res/icons/hicolor/\" \"${COOKBOOK_STAGE}/usr/share/icons/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/cosmic-settings/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/cosmic-settings.git\"\nbranch = \"master\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gettext\",\n    \"libxkbcommon\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport GETTEXT_DIR=\"${COOKBOOK_SYSROOT}/usr\"\n(COOKBOOK_SOURCE+=\"/cosmic-settings\" cookbook_cargo --no-default-features \\\n    --config 'patch.crates-io.rustix.git = \"https://github.com/bytecodealliance/rustix\"' \\\n    --config 'patch.crates-io.rustix.rev = \"8bf15a0\"')\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin/\"\ncp -v \"target/${TARGET}/release/cosmic-settings\" \"${COOKBOOK_STAGE}/usr/bin/\"\n#TODO: install with just?\nAPPID=\"com.system76.CosmicSettings\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/applications/\"\nsed 's/Categories=COSMIC/Categories=Settings/' \"${COOKBOOK_SOURCE}/resources/applications/${APPID}.desktop\" > \"${COOKBOOK_STAGE}/usr/share/applications/${APPID}.desktop\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\ncp -v \"${COOKBOOK_SOURCE}/resources/${APPID}.metainfo.xml\" \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/\"\ncp -rv \"${COOKBOOK_SOURCE}/resources/default_schema/\" \"${COOKBOOK_STAGE}/usr/share/cosmic/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/\"\ncp -rv \"${COOKBOOK_SOURCE}/resources/icons/\" \"${COOKBOOK_STAGE}/usr/share/icons/hicolor/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/cosmic-store/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/cosmic-store.git\"\nbranch = \"master\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gettext\",\n    \"libxkbcommon\",\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport GETTEXT_DIR=\"${COOKBOOK_SYSROOT}/usr\"\nexport ZSTD_SYS_USE_PKG_CONFIG=1\ncookbook_cargo --no-default-features --features desktop,pkgar\n\n#TODO: install with just?\nAPPID=\"com.system76.CosmicStore\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/applications/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.desktop\" \"${COOKBOOK_STAGE}/usr/share/applications/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.metainfo.xml\" \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/\"\ncp -rv \"${COOKBOOK_SOURCE}/res/icons/hicolor/\" \"${COOKBOOK_STAGE}/usr/share/icons/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/cosmic-term/manifest",
    "content": "name=COSMIC Terminal\nbinary=/bin/cosmic-term\nicon=/ui/icons/apps/utilities-terminal.png\nauthor=Jeremy Soller\ndescription=COSMIC Terminal\n"
  },
  {
    "path": "recipes/tools/cosmic-term/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/cosmic-term.git\"\nbranch = \"master\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gettext\",\n    \"libxkbcommon\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport GETTEXT_DIR=\"${COOKBOOK_SYSROOT}/usr\"\ncookbook_cargo --no-default-features\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/10_cosmic-term\"\n#TODO: install with just?\nAPPID=\"com.system76.CosmicTerm\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/applications/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.desktop\" \"${COOKBOOK_STAGE}/usr/share/applications/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.metainfo.xml\" \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/\"\ncp -rv \"${COOKBOOK_SOURCE}/res/icons/hicolor/\" \"${COOKBOOK_STAGE}/usr/share/icons/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/cosmic-text/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/cosmic-text.git\"\nbranch = \"main\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CARGO_FLAGS=() # remove --locked\nCOOKBOOK_CARGO_PATH=examples/editor cookbook_cargo_build\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/diffutils/diffutils.patch",
    "content": "diff -ruw source/lib/cmpbuf.c source-new/lib/cmpbuf.c\n--- source/lib/cmpbuf.c\t2017-01-01 04:22:36.000000000 -0700\n+++ source-new/lib/cmpbuf.c\t2018-12-29 07:31:43.920193561 -0700\n@@ -71,8 +71,8 @@\n \t     ancient AIX hosts that set errno to EINTR after uncaught\n \t     SIGCONT.  See <news:1r77ojINN85n@ftp.UU.NET>\n \t     (1993-04-22).  */\n-\t  if (! SA_RESTART && errno == EINTR)\n-\t    continue;\n+\t  //if (! SA_RESTART && errno == EINTR)\n+\t  //  continue;\n \n \t  return SIZE_MAX;\n \t}\ndiff -ruw source/lib/getdtablesize.c source-new/lib/getdtablesize.c\n--- source/lib/getdtablesize.c\t2017-05-18 10:23:32.000000000 -0600\n+++ source-new/lib/getdtablesize.c\t2018-12-29 07:32:31.709586573 -0700\n@@ -109,6 +109,7 @@\n int\n getdtablesize (void)\n {\n+#if !defined(__redox__)\n   struct rlimit lim;\n \n   if (getrlimit (RLIMIT_NOFILE, &lim) == 0\n@@ -117,6 +118,7 @@\n       && lim.rlim_cur != RLIM_SAVED_CUR\n       && lim.rlim_cur != RLIM_SAVED_MAX)\n     return lim.rlim_cur;\n+#endif\n \n   return INT_MAX;\n }\ndiff -ruw source/lib/getprogname.c source-new/lib/getprogname.c\n--- source/lib/getprogname.c\t2017-01-31 11:36:50.000000000 -0700\n+++ source-new/lib/getprogname.c\t2018-12-29 07:34:15.432575388 -0700\n@@ -51,6 +51,14 @@\n # include <sys/procfs.h>\n #endif\n \n+#if defined(__redox__)\n+# include <string.h>\n+# include <unistd.h>\n+# include <stdio.h>\n+# include <fcntl.h>\n+# include <limits.h>\n+#endif\n+\n #include \"dirname.h\"\n \n #ifndef HAVE_GETPROGNAME             /* not Mac OS X, FreeBSD, NetBSD, OpenBSD >= 5.4, Cygwin */\n@@ -177,6 +185,17 @@\n         }\n     }\n   return NULL;\n+# elif defined(__redox__)\n+  char filename[PATH_MAX];\n+  int fd = open (\"sys:exe\", O_RDONLY);\n+  if (fd > 0) {\n+    int len = read(fd, filename, PATH_MAX-1);\n+    if (len > 0) {\n+       filename[len] = '\\0';\n+       return strdup(filename);\n+    }\n+  }\n+  return NULL;\n # else\n #  error \"getprogname module not ported to this OS\"\n # endif\ndiff -ruw source/lib/sigprocmask.c source-new/lib/sigprocmask.c\n--- source/lib/sigprocmask.c\t2017-05-18 10:23:32.000000000 -0600\n+++ source-new/lib/sigprocmask.c\t2018-12-29 07:45:02.610557142 -0700\n@@ -126,6 +126,7 @@\n     return 0;\n }\n \n+#if !defined(__redox__)\n int\n sigemptyset (sigset_t *set)\n {\n@@ -180,6 +181,7 @@\n   *set = ((2U << (NSIG - 1)) - 1) & ~ SIGABRT_COMPAT_MASK;\n   return 0;\n }\n+#endif\n \n /* Set of currently blocked signals.  */\n static volatile sigset_t blocked_set /* = 0 */;\n"
  },
  {
    "path": "recipes/tools/diffutils/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/diffutils/diffutils-3.6.tar.xz\"\nblake3 = \"086a95093c15edcdb826e75ff4de6c2213de6fbd2eb13538d07bdc3286dfb4a4\"\npatches = [\"diffutils.patch\"]\nscript = \"\"\"\nautoreconf\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    gt_cv_locale_fr=false\n    gt_cv_locale_fr_utf8=false\n    gt_cv_locale_ja=false\n    gt_cv_locale_tr_utf8=false\n    gt_cv_locale_zh_CN=false\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/fd/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/sharkdp/fd.git\"\nrev = \"840a565d3aadbeb303b10a01c0aa3561924dfc46\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/file/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://astron.com/pub/file/file-5.46.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/tools/friar/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/friar.git\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/gettext/recipe.toml",
    "content": "# GNU gettext utilities are a set of tools that provides a framework to help\n# other GNU packages produce multi-lingual messages.\n[source]\ntar = \"https://ftp.gnu.org/gnu/gettext/gettext-0.22.5.tar.gz\"\nblake3 = \"cb3f3a34da7ce1a92746df81f5b78c5d53841973a24eb80ab76537263d380ec0\"\npatches = [\n    \"redox.patch\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nGNU_CONFIG_GET build-aux/config.sub\n( cd gettext-runtime/libasprintf && autoreconf -fvi -I${COOKBOOK_HOST_SYSROOT}/share/aclocal )\n( cd gettext-runtime/intl && autoreconf -fvi -I${COOKBOOK_HOST_SYSROOT}/share/aclocal )\n( cd gettext-runtime && autoreconf -fvi -I${COOKBOOK_HOST_SYSROOT}/share/aclocal )\n( cd gettext-tools && autoreconf -fvi -I${COOKBOOK_HOST_SYSROOT}/share/aclocal )\n( cd libtextstyle && autoreconf -fvi -I${COOKBOOK_HOST_SYSROOT}/share/aclocal )\nautoreconf -fvi -I${COOKBOOK_HOST_SYSROOT}/share/aclocal\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libiconv\"\n]\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    ac_cv_have_decl_program_invocation_name=no\n    gt_cv_locale_fr=false\n    gt_cv_locale_fr_utf8=false\n    gt_cv_locale_ja=false\n    gt_cv_locale_tr_utf8=false\n    gt_cv_locale_zh_CN=false\n)\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/tools/gettext/redox.patch",
    "content": "diff -ruwN source/gettext-tools/gnulib-lib/getdtablesize.c source-new/gettext-tools/gnulib-lib/getdtablesize.c\n--- source/gettext-tools/gnulib-lib/getdtablesize.c\t2016-06-11 06:59:58.000000000 -0600\n+++ source-new/gettext-tools/gnulib-lib/getdtablesize.c\t2019-01-05 08:45:36.015291070 -0700\n@@ -84,6 +84,14 @@\n   return dtablesize;\n }\n \n+#elif defined(__redox__)\n+\n+int\n+getdtablesize (void)\n+{\n+  return INT_MAX;\n+}\n+\n #else\n \n # include <limits.h>\ndiff -ruwN source/gettext-tools/gnulib-lib/spawni.c source-new/gettext-tools/gnulib-lib/spawni.c\n--- source/gettext-tools/gnulib-lib/spawni.c\t2016-06-11 07:00:02.000000000 -0600\n+++ source-new/gettext-tools/gnulib-lib/spawni.c\t2019-01-05 08:55:44.661641522 -0700\n@@ -51,10 +51,10 @@\n # include <local-setxid.h>\n #else\n # if !HAVE_SETEUID\n-#  define seteuid(id) setresuid (-1, id, -1)\n+#  define seteuid(id) setreuid (-1, id)\n # endif\n # if !HAVE_SETEGID\n-#  define setegid(id) setresgid (-1, id, -1)\n+#  define setegid(id) setregid (-1, id)\n # endif\n # define local_seteuid(id) seteuid (id)\n # define local_setegid(id) setegid (id)\ndiff -ruwN source/gettext-tools/Makefile.am source-new/gettext-tools/Makefile.am\n--- source/gettext-tools/Makefile.am\t2023-09-19 03:08:31.000000000 +0700\n+++ source-new/gettext-tools/Makefile.am\t2025-10-05 12:39:33.287595871 +0700\n@@ -19,7 +19,7 @@\n AUTOMAKE_OPTIONS = 1.5 gnu no-dependencies\n ACLOCAL_AMFLAGS = -I m4 -I ../gettext-runtime/m4 -I ../m4 -I gnulib-m4 -I libgrep/gnulib-m4 -I libgettextpo/gnulib-m4\n \n-SUBDIRS = gnulib-lib libgrep src libgettextpo po its projects styles emacs misc man m4 tests system-tests gnulib-tests examples doc\n+SUBDIRS = gnulib-lib libgrep src libgettextpo po its projects styles emacs misc man m4\n \n EXTRA_DIST = misc/DISCLAIM\n MOSTLYCLEANFILES = core *.stackdump\n"
  },
  {
    "path": "recipes/tools/gnu-binutils/01_build_fix.patch",
    "content": "diff '--color=auto' -ur source/gprofng/libcollector/configure.ac source-new/gprofng/libcollector/configure.ac\n--- source/gprofng/libcollector/configure.ac\t2024-08-17 09:00:00.000000000 +1000\n+++ source-new/gprofng/libcollector/configure.ac\t2024-12-04 15:59:58.407412951 +1100\n@@ -18,7 +18,7 @@\n \n m4_include([../../bfd/version.m4])\n AC_INIT([gprofng], [BFD_VERSION])\n-AC_CONFIG_MACRO_DIRS([../../config ../..])\n+#AC_CONFIG_MACRO_DIRS([../../config ../..])\n AC_CONFIG_AUX_DIR(../..)\n AC_CANONICAL_TARGET\n AM_INIT_AUTOMAKE\ndiff '--color=auto' -ur source/libiberty/configure.ac source-new/libiberty/configure.ac\n--- source/libiberty/configure.ac\t2024-08-17 09:00:00.000000000 +1000\n+++ source-new/libiberty/configure.ac\t2024-12-04 15:59:31.572203764 +1100\n@@ -37,7 +37,7 @@\n   libiberty_topdir=\"${srcdir}/..\"\n fi\n AC_SUBST(libiberty_topdir)\n-AC_CONFIG_AUX_DIR($libiberty_topdir)\n+AC_CONFIG_AUX_DIR([.])\n \n dnl Very limited version of automake's enable-maintainer-mode\n \n"
  },
  {
    "path": "recipes/tools/gnu-binutils/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/binutils/binutils-2.43.1.tar.xz\"\npatches = [\"01_build_fix.patch\"]\nscript = \"\"\"\nDYNAMIC_INIT\n\nCOOKBOOK_AUTORECONF=autoreconf2.69 autotools_recursive_regenerate -I\"$(realpath ./config)\"\ncp -fpv ${COOKBOOK_HOST_SYSROOT}/share/libtool/build-aux/{config.sub,config.guess,install-sh} libiberty/\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n  \"expat\",\n  \"libgmp\",\n  \"libmpfr\",\n  \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nCOOKBOOK_CONFIGURE_FLAGS+=(\n  --target=\"${GNU_TARGET}\"\n  --disable-werror\n  --disable-dependency-tracking\n  --disable-nls\n  --enable-colored-disassembly\n  --enable-gdb\n  --with-system-zlib\n  --with-multilib\n  --with-interwork\n  --with-pic\n  --with-expat\n)\n\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/tools/gnu-grep/grep.patch",
    "content": "Only in source: grep.patch\ndiff -ru source/lib/getdtablesize.c source-new/lib/getdtablesize.c\n--- source/lib/getdtablesize.c\t2017-07-23 20:50:44.287742363 -0700\n+++ source-new/lib/getdtablesize.c\t2017-07-23 20:51:06.271284748 -0700\n@@ -109,15 +109,6 @@\n int\n getdtablesize (void)\n {\n-  struct rlimit lim;\n-\n-  if (getrlimit (RLIMIT_NOFILE, &lim) == 0\n-      && 0 <= lim.rlim_cur && lim.rlim_cur <= INT_MAX\n-      && lim.rlim_cur != RLIM_INFINITY\n-      && lim.rlim_cur != RLIM_SAVED_CUR\n-      && lim.rlim_cur != RLIM_SAVED_MAX)\n-    return lim.rlim_cur;\n-\n   return INT_MAX;\n }\n \ndiff -ru source/lib/getprogname.c source-new/lib/getprogname.c\n--- source/lib/getprogname.c\t2017-01-16 09:29:13.000000000 -0800\n+++ source-new/lib/getprogname.c\t2017-07-23 20:49:21.133618122 -0700\n@@ -43,13 +43,11 @@\n # include <string.h>\n #endif\n \n-#ifdef __sgi\n # include <string.h>\n # include <unistd.h>\n # include <stdio.h>\n # include <fcntl.h>\n-# include <sys/procfs.h>\n-#endif\n+# include <limits.h>\n \n #include \"dirname.h\"\n \n@@ -178,7 +176,16 @@\n     }\n   return NULL;\n # else\n-#  error \"getprogname module not ported to this OS\"\n+  char filename[PATH_MAX];\n+  int fd = open (\"sys:exe\", O_RDONLY);\n+  if (fd > 0) {\n+    int len = read(fd, filename, PATH_MAX-1);\n+    if (len > 0) {\n+       filename[len] = '\\0';\n+       return strdup(filename);\n+    }\n+  }\n+  return NULL;\n # endif\n }\n \ndiff -ru source/src/grep.c source-new/src/grep.c\n--- source/src/grep.c\t2017-07-02 10:41:41.000000000 -0700\n+++ source-new/src/grep.c\t2017-07-23 20:53:10.439131874 -0700\n@@ -2895,7 +2895,7 @@\n #ifdef _SC_PAGESIZE\n   long psize = sysconf (_SC_PAGESIZE);\n #else\n-  long psize = getpagesize ();\n+  long psize = 4096;\n #endif\n   if (! (0 < psize && psize <= (SIZE_MAX - sizeof (uword)) / 2))\n     abort ();\n"
  },
  {
    "path": "recipes/tools/gnu-grep/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/grep/grep-3.1.tar.xz\"\nblake3 = \"46b6e24dfa1b0f309f4eae3c450d612396c8faa6510b53a55f629e4f4c70b4a3\"\npatches = [\"grep.patch\"]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --prefix=/\n)\ncookbook_configure\nrm -rf \"${COOKBOOK_STAGE}\"/{lib,share}\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/helix/recipe.toml",
    "content": "#TODO signal handling is disabled, it should be re-enabled when Redox is ready\n#TODO language files are not built for fennel and crstalline langauges\n#TODO configuration - https://docs.helix-editor.com/install.html#configuring-helixs-runtime-files\n[source]\ngit = \"https://github.com/greyshaman/helix.git\"\nrev = \"34b91f42d9e9b04ba39cb6cc0f7c044d8ca4261d\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport CFLAGS=\"$CFLAGS -D__redox__\"\nCOOKBOOK_CARGO_PATH=\"helix-term\" cookbook_cargo\nmv \"${COOKBOOK_STAGE}/usr/bin/hx\" \"${COOKBOOK_STAGE}/usr/bin/helix\"\nmkdir -p \"${COOKBOOK_STAGE}/usr/lib/helix/runtime/grammars\"\nmkdir -p \"${COOKBOOK_STAGE}/usr/lib/helix/runtime/queries\"\nmkdir -p \"${COOKBOOK_STAGE}/usr/lib/helix/runtime/themes\"\necho \"show runtime grammars dir content\"\ncp ${COOKBOOK_SOURCE}/runtime/grammars/*.so ${COOKBOOK_STAGE}/usr/lib/helix/runtime/grammars/\ncp -r ${COOKBOOK_SOURCE}/runtime/queries/* ${COOKBOOK_STAGE}/usr/lib/helix/runtime/queries/\ncp -r ${COOKBOOK_SOURCE}/runtime/themes/* ${COOKBOOK_STAGE}/usr/lib/helix/runtime/themes/\ncp \"${COOKBOOK_SOURCE}/runtime/tutor\" ${COOKBOOK_STAGE}/usr/lib/helix/runtime/\n\necho '#!/usr/bin/env bash' > \"${COOKBOOK_STAGE}/usr/bin/hx\"\necho 'export HELIX_RUNTIME=/usr/lib/helix/runtime' >> \"${COOKBOOK_STAGE}/usr/bin/hx\"\necho '/usr/bin/helix $@' >> \"${COOKBOOK_STAGE}/usr/bin/hx\"\n\nchmod +x ${COOKBOOK_STAGE}/usr/bin/hx\n\"\"\"\n\n"
  },
  {
    "path": "recipes/tools/libc-bench/recipe.toml",
    "content": "[source]\ntar = \"https://www.etalabs.net/releases/libc-bench-20110206.tar.gz\"\nblake3 = \"64093102f29faa76da455f55a7b4be25b6d74d5c3d6fe88dbbc38aaae185182f\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n\"${COOKBOOK_MAKE}\" -j\"$(${NPROC})\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\ncp -v \"libc-bench\" \"${COOKBOOK_STAGE}/usr/bin\"\n\"\"\""
  },
  {
    "path": "recipes/tools/libc-bench/redox.patch",
    "content": "diff -ruw source/Makefile source-new/Makefile\n--- source/Makefile\t2011-01-31 00:13:00.000000000 -0700\n+++ source-new/Makefile\t2018-12-25 09:07:37.564520567 -0700\n@@ -4,7 +4,7 @@\n\n CFLAGS = -Os\n LDFLAGS = -static\n-LIBS = -lpthread -lrt -lpthread\n+LIBS = -lpthread\n\n\n all: libc-bench\ndiff -ruw source/utf8.c source-new/utf8.c\n--- source/utf8.c\t2011-01-24 20:08:38.000000000 -0700\n+++ source-new/utf8.c\t2018-12-25 08:52:35.893821291 -0700\n@@ -3,7 +3,7 @@\n #include <string.h>\n #include <wchar.h>\n #include <locale.h>\n-#include <langinfo.h>\n+//#include <langinfo.h>\n\n size_t b_utf8_bigbuf(void *dummy)\n {\n@@ -18,7 +18,7 @@\n \t|| setlocale(LC_CTYPE, \"en.UTF-8\")\n \t|| setlocale(LC_CTYPE, \"de_DE-8\")\n \t|| setlocale(LC_CTYPE, \"fr_FR-8\");\n-\tif (strcmp(nl_langinfo(CODESET), \"UTF-8\")) return -1;\n+\t//if (strcmp(nl_langinfo(CODESET), \"UTF-8\")) return -1;\n\n \tbuf = malloc(500000);\n \twbuf = malloc(500000*sizeof(wchar_t));\n@@ -56,7 +56,7 @@\n \t|| setlocale(LC_CTYPE, \"en.UTF-8\")\n \t|| setlocale(LC_CTYPE, \"de_DE-8\")\n \t|| setlocale(LC_CTYPE, \"fr_FR-8\");\n-\tif (strcmp(nl_langinfo(CODESET), \"UTF-8\")) return -1;\n+\t//if (strcmp(nl_langinfo(CODESET), \"UTF-8\")) return -1;\n\n \tbuf = malloc(500000);\n \tl = 0;\n"
  },
  {
    "path": "recipes/tools/lsd/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/lsd-rs/lsd\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/nano/recipe.toml",
    "content": "[source]\ntar = \"https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncursesw\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n\n[package]\ndependencies = [\n    \"terminfo\"\n]\n"
  },
  {
    "path": "recipes/tools/onefetch/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/o2sh/onefetch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/patchelf/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0.tar.bz2\"\nblake3 = \"f843b32bdf3ee8a1f465e92d3fef34f30c48ccef9c112fdb793e2e7f2ae7283a\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/tools/pathfinder/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/pathfinder.git\"\nbranch = \"redox\"\nupstream = \"https://github.com/servo/pathfinder.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"mesa\",\n    \"zlib\",\n]\nscript = \"\"\"\ncargo rustc \\\n    --target \"$TARGET\" \\\n    --release \\\n    --manifest-path \"${COOKBOOK_SOURCE}/examples/canvas_glutin_minimal/Cargo.toml\" \\\n    -- \\\n    -L \"${COOK_SYSROOT}/lib\" \\\n    -C link-args=\"-Wl,-Bstatic $(\"${TARGET}-pkg-config\" --libs osmesa) -lz -lstdc++ -lc -lgcc\"\nmkdir -pv \"${COOKBOOK_STAGE}/bin\"\ncp -v \"target/${TARGET}/release/canvas_glutin_minimal\" \"${COOKBOOK_STAGE}/bin/pathfinder\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/perg/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/guerinoni/perg.git\"\nrev = \"e206fab6bbd9c363c686fa7503d318304e48ddbe\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/periodictable/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/periodictable.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v \"${COOKBOOK_SOURCE}/pkg/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/periodictable\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons\"\ncp -v \"${COOKBOOK_SOURCE}/pkg/icon.png\" \"${COOKBOOK_STAGE}/usr/share/icons/periodictable.png\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"orbital\",\n]"
  },
  {
    "path": "recipes/tools/powerline/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jD91mZM2/powerline-rs\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nexport CARGOFLAGS=\"--no-default-features --features chrono\"\n\n# --locked uses a reallyyyy old redox_syscall and libc which fails\n${COOKBOOK_CARGO} install \\\n    --path \"${COOKBOOK_SOURCE}/${COOKBOOK_CARGO_PATH}\" \\\n    --root \"${COOKBOOK_STAGE}/usr\" \\\n    --no-default-features \\\n    --features chrono \\\n    ${install_flags}\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/ripgrep/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/ripgrep.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/schismtracker/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/schismtracker/schismtracker/archive/20181223.tar.gz\"\nblake3 = \"057e973f4f84cf898e2240d67c0e92f25086d8b9ffdc7e0c7ef81dd8dc81bc70\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\nautoreconf -i\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1\",\n    \"liborbital\", \n    \"libiconv\",\n]\nscript = \"\"\"\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include/SDL\"\nexport SDL_CONFIG=\"${COOKBOOK_SYSROOT}/bin/sdl-config\"\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --build=\"$(gcc -dumpmachine)\"\n    --host=\"${TARGET}\"\n    --prefix=\"\"\n    --with-sdl-prefix=\"${COOKBOOK_SYSROOT}\"\n)\n\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/tools/schismtracker/redox.patch",
    "content": "diff -rupNw source-original/Makefile.am source/Makefile.am\n--- source-original/Makefile.am\t2018-08-10 07:04:54.000000000 +0200\n+++ source/Makefile.am\t2018-12-30 23:18:07.957244170 +0100\n@@ -223,7 +223,7 @@ files_macosx = \\\n endif\n \n if USE_NETWORK\n-cflags_network=-DUSE_NETWORK\n+#cflags_network=-DUSE_NETWORK\n endif\n \n \ndiff -rupNw source-original/schism/main.c source/schism/main.c\n--- source-original/schism/main.c\t2018-08-10 07:04:54.000000000 +0200\n+++ source/schism/main.c\t2018-12-30 23:19:24.954046191 +0100\n@@ -1033,7 +1033,7 @@ int main(int argc, char **argv)\n \n \tvideo_fullscreen(0);\n \n-\ttzset(); // localtime_r wants this\n+\t//tzset(); // localtime_r wants this\n \tsrand(time(NULL));\n \tparse_options(argc, argv); /* shouldn't this be like, first? */\n \n"
  },
  {
    "path": "recipes/tools/sed/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/sed/sed-4.4.tar.xz\"\npatches = [\n    \"sed.patch\"\n]\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/tools/sed/sed.patch",
    "content": "diff -ruN sed-4.4/sed/mbcs.c source/sed/mbcs.c\n--- sed-4.4/sed/mbcs.c\t2017-01-01 03:17:10.000000000 -0800\n+++ source/sed/mbcs.c\t2025-06-06 04:36:30.129312397 -0700\n@@ -38,6 +38,7 @@\n int\n is_mb_char (int ch, mbstate_t *cur_stat)\n {\n+  return 0; // FIXME: Implement mbrtowc in relibc, then remove this line\n   const char c = ch ;\n   const int mb_pending = !mbsinit (cur_stat);\n   const int result = mbrtowc (NULL, &c, 1, cur_stat);\n"
  },
  {
    "path": "recipes/tools/shellharden/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/anordal/shellharden.git\"\nrev = \"bd24c99d5d1e76452b6d0749404837c1c95d923c\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/shellstorm/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/shellstorm.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/smith/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/Smith.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/sodium/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/sodium.git\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\"${COOKBOOK_CARGO}\" install \\\n    --path \"${COOKBOOK_SOURCE}\" \\\n    --root \"${COOKBOOK_STAGE}/usr\" \\\n    --locked \\\n    ${install_flags} \\\n    --features orbital\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps\"\ncp -v ${COOKBOOK_SOURCE}/manifest \"${COOKBOOK_STAGE}/usr/share/ui/apps/sodium\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons\"\ncp -v ${COOKBOOK_SOURCE}/icon.png \"${COOKBOOK_STAGE}/usr/share/icons/sodium.png\"\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/tokei/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/XAMPPRocky/tokei.git\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/twin-commander/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/kivimango/twin-commander.git\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/tools/vim/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/vim/vim/archive/refs/tags/v9.1.0821.tar.gz\"\nblake3 = \"d1f5802ceb047b09143f1764bf4016f084cf7e6c026c7047919264c9f262a5dd\"\npatches = [\"vim.patch\"]\n\n[build]\ndependencies = [\"ncursesw\"]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\nexport vim_cv_toupper_broken=no\nexport vim_cv_tgetent=zero\nexport vim_cv_terminfo=yes\nexport vim_cv_tty_group=world\nexport vim_cv_getcwd_broken=no\nexport vim_cv_stat_ignores_slash=yes\nexport vim_cv_memmove_handles_overlap=yes\n\nCOOKBOOK_CONFIGURE=\"./configure\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --with-tlib=ncursesw\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/tools/vim/vim.patch",
    "content": "diff -ruwN source/src/configure.ac source-new/src/configure.ac\n--- source/src/configure.ac\t2024-10-29 04:05:26.000000000 +0700\n+++ source-new/src/configure.ac\t2025-08-06 03:15:52.796303989 +0700\n@@ -3759,7 +3759,7 @@\n dnl Check for functions in one big call, to reduce the size of configure.\n dnl Can only be used for functions that do not require any include.\n AC_CHECK_FUNCS(fchdir fchown fchmod fsync getcwd getpseudotty \\\n-\tgetpwent getpwnam getpwuid getrlimit gettimeofday localtime_r lstat \\\n+\tgetpwent getpwnam getpwuid gettimeofday localtime_r lstat \\\n \tmemset mkdtemp nanosleep opendir putenv qsort readlink select setenv \\\n \tgetpgid setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \\\n \tsigprocmask sigvec strcasecmp strcoll strerror strftime stricmp strncasecmp \\\ndiff -ruwN source/src/feature.h source-new/src/feature.h\n--- source/src/feature.h\t2024-10-29 04:05:26.000000000 +0700\n+++ source-new/src/feature.h\t2025-08-06 03:16:27.596296730 +0700\n@@ -272,6 +272,7 @@\n  */\n #if defined(FEAT_NORMAL) \\\n \t&& defined(FEAT_EVAL) \\\n+\t&& !defined (__redox__)  /* disable setitimer */ \\\n \t&& ((defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) \\\n \t\t&& (!defined(MACOS_X) || defined(HAVE_DISPATCH_DISPATCH_H))) \\\n \t    || defined(MSWIN))\ndiff -ruwN source/src/libvterm/include/vterm.h source-new/src/libvterm/include/vterm.h\n--- source/src/libvterm/include/vterm.h\t2024-10-29 04:05:26.000000000 +0700\n+++ source-new/src/libvterm/include/vterm.h\t2025-08-06 03:15:02.506316769 +0700\n@@ -17,9 +17,11 @@\n #define FALSE 0\n \n // VIM: from stdint.h\n+#if !defined (__redox__)\n typedef unsigned char\t\tuint8_t;\n typedef unsigned short\t\tuint16_t;\n typedef unsigned int\t\tuint32_t;\n+#endif\n \n // VIM: define max screen cols and rows\n #define VTERM_MAX_COLS 1000\ndiff -ruwN source/src/memfile.c source-new/src/memfile.c\n--- source/src/memfile.c\t2024-10-29 04:05:26.000000000 +0700\n+++ source-new/src/memfile.c\t2025-08-06 03:15:36.896308173 +0700\n@@ -599,6 +599,8 @@\n \t    // No sync() on Stratus VOS\n # if defined(__OPENNT) || defined(__TANDEM) || defined(__VOS__)\n \t    fflush(NULL);\n+# elif defined(__redox__)\n+        fsync(mfp->mf_fd);\n # else\n \t    sync();\n # endif\ndiff -ruwN source/src/auto/configure source-new/src/auto/configure\n--- source/src/auto/configure\t2024-10-29 04:05:26.000000000 +0700\n+++ source-new/src/auto/configure\t2025-08-06 03:56:11.765660165 +0700\n@@ -13358,12 +13358,6 @@\n   printf \"%s\\n\" \"#define HAVE_GETPWUID 1\" >>confdefs.h\n \n fi\n-ac_fn_c_check_func \"$LINENO\" \"getrlimit\" \"ac_cv_func_getrlimit\"\n-if test \"x$ac_cv_func_getrlimit\" = xyes\n-then :\n-  printf \"%s\\n\" \"#define HAVE_GETRLIMIT 1\" >>confdefs.h\n-\n-fi\n ac_fn_c_check_func \"$LINENO\" \"gettimeofday\" \"ac_cv_func_gettimeofday\"\n if test \"x$ac_cv_func_gettimeofday\" = xyes\n then :\n"
  },
  {
    "path": "recipes/tools/xz/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/tukaani-project/xz/releases/download/v5.2.13/xz-5.2.13.tar.gz\"\nblake3 = \"edc6350542e8cb7188a878135e5b9bd592d687e5b47451ca1c89d51cc4bc6b53\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_STATIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-lzmadec\n    --disable-lzmainfo\n    --disable-xz\n    --disable-xzdec\n    --enable-threads=no\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/tui/goaccess/recipe.toml",
    "content": "\n[source]\ntar = \"https://tar.goaccess.io/goaccess-1.9.4.tar.gz\"\nblake3 = \"a7a7641c98956e8941191956129141e071321851d004269c7d21bce536d9224a\"\n\n#git = \"https://github.com/allinurl/goaccess.git\"\n#branch = \"master\"\n\npatches = [\n    \"redox1.patch\",\n    \"redox2.patch\",\n]\n\n# This is only needed when compiling from git. The tar.gz already has the make files.\nscript = \"\"\"\nautoreconf -fiv\nautomake --add-missing --copy --force-missing\n\"\"\"\n\n[build]\ndependencies = [\"ncursesw\"]\ntemplate = \"custom\"\n\nscript = \"\"\"\n# Compile bin2c to be executed on the host\ngcc -O2 -o \"$COOKBOOK_BUILD/bin2c\" \"$COOKBOOK_SOURCE/src/bin2c.c\"\nchmod +x \"$COOKBOOK_BUILD/bin2c\"\n\n# Compile goaccess\nexport COOKBOOK_NOSTRIP=1\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --host=$ARCH-unknown-redox\n    --enable-utf8\n    --disable-geoip\n    --prefix=/usr\n    --disable-dependency-tracking\n    --with-bin2c-path=\"$COOKBOOK_BUILD/src/bin2c\"\n)\ncookbook_configure\n\"\"\"\n\n\n\n"
  },
  {
    "path": "recipes/tui/goaccess/redox1.patch",
    "content": "From 2444d71e7815c8b7f3bd4462b8418d9c7e8c5667 Mon Sep 17 00:00:00 2001\nFrom: Rafael Senties Martinelli <rafael@rsm92.fr>\nDate: Sun, 19 Oct 2025 19:42:46 +0200\nSubject: [PATCH 1/2] Ensure fixed-width integers and PIPE_BUF are defined for\n Redox or minimal libc\n\n---\n src/websocket.h | 9 ++++++++-\n 1 file changed, 8 insertions(+), 1 deletion(-)\n\ndiff --git a/src/websocket.h b/src/websocket.h\nindex 79d03dff..31847b10 100644\n--- a/src/websocket.h\n+++ b/src/websocket.h\n@@ -45,8 +45,15 @@\n #include <openssl/ssl.h>\n #endif\n \n-#if defined(__linux__) || defined(__CYGWIN__)\n+#if defined(__linux__) || defined(__CYGWIN__) || defined(__redox__)\n #  include <endian.h>\n+#if defined(__redox__)\n+#  include <stdint.h>   /* for uint*_t types */\n+#  include <limits.h>   /* for PIPE_BUF */\n+#  ifndef PIPE_BUF\n+#    define PIPE_BUF 4096\n+#  endif\n+#endif\n #if ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 9))\n #if defined(__BYTE_ORDER) && (__BYTE_ORDER == __LITTLE_ENDIAN)\n #  include <arpa/inet.h>\n-- \n2.51.1.dirty\n\n"
  },
  {
    "path": "recipes/tui/goaccess/redox2.patch",
    "content": "From 4a564a6b0f9d4ee7a804b9dbb391e7421187014b Mon Sep 17 00:00:00 2001\nFrom: Rafael Senties Martinelli <rafael@rsm92.fr>\nDate: Sun, 19 Oct 2025 20:08:10 +0200\nSubject: [PATCH 2/2] Add option to ignore building bin2c\n\n---\n Makefile.am  |  9 +++++++++\n configure.ac | 16 ++++++++++++++++\n 2 files changed, 25 insertions(+)\n\ndiff --git a/Makefile.am b/Makefile.am\nindex 7696c8f5..8d0fcdcd 100644\n--- a/Makefile.am\n+++ b/Makefile.am\n@@ -51,6 +51,15 @@ CLEANFILES =                          \\\n   resources/js/charts.js.tmp          \\\n   resources/js/app.js.tmp\n \n+# Prevent rebuilding bin2c if binary already exists\n+bin2c$(EXEEXT):\n+if USE_PREBUILT_BIN2C\n+\t@echo \"Using prebuilt bin2c from $(BIN2C_PATH)\"\n+\tcp $(BIN2C_PATH) bin2c$(EXEEXT)\n+else\n+\t$(AM_V_CCLD)$(LINK) $(bin2c_OBJECTS) $(bin2c_LDADD) $(LIBS)\n+endif\n+\n # Tpls\n src/tpls.h: bin2c$(EXEEXT) $(srcdir)/resources/tpls.html\n if HAS_SEDTR\ndiff --git a/configure.ac b/configure.ac\nindex 790499ce..feaf72d2 100644\n--- a/configure.ac\n+++ b/configure.ac\n@@ -105,6 +105,22 @@ if test \"$with_getline\" = \"yes\"; then\n   AC_DEFINE([WITH_GETLINE], 1, [Build using GNU getline.])\n fi\n \n+# bin2c\n+AC_ARG_WITH([bin2c-path],\n+    [AS_HELP_STRING([--with-bin2c-path=PATH], [Use prebuilt bin2c binary at PATH])],\n+    [BIN2C_PATH=\"$withval\"],\n+    [BIN2C_PATH=\"\"])\n+\n+if test -n \"$BIN2C_PATH\"; then\n+    USE_PREBUILT_BIN2C=true\n+else\n+    USE_PREBUILT_BIN2C=false\n+fi\n+\n+AM_CONDITIONAL([USE_PREBUILT_BIN2C], [test \"$USE_PREBUILT_BIN2C\" = true])\n+AC_SUBST([BIN2C_PATH])\n+\n+\n # UTF8\n AC_ARG_ENABLE([utf8],[AS_HELP_STRING([--enable-utf8],[Enable ncurses library that handles wide characters. Default is disabled])],[utf8=\"$enableval\"],[utf8=no])\n \n-- \n2.51.1.dirty\n\n"
  },
  {
    "path": "recipes/tui/mdp/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/visit1985/mdp.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncursesw\",\n    \"terminfo\"\n]\nscript = \"\"\"\nrsync -av --delete --exclude='.git' \"${COOKBOOK_SOURCE}/\" ./\n\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include/ncursesw\"\n\n\"${COOKBOOK_MAKE}\" -j\"${COOKBOOK_MAKE_JOBS}\"\n\n# Install\n\"${COOKBOOK_MAKE}\" DESTDIR=\"${COOKBOOK_STAGE}\" PREFIX=\"\" install\n\"\"\""
  },
  {
    "path": "recipes/tui/ncdu/recipe.toml",
    "content": "[source]\ntar = \"https://dev.yorhel.nl/download/ncdu-1.22.tar.gz\"\nblake3 = \"b7838c03ded7207a328a26c840ec3d62d3be6bbf7269a70ea3430c6cbf065960\"\n\n[package]\ndependencies = [\"terminfo\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\"ncursesw\"]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/video/sdl-player/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/sdl-player.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ffmpeg6\",\n    \"liborbital\",\n    \"sdl1\",\n    \"zlib\"\n]\nscript = \"\"\"\nrsync -av --delete --exclude='.git' \"${COOKBOOK_SOURCE}/\" ./\n\"${COOKBOOK_MAKE}\" -j\"$(${NPROC})\"\n\nmkdir -pv \"${COOKBOOK_STAGE}/bin\"\ncp -v \"player\" \"${COOKBOOK_STAGE}/bin/sdl-player\"\n\"\"\"\n"
  },
  {
    "path": "recipes/web/netsurf/01_redox.patch",
    "content": "diff -ruwN source/Makefile source-new/Makefile\n--- source/Makefile\t2023-12-28 07:57:05.071795200 +0700\n+++ source-new/Makefile\t2025-07-20 11:58:36.652747547 +0700\n@@ -110,7 +110,7 @@\n \n # prefixed install macro for each host sub target\n define do_build_prefix_install\n-\t$(MAKE) install --directory=$1 HOST=$(BUILD) PREFIX=$(TMP_PREFIX) Q=$(Q) DESTDIR=\n+\t$(MAKE) install --directory=$1 HOST=$(BUILD) PREFIX=$(TMP_PREFIX) Q=$(Q) DESTDIR= CC=cc LDFLAGS=\n \n endef\n \ndiff -ruwN source/buildsystem/makefiles/Makefile.tools source-new/buildsystem/makefiles/Makefile.tools\n--- source/buildsystem/makefiles/Makefile.tools\t2023-12-28 07:57:21.479359900 +0700\n+++ source-new/buildsystem/makefiles/Makefile.tools\t2025-07-20 11:58:36.662747547 +0700\n@@ -135,7 +135,7 @@\n   endif\n \n   # Search the path for the compiler\n-  toolpath_ := $(shell /bin/which $(CC__))\n+  toolpath_ := $(shell which $(CC__))\n   ifeq ($(toolpath_),)\n     toolpath_ := /opt/netsurf/$(HOST)/cross/bin/\n     CC__  := $(toolpath_)$(HOST)-gcc\ndiff -ruwN source/buildsystem/makefiles/Makefile.top source-new/buildsystem/makefiles/Makefile.top\n--- source/buildsystem/makefiles/Makefile.top\t2023-12-28 07:57:21.479359900 +0700\n+++ source-new/buildsystem/makefiles/Makefile.top\t2025-07-20 11:58:36.662747547 +0700\n@@ -462,7 +462,7 @@\n \n   define build_c\n     ifeq ($$(findstring $$(BUILDDIR)/$2,$$(BUILDFILES)),)\n-      $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1\n+      $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1 | $$(PRE_TARGETS)\n \t$$(VQ)$$(ECHO) $$(ECHOFLAGS) \" COMPILE: $1\"\n \t$$(Q)$$(CC) -MMD -MP $$($3) -o $$@ -c $1\n \ndiff -ruwN source/libnsfb/Makefile source-new/libnsfb/Makefile\n--- source/libnsfb/Makefile\t2023-12-28 07:57:22.311338000 +0700\n+++ source-new/libnsfb/Makefile\t2025-07-20 11:58:36.652747547 +0700\n@@ -43,10 +43,10 @@\n NSFB_XCB_PKG_NAMES := xcb xcb-icccm xcb-image xcb-keysyms xcb-atom\n \n # determine which surface handlers can be compiled based upon avalable library\n-$(eval $(call pkg_config_package_available,NSFB_VNC_AVAILABLE,libvncserver))\n+#$(eval $(call pkg_config_package_available,NSFB_VNC_AVAILABLE,libvncserver))\n $(eval $(call pkg_config_package_available,NSFB_SDL_AVAILABLE,sdl))\n-$(eval $(call pkg_config_package_available,NSFB_XCB_AVAILABLE,$(NSFB_XCB_PKG_NAMES)))\n-$(eval $(call pkg_config_package_available,NSFB_WLD_AVAILABLE,wayland-client))\n+#$(eval $(call pkg_config_package_available,NSFB_XCB_AVAILABLE,$(NSFB_XCB_PKG_NAMES)))\n+#$(eval $(call pkg_config_package_available,NSFB_WLD_AVAILABLE,wayland-client))\n \n # Flags and setup for each support library\n ifeq ($(NSFB_SDL_AVAILABLE),yes)\ndiff -ruwN source/libnsfb/src/plot.h source-new/libnsfb/src/plot.h\n--- source/libnsfb/src/plot.h\t2023-12-28 07:57:22.315338000 +0700\n+++ source-new/libnsfb/src/plot.h\t2025-07-20 11:58:36.652747547 +0700\n@@ -46,7 +46,7 @@\n         #error \"Endian determination failed\"\n     #endif\n #else\n-    #include <endian.h>\n+    #include <machine/endian.h>\n     #if defined(__BYTE_ORDER__)\n         #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__\n             #define NSFB_BE_BYTE_ORDER\ndiff -ruwN source/netsurf/Makefile.config source-new/netsurf/Makefile.config\n--- source/netsurf/Makefile.config\t1970-01-01 07:00:00.000000000 +0700\n+++ source-new/netsurf/Makefile.config\t2025-07-20 11:58:36.652747547 +0700\n@@ -0,0 +1,28 @@\n+override NETSURF_HOMEPAGE := \"https://www.redox-os.org/\"\n+override NETSURF_FB_FRONTEND := sdl\n+\n+override NETSURF_USE_JPEG := YES\n+override NETSURF_USE_BMP := YES\n+override NETSURF_USE_OPENSSL := YES\n+override NETSURF_USE_CURL := YES\n+override NETSURF_USE_PNG := YES\n+\n+override NETSURF_USE_LIBICONV_PLUG := NO\n+override NETSURF_USE_NSSVG := NO\n+override NETSURF_USE_RSVG := NO\n+override NETSURF_USE_DUKTAPE := YES\n+override NETSURF_USE_HARU_PDF := NO\n+override NETSURF_USE_VIDEO := NO\n+\n+override NETSURF_FB_FONTLIB := freetype\n+override NETSURF_FB_FONTPATH := /usr/share/fonts/\n+override NETSURF_FB_FONT_SANS_SERIF := Sans/Fira/Regular.ttf\n+override NETSURF_FB_FONT_SANS_SERIF_BOLD := Sans/Fira/Bold.ttf\n+override NETSURF_FB_FONT_SANS_SERIF_ITALIC := Sans/Fira/Regular.ttf\n+override NETSURF_FB_FONT_SANS_SERIF_ITALIC_BOLD := Sans/Fira/Bold.ttf\n+override NETSURF_FB_FONT_SERIF := Sans/Fira/Regular.ttf\n+override NETSURF_FB_FONT_SERIF_BOLD := Sans/Fira/Bold.ttf\n+override NETSURF_FB_FONT_MONOSPACE := Mono/Fira/Regular.ttf\n+override NETSURF_FB_FONT_MONOSPACE_BOLD := Mono/Fira/Bold.ttf\n+override NETSURF_FB_FONT_CURSIVE := Sans/Fira/Regular.ttf\n+override NETSURF_FB_FONT_FANTASY := Sans/Fira/Regular.ttf\ndiff -ruwN source/netsurf/frontends/framebuffer/Makefile source-new/netsurf/frontends/framebuffer/Makefile\n--- source/netsurf/frontends/framebuffer/Makefile\t2023-12-28 07:57:22.987320000 +0700\n+++ source-new/netsurf/frontends/framebuffer/Makefile\t2025-07-20 11:58:36.662747547 +0700\n@@ -200,7 +200,7 @@\n install-framebuffer:\n \t$(VQ)echo \" INSTALL: $(DESTDIR)/$(PREFIX)\"\n \t$(Q)$(INSTALL) -d $(DESTDIR)/$(NETSURF_FRAMEBUFFER_BIN)\n-\t$(Q)$(INSTALL) -T $(EXETARGET) $(DESTDIR)/$(NETSURF_FRAMEBUFFER_BIN)/netsurf-fb\n+\t$(Q)$(INSTALL) $(EXETARGET) $(DESTDIR)/$(NETSURF_FRAMEBUFFER_BIN)/netsurf-fb\n \t$(Q)$(INSTALL) -d $(DESTDIR)/$(NETSURF_FRAMEBUFFER_RESOURCES)\n \t$(Q)for F in $(NETSURF_FRAMEBUFFER_RESOURCE_LIST); do $(INSTALL) -m 644 $(FRONTEND_RESOURCES_DIR)/$$F $(DESTDIR)/$(NETSURF_FRAMEBUFFER_RESOURCES); done\n \t$(Q)$(INSTALL) -m 644 -T $(MESSAGES_TARGET)/en/Messages $(DESTDIR)/$(NETSURF_FRAMEBUFFER_RESOURCES)/Messages\ndiff -ruwN source/netsurf/utils/config.h source-new/netsurf/utils/config.h\n--- source/netsurf/utils/config.h\t2023-12-28 07:57:23.095317100 +0700\n+++ source-new/netsurf/utils/config.h\t2025-07-20 12:12:51.782724549 +0700\n@@ -63,7 +63,8 @@\n      defined(__BEOS__) ||     \\\n      defined(__amigaos4__) || \\\n      defined(__AMIGA__) ||    \\\n-     defined(__MINT__))\n+     defined(__MINT__) ||    \\\n+     defined(__redox__))\n #undef HAVE_STRPTIME\n #undef HAVE_STRFTIME\n #else\n@@ -136,7 +137,7 @@\n #endif\n \n #define HAVE_MMAP\n-#if (defined(_WIN32) || defined(__riscos__) || defined(__HAIKU__) || defined(__BEOS__) || defined(__amigaos4__) || defined(__AMIGA__) || defined(__MINT__))\n+#if (defined(_WIN32) || defined(__riscos__) || defined(__HAIKU__) || defined(__BEOS__) || defined(__amigaos4__) || defined(__AMIGA__) || defined(__MINT__) || defined(__redox__))\n #undef HAVE_MMAP\n #endif\n \n@@ -149,7 +150,7 @@\n #define HAVE_DIRFD\n #define HAVE_UNLINKAT\n #define HAVE_FSTATAT\n-#if (defined(_WIN32) || defined(__riscos__) || defined(__HAIKU__) || defined(__BEOS__) || defined(__amigaos4__) || defined(__AMIGA__) || defined(__MINT__))\n+#if (defined(_WIN32) || defined(__riscos__) || defined(__HAIKU__) || defined(__BEOS__) || defined(__amigaos4__) || defined(__AMIGA__) || defined(__MINT__) || defined(__redox__))\n #undef HAVE_DIRFD\n #undef HAVE_UNLINKAT\n #undef HAVE_FSTATAT\n"
  },
  {
    "path": "recipes/web/netsurf/manifest",
    "content": "name=Netsurf\nbinary=/usr/bin/netsurf-fb\nicon=/ui/icons/apps/internet-web-browser.png\naccept=*.html\nauthor=The Netsurf Developers\ndescription=Browser for Redox\n"
  },
  {
    "path": "recipes/web/netsurf/recipe.toml",
    "content": "[source]\ntar = \"https://download.netsurf-browser.org/netsurf/releases/source-full/netsurf-all-3.11.tar.gz\"\nblake3 = \"cd406668a9ed5712efac1a8685125b83626690b73bbc6cb5de82ef00e3f65087\"\npatches = [\n    \"./01_redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"curl\",\n    \"expat\",\n    \"libjpeg\",\n    \"libpng\",\n    \"nghttp2\",\n    \"openssl3\",\n    \"sdl1\",\n    \"zlib\",\n    \"freetype2\",\n    \"liborbital\",\n    \"libiconv\"\n]\ndev-dependencies = [\n    \"host:gperf\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\n# Netsurf does not currently support out-of-tree builds :(\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n# obscure crash from sccache if jobs number is too much\nCOOKBOOK_MAKE_JOBS=\"$(( ${COOKBOOK_MAKE_JOBS} > 8 ? 8 : ${COOKBOOK_MAKE_JOBS} ))\"\n\nexport TARGET=\"framebuffer\"\nexport CFLAGS=\"-I${PWD}/inst-${TARGET}/include\"\nexport LDFLAGS=\"${LDFLAGS} -L${COOKBOOK_SYSROOT}/lib -L${PWD}/inst-${TARGET}/lib -Wl,--allow-multiple-definition -Wl,-rpath-link,${COOKBOOK_SYSROOT}/lib\"\n# nghttp2 is not linked for some reason\nexport LDFLAGS=\"${LDFLAGS} -lcurl -lnghttp2\"\n# netsurf mixes up CFLAGS for host and build\nexport CC=\"${CC} ${CPPFLAGS}\"\n\n\"$COOKBOOK_MAKE\" PREFIX=/usr V=1 -j\"$COOKBOOK_MAKE_JOBS\"\n\"$COOKBOOK_MAKE\" DESTDIR=\"$COOKBOOK_STAGE\" PREFIX=/usr install -j\"$COOKBOOK_MAKE_JOBS\"\nmkdir -pv \"$COOKBOOK_STAGE/ui/apps\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"$COOKBOOK_STAGE/ui/apps/00_netsurf\"\n\"\"\"\n\n[package]\ndependencies = [\n    \"ca-certificates\",\n    \"orbital\",\n]\n"
  },
  {
    "path": "recipes/web/website/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/website\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nexport PATH=\"$HOME/.local/bin:$HOME/.local/opt/node/bin:$PATH\"\nif ! command -v node &> /dev/null; then\n   echo \"Installing Node via webi...\"\n   curl -sS https://webi.sh/node | sh\nfi\nif ! command -v hugo &> /dev/null; then\n   echo \"Installing Hugo via webi...\"\n   curl -sS https://webi.sh/hugo | sh\nfi\nif ! command -v postcss &> /dev/null; then\n   echo \"Installing PostCSS via npm...\"\n   npm install -g postcss-cli\nfi\n\nrsync -a \"${COOKBOOK_SOURCE}/\" ./\n./hugo.sh\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/website\ncp -rv \"${COOKBOOK_BUILD}\"/build/public/* \"${COOKBOOK_STAGE}\"/usr/share/website\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/a11y/espeak-ng/recipe.toml",
    "content": "#     compiles, but only wavefile generation is supported\r\n#TODO waiting for a custom libpcaudio0 backend for real-time output (bpisch is working on it)\r\n\r\n[source]\r\ngit = \"https://gitlab.redox-os.org/bpisch/espeak-ng.git\"\r\nbranch = \"redox\"\r\n\r\n[build]\r\ntemplate = \"custom\"\r\ndependencies = [\"libstdcxx\"]\r\nscript = \"\"\"\r\nDYNAMIC_INIT\r\ncp -R \"${COOKBOOK_SOURCE}/espeak-ng-data\" .\r\ncookbook_cmake\r\ncp -R \"${COOKBOOK_SOURCE}/espeak-ng-data\" \"${COOKBOOK_STAGE}/usr/share/espeak-ng-data\"\r\n\"\"\"\r\n"
  },
  {
    "path": "recipes/wip/a11y/orca/recipe.toml",
    "content": "#TODO not compiled or tested\n# dependencies: https://gitlab.gnome.org/GNOME/orca/#dependencies\n[source]\ntar = \"https://download.gnome.org/sources/orca/48/orca-48.6.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"atk\",\n    \"at-spi2-core\",\n    \"gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/ai/nnx/recipe.toml",
    "content": "#TODO fs2 crate error\n[source]\ngit = \"https://github.com/webonnx/wonnx\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages wonnx-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/ai/rustgpt/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tekaratzas/RustGPT\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/ai/tgs/recipe.toml",
    "content": "#TODO make libtorch work\n[source]\ngit = \"https://github.com/warpy-ai/tgs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libtorch\",\n]\n"
  },
  {
    "path": "recipes/wip/analysis/binsider/recipe.toml",
    "content": "#TODO async-io and rustix crates error\n[source]\ngit = \"https://github.com/orhun/binsider\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/analysis/cutter/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n# build instructions: https://cutter.re/docs/building.html\n[source]\ntar = \"https://github.com/rizinorg/cutter/releases/download/v2.4.1/Cutter-v2.4.1-src.tar.gz\"\n[build]\ntemplate = \"cmake\"\n#dependencies = [\n#    \"libzip\",\n#    \"zlib\",\n#    \"qt6-base\",\n#    \"qt6-svg\",\n#]\n"
  },
  {
    "path": "recipes/wip/analysis/email-sleuth/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/tokenizer-decode/email-sleuth\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/analysis/flowgger/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/awslabs/flowgger/wiki/Installation\n[source]\ngit = \"https://github.com/awslabs/flowgger\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/analysis/graphs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/World/Graphs\"\nrev = \"v1.8.7\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"libgee\",\n    \"sqlite3\",\n]\n"
  },
  {
    "path": "recipes/wip/analysis/mmdr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/1jehuang/mermaid-rs-renderer\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/analysis/netdata/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://learn.netdata.cloud/docs/developer-and-contributor-corner/build-the-netdata-agent-yourself/compile-from-source-code#building-netdata\n[source]\ntar = \"https://github.com/netdata/netdata/releases/download/v2.8.5/netdata-v2.8.5.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DDEFAULT_FEATURE_STATE=False\",\n]\n#dependencies = [\n#    \"zlib\",\n#    \"libuv\",\n#    \"libuuid\",\n#]\n"
  },
  {
    "path": "recipes/wip/analysis/rizin/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/rizinorg/rizin/blob/dev/BUILDING.md\n[source]\ntar = \"https://github.com/rizinorg/rizin/releases/download/v0.8.1/rizin-src-v0.8.1.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Denable_tests=false\",\n    \"-Denable_rz_test=false\",\n]\n"
  },
  {
    "path": "recipes/wip/analysis/tmmpr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tanciaku/tmmpr\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/archives/7-zip/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/mcmilk/7-Zip/tree/master/DOC#readme\n[source]\ntar = \"https://7-zip.org/a/7z2301-src.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/archives/lzip/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://download.savannah.gnu.org/releases/lzip/lzip-1.24.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/archives/mlar/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ANSSI-FR/MLA\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages mlar\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/archives/orz/recipe.toml",
    "content": "#TODO don't run\n[source]\ngit = \"https://github.com/richox/orz\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/archives/ouch/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/ouch-org/ouch\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"zlib\",\n    \"bzip2\",\n    \"xz\",\n]\n"
  },
  {
    "path": "recipes/wip/archives/plzip/recipe.toml",
    "content": "#TODO missing headers\n[source]\ntar = \"https://download.savannah.gnu.org/releases/lzip/plzip/plzip-1.11.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"lzlib\",\n]\n"
  },
  {
    "path": "recipes/wip/archives/unzrip/recipe.toml",
    "content": "#TODO make zstd work (after cargo update)\n[source]\ngit = \"https://github.com/quininer/unzrip\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"zstd\",\n]\n"
  },
  {
    "path": "recipes/wip/backup/borg/recipe.toml",
    "content": "#TODO missing script for pip\n# build instructions: https://borgbackup.readthedocs.io/en/stable/installation.html#source-install\n[source]\ntar = \"https://github.com/borgbackup/borg/releases/download/1.4.1/borgbackup-1.4.1.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n    \"libacl\",\n    \"libattr\",\n    \"xxhash\",\n    \"lz4\",\n    \"zstd\",\n]\n"
  },
  {
    "path": "recipes/wip/backup/partclone/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Thomas-Tsai/partclone\"\nrev = \"0.3.40\"\nshallow_clone = true\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--enable-ncursesw\",\n]\ndependencies = [\n    \"ncursesw\",\n]\n"
  },
  {
    "path": "recipes/wip/backup/pika-backup/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/World/pika-backup\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/backup/vorta/recipe.toml",
    "content": "#TODO missing script for pip\n# build instructions: https://vorta.borgbase.com/install/linux/#install-from-source\n[source]\ngit = \"https://github.com/borgbase/vorta\"\nrev = \"v0.11.3\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/bench/cargo/cargo-benchcmp/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/BurntSushi/cargo-benchcmp\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/bench/cargo/cargo-criterion/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/bheisler/cargo-criterion\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/bench/dacapo-benchmarks/recipe.toml",
    "content": "#TODO missing data type to download the Java bytecode\n# download link: https://download.dacapobench.org/chopin/dacapo-23.11-chopin.zip\n[source]\n\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/bench/hpc/hpcc/recipe.toml",
    "content": "#TODO missing script for gnu make or python script: https://github.com/icl-utk-edu/hpcc#compiling\n[source]\ngit = \"https://github.com/icl-utk-edu/hpcc\"\nrev = \"1.5.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/bench/hpc/hpcg/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/hpcg-benchmark/hpcg\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/bench/hpc/minibude/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/UoB-HPC/miniBUDE#building\n[source]\ngit = \"https://github.com/UoB-HPC/miniBUDE\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/bench/hyperfine/recipe.toml",
    "content": "#TODO libc::RUSAGE_CHILDREN\n[source]\ngit = \"https://github.com/sharkdp/hyperfine\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/bench/io/blogbench/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/jedisct1/Blogbench/blob/master/README#L18\n[source]\ntar = \"https://github.com/jedisct1/Blogbench/releases/download/1.2/blogbench-1.2.tar.bz2\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/bench/io/fio/recipe.toml",
    "content": "#TODO configuration problem\n[source]\ngit = \"https://github.com/axboe/fio\"\nrev = \"fio-3.41\"\nshallow_clone = true\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/bench/io/simple-disk-benchmark/recipe.toml",
    "content": "#TODO source code error\n[source]\ngit = \"https://github.com/schwa/simple-disk-benchmark-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/bench/jasonisnthappy/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/sohzm/jasonisnthappy\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_examples bench_all\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/bench/rodinia/recipe.toml",
    "content": "#TODO missing script for gnu make, build the openmp (cpu backend?) or opencl implementation\n[source]\ntar = \"http://www.cs.virginia.edu/~skadron/lava/rodinia/Packages/rodinia_3.1.tar.bz2\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/bench/rpc-perf/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/iopsystems/rpc-perf\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"zstd\",\n]\n"
  },
  {
    "path": "recipes/wip/bench/stress-ng/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/ColinIanKing/stress-ng#building-stress-ng\n#TODO determine minimum dependencies\n[source]\ngit = \"https://github.com/ColinIanKing/stress-ng\"\nrev = \"V0.20.00\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n#dependencies = [\n#    \"libbsd\",\n#    \"libaio\",\n#    \"libcap\",\n#    \"libcap\",\n#    \"libgcrypt\",\n#    \"libjpeg\",\n#    \"libmd\",\n#    \"libmpfr\",\n#    \"xxhash\",\n#    \"zlib\",\n#    \"mesa\",\n#]\n"
  },
  {
    "path": "recipes/wip/bench/suite/pts/recipe.toml",
    "content": "#TODO figure out the installation script - https://github.com/phoronix-test-suite/phoronix-test-suite\n[source]\ngit = \"https://github.com/phoronix-test-suite/phoronix-test-suite\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/pts\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user/pts\"\n\"\"\"\n[package]\ndependencies = [\"php84\"]\n"
  },
  {
    "path": "recipes/wip/codecs/dav1d/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://code.videolan.org/videolan/dav1d#compile\n[source]\ntar = \"https://downloads.videolan.org/videolan/dav1d/1.5.3/dav1d-1.5.3.tar.xz\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Denable_tests=false\",\n]"
  },
  {
    "path": "recipes/wip/codecs/faad2/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/knik0/faad2\"\nrev = \"2.11.2\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/codecs/kvazaar/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://github.com/ultravideo/kvazaar/releases/download/v2.2.0/kvazaar-2.2.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/codecs/rav1e/recipe.toml",
    "content": "#TODO \"malloc(): invalid size (unsorted)\" error\n[source]\ngit = \"https://github.com/xiph/rav1e\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/codecs/svt-av1/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/Build-Guide.md#linux-operating-systems-64-bit\n[source]\ngit = \"https://gitlab.com/AOMediaCodec/SVT-AV1\"\nrev = \"v4.0.1\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/codecs/svt-hevc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/OpenVisualCloud/SVT-HEVC#linux-operating-systems-64-bit\n[source]\ngit = \"https://github.com/OpenVisualCloud/SVT-HEVC\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/codecs/svt-vp9/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/OpenVisualCloud/SVT-VP9#linux-operating-systems-64-bit\n[source]\ngit = \"https://github.com/OpenVisualCloud/SVT-VP9\"\nrev = \"v0.3.1\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/codecs/uvg266/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/ultravideo/uvg266#compiling-uvg266\n[source]\ngit = \"https://github.com/ultravideo/uvg266\"\nrev = \"v0.8.1\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_TESTS=OFF\"\n]"
  },
  {
    "path": "recipes/wip/codecs/vvenc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/fraunhoferhhi/vvenc/wiki/Build#build-using-plain-cmake\n[source]\ngit = \"https://github.com/fraunhoferhhi/vvenc\"\nrev = \"v1.14.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/codecs/wavpack/recipe.toml",
    "content": "#TODO compilation error: missing header\n[source]\ntar = \"https://github.com/dbry/WavPack/releases/download/5.9.0/wavpack-5.9.0.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libiconv\",\n]\n"
  },
  {
    "path": "recipes/wip/codecs/x264/recipe.toml",
    "content": "#TODO the redox target is not supported on the configure script\n[source]\ngit = \"https://code.videolan.org/videolan/x264\"\nbranch = \"stable\"\nshallow_clone = true\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/codecs/x265/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://bitbucket.org/multicoreware/x265_git/src/master/build/README.txt#lines-68\n[source]\ntar = \"https://bitbucket.org/multicoreware/x265_git/downloads/x265_4.1.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/source\"\nDYNAMIC_INIT\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/containers/crun/recipe.toml",
    "content": "#TODO disable systemd and SELinux\n[source]\ntar = \"https://github.com/containers/crun/releases/download/1.17/crun-1.17.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/containers/crun-vm/recipe.toml",
    "content": "#TODO camino crate error\n# dependencies - https://github.com/containers/crun-vm/blob/main/docs/1-installing.md#from-source\n[source]\ngit = \"https://github.com/containers/crun-vm\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/containers/docker/recipe.toml",
    "content": "#TODO implement a Cookbook template for the Go programming language\n[source]\ngit = \"https://github.com/docker/cli\"\nbranch = \"27.x\"\n[build]\ntemplate = \"go\"\n"
  },
  {
    "path": "recipes/wip/containers/podman/recipe.toml",
    "content": "#TODO Implement a Cookbook template for the Go programming language\n[source]\ngit = \"https://github.com/containers/podman\"\nbranch = \"v5.2\"\n[build]\ntemplate = \"go\"\n"
  },
  {
    "path": "recipes/wip/containers/skopeo/recipe.toml",
    "content": "#TODO Implement the Cookbook template for the Go programming language\n[source]\ngit = \"https://github.com/containers/skopeo\"\nbranch = \"release-1.16\"\n[build]\ntemplate = \"go\"\n"
  },
  {
    "path": "recipes/wip/containers/youki/recipe.toml",
    "content": "#TODO require cgroups\n[source]\ngit = \"https://github.com/containers/youki\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages youki\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/crypto/data2sound/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/TheAwiteb/data2sound\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/crypto/decoder/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/World/decoder\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/crypto/morse2sound/recipe.toml",
    "content": "#TODO slice-deque crate error (after cargo update)\n[source]\ngit = \"https://github.com/irevenko/morse2sound\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/crypto/qrrs/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/Lenivaya/qrrs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/crypto/qrscan/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/sayanarijit/qrscan\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/crypto/qrtool/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/sorairolake/qrtool\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/crypto/steg86/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/woodruffw/steg86\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/crypto/stupidfs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/GoldenStack/stupidfs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/data/poppler-data/recipe.toml",
    "content": "#TODO missing script for gnu make\n[source]\ntar = \"https://poppler.freedesktop.org/poppler-data-0.4.12.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/data-integrity/b3sum/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/BLAKE3-team/BLAKE3\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/b3sum\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/data-integrity/fim/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Achiefs/fim\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/data-integrity/hashgood/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/thombles/hashgood\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/data-integrity/rapidhash/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/hoxxep/rapidhash\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages rapidhash\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/data-recovery/ddrescue/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://ftp.gnu.org/gnu/ddrescue/ddrescue-1.30.tar.lz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/data-recovery/foremost/recipe.toml",
    "content": "#TODO missing script for gnu make, see the README inside the tarball\n[source]\ntar = \"http://foremost.sourceforge.net/pkg/foremost-1.5.7.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/data-recovery/testdisk/recipe.toml",
    "content": "#TODO compilation error\n# build instructions - https://www.cgsecurity.org/wiki/TestDisk_Compilation\n# add optional libraries to expand the features - https://www.cgsecurity.org/wiki/TestDisk_Compilation#Libraries\n[source]\ntar = \"https://www.cgsecurity.org/testdisk-7.2.tar.bz2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncurses\",\n]\nscript = \"\"\"\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/db/bobby/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/hbons/Bobby\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"libadwaita\",\n    \"glib\",\n    \"gtk4\",\n]\n"
  },
  {
    "path": "recipes/wip/db/clickhouse/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://clickhouse.com/docs/en/development/build#how-to-build-clickhouse-on-any-linux\n[source]\ngit = \"https://github.com/ClickHouse/ClickHouse\"\nrev = \"v25.10.2.65-stable\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"curl\",\n    \"openssl3\",\n    \"xz\",\n]\n"
  },
  {
    "path": "recipes/wip/db/cockroachdb/recipe.toml",
    "content": "#TODO missing script for Bazel\n# build instructions: https://cockroachlabs.atlassian.net/wiki/spaces/CRDB/pages/181338446/Getting+and+building+CockroachDB+from+source\n[source]\ngit = \"https://github.com/cockroachdb/cockroach\"\nbranch = \"release-25.4\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/db/gobang/recipe.toml",
    "content": "#TODO update mio to 0.8 (after cargo update and patch on ring)\n[source]\ngit = \"https://github.com/TaKO8Ki/gobang\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/db/influxdb/recipe.toml",
    "content": "#TODO nonsense error \"Cargo.toml doesn't exist\"\n#TODO configure the CLI and service\n[source]\ngit = \"https://github.com/influxdata/influxdb\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/db/iotdb/recipe.toml",
    "content": "#TODO missing script for Maven, \n# build instructions: https://github.com/apache/iotdb#build-iotdb-from-source\n[source]\ngit = \"https://github.com/apache/iotdb\"\nrev = \"v2.0.5\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/db/jdbrowser/recipe.toml",
    "content": "#TODO wayland-backend crate error\n[source]\ngit = \"https://github.com/Jkeyuk/JDbrowser\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/db/limbo/recipe.toml",
    "content": "#TODO compilation error on the sqlite3 parser\n[source]\ngit = \"https://github.com/tursodatabase/limbo\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages limbo_cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/db/mariadb/recipe.toml",
    "content": "#TODO need openat (patched), posix_spawn\n[source]\ntar = \"https://dlm.mariadb.com/4509471/MariaDB/mariadb-12.1.2/source/mariadb-12.1.2.tar.gz\"\nblake3 = \"749a293e1c4fd13be936fbda33de38b1ccc8c737c30a55c187c028d3ce74f70c\"\npatches = [\n    \"redox.patch\"\n]\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncurses\",\n    \"bzip2\",\n    \"curl\",\n    \"zlib\",\n    \"pcre2\",\n    \"lz4\",\n    \"libevent\",\n    \"openssl3\",\n    \"curl\",\n    \"libxml2\",\n    \"boost\",\n]\ndev-dependencies = [\n    \"host:ncurses\",\n    \"boost.dev\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\n# see https://mariadb.com/kb/en/cross-compiling-mariadb/\nmkdir -p host\npushd host\n# todo: should use native generate_cookbook_cmake_file if possible\n(unset CC CXX AR && cmake ${COOKBOOK_SOURCE} -DWITH_SSL=system -DCMAKE_CROSSCOMPILING=False -DCMAKE_FIND_ROOT_PATH=${COOKBOOK_TOOLCHAIN})\nmake import_executables\npopd\n\nexport LDFLAGS+=\" -lcurl -lnghttp2 -lssl -lcrypto\"\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DWITH_UNIT_TESTS=OFF\n    -DSTACK_DIRECTION=-1\n    -DHAVE_IB_GCC_ATOMIC_BUILTINS=-1\n    -DCONC_DEFAULT_CHARSET=utf8mb4\n    -DPLUGIN_AWS_KEY_MANAGEMENT=NO\n    -DPLUGIN_COLUMNSTORE=NO\n    -DWITHOUT_ROCKSDB=1\n    -DIMPORT_EXECUTABLES=\"${COOKBOOK_BUILD}/host/import_executables.cmake\"\n)\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/db/mariadb/redox.patch",
    "content": "diff -ruwN source/mysys/mysys_priv.h source-new/mysys/mysys_priv.h\n--- source/mysys/mysys_priv.h\t2025-11-14 00:00:49.000000000 +0700\n+++ source-new/mysys/mysys_priv.h\t2026-03-14 05:20:38.369176577 +0700\n@@ -142,7 +142,7 @@\n #endif\n #endif\n \n-#ifdef O_PATH\n+#if defined(O_PATH) && !defined(__redox__) /* need openat */\n #define HAVE_OPEN_PARENT_DIR_NOSYMLINKS\n const char *my_open_parent_dir_nosymlinks(const char *pathname, int *pdfd);\n #define NOSYMLINK_FUNCTION_BODY(AT,NOAT)                                \\\n\n"
  },
  {
    "path": "recipes/wip/db/mariadb-lts/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions:\n# https://mariadb.com/kb/en/generic-build-instructions/\n# https://mariadb.com/kb/en/cross-compiling-mariadb/\n[source]\ntar = \"https://archive.mariadb.org/mariadb-10.11.6/source/mariadb-10.11.6.tar.gz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"ncurses\",\n    \"zlib\",\n    \"libevent\",\n    \"openssl1\",\n    \"curl\",\n    \"libxml2\",\n    \"boost\",\n    \"libaio\",\n]\n"
  },
  {
    "path": "recipes/wip/db/memcached/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://docs.memcached.org/serverguide/#from-source\n[source]\ntar = \"https://www.memcached.org/files/memcached-1.6.22.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libevent\",\n]\n"
  },
  {
    "path": "recipes/wip/db/mongodb6/recipe.toml",
    "content": "#TODO missing script for SCons\n# build instructions: https://github.com/mongodb/mongo/blob/master/docs/building.md\n[source]\ngit = \"https://github.com/mongodb/mongo\"\nbranch = \"v6.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"curl\",\n    \"xz\",\n]\n"
  },
  {
    "path": "recipes/wip/db/mongodb7/recipe.toml",
    "content": "#TODO missing script for SCons\n# build instructions: https://github.com/mongodb/mongo/blob/master/docs/building.md\n[source]\ngit = \"https://github.com/mongodb/mongo\"\nbranch = \"v7.2\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"curl\",\n    \"xz\",\n]\n"
  },
  {
    "path": "recipes/wip/db/mysql-server/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://dev.mysql.com/doc/refman/8.2/en/installing-source-distribution.html\n[source]\ntar = \"https://dev.mysql.com/downloads/file/?id=523432\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"boost\",\n    \"ncurses\",\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/db/mysql-shell/recipe.toml",
    "content": "#TODO missing script\n[source]\ntar = \"https://dev.mysql.com/downloads/file/?id=524161\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/db/pgtui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/kdwarn/pgtui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/db/postgresql16/recipe.toml",
    "content": "#TODO waiting on sigjmp_buf and related POSIX functions in relibc\n[source]\ntar = \"https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.bz2\"\nscript = \"\"\"\ncp \"${COOKBOOK_SOURCE}/src/backend/utils/errcodes.h\" \"${COOKBOOK_SOURCE}/src/include/utils/errcodes.h\"\n\"\"\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--without-icu\",\n    \"--without-readline\",\n    \"--with-template=redox\",\n]\ndependencies = [\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/db/postgresql18/recipe.toml",
    "content": "#TODO require sys/ipc.h\n[source]\ntar = \"https://ftp.postgresql.org/pub/source/v18.3/postgresql-18.3.tar.bz2\"\nblake3 = \"52696c9d474ce3e2073f97d4ba891af59ffc67a9dfb8f9f5adac409d1fe0dc28\"\npatches = [\n    \"redox.patch\"\n]\n[build]\ntemplate = \"meson\"\nmesonflags = [\n]\ndependencies = [\n    \"zstd\",\n    \"readline\",\n]\n"
  },
  {
    "path": "recipes/wip/db/postgresql18/redox.patch",
    "content": "diff --color -ruwN source/meson.build source-new/meson.build\n--- source/meson.build\t2026-02-24 04:56:43.000000000 +0700\n+++ source-new/meson.build\t2026-03-14 10:58:35.570033768 +0700\n@@ -256,6 +256,10 @@\n   # LDFLAGS.\n   ldflags += ['-Wl,-z,now', '-Wl,-z,relro']\n \n+elif host_system == 'redox'\n+  sema_kind = 'unnamed_posix'\n+  shmem_kind = 'sysv'\n+\n elif host_system == 'openbsd'\n   # you're ok\n \ndiff --color -ruwN source/src/include/port/redox.h source-new/src/include/port/redox.h\n--- source/src/include/port/redox.h\t1970-01-01 07:00:00.000000000 +0700\n+++ source-new/src/include/port/redox.h\t2026-03-14 10:50:26.877146350 +0700\n@@ -0,0 +1 @@\n+/* src/include/port/redox.h */\ndiff --color -ruwN source/src/makefiles/Makefile.redox source-new/src/makefiles/Makefile.redox\n--- source/src/makefiles/Makefile.redox\t1970-01-01 07:00:00.000000000 +0700\n+++ source-new/src/makefiles/Makefile.redox\t2026-03-14 10:51:25.313879766 +0700\n@@ -0,0 +1,6 @@\n+rpath = -Wl,-R'$(rpathdir)'\n+\n+\n+# Rule for building a shared library from a single .o file\n+%.so: %.o\n+\t$(CC) $(CFLAGS) $< $(LDFLAGS) $(LDFLAGS_SL) -shared -o $@\ndiff --color -ruwN source/src/template/redox source-new/src/template/redox\n--- source/src/template/redox\t1970-01-01 07:00:00.000000000 +0700\n+++ source-new/src/template/redox\t2026-03-14 10:55:40.896750233 +0700\n@@ -0,0 +1,7 @@\n+# src/template/redox\n+\n+# Prefer unnamed POSIX semaphores\n+PREFERRED_SEMAPHORES=UNNAMED_POSIX\n+\n+# Extra CFLAGS for code that will go into a shared library\n+CFLAGS_SL=\"-fPIC\"\n"
  },
  {
    "path": "recipes/wip/db/rainfrog/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/achristmascarl/rainfrog\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\n    \"nerd-fonts\",\n]\n"
  },
  {
    "path": "recipes/wip/db/rocksdb/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions: https://github.com/facebook/rocksdb/blob/main/INSTALL.md\n[source]\ngit = \"https://github.com/facebook/rocksdb\"\nrev = \"v10.7.5\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"zlib\",\n    \"lz4\",\n    \"bzip2\",\n    \"zstd\",\n    \"snappy\",\n    \"gflags\",\n]\n"
  },
  {
    "path": "recipes/wip/db/skytable/recipe.toml",
    "content": "#TODO libsky crate error\n[source]\ngit = \"https://github.com/skytable/skytable\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages skysh skyd\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/db/sqlite3/recipe.toml",
    "content": "#TODO incomplete port\n#TODO Complied, works for basic use cases. pthread mutexes compiled in, but not working.\n#TODO Calls triggering mutexes yield the following errors:\n#relibc getrlimit(7, 0x7ffffffffc38): not implemented\n#relibc getgroups(65536, 0x14920): not implemented\n#Runtime error near line 1: disk I/O error (10)\n[source]\ntar = \"https://sqlite.org/2025/sqlite-autoconf-3490200.tar.gz\"\nblake3 = \"96e071dc4f964311882334e927f017d8383915b1b140adcf308957dff213aa8c\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/db/sqllogictest/recipe.toml",
    "content": "#TODO Works, but not reliably\n#TODO Raises the following warnings:\n# setsockopt(16, 6, 1, 0x7fffffff4adc, 4) - unknown option\n# setsockopt(16, 1, 9, 0x7fffffff4ad0, 4) - unknown option\n# setsockopt(16, 6, 1, 0x7fffffff4ad4, 4) - unknown option\n\n[source]\ngit = \"https://github.com/risinglightdb/sqllogictest-rs.git\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages sqllogictest-bin\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/db/stoolap/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/stoolap/stoolap\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/db/tidb-server/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions: https://pingcap.github.io/tidb-dev-guide/get-started/build-tidb-from-source.html#build\n[source]\ngit = \"https://github.com/pingcap/tidb\"\nrev = \"v8.5.4\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/db/tsql/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/fcoury/tsql\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages tsql\n\"\"\"\n[package]\ndependencies = [\"postgresql16\"]\n"
  },
  {
    "path": "recipes/wip/db/valkey/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/valkey-io/valkey\"\nshallow_clone = true\nrev = \"9.0.3\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\"\n]\n\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}\"/* ./\n${COOKBOOK_MAKE} MALLOC=libc BUILD_TLS=yes \\\n    WARN=\"-Wall -W -Wno-missing-field-initializers\" \\\n    WARNINGS=\"-Wall -W -Wno-missing-field-initializers\" \\\n    AR=\"${TARGET}-gcc-ar\" CFLAGS=\"${CFLAGS} ${CPPFLAGS}\"\n${COOKBOOK_MAKE} install PREFIX=\"${COOKBOOK_STAGE}\"/usr\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/demos/albedo/recipe.toml",
    "content": "#TODO nanorand crate error\n[source]\ngit = \"https://github.com/albedo-engine/albedo\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"gpu_picking\"\n]\n"
  },
  {
    "path": "recipes/wip/demos/appcui/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/gdt050579/AppCUI-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"examples\"\n]\n"
  },
  {
    "path": "recipes/wip/demos/avian/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Jondolf/avian\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"chain_2d\",\n    \"many_shapes\",\n    \"ray_caster\",\n    \"chain_3d\",\n    \"cubes\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/avt/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/asciinema/avt\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"text\"\n]\n"
  },
  {
    "path": "recipes/wip/demos/bevy/recipe.toml",
    "content": "#TODO async-io crate error\n[source]\ngit = \"https://github.com/bevyengine/bevy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"hello_world\"\n]\n"
  },
  {
    "path": "recipes/wip/demos/blade/recipe.toml",
    "content": "#TODO x11rb and rustix crates error\n[source]\ngit = \"https://github.com/kvark/blade\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"bunnymark\",\n    \"particle\",\n    \"ray-query\",\n    \"scene\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/blitz/recipe.toml",
    "content": "#TODO fontique crate error\n[source]\ngit = \"https://github.com/DioxusLabs/blitz\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"url\",\n    \"markdown\",\n]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/blockish/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/yazgoo/blockish\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"euc\",\n    \"gif\",\n    \"tiny-skia\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/blockishfire/recipe.toml",
    "content": "#TODO outdated redox_syscall crate (cargo update don't fix it)\n[source]\ngit = \"https://github.com/yazgoo/blockishfire\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/demos/blue-engine/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/AryanpurTech/BlueEngine\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"triangle\",\n    \"square\",\n    \"cube\",\n    \"rotate_around\",\n    \"wireframe\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/bones/recipe.toml",
    "content": "#TODO iroh-quinn-udp crate error\n[source]\ngit = \"https://github.com/fishfolk/bones\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"demo_hello_world\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/colored/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/colored-rs/colored\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"control\",\n    \"custom_colors\",\n    \"dynamic_colors\",\n    \"most_simple\",\n    \"nested_colors\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/comfy/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/darthdeus/comfy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"animated_shapes\",\n    \"animated_sprites\",\n    \"animated_text\",\n    \"bloom\",\n    \"circle\",\n    \"colors\",\n    \"egui\",\n    \"fragment-shader\",\n    \"lighting\",\n    \"music\",\n    \"shapes\",\n    \"single_particle\",\n    \"sprite\",\n    \"text\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/console-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/console-rs/console\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"colors\",\n    \"colors256\",\n    \"cursor_at\",\n    \"keyboard\",\n    \"term\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/contrast-renderer/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Lichtso/contrast_renderer\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"showcase\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/cubecl/recipe.toml",
    "content": "#TODO cubecl-macros crate error\n[source]\ngit = \"https://github.com/tracel-ai/cubecl\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"gelu\"\n]\ncargoflags = [\"--no-default-features --wgpu\"]\n"
  },
  {
    "path": "recipes/wip/demos/dioxus-examples/recipe.toml",
    "content": "#TODO wry crate error\n[source]\ngit = \"https://github.com/DioxusLabs/dioxus\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"calculator\",\n    \"clock\",\n    \"counters\",\n    \"file_explorer\",\n    \"hello_world\",\n    \"multiwindow\",\n    \"popup\",\n    \"window_event\",\n    \"window_zoom\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/doomfire/recipe.toml",
    "content": "#TODO discover how to build the \"doomfire-minifb\" example\n[source]\ngit = \"https://github.com/r-marques/doomfire\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"doomfire-minifb\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/egui/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/emilk/egui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"hello_world\"\n]\n"
  },
  {
    "path": "recipes/wip/demos/euc/recipe.toml",
    "content": "#TODO minifb crate error\n[source]\ngit = \"https://github.com/zesterer/euc\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"spinning_cube\",\n    \"teapot\",\n    \"texture_mapping\",\n    \"triangle\",\n    \"wireframes\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/feoxdb/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mehrantsi/FeOxDB\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"basic_usage\",\n    \"deterministic_test\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/ferris-says/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/rust-lang/ferris-says\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"fsays\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/firewheel/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/BillyDM/firewheel\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"beep_test\",\n    \"play_sample\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/firework-rs/recipe.toml",
    "content": "#TODO fix the script\n[source]\ngit = \"https://github.com/Wayoung7/firework-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"firework-rs\"]\ncargoexamples = [\n    \"fountain\",\n    \"heart\",\n    \"vortex\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/fonterator/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ardaku/fonterator\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--features monospace-font\"]\ncargoexamples = [\n    \"main\",\n    \"directions\",\n    \"image\",\n    \"raster\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/fractal-rs/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/aetherknight/fractal-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"fractal-piston\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/freya/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/marc2332/freya\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"animated_position\",\n    \"animated_tabs\",\n    \"animation\",\n    \"button\",\n    \"camera\",\n    \"checkbox\",\n    \"clock\",\n    \"counter\",\n    \"drag\",\n    \"drag_drop\",\n    \"dynamic_theme\",\n    \"file_explorer\",\n    \"frameless_window\",\n    \"gradient\",\n    \"graph\",\n    \"highlight\",\n    \"image\",\n    \"image_viewer\",\n    \"images_slideshow\",\n    \"infinite_list\",\n    \"input\",\n    \"keyboard_navigation\",\n    \"menu\",\n    \"mouse_trace\",\n    \"opacity\",\n    \"pointer\",\n    \"popup\",\n    \"position\",\n    \"progress_bar\",\n    \"radio\",\n    \"render_canvas\",\n    \"rotate\",\n    \"scroll\",\n    \"selectable_text\",\n    \"sequential_animation\",\n    \"shader\",\n    \"shader_editor\",\n    \"shadow\",\n    \"simple_editor\",\n    \"speedometer\",\n    \"svg\",\n    \"tab\",\n    \"table\",\n    \"text\",\n    \"text_editors\",\n    \"tic_tac_toe\",\n    \"touch\",\n    \"ui\",\n    \"website\",\n    \"window_size\",\n]\ndependencies = [\n    \"openssl3\",\n    \"gtk3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_examples \n\"\"\"\n"
  },
  {
    "path": "recipes/wip/demos/fundsp/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/SamiPerttu/fundsp\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"beep\",\n    \"file\",\n    \"grain\",\n    \"grain2\",\n    \"keys\",\n    \"network\",\n    \"optimize\",\n    \"peek\",\n    \"plot\",\n    \"sequence\",\n    \"type\",\n]\ndependencies = [\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/funutd/recipe.toml",
    "content": "#TODO rfd crate error\n[source]\ngit = \"https://github.com/SamiPerttu/funutd\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"editor\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/fyrox/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/FyroxEngine/Fyrox-demo-projects\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopath = \"ui\"\ncargopackages = [\"executor\"]\n"
  },
  {
    "path": "recipes/wip/demos/genpdf-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://git.sr.ht/~ireas/genpdf-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"demo\"]\n"
  },
  {
    "path": "recipes/wip/demos/gfx-shader-watch/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/alexheretic/gfx-shader-watch\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"watch-shaders\"]\n"
  },
  {
    "path": "recipes/wip/demos/ggez/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ggez/ggez\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"02_hello_world\",\n    \"04_snake\",\n    \"cube\",\n    \"hello_canvas\",\n    \"input_test\",\n    \"shader\",\n    \"shadows\",\n    \"sounds\",\n    \"text\",\n    \"vertex_shader\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/globe-rs/recipe.toml",
    "content": "#TODO update the mio crate version (after cargo update)\n[source]\ngit = \"https://github.com/adamsky/globe\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages globe-cli\nmv \"${COOKBOOK_STAGE}/usr/bin/globe\" \"${COOKBOOK_STAGE}/usr/bin/globe-rs\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/demos/hotline/recipe.toml",
    "content": "#TODO hot-lib-reloader crate error\n[source]\ngit = \"https://github.com/polymonster/hotline\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"triangle\"]\n"
  },
  {
    "path": "recipes/wip/demos/iced-7guis/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/dcampbell24/iced_7guis\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/demos/if-watch/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mxinden/if-watch\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--features smol\"]\ncargoexamples = [\"if_watch\"]\n"
  },
  {
    "path": "recipes/wip/demos/imgui-examples/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# pull request: https://github.com/ocornut/imgui/pull/3027\n[source]\ngit = \"https://github.com/Qix-/imgui\"\nbranch = \"cmake\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n#dependencies = [\"sdl2\"]\n"
  },
  {
    "path": "recipes/wip/demos/iocraft/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ccbrown/iocraft\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"borders\",\n    \"calculator\",\n    \"counter\",\n    \"fullscreen\",\n    \"hello_world\",\n    \"overlap\",\n    \"progress_bar\",\n    \"scrolling\",\n    \"table\",\n    \"use_input\",\n    \"use_output\",\n    \"weather\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/kira/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/tesselode/kira-examples\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"dynamic-music\",\n    \"ghost-noise\",\n    \"metronome\",\n    \"score-counter\",\n    \"spatial-audio\",\n    \"simple-sound-playback\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/kiss3d/recipe.toml",
    "content": "#TODO winit crate error (even after cargo update)\n[source]\ngit = \"https://github.com/sebcrozet/kiss3d\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"camera\",\n    \"cube\",\n    \"lines\",\n    \"multi_windows\",\n    \"planar_lines\",\n    \"points\",\n    \"post_processing\",\n    \"primitives\",\n    \"primitives2d\",\n    \"procedural\",\n    \"rectangle\",\n    \"screenshot\",\n    \"stereo\",\n    \"text\",\n    \"texturing\",\n    \"ui\",\n    \"window\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/lenia/recipe.toml",
    "content": "#TODO winit crate error (after cargo update)\n[source]\ngit = \"https://github.com/BirdbrainEngineer/lenia\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/demos/macroquad/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/not-fl3/macroquad\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"3d\",\n    \"basic_shapes\",\n    \"camera\",\n    \"first_person\",\n    \"particles_example\",\n    \"platformer\",\n    \"shadertoy\",\n    \"snake\",\n    \"text\",\n    \"ui\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/mage/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/baad-c0de/mage-core\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"basic\",\n    \"hello\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/mesa-demos/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.freedesktop.org/mesa/demos/-/blob/main/README.rst?ref_type=heads\n[source]\ntar = \"https://archive.mesa3d.org/demos/mesa-demos-9.0.0.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"freeglut\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/mousefood/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/j-g00da/mousefood\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"simulator\"]\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/nibble/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Vaishnav-Sabari-Girish/nibble\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/demos/notan/recipe.toml",
    "content": "#TODO environment leak on CMake\n[source]\ngit = \"https://github.com/Nazariglez/notan\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"renderer_cube\",\n    \"draw_path_flower\",\n    \"game_pong\",\n    \"game_of_life\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/pingora/recipe.toml",
    "content": "#TODO jemalloc-sys crate error\n[source]\ngit = \"https://github.com/cloudflare/pingora\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"server\",\n    \"client\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/pipes-rs/recipe.toml",
    "content": "#TODO libmalloc-sys crate error\n[source]\ngit = \"https://github.com/lhvy/pipes-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"pipes-rs\"]\n"
  },
  {
    "path": "recipes/wip/demos/piston/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/pistondevelopers/piston-examples\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"cube\",\n    \"hello_world\",\n    \"image\",\n    \"multi_window\",\n    \"shapes\",\n    \"snake\",\n    \"sprite\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/pix-engine/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/lukexor/pix-engine\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"maze\",\n    \"2d_raycasting\",\n    \"3d_raycasting\",\n    \"asteroids\",\n    \"colors\",\n    \"fluid_simulation\",\n    \"gui\",\n    \"hello_world\",\n    \"image\",\n    \"light\",\n    \"matrix\",\n    \"shapes\",\n    \"textures\",\n    \"tree\",\n    \"windows\",\n]\ndependencies = [\n    \"sdl2\",\n    \"sdl2-image\",\n    \"sdl2-mixer\",\n    \"sdl2-ttf\",\n    \"sdl-gfx\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/pixels/recipe.toml",
    "content": "#TODO webbrowser crate error\n[source]\ngit = \"https://github.com/parasyte/pixels\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"conway\",\n    \"invaders\",\n    \"minimal-egui\",\n    \"minimal-winit\",\n    \"tiny-skia-winit\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/raclettui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ishrut/raclettui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"cpu_ratatui\",\n    \"test\",\n    \"wgpu_ratatui\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/rain/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/saschagrunert/rain\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"demo\"]\n"
  },
  {
    "path": "recipes/wip/demos/rapier/recipe.toml",
    "content": "#TODO x11rb, rustix and webbrowser crates error\n[source]\ngit = \"https://github.com/dimforge/rapier\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"rapier-examples-2d\",\n    \"rapier-examples-3d\",\n    \"rapier-examples-3d-f64\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/ratatui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ratatui/ratatui\"\nbranch = \"latest\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--no-default-features --features termion\"]\ncargopackages = [\n    \"async-github\",\n    \"calendar-explorer\",\n    \"canvas\",\n    \"chart\",\n    \"color-explorer\",\n    \"colors-rgb\",\n    \"demo\",\n    \"demo2\",\n    \"hyperlink\",\n    \"hello-world\",\n    \"inline\",\n    \"modifiers\",\n    \"mouse-drawing\",\n    \"simple\",\n    \"panic\",\n    \"popup\",\n    \"scrollbar\",\n    \"table\",\n    \"todo-list\",\n    \"tracing\",\n    \"user-input\",\n]\ncargoexamples = [\n    \"block\",\n    \"calendar\",\n    \"canvas\",\n    \"chart\",\n    \"logo\",\n    \"scrollbar\",\n    \"sparkline\",\n    \"tabs\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/ratatui-hypertile/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nikolic-milos/ratatui-hypertile\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"core_only\"]\n"
  },
  {
    "path": "recipes/wip/demos/ratzilla/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/orhun/ratzilla\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CARGO_FLAGS=() # remove --locked\nCOOKBOOK_CARGO_PATH=\"examples/animations\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/canvas_stress_test\" bin_name=\"canvas-stress-test\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/canvas_waves\" bin_name=\"canvas-waves\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/colors_rgb\" bin_name=\"color-rgb\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/demo\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/demo2\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/minimal\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/pong\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/text_area\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/user_input\" bin_name=\"user-input\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/website\" cookbook_cargo_build\nCOOKBOOK_CARGO_PATH=\"examples/world_map\" bin_name=\"world-map\" cookbook_cargo_build\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/demos/rend3/recipe.toml",
    "content": "#TODO webbrowser crate error\n[source]\ngit = \"https://github.com/BVE-Reborn/rend3\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"rend3-examples-package\"]\n"
  },
  {
    "path": "recipes/wip/demos/renderling/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/schell/renderling\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"example\"]\n"
  },
  {
    "path": "recipes/wip/demos/reticulum-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n# require protobuf\n[source]\ngit = \"https://github.com/BeechatNetworkSystemsLtd/Reticulum-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"tcp_client\",\n    \"kaonic_client\",\n]\ndev-dependencies = [\"protobuf\"]\n"
  },
  {
    "path": "recipes/wip/demos/rootvg/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/MeadowlarkDAW/rootvg\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"demo\"]\n"
  },
  {
    "path": "recipes/wip/demos/rpt/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ekzhang/rpt\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"basic\",\n    \"cylinder\",\n    \"fractal_spheres\",\n    \"fractal_teapots\",\n    \"glass\",\n    \"marbles\",\n    \"metal\",\n    \"rustacean\",\n    \"sphere\",\n    \"spheres\",\n    \"teapot\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/rsille/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/nidhoggfgg/rsille\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--features=img\"]\ncargoexamples = [\n    \"anime-mix\",\n    \"obj-mix\",\n    \"cube\",\n    \"cube-colorful\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/rui/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/audulus/rui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"calculator\",\n    \"synth\",\n]\ncargoexamples = [\n    \"action\",\n    \"background\",\n    \"basic\",\n    \"canvas\",\n    \"counter\",\n    \"counter2\",\n    \"font_size\",\n    \"gallery\",\n    \"list\",\n    \"menu\",\n    \"shapes\",\n    \"slider\",\n    \"text_editor\",\n    \"toggle\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/ruscii/recipe.toml",
    "content": "#TODO device_query crate error\n[source]\ngit = \"https://github.com/lemunozm/ruscii\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"pong\",\n    \"space_invaders\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/rust-cairo/recipe.sh",
    "content": "GIT=https://gitlab.redox-os.org/redox-os/rust-cairo.git\nBUILD_DEPENDS=(cairo expat fontconfig freetype2 libpng pixman zlib)\nCARGOFLAGS=\"--example gui\"\n\nfunction recipe_build {\n    sysroot=\"$(realpath ../sysroot)\"\n    cargo rustc --target \"$TARGET\" --release ${CARGOFLAGS} \\\n        -- \\\n        -L \"${sysroot}/lib\" \\\n        -l cairo \\\n        -l fontconfig \\\n        -l expat \\\n    \t-l pixman-1 \\\n    \t-l freetype \\\n    \t-l png \\\n    \t-l z\n    skip=1\n}\n\nfunction recipe_stage {\n    dest=\"$(realpath $1)\"\n    mkdir -pv \"$dest/bin\"\n    cp -v \"target/${TARGET}/release/examples/gui\" \"$dest/bin/rust-cairo\"\n    skip=1\n}\n"
  },
  {
    "path": "recipes/wip/demos/rust-cairo-demo/recipe.sh",
    "content": "GIT=https://gitlab.redox-os.org/redox-os/rust-cairo-demo.git\nBUILD_DEPENDS=(cairo expat fontconfig freetype2 libpng pixman zlib)\n\nfunction recipe_build {\n    sysroot=\"$(realpath ../sysroot)\"\n    cargo rustc --target \"$TARGET\" --release ${CARGOFLAGS} \\\n        -- \\\n        -L \"${sysroot}/lib\" \\\n        -l cairo \\\n        -l fontconfig \\\n        -l expat \\\n    \t-l pixman-1 \\\n    \t-l freetype \\\n    \t-l png \\\n    \t-l z\n    skip=1\n}\n\n"
  },
  {
    "path": "recipes/wip/demos/rustubble/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/warpy-ai/rustubble\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"list_example\",\n    \"menu_list_example\",\n    \"progress_bar_example\",\n    \"spinner_example\",\n    \"stopwatch_example\",\n    \"table_example\",\n    \"text_area_example\",\n    \"text_input_example\",\n    \"timer_example\",\n    \"viewport_example\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/rustui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/broccolingual/rustui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"tetris\"]\ncargoexamples = [\n    \"hello_world\",\n    \"colors\",\n    \"inputs\",\n    \"file_reader\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/rusty-rain/recipe.toml",
    "content": "#TODO compiled but not tested for a long time\n[source]\ngit = \"https://github.com/cowboy8625/rusty-rain\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/demos/servo-gtk/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nacho/servo-gtk\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"browser\"]\ndependencies = [\n    \"gtk4\"\n]\n"
  },
  {
    "path": "recipes/wip/demos/simdjson-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/simd-lite/simd-json\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"perf\"]\n"
  },
  {
    "path": "recipes/wip/demos/slint/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/slint-ui/slint\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"gallery\",\n    \"energy-monitor\",\n    \"carousel\",\n    \"memory\",\n    \"imagefilter\",\n    \"plotter\",\n    \"opengl_underlay\",\n    \"opengl_texture\",\n    \"maps\",\n    \"virtual_keyboard\",\n    \"7guis\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/soft-ratatui/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/gold-silver-copper/soft_ratatui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"egui_colors_example\"]\n"
  },
  {
    "path": "recipes/wip/demos/speedy2d/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/QuantumBadger/Speedy2D\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"animation\",\n    \"hello_world\",\n    \"moving_text\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/spinners/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/FGRibreau/spinners\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"cycle\",\n    \"simple\",\n    \"stop_persist\",\n    \"stop_symbol\",\n    \"timer\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/spinoff/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ad4mx/spinoff\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"simple\",\n    \"stop_and_persist\",\n    \"stream\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/tachyonfx/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/junkdog/tachyonfx\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"basic-effects\",\n    \"open-window\",\n    \"tweens\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/taffy/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/DioxusLabs/taffy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"basic\"]\n"
  },
  {
    "path": "recipes/wip/demos/tenki/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ckaznable/tenki\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/demos/termtree/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/rust-cli/termtree\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"tree\"]\n"
  },
  {
    "path": "recipes/wip/demos/ternimal/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO add condition script for multiarch compilation\n# build instructions: https://github.com/p-e-w/ternimal#building\n[source]\ngit = \"https://github.com/p-e-w/ternimal\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncp -v \"${COOKBOOK_SOURCE}\"/ternimal.rs \"${COOKBOOK_BUILD}\"\nrustc -O \"${COOKBOOK_BUILD}\"/ternimal.rs --target x86_64-unknown-redox\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\ncp -v \"${COOKBOOK_BUILD}\"/ternimal \"${COOKBOOK_STAGE}/usr/bin\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/demos/terra/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/fintelia/terra\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n    \"mesa\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/three-d/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/asny/three-d\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"animation\",\n    \"environment\",\n    \"fireworks\",\n    \"fog\",\n    \"forest\",\n    \"image\",\n    \"instanced_shapes\",\n    \"lighting\",\n    \"lights\",\n    \"logo\",\n    \"mandelbrot\",\n    \"multiwindow\",\n    \"pbr\",\n    \"shapes\",\n    \"shapes2d\",\n    \"sprites\",\n    \"statues\",\n    \"terrain\",\n    \"texture\",\n    \"triangle\",\n]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/tquic/recipe.toml",
    "content": "#TODO tikv-jemalloc-sys crate error\n[source]\ngit = \"https://github.com/Tencent/tquic\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages tquic_tools\nmv \"${COOKBOOK_STAGE}/usr/bin/tquic_server\" \"${COOKBOOK_STAGE}/usr/bin/tquic-server\"\nmv \"${COOKBOOK_STAGE}/usr/bin/tquic_client\" \"${COOKBOOK_STAGE}/usr/bin/tquic-client\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/demos/uniocr/recipe.toml",
    "content": "#TODO xcap crate error\n[source]\ngit = \"https://github.com/mediar-ai/uniOCR\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"basic\",\n    \"batch_processing\",\n]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/usfx/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tversteeg/usfx\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"cpal\",\n    \"music\",\n    \"sdl2\",\n]\ndependencies = [\n    \"libalsa\",\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/vizia/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/vizia/vizia\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"animation\",\n    \"dragdrop\",\n    \"number\",\n    \"input\",\n    \"timers\",\n]\n#dependencies = [\"libwayland\"]\n"
  },
  {
    "path": "recipes/wip/demos/wavy/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ardaku/wavy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\n    \"monitor\",\n    \"play\",\n    \"query\",\n    \"record\",\n]\n"
  },
  {
    "path": "recipes/wip/demos/wgpu-sky-rendering/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/bmatthieu3/wgpu-sky-rendering\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/demos/xaos/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n# build instructions: https://github.com/xaos-project/XaoS/wiki/Developer's-Guide#build-instructions-for-version-433\n[source]\ngit = \"https://github.com/xaos-project/XaoS\"\nrev = \"release-4.3.4\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n#dependencies = [\n#    \"qt6-base\",\n#    \"mesa\",\n#]\n"
  },
  {
    "path": "recipes/wip/demos/xilem/recipe.toml",
    "content": "#TODO xilem_core crate error\n[source]\ngit = \"https://github.com/linebender/xilem\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoexamples = [\"components\"]\n"
  },
  {
    "path": "recipes/wip/dev/analysis/binocle/recipe.toml",
    "content": "#TODO \"No suitable wgpu::Adapter found\" error on execution\n[source]\ngit = \"https://github.com/sharkdp/binocle\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/binwalk/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ReFirmLabs/binwalk\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"fontconfig\",\n    \"xz\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/analysis/code-minimap/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/wfxr/code-minimap\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/codevis/recipe.toml",
    "content": "#TODO open crate error (after cargo update)\n[source]\ngit = \"https://github.com/sloganking/codevis\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/debtmap/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/iepathos/debtmap\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/feluda/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/anistark/feluda\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/analysis/hex/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/sitkevij/hex\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/hgrep/recipe.toml",
    "content": "#TODO compilation error, missing mimalloc sys/syscall.h\n[source]\ngit = \"https://github.com/rhysd/hgrep\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/hl/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/pamburus/hl\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/honggfuzz-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rust-fuzz/honggfuzz-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gnu-binutils\",\n    \"libunwind\",\n    \"xz\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/analysis/hx/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/krpors/hx#compiling-and-running\n[source]\ngit = \"https://github.com/krpors/hx\"\nrev = \"v1.0.15\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/pratdiff/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/fowles/pratdiff\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/statui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Mohamed-Badry/statui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/tinywatcher/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tinywatcher/tinywatcher\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/analysis/zizmor/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/woodruffw/zizmor\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages zizmor\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/blockchain/foundry/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/foundry-rs/foundry\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages anvil cast chisel forge\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/blockchain/geth/recipe.toml",
    "content": "#TODO missing script for gnu make: https://geth.ethereum.org/docs/getting-started/installing-geth#build-from-source\n[source]\ngit = \"https://github.com/ethereum/go-ethereum\"\nbranch = \"release/1.16\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/blockchain/solidity/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://docs.soliditylang.org/en/v0.8.33/installing-solidity.html#building-from-source\n[source]\ntar = \"https://github.com/argotorg/solidity/releases/download/v0.8.33/solidity_0.8.33.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DPEDANTIC=OFF\",\n]\ndependencies = [\n    \"boost\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/blockchain/surfpool/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/txtx/surfpool\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages surfpool-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/build-system/ant/recipe.toml",
    "content": "#TODO not tested\n[source]\ntar = \"https://dlcdn.apache.org//ant/binaries/apache-ant-1.10.15-bin.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin/ant-dir\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/usr/bin/ant-dir\"\necho \"/usr/bin/ant-dir/bin/ant\" > \"${COOKBOOK_STAGE}\"/usr/bin/ant\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/ant\n\"\"\"\n[package]\ndependencies = [\"openjdk21\",]\n"
  },
  {
    "path": "recipes/wip/dev/build-system/ccache/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies: https://github.com/ccache/ccache/blob/master/doc/INSTALL.md#dependencies\n# build instructions: https://github.com/ccache/ccache/blob/master/doc/INSTALL.md\n[source]\ntar = \"https://github.com/ccache/ccache/releases/download/v4.10.2/ccache-4.10.2.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_TESTING=OFF\",\n    \"-DREDIS_STORAGE_BACKEND=OFF\",\n]\ndependencies = [\n    \"libfmt\",\n    \"xxhash\",\n    \"zstd\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/build-system/hadrian/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/ghc/hadrian\n[source]\ntar = \"https://downloads.haskell.org/~ghc/9.8.1/hadrian-bootstrap-sources/hadrian-bootstrap-sources-9.6.2.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/build-system/just/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/casey/just\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages just\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/build-system/lux/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/lumen-oss/lux\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages lux-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/build-system/meson/recipe.toml",
    "content": "#TODO create a standalone script: https://github.com/mesonbuild/meson#creating-a-standalone-script\n[source]\ntar = \"https://github.com/mesonbuild/meson/releases/download/1.3.0/meson-1.3.0.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/build-system/ninja-build/recipe.toml",
    "content": "#TODO not compiled or tested \n# build instructions: https://github.com/ninja-build/ninja#building-ninja-itself\n[source]\ngit = \"https://github.com/ninja-build/ninja\"\nrev = \"v1.13.1\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/dev/build-system/sbt/recipe.toml",
    "content": "#TODO missing script for building, discover how to build\n[source]\ngit = \"https://github.com/sbt/sbt\"\nbranch = \"1.12.x\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/build-system/scala-cli/recipe.toml",
    "content": "#TODO not tested yet\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\nwget https://github.com/VirtusLab/scala-cli/releases/download/v1.12.1/scala-cli.jar \"${COOKBOOK_STAGE}\"/usr/bin\necho \"#!/usr/bin/env sh \\n java -jar scala-cli.jar\" > \"${COOKBOOK_STAGE}\"/usr/bin/scala-cli\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/scala-cli\n\"\"\"\n[package]\ndependencies = [\"openjdk21\"]\n"
  },
  {
    "path": "recipes/wip/dev/build-system/werk/recipe.toml",
    "content": "#TODO async and rustix crates error\n[source]\ngit = \"https://github.com/simonask/werk\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages werk-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-about/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/EmbarkStudios/cargo-about\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-all-features/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/frewsxcv/cargo-all-features\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-attribution/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/ameknite/cargo-attribution\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-audit/recipe.toml",
    "content": "#TODO camino crate error (after a patch on the ring crate)\n[source]\ngit = \"https://github.com/rustsec/rustsec\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n    \"libssh2\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\ncookbook_cargo_packages cargo-audit\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-auditable/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/rust-secure-code/cargo-auditable\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-auditable\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-auto/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/automation-tasks-rs/cargo-auto\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-autodd/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/nwiizo/cargo-autodd\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-binutils/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/rust-embedded/cargo-binutils\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-bloat/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/RazrFalcon/cargo-bloat\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-c/recipe.toml",
    "content": "#TODO require rustc 1.75 or newer\n[source]\ngit = \"https://github.com/lu-zero/cargo-c\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-cache/recipe.toml",
    "content": "# TODO compile errors from fs_at 0.1.4, libc 0.2.140, proc-macro2 1.0.53\n# tested 29th January 2026\n[source]\ngit = \"https://github.com/matthiaskrgr/cargo-cache\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-careful/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/RalfJung/cargo-careful\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-check-deadlock/recipe.toml",
    "content": "#TODO require the components rust-src rustc-dev llvm-tools-preview to be installed\n[source]\ngit = \"https://github.com/hlisdero/cargo-check-deadlock\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-checkmate/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/cargo-checkmate/cargo-checkmate\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-clone/recipe.toml",
    "content": "#TODO cargo-util crate error\n[source]\ngit = \"https://github.com/JanLikar/cargo-clone\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-clone\"]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-clone-crate/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ehuss/cargo-clone-crate\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-compete/recipe.toml",
    "content": "#TODO serde crate error (after cargo update)\n[source]\ngit = \"https://github.com/qryxip/cargo-compete\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-component/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/bytecodealliance/cargo-component\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-crev/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/crev-dev/cargo-crev\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-crev\"]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-deny/recipe.toml",
    "content": "#TODO camino crate error (after a patch on the ring crate)\n[source]\ngit = \"https://github.com/EmbarkStudios/cargo-deny\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-depsize/recipe.toml",
    "content": "#TODO cargo-util crate error\n[source]\ngit = \"https://github.com/Alfex4936/cargo-depsize\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-derivefmt/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/dcchut/cargo-derivefmt\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-derivefmt\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-diet/recipe.toml",
    "content": "#TODO termsize crate error\n[source]\ngit = \"https://github.com/the-lean-crate/cargo-diet\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-dist/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/axodotdev/cargo-dist\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-dist\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-docs/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/btwiuse/cargo-docs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-docs-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/dtolnay/cargo-docs-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-duplicates/recipe.toml",
    "content": "#TODO cargo-util crate error\n[source]\ngit = \"https://github.com/Keruspe/cargo-duplicates\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-edit/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/killercup/cargo-edit\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-equip/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/qryxip/cargo-equip\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-expand/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/dtolnay/cargo-expand\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-featalign/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/hack-ink/cargo-featalign\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-feature/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/Riey/cargo-feature\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-feature-combinations/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/romnn/cargo-feature-combinations\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-files/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/dcchut/cargo-files\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-files\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-fixture/recipe.toml",
    "content": "#TODO async-io and rustix crates error\n[source]\ngit = \"https://github.com/vojtechkral/cargo-fixture\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-ft/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/stormshield/cargo-ft\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-fuzz/recipe.toml",
    "content": "#TODO compiled but not tested (after an update on proc-macro2)\n[source]\ngit = \"https://github.com/rust-fuzz/cargo-fuzz\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-gc/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/waynexia/cargo-gc\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-geiger/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/rust-secure-code/cargo-geiger\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\ncookbook_cargo_packages cargo-geiger\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-generate/recipe.toml",
    "content": "#TODO fs_at crate error\n[source]\ngit = \"https://github.com/cargo-generate/cargo-generate\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-get/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/nicolaiunrein/cargo-get\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-goggles/recipe.toml",
    "content": "#TODO serde crate error\n[source]\ngit = \"https://github.com/M4SS-Code/cargo-goggles\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-guppy/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/guppy-rs/guppy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-guppy\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-hack/recipe.toml",
    "content": "#TODO serde crate error\n[source]\ngit = \"https://github.com/taiki-e/cargo-hack\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-hackerman/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/pacak/hackerman\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-hakari/recipe.toml",
    "content": "#TODO atomicwrites and rustix crates error\n[source]\ngit = \"https://github.com/guppy-rs/guppy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-hakari\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-http-registry/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/d-e-s-o/cargo-http-registry\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-info/recipe.toml",
    "content": "#TODO openssl error\n[source]\ngit = \"https://gitlab.com/imp/cargo-info\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-lambda/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/cargo-lambda/cargo-lambda\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-lambda\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-leet/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/rust-practice/cargo-leet\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-leptos/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/leptos-rs/cargo-leptos\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-license/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/onur/cargo-license\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-limit/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/cargo-limit/cargo-limit\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-list/recipe.toml",
    "content": "#TODO update the redox_syscall crate version on the dependency tree\n[source]\ngit = \"https://github.com/qtfkwk/cargo-list\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-llvm-cov/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/taiki-e/cargo-llvm-cov\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-llvm-lines/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/dtolnay/cargo-llvm-lines\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-loc/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/Shnatsel/cargo-loc\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-lockup/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/collinoc/cargo-lookup\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-machete/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/bnjbvr/cargo-machete\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-make/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/sagiegurari/cargo-make\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-modules/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/regexident/cargo-modules\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-msrv/recipe.toml",
    "content": "#TODO camino crate error (after a patch on ring)\n[source]\ngit = \"https://github.com/foresterre/cargo-msrv\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-multivers/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/ronnychevalier/cargo-multivers\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-mutants/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/sourcefrog/cargo-mutants\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-nextest/recipe.toml",
    "content": "#TODO shared_child and libc crates error\n[source]\ngit = \"https://github.com/nextest-rs/nextest\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-nextest\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-outofdate/recipe.toml",
    "content": "#TODO cargo-util crate error\n[source]\ngit = \"https://github.com/quininer/cargo-outofdate\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-packager/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/crabnebula-dev/cargo-packager\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-packager\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-patch/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/itmettkeDE/cargo-patch\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-preflight/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/supinie/cargo-preflight\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-public-api/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/Enselic/cargo-public-api\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"cargo-public-api\"]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-px/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/LukeMathWalker/cargo-px\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-qtest/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/onur-ozkan/cargo-qtest\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-rdme/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/orium/cargo-rdme\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-release/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/crate-ci/cargo-release\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-remark/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/kobzol/cargo-remark\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--no-default-features\"]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-run-bin/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/dustinblackman/cargo-run-bin\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-scaffold/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/iomentum/cargo-scaffold\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-selector/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/lusingander/cargo-selector\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-semver-checks/recipe.toml",
    "content": "#TODO serde crate error\n[source]\ngit = \"https://github.com/obi1kenobi/cargo-semver-checks\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-shear/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/Boshen/cargo-shear\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-show-asm/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/pacak/cargo-show-asm\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-single-line/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/mexus/cargo-single-line\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-smart-release/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/Byron/cargo-smart-release\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-spellcheck/recipe.toml",
    "content": "#TODO Not compiled or tested\n#TODO determine what llvm variant is needed\n[source]\ngit = \"https://github.com/drahnr/cargo-spellcheck\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n#dependencies = [\n#    \"llvm21\",\n#    \"llvm21.runtime\",\n#]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-subspace/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ethowitz/cargo-subspace\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-supply-chain/recipe.toml",
    "content": "#TODO camino crate error (after cargo update)\n[source]\ngit = \"https://github.com/rust-secure-code/cargo-supply-chain\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-sweep/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/holmgr/cargo-sweep\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-sync-rdme/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/gifnksm/cargo-sync-rdme\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-tally/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/dtolnay/cargo-tally\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-tarpaulin/recipe.toml",
    "content": "# TODO compiles and works. Need cargo disk I/O errors fixed before it can be used.\n# tested 29th January 2026\n[source]\ngit = \"https://github.com/xd009642/tarpaulin\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-temp/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/yozhgoor/cargo-temp\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-trend/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/dalance/cargo-trend\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-trim/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/iamsauravsharma/cargo-trim\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-udeps/recipe.toml",
    "content": "#TODO cargo-util crate error\n[source]\ngit = \"https://github.com/est31/cargo-udeps\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-ui/recipe.toml",
    "content": "#TODO make libxkbcommon work\n[source]\ngit = \"https://github.com/slint-ui/cargo-ui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\n    \"--no-default-features --features slint-backend-gl-all\"\n]\ndependencies = [\n    \"fontconfig\",\n    \"libxkbcommon\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-unfmt/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/fprasx/cargo-unfmt\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-unmaintained/recipe.toml",
    "content": "#TODO compiled but not tested (after a camino crate patch)\n[source]\ngit = \"https://github.com/trailofbits/cargo-unmaintained\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-update/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/nabijaczleweli/cargo-update\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"curl\",\n    \"openssl3\",\n    \"libssh2\",\n    \"libgit2\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-vendor-filterer/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/coreos/cargo-vendor-filterer\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-vet/recipe.toml",
    "content": "#TODO camino crate error (after cargo update and a patch on the ring crate)\n[source]\ngit = \"https://github.com/mozilla/cargo-vet\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-wasi/recipe.toml",
    "content": "#TODO fs2 crate error\n[source]\ngit = \"https://github.com/bytecodealliance/cargo-wasi\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-wasix/recipe.toml",
    "content": "#TODO fs2 crate error\n[source]\ngit = \"https://github.com/wasix-org/cargo-wasix\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-watch/recipe.toml",
    "content": "#TODO nix crate error\n[source]\ngit = \"https://github.com/watchexec/cargo-watch\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-whatfeatures/recipe.toml",
    "content": "#TODO camino crate error\n# use openssl if rustls doesn't work\n[source]\ngit = \"https://github.com/museun/cargo-whatfeatures\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--features rustls\"]\n#dependencies = [\n#    \"openssl3\",\n#]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-wizard/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/Kobzol/cargo-wizard\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-workspace-version/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/ava-labs/cargo-workspace-version\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-workspaces/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/pksunkara/cargo-workspaces\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopath = \"cargo-workspaces\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/cargo-zigbuild/recipe.toml",
    "content": "#TODO make zig work\n[source]\ngit = \"https://github.com/rust-cross/cargo-zigbuild\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\n    \"zig\"\n]\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/carwash/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/epistates/carwash\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/cargo-tools/crunch/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/liamaharon/crunch-cli\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/debug/dr-memory/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ngit = \"https://github.com/DynamoRIO/drmemory\"\nrev = \"release_2.6.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libunwind\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/debug/gdb/recipe.toml",
    "content": "#TODO port to redox\n[source]\ntar = \"https://ftp.gnu.org/gnu/gdb/gdb-15.1.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libgmp\",\n    \"libmpfr\",\n    \"ncurses\",\n    \"readline\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-binutils\n    --disable-ld\n    --disable-gold\n    --disable-gas\n    --disable-sim\n    --disable-gprof\n    --disable-gprofng\n    --disable-intl\n    --with-system-readline\n    --with-gmp=\"${COOKBOOK_SYSROOT}\"\n    --with-mpfr=\"${COOKBOOK_SYSROOT}\"\n    --with-curses\n)\n\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/debug/nnd/recipe.toml",
    "content": "#TODO nnd crate error\n[source]\ngit = \"https://github.com/al13n321/nnd\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo --profile=dbgo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/debug/rr-debugger/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/rr-debugger/rr/wiki/Building-And-Installing\n[source]\ngit = \"https://github.com/rr-debugger/rr\"\nrev = \"5.9.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"zlib\",\n    \"capnproto\",\n    \"zstd\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/debug/termfu/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions: https://github.com/jvalcher/termfu#installation\n[source]\ngit = \"https://github.com/jvalcher/termfu\"\nrev = \"v0.2.2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncurses\",\n]\n[package]\ndependencies = [\n    \"gdb\",\n    \"python312\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/debug/yetty/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/aa55-dev/yeTTY\"\nrev = \"v0.1.3\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt6-base\",\n    \"qt6-multimedia\",\n    \"qt6-serialport\",\n    \"zstd\",\n    \"boost\",\n    \"libbacktrace\",\n    \"ktexteditor6\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/framework/biome/recipe.toml",
    "content": "#TODO tikv-jemalloc-sys crate error\n[source]\ngit = \"https://github.com/biomejs/biome\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages biome_cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/framework/deno/recipe.toml",
    "content": "#TODO v8 crate error\n#TODO lacking librusty_v8 crate binaries for redox\n[source]\ngit = \"https://github.com/denoland/deno\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages deno\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/framework/feather/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/BersisSe/feather-cli\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/framework/moonzoon/recipe.toml",
    "content": "#TODO camino crate error, require the WebAssembly target on Rustup.\n[source]\ngit = \"https://github.com/MoonZoon/MoonZoon\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages mzoon\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/framework/sphere/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/Nakadra/sphere-runtime\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/sphere\"\ncp -rv \"${COOKBOOK_SOURCE}/*.sphere\" \"${COOKBOOK_STAGE}/usr/share/sphere\"\necho \"entrypoint = \"echo 'Hello, from my first Sphere!'\"\" > \"${COOKBOOK_STAGE}/usr/share/sphere/hello.sphere\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/game-engine/defold-engine/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/defold/defold/blob/dev/README_BUILD.md\n#TODO build the editor, see https://github.com/defold/defold/blob/dev/editor/README_BUILD.md\n# probably the SDKs can't run on Redox, avoid them\n[source]\ngit = \"https://github.com/defold/defold\"\nrev = \"4e156b7cf37a380122aada30dacbf2b590ead76b\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libxi\",\n    \"libxext\",\n    \"mesa-glu\",\n    \"mesa\",\n    \"curl\",\n    \"freeglut\",\n    \"libuuid\",\n    \"openal\",\n    \"ncurses\",\n]\nscript = \"\"\"\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/game-engine/fyrox-template/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/FyroxEngine/Fyrox\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages fyrox-template\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/game-engine/godot4/recipe.toml",
    "content": "#TODO missing script for scons: https://docs.godotengine.org/en/stable/contributing/development/compiling/compiling_for_linuxbsd.html\n#TODO discover minimum dependencies from scons log\n[source]\ntar = \"https://github.com/godotengine/godot/releases/download/4.5.1-stable/godot-4.5.1-stable.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/game-engine/redot4/recipe.toml",
    "content": "#TODO missing script for scons: https://docs.redotengine.org/en/stable/contributing/development/compiling/compiling_for_linuxbsd\n#TODO discover minimum dependencies from scons log\n[source]\ntar = \"https://github.com/Redot-Engine/redot-engine/releases/download/redot-4.3.1-stable/Redot-4.3.1-stable.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/auto-commit/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/m1guelpf/auto-commit\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-absorb/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/tummychow/git-absorb\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-chain/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/dashed/git-chain\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-cliff/recipe.toml",
    "content": "#TODO compiled but not tested (after a patch on the ring crate)\n[source]\ngit = \"https://github.com/orhun/git-cliff\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"git-cliff\"]\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-grab/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/wezm/git-grab\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-graph/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/mlange-42/git-graph\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-ignore-generator/recipe.toml",
    "content": "#TODO compiled but not tested (after a cargo update and a patch on the ring crate)\n[source]\ngit = \"https://github.com/sondr3/git-ignore\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-interactive-rebase-tool/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/MitMaro/git-interactive-rebase-tool\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-lfs/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/git-lfs/git-lfs?tab=readme-ov-file#from-source\n[source]\ntar = \"https://github.com/git-lfs/git-lfs/releases/download/v3.5.1/git-lfs-v3.5.1.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-repo-manager/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/hakoerber/git-repo-manager\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-statuses/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bircni/git-statuses\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-subset/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/jasonwhite/git-subset\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-tool-rs/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/SierraSoftworks/git-tool\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/git-tools-rs/recipe.toml",
    "content": "#TODO users crate error\n[source]\ngit = \"https://github.com/cecton/git-tools\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/gitlogue/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/unhappychoice/gitlogue\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/gitv/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/JayanAXHF/gitv\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/keifu/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/trasta298/keifu\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\n    \"git\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/lazygh/recipe.toml",
    "content": "#TODO x11rb and rustix crates error\n[source]\ngit = \"https://github.com/kmj-007/lazygh\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/lazygit/recipe.toml",
    "content": "#TODO: Incomplete std/syscall porting, or vendor patches\n[source]\ngit = \"https://github.com/jesseduffield/lazygit\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndev-dependencies = [\n    \"host:go\"\n]\nscript = \"\"\"\nexport GOTOOLCHAIN=local\ncase \"${TARGET}\" in\n    x86_64-unknown-linux-gnu)  export GOARCH=amd64 GOOS=linux;;\n    aarch64-unknown-linux-gnu) export GOARCH=arm64 GOOS=linux;;\n    i586-unknown-redox)     export GOARCH=386 GOOS=redox;;\n    x86_64-unknown-redox)  export GOARCH=amd64 GOOS=redox;;\n    aarch64-unknown-redox) export GOARCH=arm64 GOOS=redox;;\n    riscv64gc-unknown-redox) export GOARCH=riscv64 GOOS=redox;;\nesac\n\nmkdir -p $COOKBOOK_STAGE/usr/bin\ngo build -C ${COOKBOOK_SOURCE} -o $COOKBOOK_STAGE/usr/bin/lazygit\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/oyo/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ahkohd/oyo\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"oyo\"]\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/patchy/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/nik-rev/patchy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/riff/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/walles/riff\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/serie/recipe.toml",
    "content": "#TODO x11rb and rustix crates error\n[source]\ngit = \"https://github.com/lusingander/serie\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/git-tools/shackle-shell/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/worthe-it/shackle-shell\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/graphics/bonzomatic/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies\n# build instructions - https://github.com/Gargaj/Bonzomatic#linux\n[source]\ngit = \"https://github.com/Gargaj/Bonzomatic\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libx11\",\n    \"libalsa\",\n    \"mesa-glu\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/graphics/pilka/recipe.toml",
    "content": "#TODO winit crate error (after cargo update)\n[source]\ngit = \"https://github.com/pudnax/pilka\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/graphics/sh4der-jockey/recipe.toml",
    "content": "#TODO winit crate error\n[source]\ngit = \"https://github.com/slerpyyy/sh4der-jockey\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/hw/design/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n[source]\ngit = \"https://github.com/dubstar-04/Design\"\nrev = \"e6906bc36217306b07d23fa5a4332778db8bca78\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/dev/hw/librepcb/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://librepcb.org/docs/installation/build-from-sources/\n# commented out optional dependencies\n[source]\ngit = \"https://github.com/LibrePCB/LibrePCB\"\nrev = \"1.3.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DUSE_GLU=0\",\n    \"-DUSE_OPENCASCADE=0\",\n]\ndependencies = [\n    \"qt6-base\",\n    \"qt6-imageformats\",\n    \"openssl3\",\n    \"zlib\",\n    #\"opencascade\",\n    #\"mesa-glu\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/hw/uefitool/recipe.toml",
    "content": "#TODO missing script for compilation: https://github.com/LongSoft/UEFITool#installation\n[source]\ngit = \"https://github.com/LongSoft/UEFITool\"\nrev = \"A73\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/ide/asm-lsp/recipe.toml",
    "content": "#TODO linking error\n[source]\ngit = \"https://github.com/bergercookie/asm-lsp\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages asm-lsp\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/ide/astronvim/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/AstroNvim/AstroNvim\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/home/user/.config/nvim\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/home/user/.config/nvim\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/ide/rust-analyzer/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rust-lang/rust-analyzer\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages rust-analyzer\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/artichoke/recipe.toml",
    "content": "#TODO iana-time-zone crate error\n[source]\ngit = \"https://github.com/artichoke/artichoke\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/blueprint/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/blueprint-compiler/0.19/blueprint-compiler-0.19.0.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/brimstone/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Hans-Halverson/brimstone\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/cjit/recipe.toml",
    "content": "#TODO write a gnu make target for redox: https://github.com/dyne/cjit#build-from-source\n[source]\ngit = \"https://github.com/dyne/cjit\"\nrev = \"v0.18.2\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/dotnet8/recipe.toml",
    "content": "#TODO missing script for building: https://github.com/dotnet/dotnet/tree/release/8.0.1xx#building\n# linux requirements: https://github.com/dotnet/runtime/blob/release/8.0/docs/workflow/requirements/linux-requirements.md\n# freebsd requirements: https://github.com/dotnet/runtime/blob/release/8.0/docs/workflow/requirements/freebsd-requirements.md#linux-environment\n# bootstraping: https://github.com/dotnet/source-build/blob/main/Documentation/bootstrapping-guidelines.md#building-for-new-os-using-a-rid-unknown-to-net\n[source]\ngit = \"https://github.com/dotnet/dotnet\"\nbranch = \"release/8.0.1xx\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libicu\",\n    \"lttng-ust\",\n    \"openssl3\",\n    \"kerberos5\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/lang/elixir/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/elixir-lang/elixir#compiling-from-source\n[source]\ngit = \"https://github.com/elixir-lang/elixir\"\nbranch = \"v1.19\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/elm/recipe.toml",
    "content": "#TODO missing script for building, lacking build instructions\n[source]\ngit = \"https://github.com/elm/compiler\"\nrev = \"0.19.1\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/erlang/recipe.toml",
    "content": "#TODO discover current status\n# build instructions: https://www.erlang.org/doc/installation_guide/install\n[source]\ntar = \"https://github.com/erlang/otp/releases/download/OTP-28.3.1/otp_src_28.3.1.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport ERL_TOP=\"${COOKBOOK_SOURCE}\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --without-termcap\n    --enable-bootstrap-only\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/ghc/recipe.toml",
    "content": "#TODO missing script for hadrian: https://gitlab.haskell.org/ghc/ghc/-/wikis/building/hadrian\n[source]\ntar = \"https://downloads.haskell.org/~ghc/9.14.1/ghc-9.14.1-src.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/ghostscript/recipe.toml",
    "content": "#TODO libtiff configure script error\n# customization: https://ghostscript.readthedocs.io/en/latest/Make.html\n[source]\ntar = \"https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10060/ghostscript-10.06.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/go/recipe.toml",
    "content": "#TODO compiling, not tested further\n[source]\ngit = \"https://github.com/willnode/go\"\nbranch = \"go-1.25-redox\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nexport PATH=$HOME/go/bin:$PATH\n\nexport GOPATH=${COOKBOOK_BUILD}/gopath\nif ! command -v go &> /dev/null; then\n   GO_TARBALL=go1.24.6.linux-$( [ \"$(uname -m)\" = \"aarch64\" ] && echo \"arm64\" || echo \"amd64\" ).tar.gz\n   GO_DOWNLOAD_URL=\"https://dl.google.com/go/${GO_TARBALL}\"\n   echo \"Installing Go...\"\n   wget -q --show-progress \"${GO_DOWNLOAD_URL}\"\n   tar -C \"$HOME\" -xzf \"${GO_TARBALL}\"\nfi\n\n# Go does not support out-of-tree builds :(\nrsync -a --delete \"${COOKBOOK_SOURCE}/\" ./\n\ncase \"${TARGET}\" in\n    x86_64-unknown-linux-gnu)  export GOARCH=amd64 GOOS=linux;;\n    aarch64-unknown-linux-gnu) export GOARCH=arm64 GOOS=linux;;\n    i586-unknown-redox)     export GOARCH=386 GOOS=redox;;\n    x86_64-unknown-redox)  export GOARCH=amd64 GOOS=redox;;\n    aarch64-unknown-redox) export GOARCH=arm64 GOOS=redox;;\n    riscv64gc-unknown-redox) export GOARCH=riscv64 GOOS=redox;;\nesac\n\nexport CGO_ENABLED=1\necho \"go1.25.0\" > VERSION # to set -trimpath\n(cd ./src && bash ./make.bash)\n\nmkdir -p \"${COOKBOOK_STAGE}\"/usr/bin \\\n    \"${COOKBOOK_STAGE}\"/usr/lib/golang/{bin,lib,misc,pkg/include,pkg/tool,src}\n\nif [ \"$TARGET\" = \"$COOKBOOK_HOST_TARGET\" ]; then\n    rsync -a bin/* \"${COOKBOOK_STAGE}\"/usr/lib/golang/bin/\nelse\n    rsync -a bin/${GOOS}_${GOARCH}/* \"${COOKBOOK_STAGE}\"/usr/lib/golang/bin/\nfi\nrsync -a lib/* \"${COOKBOOK_STAGE}\"/usr/lib/golang/lib/\nrsync -a misc/* \"${COOKBOOK_STAGE}\"/usr/lib/golang/misc/\nrsync -a pkg/include/* \"${COOKBOOK_STAGE}\"/usr/lib/golang/pkg/include/\nrsync -a pkg/tool/${GOOS}_${GOARCH} \"${COOKBOOK_STAGE}\"/usr/lib/golang/pkg/tool/\nrsync -a src/* \"${COOKBOOK_STAGE}\"/usr/lib/golang/src/\ncat go.env > \"${COOKBOOK_STAGE}\"/usr/lib/golang/go.env\nln -s \"../lib/golang/bin/go\" \"${COOKBOOK_STAGE}\"/usr/bin/go\nln -s \"../lib/golang/bin/gofmt\" \"${COOKBOOK_STAGE}\"/usr/bin/gofmt\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/goiaba/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/raphamorim/goiaba\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/java/openjdk11/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/openjdk/jdk11u/blob/master/doc/building.md\n[source]\ngit = \"https://github.com/openjdk/jdk11u\"\nrev = \"jdk-11.0.29-ga\"\nshallow_clone = true\nscript = \"chmod a+x configure\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--enable-headless-only=yes\",\n]\ndependencies = [\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/lang/java/openjdk17/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/openjdk/jdk17u/blob/master/doc/building.md\n[source]\ngit = \"https://github.com/openjdk/jdk17u\"\nrev = \"jdk-17.0.17-ga\"\nshallow_clone = true\nscript = \"chmod a+x configure\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--enable-headless-only=yes\",\n]\ndependencies = [\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/lang/java/openjdk21/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/openjdk/jdk21u/blob/master/doc/building.md\n[source]\ngit = \"https://github.com/openjdk/jdk21u\"\nrev = \"jdk-21.0.9-ga\"\nshallow_clone = true\nscript = \"chmod a+x configure\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--enable-headless-only=yes\",\n]\ndependencies = [\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/lang/java/openjdk8/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/openjdk/jdk8u/blob/master/doc/building.md\n[source]\ngit = \"https://github.com/openjdk/jdk8u\"\nrev = \"jdk8u472-ga\"\nshallow_clone = true\nscript = \"chmod a+x configure\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--enable-headless-only=yes\",\n]\ndependencies = [\n    \"freetype2\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/lang/kotlin/recipe.toml",
    "content": "#TODO not tested yet\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin/kotlin-dir\"\nwget https://github.com/JetBrains/kotlin/releases/download/v2.3.0/kotlin-compiler-2.3.0.zip \"${COOKBOOK_BUILD}\"\nunzip \"${COOKBOOK_BUILD}\"/kotlin-compiler-2.3.0.zip -d \"${COOKBOOK_BUILD}\"\nmv \"${COOKBOOK_BUILD}\"/kotlinc/* \"${COOKBOOK_STAGE}/usr/bin/kotlin-dir\"\necho \"/usr/bin/kotlin-dir/bin/kotlinc\" > \"${COOKBOOK_STAGE}\"/usr/bin/kotlinc\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/kotlinc\n\"\"\"\n[package]\ndependencies = [\"openjdk21\"]\n"
  },
  {
    "path": "recipes/wip/dev/lang/lacc/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/larmel/lacc\"\nrev = \"30839843daaff9d87574b5854854c9ee4610cdcd\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/llvm-mingw/recipe.toml",
    "content": "#TODO missing script, read the llvm21 recipe for reference\n# build instructions: https://github.com/mstorsjo/llvm-mingw#building-from-source\n[source]\ngit = \"https://github.com/mstorsjo/llvm-mingw\"\nrev = \"20251216\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/lang/mono/recipe.toml",
    "content": "#TODO can't recognize the redox target\n[source]\ntar = \"https://dl.winehq.org/mono/sources/mono/mono-6.14.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/nodejs-21/recipe.toml",
    "content": "#TODO promote\n[source]\ntar = \"https://nodejs.org/dist/v21.7.3/node-v21.7.3.tar.xz\"\nblake3 = \"95a56db4f9729b2f8384ab58ccb2ec0c41da05991f7400ef97bd76748d77870b\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libbrotli\",\n    \"c-ares\",\n    \"libuv\",\n    \"ngtcp2\",\n    \"nghttp2\",\n    \"nghttp3\",\n    \"openssl3\",\n    \"sqlite3\",\n    \"zlib\",\n    \"zstd\",\n]\n\ndev-dependencies = [\n    \"host:libbrotli\",\n    \"host:c-ares\",\n    \"host:libuv\",\n    \"host:ngtcp2\",\n    \"host:nghttp2\",\n    \"host:nghttp3\",\n    \"host:openssl3\",\n    \"host:sqlite3\",\n    \"host:zlib\",\n    \"host:zstd\",\n]\n\nscript = \"\"\"\nDYNAMIC_INIT\nexport PYTHONDONTWRITEBYTECODE=1 COOKBOOK_NOSTRIP=true\nexport CC_host=\"$CC_WRAPPER gcc\" CXX_host=\"$CC_WRAPPER g++\"\n\nrsync -av \"${COOKBOOK_SOURCE}/\" ./\n\ncase \"${TARGET}\" in\n    x86_64-unknown-linux-gnu)  export NODE_CPU=x64 NODE_OS=linux;;\n    aarch64-unknown-linux-gnu) export NODE_CPU=arm64 NODE_OS=linux;;\n    i586-unknown-redox)        export NODE_CPU=ia32 NODE_OS=redox;;\n    x86_64-unknown-redox)      export NODE_CPU=x64 NODE_OS=redox;;\n    aarch64-unknown-redox)     export NODE_CPU=arm64 NODE_OS=redox;;\nesac\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n  --prefix=/usr\n  --dest-cpu=${NODE_CPU}\n  --dest-os=${NODE_OS}\n  --shared-cares\n  --shared-libuv\n  --shared-ngtcp2\n  --shared-nghttp2\n  --shared-nghttp3\n  --shared-openssl\n  --shared-zlib\n  --without-inspector\n# TODO: Find a way to separate host and target flags instead?\n# --shared-zlib-includes=\"${COOKBOOK_TOOLCHAIN}/include\"\n  --shared-openssl-includes=\"${COOKBOOK_SYSROOT}/include\"\n  --shared-zlib-libpath=\"${COOKBOOK_TOOLCHAIN}/lib\"\n  --shared-openssl-libpath=\"${COOKBOOK_SYSROOT}/lib\"\n  --cross-compiling\n)\nCOOKBOOK_CONFIGURE=\"./configure\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/nodejs-21/redox.patch",
    "content": "diff -ruwN source/configure source-new/configure\n--- source/configure\t2024-04-10 19:46:11.000000000 +0700\n+++ source-new/configure\t2025-11-30 18:13:57.842696765 +0700\n@@ -4,6 +4,7 @@\n # Note that the mix of single and double quotes is intentional,\n # as is the fact that the ] goes on a new line.\n _=[ 'exec' '/bin/sh' '-c' '''\n+command -v python3.13 >/dev/null && exec python3.13 \"$0\" \"$@\"\n command -v python3.12 >/dev/null && exec python3.12 \"$0\" \"$@\"\n command -v python3.11 >/dev/null && exec python3.11 \"$0\" \"$@\"\n command -v python3.10 >/dev/null && exec python3.10 \"$0\" \"$@\"\n@@ -24,7 +25,7 @@\n   from distutils.spawn import find_executable as which\n \n print('Node.js configure: Found Python {}.{}.{}...'.format(*sys.version_info))\n-acceptable_pythons = ((3, 12), (3, 11), (3, 10), (3, 9), (3, 8), (3, 7), (3, 6))\n+acceptable_pythons = ((3, 13), (3, 12), (3, 11), (3, 10), (3, 9), (3, 8), (3, 7), (3, 6))\n if sys.version_info[:2] in acceptable_pythons:\n   import configure\n else:\ndiff -ruwN source/configure.py source-new/configure.py\n--- source/configure.py\t2024-04-10 19:46:11.000000000 +0700\n+++ source-new/configure.py\t2025-10-10 13:46:04.244040340 +0700\n@@ -46,7 +46,7 @@\n parser = argparse.ArgumentParser()\n \n valid_os = ('win', 'mac', 'solaris', 'freebsd', 'openbsd', 'linux',\n-            'android', 'aix', 'cloudabi', 'os400', 'ios')\n+            'android', 'aix', 'cloudabi', 'os400', 'ios', 'redox')\n valid_arch = ('arm', 'arm64', 'ia32', 'mips', 'mipsel', 'mips64el', 'ppc',\n               'ppc64', 'x64', 'x86', 'x86_64', 's390x', 'riscv64', 'loong64')\n valid_arm_float_abi = ('soft', 'softfp', 'hard')\ndiff -ruwN source/deps/v8/bazel/config/BUILD.bazel source-new/deps/v8/bazel/config/BUILD.bazel\n--- source/deps/v8/bazel/config/BUILD.bazel\t2024-04-10 19:46:12.000000000 +0700\n+++ source-new/deps/v8/bazel/config/BUILD.bazel\t2025-10-10 15:52:40.317126983 +0700\n@@ -144,6 +144,11 @@\n )\n \n config_setting(\n+    name = \"is_redox\",\n+    constraint_values = [\"@platforms//os:redox\"],\n+)\n+\n+config_setting(\n     name = \"is_linux\",\n     constraint_values = [\"@platforms//os:linux\"],\n )\n@@ -204,6 +209,7 @@\n selects.config_setting_group(\n     name = \"is_non_android_posix\",\n     match_any = [\n+        \":is_redox\",\n         \":is_linux\",\n         \":is_macos\",\n     ],\ndiff -ruwN source/deps/v8/BUILD.bazel source-new/deps/v8/BUILD.bazel\n--- source/deps/v8/BUILD.bazel\t2024-04-10 19:46:12.000000000 +0700\n+++ source-new/deps/v8/BUILD.bazel\t2025-10-10 16:05:33.775461039 +0700\n@@ -758,6 +758,11 @@\n             \"src/base/debug/stack_trace_posix.cc\",\n             \"src/base/platform/platform-darwin.cc\",\n         ],\n+        \"@v8//bazel/config:is_redox\": [\n+            \"src/base/debug/stack_trace_posix.cc\",\n+            \"src/base/platform/platform-redox.cc\",\n+            \"src/base/platform/platform-redox.h\",\n+        ],\n         \"@v8//bazel/config:is_windows\": [\n             \"src/base/debug/stack_trace_win.cc\",\n             \"src/base/platform/platform-win32.cc\",\ndiff -ruwN source/deps/v8/BUILD.gn source-new/deps/v8/BUILD.gn\n--- source/deps/v8/BUILD.gn\t2024-04-10 19:46:12.000000000 +0700\n+++ source-new/deps/v8/BUILD.gn\t2025-10-10 21:27:40.939874152 +0700\n@@ -5538,8 +5538,9 @@\n     if (v8_enable_webassembly) {\n       # iOS Xcode simulator builds run on an x64 target. iOS and macOS are both\n       # based on Darwin and thus POSIX-compliant to a similar degree.\n-      if (is_linux || is_chromeos || is_mac || is_ios ||\n+      if (is_linux || is_redox || is_chromeos || is_mac || is_ios ||\n           target_os == \"freebsd\") {\n+        assert(false, \"gatchs\")\n         sources += [\n           \"src/trap-handler/handler-inside-posix.cc\",\n           \"src/trap-handler/handler-outside-posix.cc\",\n@@ -5590,8 +5591,8 @@\n     if (v8_enable_webassembly) {\n       # Trap handling is enabled on arm64 Mac and Linux and in simulators on\n       # x64 on Linux, Mac, and Windows.\n-      if ((current_cpu == \"arm64\" && (is_linux || is_chromeos || is_apple)) ||\n-          (current_cpu == \"x64\" && (is_linux || is_chromeos || is_mac))) {\n+      if ((current_cpu == \"arm64\" && (is_linux || is_redox || is_chromeos || is_apple)) ||\n+          (current_cpu == \"x64\" && (is_linux || is_redox || is_chromeos || is_mac))) {\n         sources += [\n           \"src/trap-handler/handler-inside-posix.cc\",\n           \"src/trap-handler/handler-outside-posix.cc\",\n@@ -6174,6 +6175,11 @@\n       \"src/base/debug/stack_trace_posix.cc\",\n       \"src/base/platform/platform-darwin.cc\",\n     ]\n+  } else if (is_redox) {\n+    sources += [\n+      \"src/base/debug/stack_trace_posix.cc\",\n+      \"src/base/platform/platform-redox.cc\",\n+    ]\n   } else if (is_ios) {\n     sources += [\n       \"src/base/debug/stack_trace_posix.cc\",\ndiff -ruwN source/deps/v8/include/v8config.h source-new/deps/v8/include/v8config.h\n--- source/deps/v8/include/v8config.h\t2024-04-10 19:46:12.000000000 +0700\n+++ source-new/deps/v8/include/v8config.h\t2025-10-10 22:03:04.057821844 +0700\n@@ -159,6 +159,11 @@\n # define V8_OS_QNX 1\n # define V8_OS_STRING \"qnx\"\n \n+#elif defined(__redox__)\n+# define V8_OS_POSIX 1\n+# define V8_OS_REDOX 1\n+# define V8_OS_STRING \"redox\"\n+\n #elif defined(_WIN32)\n # define V8_OS_WIN 1\n # define V8_OS_STRING \"windows\"\n@@ -185,6 +190,7 @@\n   && !defined(V8_TARGET_OS_IOS) \\\n   && !defined(V8_TARGET_OS_LINUX) \\\n   && !defined(V8_TARGET_OS_MACOS) \\\n+  && !defined(V8_TARGET_OS_REDOX) \\\n   && !defined(V8_TARGET_OS_WIN) \\\n   && !defined(V8_TARGET_OS_CHROMEOS)\n #  error No known target OS defined.\n@@ -197,6 +203,7 @@\n   || defined(V8_TARGET_OS_IOS) \\\n   || defined(V8_TARGET_OS_LINUX) \\\n   || defined(V8_TARGET_OS_MACOS) \\\n+  || defined(V8_TARGET_OS_REDOX) \\\n   || defined(V8_TARGET_OS_WIN) \\\n   || defined(V8_TARGET_OS_CHROMEOS)\n #  error A target OS is defined but V8_HAVE_TARGET_OS is unset.\n@@ -223,6 +230,10 @@\n # define V8_TARGET_OS_MACOS\n #endif\n \n+#ifdef V8_OS_REDOX\n+# define V8_TARGET_OS_REDOX\n+#endif\n+\n #ifdef V8_OS_WIN\n # define V8_TARGET_OS_WIN\n #endif\n@@ -239,6 +250,8 @@\n # define V8_TARGET_OS_STRING \"linux\"\n #elif defined(V8_TARGET_OS_MACOS)\n # define V8_TARGET_OS_STRING \"macos\"\n+#elif defined(V8_TARGET_OS_REDOX)\n+# define V8_TARGET_OS_STRING \"redox\"\n #elif defined(V8_TARGET_OS_WINDOWS)\n # define V8_TARGET_OS_STRING \"windows\"\n #else\ndiff -ruwN source/deps/v8/src/base/platform/memory.h source-new/deps/v8/src/base/platform/memory.h\n--- source/deps/v8/src/base/platform/memory.h\t2024-04-10 19:46:12.000000000 +0700\n+++ source-new/deps/v8/src/base/platform/memory.h\t2025-10-10 13:46:04.297422792 +0700\n@@ -23,9 +23,9 @@\n #include <malloc.h>\n #endif  // !V8_OS_DARWIN\n \n-#if (V8_OS_POSIX && !V8_OS_AIX && !V8_OS_SOLARIS) || V8_OS_WIN\n+#if (V8_OS_POSIX && !V8_OS_AIX && !V8_OS_SOLARIS && !V8_OS_REDOX) || V8_OS_WIN\n #define V8_HAS_MALLOC_USABLE_SIZE 1\n-#endif  // (V8_OS_POSIX && !V8_OS_AIX && !V8_OS_SOLARIS) || V8_OS_WIN\n+#endif  // (V8_OS_POSIX && !V8_OS_AIX && !V8_OS_SOLARIS && !V8_OS_REDOX) || V8_OS_WIN\n \n namespace v8::base {\n \ndiff -ruwN source/deps/v8/src/base/platform/platform-posix.cc source-new/deps/v8/src/base/platform/platform-posix.cc\n--- source/deps/v8/src/base/platform/platform-posix.cc\t2024-04-10 19:46:12.000000000 +0700\n+++ source-new/deps/v8/src/base/platform/platform-posix.cc\t2025-10-10 13:46:04.416447015 +0700\n@@ -28,6 +28,10 @@\n #include <sys/sysctl.h>  // for sysctl\n #endif\n \n+#if defined(__redox__)\n+  #define PTHREAD_STACK_MIN 1024 * 1024\n+#endif\n+\n #if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT)\n #define LOG_TAG \"v8\"\n #include <android/log.h>\n@@ -69,7 +73,7 @@\n #include <sys/resource.h>\n #endif\n \n-#if !defined(_AIX) && !defined(V8_OS_FUCHSIA)\n+#if !defined(_AIX) && !defined(V8_OS_FUCHSIA) && !defined(V8_OS_REDOX)\n #include <sys/syscall.h>\n #endif\n \n@@ -135,7 +139,7 @@\n   int flags = MAP_ANONYMOUS;\n   flags |= (page_type == PageType::kShared) ? MAP_SHARED : MAP_PRIVATE;\n   if (access == OS::MemoryPermission::kNoAccess) {\n-#if !V8_OS_AIX && !V8_OS_FREEBSD && !V8_OS_QNX\n+#if !V8_OS_AIX && !V8_OS_FREEBSD && !V8_OS_QNX && !V8_OS_REDOX\n     flags |= MAP_NORESERVE;\n #endif  // !V8_OS_AIX && !V8_OS_FREEBSD && !V8_OS_QNX\n #if V8_OS_QNX\n@@ -565,14 +569,8 @@\n     // MADV_FREE_REUSABLE sometimes fails, so fall back to MADV_DONTNEED.\n     ret = madvise(address, size, MADV_DONTNEED);\n   }\n-#elif defined(_AIX) || defined(V8_OS_SOLARIS)\n-  int ret = madvise(reinterpret_cast<caddr_t>(address), size, MADV_FREE);\n-  if (ret != 0 && errno == ENOSYS) {\n-    return true;  // madvise is not available on all systems.\n-  }\n-  if (ret != 0 && errno == EINVAL) {\n-    ret = madvise(reinterpret_cast<caddr_t>(address), size, MADV_DONTNEED);\n-  }\n+#elif defined(_AIX) || defined(V8_OS_SOLARIS) || defined(V8_OS_REDOX)\n+  int ret = 0; // madvise is not available on all systems.\n #else\n   int ret = madvise(address, size, MADV_DONTNEED);\n #endif\ndiff -ruwN source/deps/v8/src/base/platform/platform-redox.cc source-new/deps/v8/src/base/platform/platform-redox.cc\n--- source/deps/v8/src/base/platform/platform-redox.cc\t1970-01-01 07:00:00.000000000 +0700\n+++ source-new/deps/v8/src/base/platform/platform-redox.cc\t2025-10-10 15:23:18.233737033 +0700\n@@ -0,0 +1,63 @@\n+// Copyright 2014 the V8 project authors. All rights reserved.\n+// Use of this source code is governed by a BSD-style license that can be\n+// found in the LICENSE file.\n+\n+// Platform specific code for Redox goes here. For the POSIX comaptible parts\n+// the implementation is in platform-posix.cc.\n+\n+#include <signal.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <sys/time.h>\n+\n+#include <cmath>\n+\n+#undef MAP_TYPE\n+\n+#include \"src/base/macros.h\"\n+#include \"src/base/platform/platform-posix-time.h\"\n+#include \"src/base/platform/platform-posix.h\"\n+#include \"src/base/platform/platform.h\"\n+\n+namespace v8 {\n+namespace base {\n+\n+\n+int64_t get_gmt_offset(const tm& localtm) {\n+  // replacement for tm->tm_gmtoff field in glibc\n+  // returns seconds east of UTC, taking DST into account\n+  struct timeval tv;\n+  struct timezone tz;\n+  int ret_code = gettimeofday(&tv, &tz);\n+  // 0 = success, -1 = failure\n+  DCHECK_NE(ret_code, -1);\n+  if (ret_code == -1) {\n+    return 0;\n+  }\n+  return (-tz.tz_minuteswest * 60) + (localtm.tm_isdst > 0 ? 3600 : 0);\n+}\n+\n+TimezoneCache* OS::CreateTimezoneCache() {\n+  return new PosixDefaultTimezoneCache();\n+}\n+\n+static unsigned StringToLong(char* buffer) {\n+  return static_cast<unsigned>(strtol(buffer, nullptr, 16));\n+}\n+\n+std::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() {\n+  UNREACHABLE();\n+}\n+\n+void OS::SignalCodeMovingGC() {}\n+\n+void OS::AdjustSchedulingParams() {}\n+\n+std::vector<OS::MemoryRange> OS::GetFreeMemoryRangesWithin(\n+    OS::Address boundary_start, OS::Address boundary_end, size_t minimum_size,\n+    size_t alignment) {\n+  return {};\n+}\n+\n+}  // namespace base\n+}  // namespace v8\ndiff -ruwN source/deps/v8/src/libsampler/sampler.cc source-new/deps/v8/src/libsampler/sampler.cc\n--- source/deps/v8/src/libsampler/sampler.cc\t2024-04-10 19:46:13.000000000 +0700\n+++ source-new/deps/v8/src/libsampler/sampler.cc\t2025-10-10 13:46:04.417193700 +0700\n@@ -16,11 +16,11 @@\n #include <sys/time.h>\n #include <atomic>\n \n-#if !V8_OS_QNX && !V8_OS_AIX\n+#if !V8_OS_QNX && !V8_OS_AIX && !V8_OS_REDOX\n #include <sys/syscall.h>\n #endif\n \n-#if V8_OS_AIX || V8_TARGET_ARCH_S390X\n+#if V8_OS_AIX || V8_OS_REDOX || V8_TARGET_ARCH_S390X\n \n #include \"src/base/platform/time.h\"\n \ndiff -ruwN source/deps/v8/src/trap-handler/handler-inside-posix.cc source-new/deps/v8/src/trap-handler/handler-inside-posix.cc\n--- source/deps/v8/src/trap-handler/handler-inside-posix.cc\t2024-04-10 19:46:13.000000000 +0700\n+++ source-new/deps/v8/src/trap-handler/handler-inside-posix.cc\t2025-10-11 12:32:56.074858844 +0700\n@@ -23,6 +23,7 @@\n // context. Some additional code is used both inside and outside the signal\n // handler. This code can be found in handler-shared.cc.\n \n+#ifndef __redox__\n #include \"src/trap-handler/handler-inside-posix.h\"\n \n #include <signal.h>\n@@ -102,7 +103,6 @@\n     asm(\"v8_simulator_probe_memory_continuation\");\n #endif\n #endif  // V8_TRAP_HANDLER_VIA_SIMULATOR\n-\n bool TryHandleSignal(int signum, siginfo_t* info, void* context) {\n   // Ensure the faulting thread was actually running Wasm code. This should be\n   // the first check in the trap handler to guarantee that the\n@@ -197,3 +197,5 @@\n }  // namespace trap_handler\n }  // namespace internal\n }  // namespace v8\n+\n+#endif\ndiff -ruwN source/deps/v8/src/trap-handler/handler-inside-posix.h source-new/deps/v8/src/trap-handler/handler-inside-posix.h\n--- source/deps/v8/src/trap-handler/handler-inside-posix.h\t2024-04-10 19:46:13.000000000 +0700\n+++ source-new/deps/v8/src/trap-handler/handler-inside-posix.h\t2025-10-10 21:44:55.221873295 +0700\n@@ -4,7 +4,7 @@\n \n #ifndef V8_TRAP_HANDLER_HANDLER_INSIDE_POSIX_H_\n #define V8_TRAP_HANDLER_HANDLER_INSIDE_POSIX_H_\n-\n+#ifndef __redox__\n #include <signal.h>\n \n #include \"include/v8config.h\"\n@@ -28,5 +28,5 @@\n }  // namespace trap_handler\n }  // namespace internal\n }  // namespace v8\n-\n+#endif\n #endif  // V8_TRAP_HANDLER_HANDLER_INSIDE_POSIX_H_\ndiff -ruwN source/deps/v8/src/wasm/std-object-sizes.h source-new/deps/v8/src/wasm/std-object-sizes.h\n--- source/deps/v8/src/wasm/std-object-sizes.h\t2024-04-10 19:46:13.000000000 +0700\n+++ source-new/deps/v8/src/wasm/std-object-sizes.h\t2025-10-10 13:46:04.591737114 +0700\n@@ -54,24 +54,7 @@\n   return raw * 4 / 3;\n }\n \n-// To make it less likely for size estimation functions to become outdated\n-// when the classes they're responsible for change, we insert static asserts\n-// about the respective class's size into them to at least catch some possible\n-// future modifications. Since object sizes are toolchain specific, we define\n-// restrictions here under which we enable these checks.\n-// When one of these checks fails, that probably means you've added fields to\n-// a class guarded by it. Update the respective EstimateCurrentMemoryConsumption\n-// function accordingly, and then update the check's expected size.\n-#if V8_TARGET_ARCH_X64 && defined(__clang__) && V8_TARGET_OS_LINUX &&          \\\n-    !V8_USE_ADDRESS_SANITIZER && !V8_USE_MEMORY_SANITIZER && defined(DEBUG) && \\\n-    V8_COMPRESS_POINTERS && !defined(V8_GC_MOLE) && defined(_LIBCPP_VERSION)\n-#define UPDATE_WHEN_CLASS_CHANGES(classname, size)                       \\\n-  static_assert(sizeof(classname) == size,                               \\\n-                \"Update {EstimateCurrentMemoryConsumption} when adding \" \\\n-                \"fields to \" #classname)\n-#else\n #define UPDATE_WHEN_CLASS_CHANGES(classname, size) (void)0\n-#endif\n \n }  // namespace v8::internal::wasm\n \ndiff -ruwN source/src/debug_utils.cc source-new/src/debug_utils.cc\n--- source/src/debug_utils.cc\t2024-04-10 19:46:14.000000000 +0700\n+++ source-new/src/debug_utils.cc\t2025-10-10 13:46:04.755669055 +0700\n@@ -14,7 +14,7 @@\n \n #if defined(__linux__) && !defined(__GLIBC__) || \\\n     defined(__UCLIBC__) || \\\n-    defined(_AIX)\n+    defined(_AIX) || defined(__redox__)\n #define HAVE_EXECINFO_H 0\n #else\n #define HAVE_EXECINFO_H 1\ndiff -ruwN source/src/node_credentials.cc source-new/src/node_credentials.cc\n--- source/src/node_credentials.cc\t2024-04-10 19:46:14.000000000 +0700\n+++ source-new/src/node_credentials.cc\t2025-10-10 13:46:04.816900208 +0700\n@@ -182,7 +182,7 @@\n \n static uid_t uid_by_name(Isolate* isolate, Local<Value> value) {\n   if (value->IsUint32()) {\n-    static_assert(std::is_same<uid_t, uint32_t>::value);\n+    // static_assert(std::is_same<uid_t, uint32_t>::value);\n     return value.As<Uint32>()->Value();\n   } else {\n     Utf8Value name(isolate, value);\n@@ -192,7 +192,7 @@\n \n static gid_t gid_by_name(Isolate* isolate, Local<Value> value) {\n   if (value->IsUint32()) {\n-    static_assert(std::is_same<gid_t, uint32_t>::value);\n+    // static_assert(std::is_same<gid_t, uint32_t>::value);\n     return value.As<Uint32>()->Value();\n   } else {\n     Utf8Value name(isolate, value);\ndiff -ruwN source/src/node_dotenv.cc source-new/src/node_dotenv.cc\n--- source/src/node_dotenv.cc\t2024-04-10 19:46:14.000000000 +0700\n+++ source-new/src/node_dotenv.cc\t2025-11-30 23:39:21.486092041 +0700\n@@ -16,10 +16,14 @@\n  * The inspiration for this implementation comes from the original dotenv code,\n  * available at https://github.com/motdotla/dotenv\n  */\n+\n+// redox crash on compiling this regex\n+#if !defined(__redox__)\n const std::regex LINE(\n     \"\\\\s*(?:export\\\\s+)?([\\\\w.-]+)(?:\\\\s*=\\\\s*?|:\\\\s+?)(\\\\s*'(?:\\\\\\\\'|[^']\"\n     \")*'|\\\\s*\\\"(?:\\\\\\\\\\\"|[^\\\"])*\\\"|\\\\s*`(?:\\\\\\\\`|[^`])*`|[^#\\r\\n]+)?\\\\s*(?\"\n     \":#.*)?\");  // NOLINT(whitespace/line_length)\n+#endif\n \n std::vector<std::string> Dotenv::GetPathFromArgs(\n     const std::vector<std::string>& args) {\n@@ -102,6 +106,7 @@\n }\n \n void Dotenv::ParseContent(const std::string_view content) {\n+#if !defined(__redox__)\n   std::string lines = std::string(content);\n   lines = std::regex_replace(lines, std::regex(\"\\r\\n?\"), \"\\n\");\n \n@@ -131,6 +136,7 @@\n     store_.insert_or_assign(std::string(key), value);\n     lines = match.suffix();\n   }\n+#endif\n }\n \n Dotenv::ParseResult Dotenv::ParsePath(const std::string_view path) {\ndiff -ruwN source/src/node_report.cc source-new/src/node_report.cc\n--- source/src/node_report.cc\t2024-04-10 19:46:14.000000000 +0700\n+++ source-new/src/node_report.cc\t2025-10-10 13:46:05.190512964 +0700\n@@ -524,7 +524,7 @@\n     while (line != -1) {\n       l = ss.substr(0, line);\n       l.erase(l.begin(), std::find_if(l.begin(), l.end(), [](int ch) {\n-                return !std::iswspace(ch);\n+                return !std::isspace(ch);\n               }));\n       writer->json_element(l);\n       ss = ss.substr(line + 1);\ndiff -ruwN source/tools/gyp/pylib/gyp/common.py source-new/tools/gyp/pylib/gyp/common.py\n--- source/tools/gyp/pylib/gyp/common.py\t2024-04-10 19:46:15.000000000 +0700\n+++ source-new/tools/gyp/pylib/gyp/common.py\t2025-10-10 21:36:23.972976264 +0700\n@@ -445,6 +445,8 @@\n         return \"netbsd\"\n     if sys.platform.startswith(\"aix\"):\n         return \"aix\"\n+    if sys.platform.startswith(\"redox\"):\n+        return \"redox\"\n     if sys.platform.startswith((\"os390\", \"zos\")):\n         return \"zos\"\n     if sys.platform == \"os400\":\ndiff -ruwN source/tools/gyp/pylib/gyp/generator/make.py source-new/tools/gyp/pylib/gyp/generator/make.py\n--- source/tools/gyp/pylib/gyp/generator/make.py\t2024-04-10 19:46:15.000000000 +0700\n+++ source-new/tools/gyp/pylib/gyp/generator/make.py\t2025-10-10 14:27:51.496602771 +0700\n@@ -1868,7 +1868,7 @@\n                 self.flavor not in (\"mac\", \"openbsd\", \"netbsd\", \"win\")\n                 and not self.is_standalone_static_library\n             ):\n-                if self.flavor in (\"linux\", \"android\"):\n+                if self.flavor in (\"linux\", \"android\", \"redox\"):\n                     self.WriteMakeRule(\n                         [self.output_binary],\n                         link_deps,\n@@ -1883,7 +1883,7 @@\n                         postbuilds=postbuilds,\n                     )\n             else:\n-                if self.flavor in (\"linux\", \"android\"):\n+                if self.flavor in (\"linux\", \"android\", \"redox\"):\n                     self.WriteMakeRule(\n                         [self.output_binary],\n                         link_deps,\ndiff -ruwN source/tools/v8_gypfiles/d8.gyp source-new/tools/v8_gypfiles/d8.gyp\n--- source/tools/v8_gypfiles/d8.gyp\t2024-04-10 19:46:15.000000000 +0700\n+++ source-new/tools/v8_gypfiles/d8.gyp\t2025-10-10 21:34:47.141291162 +0700\n@@ -47,7 +47,7 @@\n         }],\n         ['(OS==\"linux\" or OS==\"mac\" or OS==\"freebsd\" or OS==\"netbsd\" \\\n            or OS==\"openbsd\" or OS==\"solaris\" or OS==\"android\" \\\n-           or OS==\"qnx\" or OS==\"aix\" or OS==\"os400\")', {\n+           or OS==\"qnx\" or OS==\"aix\" or OS==\"redox\" or OS==\"os400\")', {\n              'sources': [ '<(V8_ROOT)/src/d8/d8-posix.cc', ]\n            }],\n         [ 'OS==\"win\"', {\ndiff -ruwN source/tools/v8_gypfiles/toolchain.gypi source-new/tools/v8_gypfiles/toolchain.gypi\n--- source/tools/v8_gypfiles/toolchain.gypi\t2024-04-10 19:46:15.000000000 +0700\n+++ source-new/tools/v8_gypfiles/toolchain.gypi\t2025-10-10 21:57:05.129575573 +0700\n@@ -575,6 +575,12 @@\n           'V8_TARGET_OS_MACOS',\n         ]\n       }],\n+      ['OS==\"redox\"', {\n+        'defines': [\n+          'V8_HAVE_TARGET_OS',\n+          'V8_TARGET_OS_REDOX',\n+        ]\n+      }],\n       ['OS==\"win\"', {\n         'defines': [\n           'V8_HAVE_TARGET_OS',\n@@ -661,7 +667,7 @@\n         ],\n       }],\n       ['OS==\"linux\" or OS==\"freebsd\" or OS==\"openbsd\" or OS==\"solaris\" \\\n-         or OS==\"netbsd\" or OS==\"qnx\" or OS==\"aix\" or OS==\"os400\"', {\n+         or OS==\"netbsd\" or OS==\"qnx\" or OS==\"aix\" or OS==\"redox\" or OS==\"os400\"', {\n         'conditions': [\n           [ 'v8_no_strict_aliasing==1', {\n             'cflags': [ '-fno-strict-aliasing' ],\ndiff -ruwN source/tools/v8_gypfiles/v8.gyp source-new/tools/v8_gypfiles/v8.gyp\n--- source/tools/v8_gypfiles/v8.gyp\t2024-04-10 19:46:15.000000000 +0700\n+++ source-new/tools/v8_gypfiles/v8.gyp\t2025-10-11 12:14:17.137386469 +0700\n@@ -606,7 +606,7 @@\n               }],\n               ['v8_enable_webassembly==1', {\n                 'conditions': [\n-                  ['OS==\"linux\" or OS==\"mac\" or OS==\"ios\" or OS==\"freebsd\"', {\n+                  ['OS==\"linux\" or OS==\"redox\" or OS==\"mac\" or OS==\"ios\" or OS==\"freebsd\"', {\n                     'sources': [\n                       '<(V8_ROOT)/src/trap-handler/handler-inside-posix.h',\n                     ],\n@@ -637,7 +637,7 @@\n               }],\n               ['v8_enable_webassembly==1', {\n                 'conditions': [\n-                  ['((_toolset==\"host\" and host_arch==\"arm64\" or _toolset==\"target\" and target_arch==\"arm64\") and (OS==\"linux\" or OS==\"mac\")) or ((_toolset==\"host\" and host_arch==\"x64\" or _toolset==\"target\" and target_arch==\"x64\") and (OS==\"linux\" or OS==\"mac\"))', {\n+                  ['((_toolset==\"host\" and host_arch==\"arm64\" or _toolset==\"target\" and target_arch==\"arm64\") and (OS==\"linux\" or OS==\"mac\")) or ((_toolset==\"host\" and host_arch==\"x64\" or _toolset==\"target\" and target_arch==\"x64\") and (OS==\"linux\" or OS==\"redox\" or OS==\"mac\"))', {\n                     'sources': [\n                       '<(V8_ROOT)/src/trap-handler/handler-inside-posix.h',\n                     ],\n@@ -941,7 +941,7 @@\n             }],\n             ['v8_enable_webassembly==1', {\n               'conditions': [\n-                ['OS==\"linux\" or OS==\"mac\" or OS==\"ios\" or OS==\"freebsd\"', {\n+                ['OS==\"linux\" or OS==\"redox\" or OS==\"mac\" or OS==\"ios\" or OS==\"freebsd\"', {\n                   'sources': [\n                     '<(V8_ROOT)/src/trap-handler/handler-inside-posix.cc',\n                     '<(V8_ROOT)/src/trap-handler/handler-outside-posix.cc',\n@@ -969,7 +969,7 @@\n           'conditions': [\n             ['v8_enable_webassembly==1', {\n               'conditions': [\n-                ['((_toolset==\"host\" and host_arch==\"arm64\" or _toolset==\"target\" and target_arch==\"arm64\") and (OS==\"linux\" or OS==\"mac\" or OS==\"ios\")) or ((_toolset==\"host\" and host_arch==\"x64\" or _toolset==\"target\" and target_arch==\"x64\") and (OS==\"linux\" or OS==\"mac\"))', {\n+                ['((_toolset==\"host\" and host_arch==\"arm64\" or _toolset==\"target\" and target_arch==\"arm64\") and (OS==\"linux\" or OS==\"redox\" or OS==\"mac\" or OS==\"ios\")) or ((_toolset==\"host\" and host_arch==\"x64\" or _toolset==\"target\" and target_arch==\"x64\") and (OS==\"linux\" or OS==\"redox\" or OS==\"mac\"))', {\n                   'sources': [\n                     '<(V8_ROOT)/src/trap-handler/handler-inside-posix.cc',\n                     '<(V8_ROOT)/src/trap-handler/handler-outside-posix.cc',\n@@ -981,7 +981,7 @@\n                     '<(V8_ROOT)/src/trap-handler/handler-outside-win.cc',\n                   ],\n                 }],\n-                ['(_toolset==\"host\" and host_arch==\"x64\" or _toolset==\"target\" and target_arch==\"x64\") and (OS==\"linux\" or OS==\"mac\" or OS==\"win\")', {\n+                ['(_toolset==\"host\" and host_arch==\"x64\" or _toolset==\"target\" and target_arch==\"x64\") and (OS==\"linux\" or OS==\"redox\" or OS==\"mac\" or OS==\"win\")', {\n                   'sources': [\n                     '<(V8_ROOT)/src/trap-handler/handler-outside-simulator.cc',\n                   ],\n@@ -1323,6 +1323,35 @@\n         # end of conditions from 'BUILD.gn'\n \n         # Node.js validated\n+        ['OS==\"redox\"', {\n+          'link_settings': {\n+            'target_conditions': [\n+              ['_toolset==\"host\"', {\n+                'libraries': [\n+                  '-ldl'\n+                ],\n+              }],\n+            ],\n+          },\n+          'sources': [\n+            '<(V8_ROOT)/src/base/platform/platform-posix.cc',\n+            '<(V8_ROOT)/src/base/platform/platform-posix.h',\n+            '<(V8_ROOT)/src/base/platform/platform-posix-time.cc',\n+            '<(V8_ROOT)/src/base/platform/platform-posix-time.h',\n+            '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc',\n+          ],\n+          'target_conditions': [\n+            ['_toolset==\"host\"', {\n+              'sources': [\n+                '<(V8_ROOT)/src/base/platform/platform-linux.cc',\n+              ],\n+            }, {\n+              'sources': [\n+                '<(V8_ROOT)/src/base/platform/platform-redox.cc',\n+              ],\n+            }],\n+          ],\n+        }],\n         ['OS==\"solaris\"', {\n           'link_settings': {\n             'libraries': [\n"
  },
  {
    "path": "recipes/wip/dev/lang/nodejs-24/01_redox.patch",
    "content": "diff -ruwN source/configure.py source-new/configure.py\r\n--- source/configure.py\t2025-07-31 15:37:54.000000000 +0700\r\n+++ source-new/configure.py\t2025-08-03 00:37:51.836604059 +0700\r\n@@ -44,7 +44,7 @@\r\n # parse our options\r\n parser = argparse.ArgumentParser()\r\n \r\n-valid_os = ('win', 'mac', 'solaris', 'freebsd', 'openbsd', 'linux',\r\n+valid_os = ('win', 'mac', 'solaris', 'freebsd', 'openbsd', 'linux', 'redox',\r\n             'android', 'aix', 'cloudabi', 'os400', 'ios', 'openharmony')\r\n valid_arch = ('arm', 'arm64', 'ia32', 'mips', 'mipsel', 'mips64el',\r\n               'ppc64', 'x64', 'x86', 'x86_64', 's390x', 'riscv64', 'loong64')\r\n"
  },
  {
    "path": "recipes/wip/dev/lang/nodejs-24/recipe.toml",
    "content": "#TODO requires stdc++20\n[source]\ntar = \"https://nodejs.org/dist/v24.9.0/node-v24.9.0.tar.xz\"\nblake3 = \"c710713c9144dc2dfadaef1d180b295d85edd9945513017fc700af68eb08a251\"\npatches = [\"01_redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n#   \"ada\",\n    \"libbrotli\",\n    \"c-ares\",\n    \"libuv\",\n    \"ngtcp2\",\n    \"nghttp2\",\n#   \"http-parser\",\n    \"nghttp3\",\n    \"openssl1\",\n    \"simdjson\",\n    \"simdutf\",\n    \"sqlite3\",\n#   \"uvwasi\",\n    \"zlib\",\n    \"zstd\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\ncase \"${TARGET}\" in\n    x86-unknown-redox)\n        export NODE_CPU=x32\n        ;;\n    x86_64-unknown-redox)\n        export NODE_CPU=x64\n        ;;\n    aarch64-unknown-redox)\n        export NODE_CPU=arm64\n        ;;\nesac\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n  --prefix=${COOKBOOK_STAGE}\n  --dest-cpu=${NODE_CPU}\n  --dest-os=redox\n  --shared-cares\n  --shared-libuv\n  --shared-ngtcp2\n  --shared-nghttp2\n  --shared-nghttp3\n  --shared-openssl\n  --shared-simdjson\n  --shared-simdutf\n  --shared-zlib\n  --shared-zstd\n  --cross-compiling\n  --without-sqlite\n  --without-inspector\n  --without-intl\n)\nCOOKBOOK_CONFIGURE=\"./configure\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/perl5/configure_tool.sh",
    "content": "# Toolchain detection\n\ntryprog() {\n\tlog \"trying $1=$2\"\n\tif command -v $2 1>/dev/null 2>/dev/null; then\n\t\tdefine \"$1\" \"$2\"\n\t\tresult \"$2\"\n\t\treturn 0\n\telse\n\t\treturn 1\n\tfi\n}\n\ntryfromenv() {\n\tif [ \"$mode\" = \"buildmini\" ]; then\n\t\tgetenv ev \"HOST$2\"\n\telse\n\t\tgetenv ev \"$2\"\n\tfi\n\n\tif [ -n \"$ev\" ]; then\n\t\ttryprog $1 \"$ev\" && return 0\n\t\tdie \"Supplied $ev is not usable\"\n\tfi\n\n\tunset ev\n\treturn 1\n}\n\n# This is only a function for easy access to return-s\n# try.out contains `$cc --version` output.\n#\n# Figuring out gcc is necessary to make sure -fwrapv fix gets applied.\n\ndetect_cc_version() {\n\t_v=`sed -ne '/^gcc version \\([0-9][0-9.]*\\).*/s//\\1/p' try.out`\n\n\tif [ -n \"$_v\" ]; then\n\t\tdefine cctype 'gcc'\n\t\tdefine ccversion \"$_v\"\n\t\tdefine gccversion \"$_v\"\n\t\tresult \"gcc $_v\"\n\t\treturn\n\tfi\n\n\t_v=`sed -ne '/^clang version \\([0-9][0-9.]*\\).*/s//\\1/p' try.out`\n\n\tif [ -n \"$_v\" ]; then\n\t\tdefine cctype 'clang'\n\t\tdefine ccversion \"$_v\"\n\t\tdefine gccversion \"0.0\"\n\t\tresult \"clang $_v\"\n\t\treturn\n\tfi\n\n\tdefine cctype 'cc'\n\tdefine ccversion ''\n\tdefine gccversion '0.0'\n\tresult 'unknown'\n}\n\n# whichprog symbol VAR prog1 prog2\nwhichprog() {\n\tmstart \"Checking for $1\"\n\thinted \"$1\" && return 0\n\n\t# Maybe we've got $CC or $HOSTCC?\n\ttryfromenv \"$1\" \"$2\" && return 0\n\n\t# For anything that sounds like a native compilation,\n\t# try no-prefix tools *first*. This is to avoid using\n\t# long names is case the host happens to have them.\n\tif [ \"$mode\" = 'native' -o \"$mode\" = 'buildmini' ]; then\n\t\ttryprog $1 \"$3\" && return 0\n\tfi\n\n\t# Finally, try $target-gcc\n\ttest -n \"$toolsprefix\" && tryprog $1 \"$toolsprefix$3\"  && return 0\n\ttest -n \"$target\"      && tryprog $1 \"$target-$3\"      && return 0\n\ttest -n \"$targetarch\"  && tryprog $1 \"$targetarch-$3\"  && return 0\n\n\tresult \"none found\"\n\treturn 1\n}\n\nwhichprog cc CC gcc || whichprog cc CC cc || die \"No C compiler found\"\n#whichprog ld LD ld # while correct, this breaks MM library test\nwhichprog ar AR ar || die \"Cannot find ar\"\nwhichprog nm NM nm\nwhichprog ranlib RANLIB ranlib\nwhichprog readelf READELF readelf || die \"Cannot find readelf\"\nwhichprog objdump OBJDUMP objdump || die \"Cannot find objdump\"\n\n# XXX: this looks wrong, but the usemmldlt code depends on $ld being able\n# to compile try.c. What kind of moron could have written that. Oh wait.\n#\n# But, there was probably a reason to assume this, likely becase mainline\n# Configure did and still does the same. So, ugh, leaving it as is for now.\n# Speak of backward bug compatibility.\ndefine ld \"$cc\"\n\nlog\n\nmstart \"Trying $cc\"\nif not hinted 'cctype'; then\n\trun $cc -v >try.out 2>&1\n\ttry_dump_out\n\tdetect_cc_version\nfi\n\nmstart \"Checking whether $cc is a C++ compiler\"\nif not hinted 'd_cplusplus'; then\n\ttry_start\n\ttry_cat <<END\n#if defined(__cplusplus)\nYES\n#endif\nEND\n\ttry_dump\n\tif not run $cc $ccflags -E try.c > try.out 2>>$cfglog; then\n\t\tdefine d_cplusplus 'undef'\n\t\tresult \"probably no\"\n\telse\n\t\t_r=`grep -v '^#' try.out | grep . | head -1 | grep '^YES'`\n\t\tif [ -n \"$_r\" ]; then\n\t\t\tdefine d_cplusplus 'define'\n\t\t\tresult \"yes\"\n\t\telse\n\t\t\tdefine d_cplusplus 'undef'\n\t\t\tresult 'no'\n\t\tfi\n\tfi\nfi\n\nmstart \"Deciding how to declare external symbols\"\nif not hinted \"extern_C\"; then\n\tcase \"$d_cplusplus\" in\n\t\tdefine)\n\t\t\tdefine \"extern_C\" 'extern \"C\"'\n\t\t\tresult \"$extern_C\"\n\t\t\t;;\n\t\t*)\n\t\t\tdefine \"extern_C\" 'extern'\n\t\t\tresult \"$extern_C\"\n\t\t\t;;\n\tesac\nfi\n\n# File name extensions, must be set before running any compile/link tests\ndefine _o '.o'\ndefine _a '.a'\ndefine so 'so'\ndefine _exe ''\n\n# Used only for modules\ndefine cccdlflags '-fPIC -Wno-unused-function'\ndefine ccdlflags '-Wl,-E'\n\n# Misc flags setup\npredef lddlflags \"-shared\"\t# modules\npredef ccflags ''\t\t# perl and modules\npredef ldflags ''\t\t# perl only?\npredef cppflags ''\t\t# unused?\n\n# setfromvar what SHELLVAR\nsetfromenv() {\n\tgetenv v \"$2\"\n\ttest -n \"$v\" && append \"$1\" \"$v\"\n}\n\nif [ \"$mode\" = 'target' -o \"$mode\" = 'native' ]; then\n\tsetfromenv ccflags CFLAGS\n\tsetfromenv ldflags LDFLAGS\n\tif [ -n \"$sysroot\" ]; then\n\t\tmsg \"Adding --sysroot to {cc,ld}flags\"\n\t\tprepend ccflags \"--sysroot=$sysroot\"\n\t\tprepend ldflags \"--sysroot=$sysroot\"\n\t\t# While cccdlflags are used together with ccflags,\n\t\t# ld is always called with lddlflags *instead*of* ldflags\n\t\tprepend lddlflags \"--sysroot=$sysroot\"\n\t\t# Same for cpp\n\t\tprepend cppflags \"--sysroot=$sysroot\"\n\tfi\nelif [ \"$mode\" = 'buildmini' ]; then\n\tsetfromenv ccflags HOSTCFLAGS\n\tsetfromenv ldflags HOSTLDFLAGS\nfi\n\n# Use $ldflags as default value for $lddlflags, together with whatever\n# hints provided, but avoid re-setting anyting specified in the command line\nif [ -n \"$ldflags\" -a \"$x_lddlflags\" != \"user\" ]; then\n\tappend lddlflags \"$ldflags\"\nfi\n\n# enddef ccflags # done later in _hdrs because of LARGEFILE_SOURCE\nenddef ldflags\nenddef lddlflags\nenddef cppflags\n\nmstart \"Checking whether ld supports scripts\"\nif not hinted 'ld_can_script'; then\n\tcat > try.c <<EOM\nvoid foo() {}\nvoid bar() {}\nEOM\n\tcat > try.h <<EOM\nLIBTEST_42 {\n global:\n  foo;\n local: *;\n };\nEOM\n\tlog \"try.c\"\n\ttry_dump\n\tlog \"try.h\"\n\ttry_dump_h\n\trm -f a.out 2>/dev/null\n\n\tif run $cc $cccdlflags $ccdlflags $ccflags $lddlflags -o a.out try.c \\\n\t\t-Wl,--version-script=try.h >/dev/null 2>&1 \\\n\t\t&& test -s a.out\n\tthen\n\t\tdefine ld_can_script 'define'\n\t\tresult \"yes\"\n\telse\n\t\tdefine ld_can_script 'undef'\n\t\tresult \"no\"\n\tfi\nfi\n\n# Guessing OS is better done with the toolchain available.\n# CC output is crucial here -- Android toolchains come with\n# generic armeabi prefix and \"android\" is one of the few osname\n# values that make difference later.\n\nmstart \"Trying to guess target OS\"\nif not hinted 'osname'; then\n\trun $cc -v > try.out 2>&1\n\ttry_dump_out\n\n\t_ct=`sed -ne '/^Target: /s///p' try.out`\n\ttest -z \"$_ct\" && _ct=\"$targetarch\"\n\n\tcase \"$_ct\" in\n\t\t*-mingw32)\n\t\t\tdefine osname \"MSWin32\"\n\t\t\tresult \"MSWin32\"\n\t\t\t;;\n\t\t*-android|*-androideabi)\n\t\t\tdefine osname \"android\"\n\t\t\tresult \"Android\"\n\t\t\t;;\n\t\t*-linux*)\n\t\t\tdefine osname \"linux\"\n\t\t\tresult \"Linux\"\n\t\t\t;;\n\t\t*-netbsd*)\n\t\t\tdefine osname \"netbsd\"\n\t\t\tresult \"NetBSD\"\n\t\t\t;;\n\t\t*-bsd*)\n\t\t\tdefine osname \"bsd\"\n\t\t\tresult \"BSD\"\n\t\t\t;;\n\t\t*-gnu*)\n\t\t\tdefine osname \"gnu\"\n\t\t\tresult \"GNU\"\n\t\t\t;;\n\t\t*-midipix*)\n\t\t\tdefine osname \"midipix\"\n\t\t\tresult \"Midipix\"\n\t\t\t;;\n\t\t*-redox*)\n\t\t\tdefine osname \"redox\"\n\t\t\tresult \"Redox\"\n\t\t\t;;\n\t\t*)\n\t\t\tresult \"no\"\n\t\t\t;;\n\tesac\nfi\n\n# Check whether debugging should be enabled\n# Allow -DEBUGGING as well (sets EBUGGING=define)\ncase \"$DEBUGGING:$EBUGGING\" in\n\t:*)\n\t\tDEBUGGING=$EBUGGING\n\t\t;;\nesac\n\nmstart \"Checking whether to enable -g\"\npredef optimize ''\ncase \"$DEBUGGING\" in\n\tboth|define)\n\t\tappend optimize \"-g\"\n\t\tresult \"yes\" ;;\n\t*)\n\t\tresult \"no\" ;;\nesac\n\nmstart \"Checking whether to use -DDEBUGGING\"\ncase \"$DEBUGGING\" in\n\tboth|define)\n\t\tappend optimize '-DDEBUGGING'\n\t\tresult \"yes\" ;;\n\t*)\n\t\tresult \"no\" ;;\nesac\n\n# gcc 4.9 and above does some optimizations that break perl.\n# see perl ticket 121505.\nif [ \"$cctype\" = 'gcc' ]; then\n\tcase \"$ccversion\" in\n\t\t1.*|2.*|3.*) ;;\n\t\t4.9*) append 'optimize' '-fwrapv -fno-strict-aliasing' ;;\n\t\t4.*) ;;\n\t\t*) append 'optimize' '-fwrapv -fno-strict-aliasing' ;;\n\tesac\nfi\nenddef optimize\n\n# These are kind-of part of toolchain, but we do not test them\n\n# For newer gcc-s, -E alone is *not* enough! Perl expects cpp not to break\n# lines, but gcc injects #line directives in-between tokens, subtly breaking\n# try_preproc and Errno.pm\ndefine cpp \"$cc -E -P\"\ndefine cpprun \"$cpp\"\ndefine cppstdin \"$cpp\"\n\ndefine cpplast -\ndefine cppminus -\ndefine cppsymbols\n\ndefine nm_opt\ndefine nm_so_opt\n\n# cperl wants to know this for some reason\nmstart \"Checking whether address sanitizer is enabled\"\nif not hinted sanitize_address 'yes' 'no'; then\n\tcase \"$ccflags\" in\n\t\t*-fsanitize=address*|*-faddress-sanitizer*)\n\t\t\tdefine sanitize_address 'define'\n\t\t\tresult 'yes'\n\t\t\t;;\n\t\t*)\n\t\t\tdefine sanitize_address 'undef'\n\t\t\tresult 'no'\n\t\t\t;;\n\tesac\nfi\n"
  },
  {
    "path": "recipes/wip/dev/lang/perl5/recipe.toml",
    "content": "#TODO compiles, works in a basic way but needs figuring out why -ldl is ignored\n#TODO also until new signal implementation gets to be the default, remove siginfo struct from relibc's include/bits/signal.h\n# and modify relibc/src/header/signal/mod.rs sigtimedwait second parameter's type from siginfo_t to siginfo (cbindgen needs a reference)\n#TODO needs further testing\n[source]\ntar = \"https://www.cpan.org/src/5.0/perl-5.40.0.tar.gz\"\nblake3 = \"8bfcbb999e0795a64ca90e1ba7308f49c30ab2619ffa25fa425527c4bfca5e0f\"\nscript = \"\"\"\ncurl -L -O --time-cond perl-cross-1.6.tar.gz https://github.com/arsv/perl-cross/releases/download/1.6/perl-cross-1.6.tar.gz\ntar --strip-components=1 -xvf perl-cross-1.6.tar.gz\nGNU_CONFIG_GET ./cnf/config.sub\n\"\"\"\n[build]\ntemplate = \"custom\"\ndev-dependencies = [\"relibc\"]\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n#Note: since perl-cross can run only inside the source-tree (out-of-tree is bugged) it's easier to do everything in the build directory\ncp ${COOKBOOK_RECIPE}/configure_tool.sh ${COOKBOOK_BUILD}/cnf/configure_tool.sh\ncp ${COOKBOOK_RECIPE}/redox ${COOKBOOK_BUILD}/cnf/hints/redox\n#Note: non-standard configure, familiar flags can have different meaning!\n./configure --host-cc=\"gcc\" --host-cpp=\"g++\" --target=${TARGET} --sysroot=${COOKBOOK_SYSROOT}\nsed -i \"s/^#define Netdb_name_t.*/#define Netdb_name_t const char*/\" config.h\nsed -i \"s/^# HAS_NANOSLEEP.*/#define HAS_NANOSLEEP/\" config.h\nsed -i \"s|^/.#define I_GRP.*|#define I_GRP|\" config.h\necho \"#define HAS_GROUP\" >> config.h\nmake -j4\nmake install DESTDIR=\"${COOKBOOK_STAGE}\"\npushd .\ncd \"${COOKBOOK_STAGE}/usr/share/man/man3\"\nfor f in *; do\ncase \"$f\" in\n*::*)\nmv \"$f\" \"${f//::/__}\";\n;;\nesac\ndone\npopd\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/perl5/redox",
    "content": "# NetBSD syscalls\nd_nanosleep='define'\n\n# libraries to test\nlibswanted='m dl'\n"
  },
  {
    "path": "recipes/wip/dev/lang/php80/recipe.toml",
    "content": "#TODO promote\n[source]\ntar = \"https://www.php.net/distributions/php-8.0.30.tar.xz\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"bzip2\",\n    \"curl\",\n    \"gettext\",\n    \"libffi\",\n    \"libgmp\",\n    \"libavif\",\n    \"libicu\",\n    \"libjpeg\",\n    \"libedit\",\n    \"libonig\",\n    \"libpng\",\n    \"libsodium\",\n    \"libwebp\",\n    \"libxml2\",\n    \"libiconv\",\n    \"libzip\",\n    \"ncurses\",\n    \"nghttp2\",\n    \"openssl1\",\n    \"pcre\",\n    \"sqlite3\",\n    \"xz\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport SUFFIX=\"80\"\n\n# extension stuff\nexport CURL_LIBS=\"-lcurl -lnghttp2 -lssl -lcrypto\"\nexport CXXFLAGS=\"-std=c++17\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --program-suffix=${SUFFIX}\n    --sysconfdir=/etc\n    --with-config-file-path=/etc/php/$SUFFIX\n    --with-config-file-scan-dir=/etc/php/$SUFFIX/conf.d\n    --with-iconv=\"${COOKBOOK_SYSROOT}/usr\"\n    --disable-opcache\n    --enable-bcmath\n    --enable-calendar\n#    --enable-fpm  # need times function\n    --enable-gd\n    --enable-intl\n    --enable-mbstring\n    --with-curl\n    --with-gettext\n    --with-gmp\n    --with-jpeg\n    --with-webp\n    --with-avif\n    --with-ffi\n    --with-libedit\n    --with-openssl\n    --with-sodium\n    --with-zip\n)\n\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\" \"$@\"\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" install \\\n    INSTALL_ROOT=\"${COOKBOOK_STAGE}\" \\\n    datarootdir=/usr/share localstatedir=/var\n\nfor bin in \"php-cgi\" \"php-config\" \"php\" \"phpdbg\" \"phpize\"; do\n  ln -s \"$bin$SUFFIX\" ${COOKBOOK_STAGE}/usr/bin/$bin\ndone\nmkdir -p ${COOKBOOK_STAGE}/etc/php/$SUFFIX/conf.d\ncp ${COOKBOOK_SOURCE}/php.ini* ${COOKBOOK_STAGE}/etc/php/$SUFFIX/\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/php80/redox.patch",
    "content": "diff -ruwN source/configure source-new/configure\n--- source/configure\t2023-08-04 00:13:08.000000000 +0700\n+++ source-new/configure\t2025-09-20 05:04:59.993364619 +0700\n@@ -46043,7 +46043,7 @@\n   fi\n \n \n-  ax_cxx_compile_alternatives=\"11 0x\"  ax_cxx_compile_cxx11_required=truednl\n+  ax_cxx_compile_alternatives=\"17 0x\"  ax_cxx_compile_cxx11_required=truednl\n   ac_ext=cpp\n ac_cpp='$CXXCPP $CPPFLAGS'\n ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\n@@ -72692,7 +72692,7 @@\n   printf %s \"(cached) \" >&6\n else $as_nop\n \n-    php_cv_crypt_r_style=none\n+    php_cv_crypt_r_style=struct_crypt_data_gnu_source\n     cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n /* end confdefs.h.  */\n \ndiff -ruwN source/ext/intl/config.m4 source-new/ext/intl/config.m4\n--- source/ext/intl/config.m4\t2023-08-04 00:13:08.000000000 +0700\n+++ source-new/ext/intl/config.m4\t2025-09-20 05:05:18.892414632 +0700\n@@ -83,7 +83,7 @@\n     breakiterator/codepointiterator_methods.cpp\"\n \n   PHP_REQUIRE_CXX()\n-  PHP_CXX_COMPILE_STDCXX(11, mandatory, PHP_INTL_STDCXX)\n+  PHP_CXX_COMPILE_STDCXX(17, mandatory, PHP_INTL_STDCXX)\n   PHP_INTL_CXX_FLAGS=\"$INTL_COMMON_FLAGS $PHP_INTL_STDCXX $ICU_CXXFLAGS\"\n   case $host_alias in\n   *cygwin*) PHP_INTL_CXX_FLAGS=\"$PHP_INTL_CXX_FLAGS -D_POSIX_C_SOURCE=200809L\"\ndiff -ruwN source/ext/phar/Makefile.frag source-new/ext/phar/Makefile.frag\n--- source/ext/phar/Makefile.frag\t2023-08-04 00:13:08.000000000 +0700\n+++ source-new/ext/phar/Makefile.frag\t2025-09-19 23:19:19.020178026 +0700\n@@ -9,20 +9,7 @@\n pharcmd: $(builddir)/phar.php $(builddir)/phar.phar\n \n PHP_PHARCMD_SETTINGS = -n -d 'open_basedir=' -d 'output_buffering=0' -d 'memory_limit=-1' -d phar.readonly=0\n-PHP_PHARCMD_EXECUTABLE = ` \\\n-\tif test -x \"$(top_builddir)/$(SAPI_CLI_PATH)\"; then \\\n-\t\t$(top_srcdir)/build/shtool echo -n -- \"$(top_builddir)/$(SAPI_CLI_PATH) -n\"; \\\n-\t\tif test \"x$(PHP_MODULES)\" != \"x\"; then \\\n-\t\t$(top_srcdir)/build/shtool echo -n -- \" -d extension_dir=$(top_builddir)/modules\"; \\\n-\t\tfor i in bz2 zlib phar; do \\\n-\t\t\tif test -f \"$(top_builddir)/modules/$$i.la\"; then \\\n-\t\t\t\t. $(top_builddir)/modules/$$i.la; $(top_srcdir)/build/shtool echo -n -- \" -d extension=$$dlname\"; \\\n-\t\t\tfi; \\\n-\t\tdone; \\\n-\t\tfi; \\\n-\telse \\\n-\t\t$(top_srcdir)/build/shtool echo -n -- \"$(PHP_EXECUTABLE)\"; \\\n-\tfi;`\n+PHP_PHARCMD_EXECUTABLE = \"true\"\n PHP_PHARCMD_BANG = `$(top_srcdir)/build/shtool echo -n -- \"$(INSTALL_ROOT)$(bindir)/$(program_prefix)php$(program_suffix)$(EXEEXT)\";`\n \n $(builddir)/phar/phar.inc: $(srcdir)/phar/phar.inc\n@@ -42,9 +29,3 @@\n \n install-pharcmd: pharcmd\n \t-@$(mkinstalldirs) $(INSTALL_ROOT)$(bindir)\n-\t$(INSTALL) $(builddir)/phar.phar $(INSTALL_ROOT)$(bindir)/$(program_prefix)phar$(program_suffix).phar\n-\t-@rm -f $(INSTALL_ROOT)$(bindir)/$(program_prefix)phar$(program_suffix)\n-\t$(LN_S) -f $(program_prefix)phar$(program_suffix).phar $(INSTALL_ROOT)$(bindir)/$(program_prefix)phar$(program_suffix)\n-\t@$(mkinstalldirs) $(INSTALL_ROOT)$(mandir)/man1\n-\t@$(INSTALL_DATA) $(builddir)/phar.1 $(INSTALL_ROOT)$(mandir)/man1/$(program_prefix)phar$(program_suffix).1\n-\t@$(INSTALL_DATA) $(builddir)/phar.phar.1 $(INSTALL_ROOT)$(mandir)/man1/$(program_prefix)phar$(program_suffix).phar.1\ndiff -ruwN source/ext/posix/posix.c source-new/ext/posix/posix.c\n--- source/ext/posix/posix.c\t2023-08-04 00:13:08.000000000 +0700\n+++ source-new/ext/posix/posix.c\t2025-09-19 22:21:28.998031846 +0700\n@@ -443,7 +443,7 @@\n \n \tZEND_PARSE_PARAMETERS_NONE();\n \n-\tif ((ticks = times(&t)) == -1) {\n+\t{\n \t\tPOSIX_G(last_error) = errno;\n \t\tRETURN_FALSE;\n \t}\ndiff -ruwN source/ext/standard/hrtime.c source-new/ext/standard/hrtime.c\n--- source/ext/standard/hrtime.c\t2023-08-04 00:13:08.000000000 +0700\n+++ source-new/ext/standard/hrtime.c\t2025-09-19 23:34:34.839471333 +0700\n@@ -70,6 +70,8 @@\n \t\treturn -1;\n \t}\n \n+#elif defined(__redox__)\n+\t/* pass */\n #elif PHP_HRTIME_PLATFORM_POSIX\n \n #if !_POSIX_MONOTONIC_CLOCK\n"
  },
  {
    "path": "recipes/wip/dev/lang/python37/config.site",
    "content": "ac_cv_file__dev_ptmx=no\nac_cv_file__dev_ptc=no\n"
  },
  {
    "path": "recipes/wip/dev/lang/python37/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO does the patch is still needed?\n#TODO maybe the script is wrong\n[source]\ntar = \"https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tar.xz\"\npatches = [\n    \"redox.patch\",\n]\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncp ../config.site ./\nsed -i 's|#define HAVE_PTHREAD_KILL 1|/* #undef HAVE_PTHREAD_KILL */|g' pyconfig.h\nsed -i 's|#define HAVE_SCHED_SETSCHEDULER 1|/* #undef HAVE_SCHED_SETSCHEDULER */|g' pyconfig.h\nsed -i 's|#define HAVE_SYS_RESOURCE_H 1|/* #undef HAVE_SYS_RESOURCE_H */|g' pyconfig.h\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-ipv6\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/python37/redox.patch",
    "content": "diff -ruwN source/configure source-new/configure\n--- source/configure\t2019-07-08 12:03:50.000000000 -0600\n+++ source-new/configure\t2019-07-16 21:25:29.432607847 -0600\n@@ -3261,6 +3261,9 @@\n \t*-*-cygwin*)\n \t\tac_sys_system=Cygwin\n \t\t;;\n+\t*-*-redox*)\n+\t\tac_sys_system=Redox\n+\t\t;;\n \t*)\n \t\t# for now, limit cross builds to known configurations\n \t\tMACHDEP=\"unknown\"\n@@ -3293,7 +3296,7 @@\n \n if test \"$cross_compiling\" = yes; then\n \tcase \"$host\" in\n-\t*-*-linux*)\n+\t*-*-linux*|*-*-redox*)\n \t\tcase \"$host_cpu\" in\n \t\tarm*)\n \t\t\t_host_cpu=arm\ndiff -ruwN source/Lib/distutils/util.py source-new/Lib/distutils/util.py\n--- source/Lib/distutils/util.py\t2019-07-08 12:03:50.000000000 -0600\n+++ source-new/Lib/distutils/util.py\t2019-07-16 22:07:35.994862914 -0600\n@@ -131,7 +131,7 @@\n         if not os.path.isabs(pathname):\n             return os.path.join(new_root, pathname)\n         else:\n-            return os.path.join(new_root, pathname[1:])\n+            return os.path.join(new_root, pathname.lstrip('/'))\n \n     elif os.name == 'nt':\n         (drive, path) = os.path.splitdrive(pathname)\ndiff -ruwN source/Modules/main.c source-new/Modules/main.c\n--- source/Modules/main.c\t2019-07-08 12:03:50.000000000 -0600\n+++ source-new/Modules/main.c\t2019-07-16 21:46:53.037866142 -0600\n@@ -56,6 +56,16 @@\n         } \\\n     } while (0)\n \n+#if defined(__redox__)\n+wchar_t * wcstok(wchar_t * wcs, const wchar_t * delimiters, wchar_t ** ptr) {\n+    return NULL;\n+}\n+\n+long wcstol(const wchar_t *restrict nptr, wchar_t **restrict endptr, int base) {\n+    return 0;\n+}\n+#endif\n+\n #ifdef MS_WINDOWS\n #define WCSTOK wcstok_s\n #else\ndiff -ruwN source/Python/pathconfig.c source-new/Python/pathconfig.c\n--- source/Python/pathconfig.c\t2019-07-08 12:03:50.000000000 -0600\n+++ source-new/Python/pathconfig.c\t2019-07-16 21:55:34.549726910 -0600\n@@ -5,6 +5,10 @@\n #include \"internal/pystate.h\"\n #include <wchar.h>\n \n+#if defined(__redox__)\n+wchar_t * wcstok(wchar_t * wcs, const wchar_t * delimiters, wchar_t ** ptr);\n+#endif\n+\n #ifdef __cplusplus\n extern \"C\" {\n #endif\ndiff -ruwN source/Python/pytime.c source-new/Python/pytime.c\n--- source/Python/pytime.c\t2019-07-08 12:03:50.000000000 -0600\n+++ source-new/Python/pytime.c\t2019-07-16 21:36:53.233119225 -0600\n@@ -7,6 +7,19 @@\n #include <mach/mach_time.h>   /* mach_absolute_time(), mach_timebase_info() */\n #endif\n \n+#if defined(__redox__)\n+int clock_getres(clockid_t clk_id, struct timespec *res) {\n+    if (res) {\n+        res->tv_sec = 0;\n+        res->tv_nsec = 1000;\n+        return 0;\n+    } else {\n+        errno = EFAULT;\n+        return -1;\n+    }\n+}\n+#endif\n+\n #define _PyTime_check_mul_overflow(a, b) \\\n     (assert(b > 0), \\\n      (_PyTime_t)(a) < _PyTime_MIN / (_PyTime_t)(b) \\\n"
  },
  {
    "path": "recipes/wip/dev/lang/python39/recipe.toml",
    "content": "#TODO Fix dynamic loading of C modules\n[source]\ntar = \"https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tar.xz\"\npatches = [\n  'redox.patch'\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"bzip2\",\n    \"libffi\",\n    \"libuuid\",\n    \"ncurses\",\n    \"ncursesw\",\n    \"openssl1\",\n    \"readline\",\n    \"sqlite3\",\n    \"zlib\",\n    \"xz\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport PYTHONDONTWRITEBYTECODE=1\nARCH=\"${TARGET%%-*}\"\n\n# Python cross-compilation requires the same Python version on the build machine\nBUILDMACH_TARGET=\"$(gcc -dumpmachine)\"\nBUILDMACH_BUILD=\"${COOKBOOK_RECIPE}/target/${BUILDMACH_TARGET}/build\"\nBUILDMACH_STAGE=\"${COOKBOOK_RECIPE}/target/${BUILDMACH_TARGET}/stage\"\n\n# If this is a fresh build then we also rebuild the build machine version\n# (Cookbook clean does not remove it so we have to do it manually)\nif [ -z \"$(ls -A .)\" ]; then\n  rm -rf \"${BUILDMACH_BUILD}\" \"${BUILDMACH_STAGE}\"\nfi\n\nmkdir -p \"${BUILDMACH_BUILD}\"\nmkdir -p \"${BUILDMACH_STAGE}\"\n\ncd \"${BUILDMACH_BUILD}\"\n# Use env that does not use the Redox build tools\nenv -i PATH=\"$PATH\" CC=\"$CC_WRAPPER gcc\" \"${COOKBOOK_SOURCE}/configure\"\nenv -i PATH=\"$PATH\" CC=\"$CC_WRAPPER gcc\" \"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" install DESTDIR=\"${BUILDMACH_STAGE}\"\ncd -\n\nexport PATH=\"${BUILDMACH_STAGE}/usr/local/bin:${PATH}\"\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --prefix=/usr\n    --enable-shared\n    --disable-ipv6\n    --host=${GNU_TARGET}\n    --build=$ARCH\n    --with-ensurepip=install\n    ac_cv_file__dev_ptmx=no\n    ac_cv_file__dev_ptc=no\n)\n\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/python39/redox.patch",
    "content": "diff -ruwN source/configure source-new/configure\n--- source/configure\t2021-11-16 00:43:00.000000000 +0700\n+++ source-new/configure\t2025-09-17 21:31:19.787497963 +0700\n@@ -3307,6 +3307,9 @@\n \t*-*-vxworks*)\n \t    ac_sys_system=VxWorks\n \t    ;;\n+\t*-*-redox*)\n+\t\tac_sys_system=Redox\n+\t\t;;\n \t*)\n \t\t# for now, limit cross builds to known configurations\n \t\tMACHDEP=\"unknown\"\n@@ -3331,6 +3334,7 @@\n     case $MACHDEP in\n \taix*) MACHDEP=\"aix\";;\n \tlinux*) MACHDEP=\"linux\";;\n+\tredox*) MACHDEP=\"redox\";;\n \tcygwin*) MACHDEP=\"cygwin\";;\n \tdarwin*) MACHDEP=\"darwin\";;\n \t'')\tMACHDEP=\"unknown\";;\n@@ -3342,7 +3346,7 @@\n \n if test \"$cross_compiling\" = yes; then\n \tcase \"$host\" in\n-\t*-*-linux*)\n+\t*-*-linux*|*-*-redox*)\n \t\tcase \"$host_cpu\" in\n \t\tarm*)\n \t\t\t_host_cpu=arm\n@@ -5951,7 +5955,7 @@\n \t      PY3LIBRARY=libpython3.so\n \t  fi\n           ;;\n-    Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*)\n+    Linux*|GNU*|NetBSD*|FreeBSD*|DragonFly*|OpenBSD*|Redox*)\n \t  LDLIBRARY='libpython$(LDVERSION).so'\n \t  BLDLIBRARY='-L. -lpython$(LDVERSION)'\n \t  RUNSHARED=LD_LIBRARY_PATH=`pwd`${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}\n@@ -9551,7 +9555,7 @@\n \t\t\tBLDSHARED=\"$LDSHARED\"\n \t\tfi\n \t\t;;\n-\tLinux*|GNU*|QNX*|VxWorks*)\n+\tLinux*|GNU*|QNX*|VxWorks*|Redox*)\n \t\tLDSHARED='$(CC) -shared'\n \t\tLDCXXSHARED='$(CXX) -shared';;\n \tFreeBSD*)\n@@ -9620,7 +9624,7 @@\n \t\t else CCSHARED=\"+z\";\n \t\t fi;;\n \tLinux-android*) ;;\n-\tLinux*|GNU*) CCSHARED=\"-fPIC\";;\n+\tLinux*|GNU*|Redox*) CCSHARED=\"-fPIC\";;\n \tFreeBSD*|NetBSD*|OpenBSD*|DragonFly*) CCSHARED=\"-fPIC\";;\n \tOpenUNIX*|UnixWare*)\n \t\tif test \"$GCC\" = \"yes\"\n@@ -9650,7 +9654,7 @@\n \t    LINKFORSHARED=\"-Wl,-E -Wl,+s\";;\n #\t    LINKFORSHARED=\"-Wl,-E -Wl,+s -Wl,+b\\$(BINLIBDEST)/lib-dynload\";;\n \tLinux-android*) LINKFORSHARED=\"-pie -Xlinker -export-dynamic\";;\n-\tLinux*|GNU*) LINKFORSHARED=\"-Xlinker -export-dynamic\";;\n+\tLinux*|GNU*|Redox*) LINKFORSHARED=\"-Xlinker -export-dynamic\";;\n \t# -u libsys_s pulls in all symbols in libsys\n \tDarwin/*)\n \t\tLINKFORSHARED=\"$extra_undefs -framework CoreFoundation\"\ndiff -ruwN source/Include/pyport.h source-new/Include/pyport.h\n--- source/Include/pyport.h\t2021-11-16 00:43:00.000000000 +0700\n+++ source-new/Include/pyport.h\t2025-09-17 21:31:56.613084352 +0700\n@@ -838,7 +838,7 @@\n #  error \"Py_TRACE_REFS ABI is not compatible with release and debug ABI\"\n #endif\n \n-#if defined(__ANDROID__) || defined(__VXWORKS__)\n+#if defined(__ANDROID__) || defined(__VXWORKS__) || defined(__redox__)\n    /* Ignore the locale encoding: force UTF-8 */\n #  define _Py_FORCE_UTF8_LOCALE\n #endif\ndiff -ruwN source/Modules/timemodule.c source-new/Modules/timemodule.c\n--- source/Modules/timemodule.c\t2021-11-16 00:43:00.000000000 +0700\n+++ source-new/Modules/timemodule.c\t2025-09-17 21:30:18.552349106 +0700\n@@ -1416,7 +1416,7 @@\n     return 0;\n }\n \n-#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID)\n+#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) && defined(CLOCK_THREAD_CPUTIME_ID)\n #define HAVE_THREAD_TIME\n \n #if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability)\n"
  },
  {
    "path": "recipes/wip/dev/lang/rilua/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/wowemulation-dev/rilua\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/ristretto/recipe.toml",
    "content": "#TODO discover current status\n[source]\ngit = \"https://github.com/theseus-rs/ristretto\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages ristretto_cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/ruby/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.8.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"openssl3\",\n    \"zlib\",\n    \"libyaml\",\n    \"libffi\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/lang/scala/recipe.toml",
    "content": "#TODO missing script for sbt\n# probable build instructions: https://github.com/scala/scala3#building-a-local-distribution\n[source]\ntar = \"https://github.com/scala/scala3/releases/download/3.3.7/scala3-3.3.7.tar.gz\"\n[build]\ntemplate = \"custom\"\ndev-dependencies = [\"host:sbt\"]\n"
  },
  {
    "path": "recipes/wip/dev/lang/scc/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions: https://git.simple-cc.org/scc/file/README.html\n[source]\ngit = \"https://git.simple-cc.org/scc/\"\nrev = \"1ed0ff0000999561feee336c289252faf2502a7e\"\n[build]\ntemplate = \"custom\"\n[package]\ndependencies = [\"qbe\"]\n"
  },
  {
    "path": "recipes/wip/dev/lang/tcc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://repo.or.cz/tinycc.git/blob/HEAD:/README\n[source]\ntar = \"https://download.savannah.nongnu.org/releases/tinycc/tcc-0.9.27.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/tsuki/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ultimaweapon/tsuki\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/tur/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rezigned/tur\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages tur-cli tur-tui\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/vala/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO require bootstraping from another vala compiler\n# build instructions: https://gitlab.gnome.org/GNOME/vala#building-vala\n[source]\ntar = \"https://download.gnome.org/sources/vala/0.56/vala-0.56.18.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"glib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/wrecc/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/PhilippRados/wrecc\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/xylo/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/giraffekey/xylo\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/xylo\"\ncp -rv \"${COOKBOOK_SOURCE}/example.xylo\" \"${COOKBOOK_STAGE}/usr/share/xylo\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/lang/zig/recipe.toml",
    "content": "#TODO compiling, not tested further\n[source]\ngit = \"https://github.com/willnode/zig\"\nbranch = \"zig-0.15.2-redox\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n  \"llvm21\",\n  \"zstd\"\n]\n\ndev-dependencies = [\n  \"llvm21.dev\",\n  \"llvm21.runtime\",\n  \"clang21\",\n  \"clang21.dev\",\n  \"lld21.dev\",\n  \"lld21\",\n  \"host:libarchive\",\n  \"host:zig\",\n]\n\nscript = \"\"\"\nDYNAMIC_INIT\nexport PATH=\"${COOKBOOK_BUILD}:${PATH}\"\n\nmkdir -p \"${COOKBOOK_STAGE}\"/usr/lib/zig  \"${COOKBOOK_STAGE}\"/usr/bin\nln -s \"../lib/zig/bin/zig\" \"${COOKBOOK_STAGE}\"/usr/bin/zig\n\nif [ \"$TARGET\" != \"$COOKBOOK_HOST_TARGET\" ]; then\n\nARCH=\"${GNU_TARGET%%-*}\"\nOS=$(echo \"${TARGET}\" | cut -d - -f3-4)\nrsync -a \"${COOKBOOK_SOURCE}\"/* ./\n\nzig build \\\n  --prefix \"${COOKBOOK_STAGE}/usr/lib/zig\" \\\n  --search-prefix \"${COOKBOOK_SYSROOT}/usr\" \\\n  -Dflat \\\n  -Dstatic-llvm \\\n  -Doptimize=ReleaseFast \\\n  -Dstrip \\\n  -Dforce-link-libc \\\n  -Dtarget=\"$ARCH-$OS\" \\\n  -Dcpu=\"baseline\" \\\n  -Dversion-string=\"0.15.2\" \\\n  -Duse-zig-libcxx \\\n  -Dno-langref \\\n  -Dno-test\n\nelse \n\nCOOKBOOK_SOURCE=\"${COOKBOOK_BUILD}\"\nCOOKBOOK_STAGE=\"${COOKBOOK_STAGE}/usr/lib/zig\"\ncookbook_cmake -DCMAKE_INSTALL_PREFIX=/ -DZIG_NO_TEST=On\n\nfi\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/managers/moon/recipe.toml",
    "content": "#TODO openssl-sys crate error (after cargo update)\n[source]\ngit = \"https://github.com/moonrepo/moon\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages moon_cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/managers/proto/recipe.toml",
    "content": "#TODO fs-set-times crate error\n[source]\ngit = \"https://github.com/moonrepo/proto\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages proto_cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/managers/ratifact/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/adolfousier/ratifact\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/abi-cafe/recipe.toml",
    "content": "#TODO compiled but not tested (after an update on the libc crate)\n[source]\ngit = \"https://github.com/Gankra/abi-cafe\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/add-determinism/recipe.toml",
    "content": "#TODO source code error\n[source]\ngit = \"https://github.com/keszybz/add-determinism\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/allocscope/recipe.toml",
    "content": "#TODO make all dependencies work\n[source]\ngit = \"https://github.com/matt-kimball/allocscope\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"allocscope-trace\",\n    \"allocscope-view\",\n]\ndependencies = [\n    \"libiberty\",\n    \"ncurses\",\n    \"sqlite3\",\n    \"libunwind\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/alquitran/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ferivoz/alquitran\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/alt/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/dotboris/alt\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/apitrace/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/apitrace/apitrace/blob/master/docs/INSTALL.markdown#linux\n[source]\ngit = \"https://github.com/apitrace/apitrace\"\nrev = \"14.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_TESTING=OFF\"\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/apr/recipe.toml",
    "content": "[source]\ntar = \"https://dlcdn.apache.org//apr/apr-1.7.4.tar.bz2\"\npatches = [\"redox.patch\"]\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\nac_cv_file__dev_zero=yes\nac_cv_working_getaddrinfo=no\napr_cv_process_shared_works=yes\napr_cv_mutex_robust_shared=yes\napr_cv_tcp_nodelay_with_cork=no\napr_cv_epoll=yes\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/apr/redox.patch",
    "content": "diff --git a/apr-config.in b/apr-config.in\nindex 626d3b0..b79d471 100644\n--- a/apr-config.in\n+++ b/apr-config.in\n@@ -180,14 +180,14 @@ while test $# -gt 0; do\n     ;;\n     --includes)\n     if test \"$location\" = \"installed\"; then\n-        flags=\"$flags -I$includedir $EXTRA_INCLUDES\"\n+        flags=\"$flags $EXTRA_INCLUDES\"\n     elif test \"$location\" = \"crosscompile\"; then\n-        flags=\"$flags -I$APR_TARGET_DIR/$includedir $EXTRA_INCLUDES\"\n+        flags=\"$flags $EXTRA_INCLUDES\"\n     elif test \"$location\" = \"source\"; then\n-        flags=\"$flags -I$APR_SOURCE_DIR/include $EXTRA_INCLUDES\"\n+        flags=\"$flags $EXTRA_INCLUDES\"\n     else\n         # this is for VPATH builds\n-        flags=\"$flags -I$APR_BUILD_DIR/include -I$APR_SOURCE_DIR/include $EXTRA_INCLUDES\"\n+        flags=\"$flags $EXTRA_INCLUDES\"\n     fi\n     ;;\n     --srcdir)\n@@ -214,12 +214,12 @@ while test $# -gt 0; do\n     --link-ld)\n     if test \"$location\" = \"installed\"; then\n         ### avoid using -L if libdir is a \"standard\" location like /usr/lib\n-        flags=\"$flags -L$libdir -l${APR_LIBNAME}\"\n+        flags=\"$flags -l${APR_LIBNAME}\"\n     elif test \"$location\" = \"crosscompile\"; then\n-        flags=\"$flags -L$APR_TARGET_DIR/$libdir -l${APR_LIBNAME}\"\n+        flags=\"$flags -l${APR_LIBNAME}\"\n     else\n         ### this surely can't work since the library is in .libs?\n-        flags=\"$flags -L$APR_BUILD_DIR -l${APR_LIBNAME}\"\n+        flags=\"$flags -l${APR_LIBNAME}\"\n     fi\n     ;;\n     --link-libtool)\n@@ -233,9 +233,9 @@ while test $# -gt 0; do\n         ### avoid using -L if libdir is a \"standard\" location like /usr/lib\n         # Since the user is specifying they are linking with libtool, we\n         # *know* that -R will be recognized by libtool.\n-        flags=\"$flags -L$libdir -R$libdir -l${APR_LIBNAME}\"\n+        flags=\"$flags -l${APR_LIBNAME}\"\n     elif test \"$location\" = \"crosscompile\"; then\n-        flags=\"$flags  -L${APR_TARGET_DIR}/$libdir  -l${APR_LIBNAME}\"\n+        flags=\"$flags  -l${APR_LIBNAME}\"\n     else\n         flags=\"$flags $LA_FILE\"\n     fi\ndiff --git a/file_io/unix/open.c b/file_io/unix/open.c\nindex 49eb727..7b28aba 100644\n--- a/file_io/unix/open.c\n+++ b/file_io/unix/open.c\n@@ -101,12 +101,15 @@ APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new,\n #endif\n \n     if ((flag & APR_FOPEN_READ) && (flag & APR_FOPEN_WRITE)) {\n+\t\t\tfprintf(stderr, \"afo flag RDRW\\n\");\n         oflags = O_RDWR;\n     }\n     else if (flag & APR_FOPEN_READ) {\n+\t\t\tfprintf(stderr, \"afo flag RDONLY\\n\");\n         oflags = O_RDONLY;\n     }\n     else if (flag & APR_FOPEN_WRITE) {\n+\t\t\tfprintf(stderr, \"afo flag WRONLY\\n\");\n         oflags = O_WRONLY;\n     }\n     else {\n@@ -114,8 +117,10 @@ APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new,\n     }\n \n     if (flag & APR_FOPEN_CREATE) {\n+\t\t\tfprintf(stderr, \"afo flag CREAT\\n\");\n         oflags |= O_CREAT;\n         if (flag & APR_FOPEN_EXCL) {\n+\t\t\tfprintf(stderr, \"afo flag EXCL\\n\");\n             oflags |= O_EXCL;\n         }\n     }\n@@ -124,19 +129,23 @@ APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new,\n     }   \n \n     if (flag & APR_FOPEN_APPEND) {\n+\t\t\tfprintf(stderr, \"afo flag APPEND\\n\");\n         oflags |= O_APPEND;\n     }\n     if (flag & APR_FOPEN_TRUNCATE) {\n+\t\t\tfprintf(stderr, \"afo flag TRUNC\\n\");\n         oflags |= O_TRUNC;\n     }\n #ifdef O_BINARY\n     if (flag & APR_FOPEN_BINARY) {\n+\t\t\tfprintf(stderr, \"afo flag BINARY\\n\");\n         oflags |= O_BINARY;\n     }\n #endif\n \n     if (flag & APR_FOPEN_NONBLOCK) {\n #ifdef O_NONBLOCK\n+\t\t\tfprintf(stderr, \"afo flag NONBLOCK\\n\");\n         oflags |= O_NONBLOCK;\n #else\n         return APR_ENOTIMPL;\n@@ -147,14 +156,17 @@ APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new,\n     /* Introduced in Linux 2.6.23. Silently ignored on earlier Linux kernels.\n      */\n     if (!(flag & APR_FOPEN_NOCLEANUP)) {\n+\t\t\tfprintf(stderr, \"afo flag CLOEXEC\\n\");\n         oflags |= O_CLOEXEC;\n }\n #endif\n  \n #if APR_HAS_LARGE_FILES && defined(_LARGEFILE64_SOURCE)\n+\t\t\tfprintf(stderr, \"afo flag LARGEFILE\\n\");\n     oflags |= O_LARGEFILE;\n #elif defined(O_LARGEFILE)\n     if (flag & APR_FOPEN_LARGEFILE) {\n+\t\t\tfprintf(stderr, \"afo flag LARGEFILE\\n\");\n         oflags |= O_LARGEFILE;\n     }\n #endif\n@@ -164,18 +176,22 @@ APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new,\n         rv = apr_thread_mutex_create(&thlock,\n                                      APR_THREAD_MUTEX_DEFAULT, pool);\n         if (rv) {\n+\t\t\tfprintf(stderr, \"afo ret 1 %d\\n\", rv);\n             return rv;\n         }\n     }\n #endif\n \n     if (perm == APR_OS_DEFAULT) {\n+\t\t\tfprintf(stderr, \"open %d %s\\n\", oflags, fname);\n         fd = open(fname, oflags, 0666);\n     }\n     else {\n+\t\t\tfprintf(stderr, \"open %s %d %d\\n\", fname, oflags, apr_unix_perms2mode(perm));\n         fd = open(fname, oflags, apr_unix_perms2mode(perm));\n     } \n     if (fd < 0) {\n+\t\t\tfprintf(stderr, \"afo ret 2 %d\\n\", errno);\n        return errno;\n     }\n     if (!(flag & APR_FOPEN_NOCLEANUP)) {\n@@ -188,12 +204,14 @@ APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new,\n \n             if ((flags = fcntl(fd, F_GETFD)) == -1) {\n                 close(fd);\n+\t\t\tfprintf(stderr, \"afo ret 3 %d\\n\", errno);\n                 return errno;\n             }\n             if ((flags & FD_CLOEXEC) == 0) {\n                 flags |= FD_CLOEXEC;\n                 if (fcntl(fd, F_SETFD, flags) == -1) {\n                     close(fd);\n+\t\t\tfprintf(stderr, \"afo ret 4 %d\\n\", errno);\n                     return errno;\n                 }\n             }\ndiff --git a/network_io/unix/sockopt.c b/network_io/unix/sockopt.c\nindex 6194e9b..a903f91 100644\n--- a/network_io/unix/sockopt.c\n+++ b/network_io/unix/sockopt.c\n@@ -372,7 +372,7 @@ apr_status_t apr_socket_opt_get(apr_socket_t *sock,\n \n apr_status_t apr_socket_atmark(apr_socket_t *sock, int *atmark)\n {\n-#ifndef BEOS_R5\n+#if !defined(BEOS_R5) && !defined(__redox__)\n     int oobmark;\n \n     if (ioctl(sock->socketdes, SIOCATMARK, (void*) &oobmark) < 0)\n"
  },
  {
    "path": "recipes/wip/dev/other/apr-util/recipe.toml",
    "content": "[source]\ntar = \"https://archive.apache.org/dist/apr/apr-util-1.6.0.tar.bz2\"\npatches = [\n    \"redox.patch\",\n]\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"apr\",\n    \"expat\",\n]\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --with-apr=\"${COOKBOOK_SYSROOT}\"\n)\nexport CFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ -I${COOKBOOK_SYSROOT}/include/apr-1 \"\nls ${COOKBOOK_SYSROOT}/include/\nexport CFLAGS_=\"${CFLAGS}\"\ncd ${COOKBOOK_SOURCE}\nautoreconf -fi\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\nsed -i build/rules.mk -e \"s;\\\\(apr_builddir=\\\\)\\\\(.*\\\\);\\\\1${COOKBOOK_SYSROOT}\\\\2;\" \\\\\n -e \"s;--mode=link;& --tag=CC;g\" -e \"s;--mode=compile;& --tag=CC -v;g\" \\\\\n\nsed -i build/rules.mk -e \"/apr_builders=/s;apr_builders=;apr_builders=${COOKBOOK_SYSROOT};\"\nsed -i build/rules.mk -e \"/^CFLAGS=/s;=.*;=${CFLAGS_};\"\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" install DESTDIR=\"${COOKBOOK_STAGE}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/apr-util/redox.patch",
    "content": "diff --git a/apu-config.in b/apu-config.in\nindex 82109e5..2d005c9 100644\n--- a/apu-config.in\n+++ b/apu-config.in\n@@ -140,12 +140,12 @@ while test $# -gt 0; do\n     ;;\n     --includes)\n     if test \"$location\" = \"installed\"; then\n-        flags=\"$flags -I$includedir $INCLUDES\"\n+        flags=\"$flags $INCLUDES\"\n     elif test \"$location\" = \"source\"; then\n-        flags=\"$flags -I$APU_SOURCE_DIR/include $INCLUDES\"\n+        flags=\"$flags $INCLUDES\"\n     else\n         # this is for VPATH builds\n-        flags=\"$flags -I$APU_BUILD_DIR/include -I$APU_SOURCE_DIR/include $INCLUDES\"\n+        flags=\"$flags $INCLUDES\"\n     fi\n     ;;\n     --ldflags)\n@@ -162,9 +162,9 @@ while test $# -gt 0; do\n     --link-ld)\n     if test \"$location\" = \"installed\"; then\n         ### avoid using -L if libdir is a \"standard\" location like /usr/lib\n-        flags=\"$flags -L$libdir -l$APRUTIL_LIBNAME\"\n+        flags=\"$flags -l$APRUTIL_LIBNAME\"\n     else\n-        flags=\"$flags -L$APU_BUILD_DIR -l$APRUTIL_LIBNAME\"\n+        flags=\"$flags -l$APRUTIL_LIBNAME\"\n     fi\n     ;;\n     --link-libtool)\n@@ -178,7 +178,7 @@ while test $# -gt 0; do\n         ### avoid using -L if libdir is a \"standard\" location like /usr/lib\n         # Since the user is specifying they are linking with libtool, we\n         # *know* that -R will be recognized by libtool.\n-        flags=\"$flags -L$libdir -R$libdir -l$APRUTIL_LIBNAME\"\n+        flags=\"$flags -l$APRUTIL_LIBNAME\"\n     else\n         flags=\"$flags $LA_FILE\"\n     fi\n"
  },
  {
    "path": "recipes/wip/dev/other/argp-standalone/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/argp-standalone/argp-standalone\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/dev/other/bender/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/pulp-platform/bender\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/bison/recipe.toml",
    "content": "#TODO Compilation error\n[source]\ntar = \"https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/bite/recipe.toml",
    "content": "#TODO rfd crate error\n[source]\ngit = \"https://github.com/WINSDK/bite\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/boon/recipe.toml",
    "content": "#TODO fs_at crate error\n[source]\ngit = \"https://github.com/camchenry/boon\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/bugstalker/recipe.toml",
    "content": "#TODO make the dependency work\n[source]\ngit = \"https://github.com/godzie44/BugStalker\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libunwind\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/cackle/recipe.toml",
    "content": "#TODO camino crate error\n#TODO Probably needs to be ported to Redox\n[source]\ngit = \"https://github.com/davidlattimore/cackle\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n#cargoflags = [\"--features unsupported-os\"] # uncomment if it doesn't work\n"
  },
  {
    "path": "recipes/wip/dev/other/capnproto/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://capnproto.org/capnproto-c++-1.0.1.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/ccs-tools/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/UIUC-PPL/ccs_tools#readme\n[source]\ngit = \"https://github.com/UIUC-PPL/ccs_tools\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/charm++/recipe.toml",
    "content": "#TODO missing script for cross-compilation, see https://charm.readthedocs.io/en/latest/charm++/manual.html#installing-charm\n[source]\ntar = \"http://charm.cs.illinois.edu/distrib/charm-7.0.0.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/chars/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/boinkor-net/chars\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"chars\"]\n"
  },
  {
    "path": "recipes/wip/dev/other/cling/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/vgvassilev/cling#building-from-source\n[source]\ngit = \"https://github.com/vgvassilev/cling\"\nrev = \"v1.3\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DLLVM_INCLUDE_TESTS=OFF\"\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/colm/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://www.colm.net/files/colm/colm-0.14.7.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/colmena/recipe.toml",
    "content": "#TODO sys-info crate error (after cargo update)\n[source]\ngit = \"https://github.com/zhaofengli/colmena\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/commit/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/alt-art/commit\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/cppunit/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"http://dev-www.libreoffice.org/src/cppunit-1.15.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/crates-tui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ratatui-org/crates-tui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/criner/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n#TODO missing script to properly move th binary\n[source]\ngit = \"https://github.com/the-lean-crate/criner\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"criner\"]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/crosstool-ng/recipe.toml",
    "content": "#TODO can't find libtool\n[source]\ntar = \"http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.26.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/customasm/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/hlorenzi/customasm\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/debugedit/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://sourceware.org/ftp/debugedit/5.0/debugedit-5.0.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"elfutils\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/deploy-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/serokell/deploy-rs\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\nmv \"${COOKBOOK_STAGE}/usr/bin/deploy\" \"${COOKBOOK_STAGE}/usr/bin/deploy-rs\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/deps-rs/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/deps-rs/deps.rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/difftastic/recipe.toml",
    "content": "#TODO make mimalloc work\n[source]\ngit = \"https://github.com/Wilfred/difftastic\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"mimalloc\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/dioxus/recipe.toml",
    "content": "#TODO compilation error\n#TODO need to install the bindgen-cli build tool from cargo: cargo install --force --locked bindgen-cli\n[source]\ngit = \"https://github.com/DioxusLabs/dioxus\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"dioxus-cli\"]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/doxygen/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://www.doxygen.nl/manual/install.html#install_src_unix\n[source]\ntar = \"https://www.doxygen.nl/files/doxygen-1.16.1.src.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/dev/other/dtool/recipe.toml",
    "content": "#TODO update the redox_syscall version on the dependency tree\n[source]\ngit = \"https://github.com/guoxbin/dtool\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/ecargo/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/crumblingstatue/ecargo\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/elfshaker/recipe.toml",
    "content": "#TODO rustc-serialize crate error (after an update on proc-macro2 and patch on ring)\n[source]\ngit = \"https://github.com/elfshaker/elfshaker\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/elfutils/recipe.toml",
    "content": "# Compiled, not tested\n[source]\ntar = \"https://sourceware.org/elfutils/ftp/0.190/elfutils-0.190.tar.bz2\"\n\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"zlib\",\n    \"argp-standalone\",\n    \"musl-fts\",\n    \"musl-obstack\",\n    # \"gettext\",\n]\nconfigureflags = [\n    \"--disable-libdebuginfod\",\n    \"--disable-debuginfod\",\n]"
  },
  {
    "path": "recipes/wip/dev/other/espmonitor/recipe.toml",
    "content": "#TODO termios crate error (after cargo update)\n[source]\ngit = \"https://github.com/esp-rs/espmonitor\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"espmonitor\",\n    \"cargo-espmonitor\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/eww/recipe.toml",
    "content": "#TODO make gtk3 work\n[source]\ngit = \"https://github.com/elkowar/eww\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"eww\"]\ndependencies = [\n    \"gtk3\",\n    \"pango\",\n    \"cairo\",\n    \"gdk-pixbuf\",\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/fal/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/4lDO2/fal-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"fal-frontend-redox\"]\n"
  },
  {
    "path": "recipes/wip/dev/other/fazi/recipe.toml",
    "content": "#TODO library source code error\n[source]\ngit = \"https://github.com/landaire/fazi\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"fazi\"]\n"
  },
  {
    "path": "recipes/wip/dev/other/firedbg/recipe.toml",
    "content": "#TODO missing script to properly move the binary\n[source]\ngit = \"https://github.com/SeaQL/FireDBG.for.Rust\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"firedbg-cli\"]\n"
  },
  {
    "path": "recipes/wip/dev/other/flamegraph/recipe.toml",
    "content": "#TODO require DTrace support\n[source]\ngit = \"https://github.com/flamegraph-rs/flamegraph\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"flamegraph\"]\n"
  },
  {
    "path": "recipes/wip/dev/other/flex/recipe.toml",
    "content": "#TODO configuration error\n[source]\ntar = \"https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/gem5/recipe.toml",
    "content": "#TODO missing script for scons: https://www.gem5.org/documentation/general_docs/building\n[source]\ngit = \"https://github.com/gem5/gem5\"\nbranch = \"stable\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/get-blessed/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/josueBarretogit/get_blessed_rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/gex/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Piturnah/gex\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/gfold/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/nickgerace/gfold\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"gfold\"]\n"
  },
  {
    "path": "recipes/wip/dev/other/ghostpdl/recipe.toml",
    "content": "#TODO error on the libtiff configure script\n[source]\ntar = \"https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10021/ghostpdl-10.02.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/gist-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/oz/gist\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/gitlab-cargo-shim/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/w4/gitlab-cargo-shim\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/gperf/recipe.toml",
    "content": "#TODO Promote\n[source]\ntar = \"https://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/grcov/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/mozilla/grcov\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/gtest/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/google/googletest/blob/main/googletest/README.md\n[source]\ngit = \"https://github.com/google/googletest\"\nrev = \"f8d7d77c06936315286eb55f8de22cd23c188571\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/dev/other/guile/recipe.toml",
    "content": "#TODO make dependencies work\n[source]\ntar = \"https://ftp.gnu.org/gnu/guile/guile-3.0.9.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libgmp\",\n    \"libiconv\",\n    \"libunistring\",\n    \"libgc\",\n    \"readline\",\n    \"libffi\",\n    \"libintl\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/harper/recipe.toml",
    "content": "#TODO linking error\n[source]\ngit = \"https://github.com/Automattic/harper\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages harper-ls\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/headers/recipe.toml",
    "content": "#TODO make libxcb work\n[source]\ngit = \"https://github.com/transmissions11/headers\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libxcb\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/hexyl/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/sharkdp/hexyl\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/honggfuzz/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/google/honggfuzz#installation\n[source]\ngit = \"https://github.com/google/honggfuzz\"\nrev = \"83a8415a372d84dcc69ac1e2c2f152190bcf76d1\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libunwind\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/htmlq/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/mgdm/htmlq\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/hvm/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/HigherOrderCO/HVM\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/icemaker/recipe.toml",
    "content": "#TODO tree-sitter-rust error\n[source]\ngit = \"https://github.com/matthiaskrgr/icemaker\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/inko/recipe.toml",
    "content": "#TODO Require LLVM 15\n[source]\ntar = \"https://releases.inko-lang.org/0.11.0.tar.gz\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/intltool/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/irust/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/sigmaSd/IRust\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages irust\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/ispc/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/ispc/ispc/wiki/ISPC-Development-Guide#build-system\n[source]\ngit = \"https://github.com/ispc/ispc\"\nrev = \"bd2c42d42e0cc3da1baf92160b82d4dc820a02ee\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/jaq/recipe.toml",
    "content": "#TODO mimalloc error\n[source]\ngit = \"https://github.com/01mf02/jaq\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages jaq\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/jco/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/bytecodealliance/jco\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/jujutsu/recipe.toml",
    "content": "#TODO mac_address crate error\n[source]\ngit = \"https://github.com/martinvonz/jj\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages jj-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/kicad/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO maybe missing dependencies, see https://dev-docs.kicad.org/en/build/getting-started/\n# build instructions: https://dev-docs.kicad.org/en/build/linux/\n[source]\ngit = \"https://gitlab.com/kicad/code/kicad\"\nrev = \"942661fc10e172febf9d9990de2471d4b1020618\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"wxwidgets-gtk3\",\n    \"cairo\",\n    \"boost\",\n    \"glew\",\n    \"zlib\",\n    \"freeglut\",\n    \"glm\",\n    \"curl\",\n    \"ngspice\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/kickstart/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Keats/kickstart\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/knope/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/knope-dev/knope\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages knope\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/kondo/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/tbillington/kondo\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages kondo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/ktra/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/moriturus/ktra\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/lading/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/DataDog/lading\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages lading\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/leetup/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/dragfire/leetup\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/leptosfmt/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/bram209/leptosfmt\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages leptosfmt\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/level-zero/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/oneapi-src/level-zero#building-and-installing\n[source]\ngit = \"https://github.com/oneapi-src/level-zero\"\nrev = \"ea5be99d8d34480447ab1e3c7efc30d6f179b123\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/dev/other/license-generator/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/azu/license-generator\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/licensure/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/chasinglogic/licensure\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/loadlibrary/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/taviso/loadlibrary#building\n[source]\ngit = \"https://github.com/taviso/loadlibrary\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"readline\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/lockdiff/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/your-tools/lockdiff\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/loco/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/loco-rs/loco\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nbinary=loco-rs\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --package \"${binary}\" \\\n            --release\n            --cli\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${binary}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${binary}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/lttng-ust/recipe.toml",
    "content": "#TODO make dependencies work\n[source]\ntar = \"http://lttng.org/files/lttng-ust/lttng-ust-2.13.6.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libxml2\",\n    \"lttng\",\n    \"liburcu\",\n    \"libuuid\",\n    \"popt\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/lurk/recipe.toml",
    "content": "#TODO users crate error\n[source]\ngit = \"https://github.com/JakWai01/lurk\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/margo/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/integer32llc/margo\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/memtest-vulkan/recipe.toml",
    "content": "#TODO nix, fs4 and rustix crates error\n[source]\ngit = \"https://github.com/GpuZelenograd/memtest_vulkan\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/mise/recipe.toml",
    "content": "#TODO shared_child and libc crates error\n[source]\ngit = \"https://github.com/jdx/mise\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/mkrs/recipe.toml",
    "content": "#TODO outdated redox_syscall crate\n[source]\ngit = \"https://github.com/qtfkwk/mkrs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/mnn/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking English build instructions\n[source]\ngit = \"https://github.com/alibaba/MNN\"\nrev = \"1ea55f467fb231655cf1e08f77d4a0f1043c4c29\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/dev/other/mold/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions - https://github.com/rui314/mold#how-to-build\n[source]\ngit = \"https://github.com/rui314/mold\"\nrev = \"b53197300b5bf9f02daccae536f65dda2d1431c5\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/dev/other/morty/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/pulp-platform/morty\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/musl-fts/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/void-linux/musl-fts\"\nscript = \"\"\"\n./bootstrap.sh\n\"\"\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/musl-obstack/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/void-linux/musl-obstack\"\nscript = \"\"\"\n./bootstrap.sh\n\"\"\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/ncnn/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-linux\n[source]\ngit = \"https://github.com/Tencent/ncnn\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"protobuf\",\n    \"libvulkan\",\n    \"opencv4\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/necessist/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/trailofbits/necessist\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sqlite3\",\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages necessist\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/netradiant/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/xonotic/netradiant#advanced-compilation\n[source]\ngit = \"https://gitlab.com/xonotic/netradiant\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libxml2\",\n    \"mesa\",\n    \"gtk2\",\n    \"libjpeg\",\n    \"libpng\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/ngspice/recipe.toml",
    "content": "#TODO maybe wrong script, see https://sourceforge.net/p/ngspice/ngspice/ci/master/tree/INSTALL\n#TODO maybe missing dependencies\n[source]\ntar = \"https://sourceforge.net/projects/ngspice/files/ng-spice-rework/42/ngspice-42.tar.gz/download\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncd release\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --with-x\n    --with-readline=yes\n    --disable-debug\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/not-perf/recipe.toml",
    "content": "#TODO perf_event_open crate error (after cargo update)\n[source]\ngit = \"https://github.com/koute/not-perf\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages nperf\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/novops/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://pierrebeucher.github.io/novops/install.html#from-source\n[source]\ngit = \"https://github.com/PierreBeucher/novops\"\nrev = \"e0891144108a889f18448b39aebe9d5a5ac2689d\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/omni/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/XaF/omni\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/omnibor-rs/recipe.toml",
    "content": "#TODO Bash error with the \"--build-binary\" Cargo flag\n[source]\ngit = \"https://github.com/omnibor/omnibor-rs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nbinary=omnibor\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --bin \"${binary}\" \\\n            --release\n            --build-binary\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${binary}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${binary}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/opam/recipe.toml",
    "content": "#TODO configuration problem\n#TODO require the OCaml compiler on the host\n[source]\ntar = \"https://github.com/ocaml/opam/releases/download/2.1.5/opam-full-2.1.5.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/opencascade/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://dev.opencascade.org/doc/overview/html/build_upgrade__building_occt.html\n#TODO missing dependencies, see https://dev.opencascade.org/doc/overview/html/build_upgrade_building_3rdparty.html#build_3rdparty_linux\n[source]\ntar = \"https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V7_8_0.tar.gz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"freetype2\",\n    \"tcl\",\n    \"tk\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/openradioss/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/OpenRadioss/OpenRadioss/blob/main/HOWTO.md#building-on-linux\n[source]\ntar = \"https://github.com/OpenRadioss/OpenRadioss\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openmpi\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/oxc/recipe.toml",
    "content": "#TODO can't fetch the submodules because they need login\n[source]\ngit = \"https://github.com/oxc-project/oxc\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages oxc\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/oxidizer/recipe.toml",
    "content": "#TODO rustc-serialize crate error\n[source]\ngit = \"https://github.com/ix/oxidizer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/panamax/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/panamax-rs/panamax\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/phantom-ci/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/helloimalemur/phantomci\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/piccolo/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/kyren/piccolo\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_examples interpreter\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/pixi/recipe.toml",
    "content": "#TODO fs4 crate error (after cargo update)\n[source]\ngit = \"https://github.com/prefix-dev/pixi\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/precious/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/houseabsolute/precious\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/probe-rs/recipe.toml",
    "content": "#TODO maybe missing dependencies\n[source]\ngit = \"https://github.com/probe-rs/probe-rs\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libudev\",\n]\nscript = \"\"\"\ncookbook_cargo --features cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/projclean/recipe.toml",
    "content": "#TODO fs_at crate error\n[source]\ngit = \"https://github.com/sigoden/projclean\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/projections/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/charmplusplus/projections#compiling-projections\n[source]\ngit = \"https://github.com/charmplusplus/projections\"\nrev = \"831b63af68f325c64dac307d9d2b5b07d9a21caa\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/protobuf/recipe.toml",
    "content": "#TODO: libabsl\n# Also see https://github.com/protocolbuffers/protobuf/blob/main/cmake/README.md\n[source]\ngit = \"https://github.com/protocolbuffers/protobuf\"\nrev = \"v34.0\"\nshallow_clone = true\n\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-Dprotobuf_BUILD_TESTS=OFF\"\n]\ndependencies = [\n    \"libabsl\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/protofetch/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/coralogix/protofetch\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/putzen/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/sassman/putzen-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/pxp/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/pxp-lang/pxp\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages pxp-tools\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/qbe/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://c9x.me/git/qbe.git/tree/README#n13\n[source]\ntar = \"https://c9x.me/compile/release/qbe-1.1.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/quicktest/recipe.toml",
    "content": "#TODO async-io and rustix crates error\n[source]\ngit = \"https://github.com/LuchoBazz/quicktest\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/radicle/recipe.toml",
    "content": "#TODO libc error\n[source]\ngit = \"https://seed.radicle.xyz/z3gqcJUoA1n9HaHKufZs5FCSGazv5.git\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages radicle-cli radicle-node radicle-remote-helper\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/ragel/recipe.toml",
    "content": "#TODO missing colm directory on the GNU Autotools flag\n[source]\ntar = \"https://www.colm.net/files/ragel/ragel-6.10.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"colm\",\n]\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --with-colm=\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/rattler-build/recipe.toml",
    "content": "#TODO openssl error\n[source]\ngit = \"https://github.com/prefix-dev/rattler-build\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/rbasefind/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/sgayou/rbasefind\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/redict/recipe.toml",
    "content": "#TODO Missing script for \"make\", see https://redict.io/docs/install/#installing-from-source\n[source]\ngit = \"https://codeberg.org/redict/redict\"\nrev = \"5684cdbd9f2aefb494dfb346292d4322319d236b\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/redis/recipe.toml",
    "content": "#TODO Missing script for \"make\", see https://redis.io/docs/install/install-redis/install-redis-from-source/\n[source]\ngit = \"https://github.com/redis/redis\"\nrev = \"7f4bae817614988c43c3024402d16edcbf3b3277\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/release-plz/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/MarcoIeni/release-plz\"\nrev = \"68baf26d77a887c3ad90e4ad75ce77d9788f2442\"\n[build]\ndependencies = [\n    \"openssl1\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\nexport OPENSSL_STATIC=\"true\"\ncookbook_cargo_packages release-plz\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/renderdoc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/baldurk/renderdoc/blob/v1.x/docs/CONTRIBUTING/Compiling.md#linux\n[source]\ngit = \"https://github.com/baldurk/renderdoc\"\nrev = \"5f95fb95a2a225a092372e7bd0bfd2073525d3ac\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libxcb\",\n    \"mesa\",\n    \"qt5-base\",\n    \"pcre\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/resym/recipe.toml",
    "content": "#TODO webbrowser crate error\n[source]\ngit = \"https://github.com/ergrelet/resym\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages resym resymc\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/rgit/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/w4/rgit\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/rhack/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/nakabonne/rhack\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/rudra/recipe.toml",
    "content": "#TODO ouutdated redox_syscall crate?\n[source]\ngit = \"https://github.com/sslab-gatech/Rudra\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/rust-counter-strings/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/thomaschaplin/rust-counter-strings\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/rusty-radamsa/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/microsoft/rusty-radamsa\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/shaderc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/google/shaderc#getting-and-building-shaderc\n[source]\ngit = \"https://github.com/google/shaderc\"\nrev = \"3882b16417077aa8eaa7b5775920e7ba4b8a224d\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/dev/other/silicon/recipe.toml",
    "content": "#TODO the yeslogic-fontconfig-sys crate can't find the fontconfig dependency\n[source]\ngit = \"https://github.com/Aloxaf/silicon\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/souper/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/google/souper#building-souper\n[source]\ngit = \"https://github.com/google/souper\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/dev/other/steel/recipe.toml",
    "content": "#TODO rustyline crate error\n[source]\ngit = \"https://github.com/mattwparas/steel\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/stgit/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/stacked-git/stgit\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/stitch/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/makepad/stitch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/svd2rust/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/rust-embedded/svd2rust\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/swig/recipe.toml",
    "content": "#TODO missing pcre2.h\n[source]\ntar = \"http://prdownloads.sourceforge.net/swig/swig-4.1.1.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"pcre\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/tcl/recipe.toml",
    "content": "#TODO maybe wrong template, see https://www.tcl.tk/doc/howto/compile.html#unix\n[source]\ntar = \"http://prdownloads.sourceforge.net/tcl/tcl8.6.13-src.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncd unix\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/wip/dev/other/tk/recipe.toml",
    "content": "#TODO maybe wrong template, see https://www.tcl.tk/doc/howto/compile.html#unix\n[source]\ntar = \"http://prdownloads.sourceforge.net/tcl/tk8.6.13-src.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncd unix\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/tnn/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/Tencent/TNN/blob/master/doc/en/user/compile_en.md#iv-compilex86-linux\n[source]\ngit = \"https://github.com/Tencent/TNN\"\nrev = \"491dfc8653e200b5e8a428069638e191662a0882\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/other/tokio-console/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/tokio-rs/console\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages tokio-console\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/tv/recipe.toml",
    "content": "#TODO update mio to 0.8 (after cargo update)\n[source]\ngit = \"https://github.com/alexhallam/tv\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/twiggy/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/rustwasm/twiggy\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages twiggy\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/ucd-generate/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/BurntSushi/ucd-generate\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/ut/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ksdme/ut\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/other/valgrind/recipe.toml",
    "content": "#TODO port to redox\n[source]\ntar = \"https://sourceware.org/pub/valgrind/valgrind-3.22.0.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/verrou/recipe.toml",
    "content": "#TODO port to redox\n[source]\ntar = \"https://github.com/edf-hpc/verrou/releases/download/v2.5.0/valgrind-3.21.0_verrou-2.5.0.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/dev/other/wrkflw/recipe.toml",
    "content": "#TODO can't find the openssl dependency\n[source]\ngit = \"https://github.com/bahdotsh/wrkflw\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages wrkflw\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/other/zeal/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/zealdocs/zeal#build-instructions\n[source]\ntar = \"https://github.com/zealdocs/zeal/releases/download/v0.7.0/zeal-0.7.0.tar.xz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt6-base\",\n    \"qt6-webengine\",\n    \"libarchive\",\n    \"sqlite3\",\n    \"mesa\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/other/zepter/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/ggwpez/zepter\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/patchers/hexpatch/recipe.toml",
    "content": "#TODO mlua-sys crate error\n[source]\ngit = \"https://github.com/Etto48/HexPatch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/perf/flamelens/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/YS-L/flamelens\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/perf/samply/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mstange/samply\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages samply\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/perf/tracy/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/wolfpld/tracy/releases/latest/download/tracy.pdf\n[source]\ngit = \"https://github.com/wolfpld/tracy\"\nrev = \"v0.13.0\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"glfw3\",\n    \"freetype2\",\n    \"dbus\",\n    \"capstone\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/perf/vkpeak/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/nihui/vkpeak#build-from-source\n[source]\ngit = \"https://github.com/nihui/vkpeak\"\nrev = \"20251010\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libvulkan\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/proofs/cvc5/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO run configure.sh or cmake directly?\n# build instructions: https://github.com/cvc5/cvc5/blob/main/INSTALL.rst\n[source]\ngit = \"https://github.com/cvc5/cvc5\"\nrev = \"cvc5-1.3.2\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_AUTO_DOWNLOAD=ON\",\n]\ndependencies = [\n    \"libgmp\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/proofs/eldarica/recipe.toml",
    "content": "#TODO missing script for sbt\n# build instructions: https://github.com/uuverifiers/eldarica#documentation\n[source]\ngit = \"https://github.com/uuverifiers/eldarica\"\nrev = \"v2.2.1\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/proofs/z3/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Z3Prover/z3/blob/master/README-CMake.md\n[source]\ngit = \"https://github.com/Z3Prover/z3\"\nrev = \"z3-4.15.4\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/dev/python/py-spy/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/benfred/py-spy\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/python/pyapp/recipe.toml",
    "content": "#TODO serde crate error\n[source]\ngit = \"https://github.com/ofek/pyapp\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/python/pylyzer/recipe.toml",
    "content": "#TODO erg_compiler crate error\n[source]\ngit = \"https://github.com/mtshiba/pylyzer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/python/pyrev/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/hacbit/pyrev\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/python/pyscan/recipe.toml",
    "content": "#TODO serde crate error (after cargo update)\n[source]\ngit = \"https://github.com/aswinnnn/pyscan\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/python/python-launcher/recipe.toml",
    "content": "#TODO serde crate error (after cargo update)\n[source]\ngit = \"https://github.com/brettcannon/python-launcher\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/python/ruff/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/astral-sh/ruff\"\nrev = \"93a16bd05fba249439848beb6fbcbf3e8a436f03\"\nshallow_clone = true\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"ruff\"\n]\n"
  },
  {
    "path": "recipes/wip/dev/python/ruff/redox.patch",
    "content": "diff --git a/Cargo.lock b/Cargo.lock\nindex 2fe49f0b..aa1a7c85 100644\n--- a/Cargo.lock\n+++ b/Cargo.lock\n@@ -573,14 +573,13 @@ checksum = \"3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831\"\n [[package]]\n name = \"clearscreen\"\n version = \"4.0.5\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"5def4343d62f01f67ff1a49147e4a15112e936c6a6a3f8ff7a29394e76468244\"\n+source = \"git+https://github.com/willnode/clearscreen?branch=redox#f4c6937931b51daaf5ed15e60ecfde5c55e40c18\"\n dependencies = [\n  \"nix 0.31.1\",\n  \"terminfo\",\n  \"thiserror 2.0.18\",\n  \"which\",\n- \"windows-sys 0.60.2\",\n+ \"windows-sys 0.61.0\",\n ]\n \n [[package]]\n@@ -710,7 +709,7 @@ version = \"3.1.1\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34\"\n dependencies = [\n- \"windows-sys 0.59.0\",\n+ \"windows-sys 0.52.0\",\n ]\n \n [[package]]\n@@ -1077,7 +1076,7 @@ dependencies = [\n  \"libc\",\n  \"option-ext\",\n  \"redox_users\",\n- \"windows-sys 0.60.2\",\n+ \"windows-sys 0.61.0\",\n ]\n \n [[package]]\n@@ -1169,7 +1168,7 @@ source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb\"\n dependencies = [\n  \"libc\",\n- \"windows-sys 0.59.0\",\n+ \"windows-sys 0.52.0\",\n ]\n \n [[package]]\n@@ -1835,7 +1834,7 @@ dependencies = [\n  \"portable-atomic\",\n  \"portable-atomic-util\",\n  \"serde_core\",\n- \"windows-sys 0.59.0\",\n+ \"windows-sys 0.52.0\",\n ]\n \n [[package]]\n@@ -3731,7 +3730,7 @@ dependencies = [\n  \"errno\",\n  \"libc\",\n  \"linux-raw-sys\",\n- \"windows-sys 0.59.0\",\n+ \"windows-sys 0.52.0\",\n ]\n \n [[package]]\n@@ -4139,7 +4138,7 @@ dependencies = [\n  \"getrandom 0.4.1\",\n  \"once_cell\",\n  \"rustix\",\n- \"windows-sys 0.59.0\",\n+ \"windows-sys 0.52.0\",\n ]\n \n [[package]]\n@@ -5344,7 +5343,7 @@ version = \"0.1.11\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n checksum = \"c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22\"\n dependencies = [\n- \"windows-sys 0.59.0\",\n+ \"windows-sys 0.52.0\",\n ]\n \n [[package]]\ndiff --git a/Cargo.toml b/Cargo.toml\nindex 5bedb191..ff6aa34a 100644\n--- a/Cargo.toml\n+++ b/Cargo.toml\n@@ -73,7 +73,7 @@ cachedir = { version = \"0.3.1\" }\n camino = { version = \"1.1.7\" }\n clap = { version = \"4.5.3\", features = [\"derive\"] }\n clap_complete_command = { version = \"0.6.0\" }\n-clearscreen = { version = \"4.0.0\" }\n+clearscreen = { git = \"https://github.com/willnode/clearscreen\", branch = \"redox\" }\n codspeed-criterion-compat = { version = \"4.0.4\", default-features = false }\n colored = { version = \"3.0.0\" }\n compact_str = \"0.9.0\"\n@@ -282,8 +282,7 @@ if_not_else = \"allow\"\n large_stack_arrays = \"allow\"\n \n [profile.release]\n-lto = \"fat\"\n-codegen-units = 16\n+lto = \"thin\"\n \n # Some crates don't change as much but benefit more from\n # more expensive optimization passes, so we selectively\ndiff --git a/crates/ruff/Cargo.toml b/crates/ruff/Cargo.toml\nindex b972d4b0..4172e1bd 100644\n--- a/crates/ruff/Cargo.toml\n+++ b/crates/ruff/Cargo.toml\n@@ -70,7 +70,7 @@ tracing = { workspace = true, features = [\"log\"] }\n walkdir = { workspace = true }\n wild = { workspace = true }\n \n-[target.'cfg(all(not(target_os = \"windows\"), not(target_os = \"openbsd\"), not(target_os = \"aix\"), not(target_os = \"android\"), any(target_arch = \"x86_64\", target_arch = \"aarch64\", target_arch = \"powerpc64\", target_arch = \"riscv64\")))'.dependencies]\n+[target.'cfg(all(not(target_os = \"windows\"), not(target_os = \"openbsd\"), not(target_os = \"aix\"), not(target_os = \"android\"), not(target_os = \"redox\"), any(target_arch = \"x86_64\", target_arch = \"aarch64\", target_arch = \"powerpc64\", target_arch = \"riscv64\")))'.dependencies]\n tikv-jemallocator = { workspace = true }\n \n [target.'cfg(target_os = \"windows\")'.dependencies]\ndiff --git a/crates/ruff/src/main.rs b/crates/ruff/src/main.rs\nindex 4342a360..19211e58 100644\n--- a/crates/ruff/src/main.rs\n+++ b/crates/ruff/src/main.rs\n@@ -17,6 +17,7 @@ static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;\n     not(target_os = \"openbsd\"),\n     not(target_os = \"aix\"),\n     not(target_os = \"android\"),\n+    not(target_os = \"redox\"),\n     any(\n         target_arch = \"x86_64\",\n         target_arch = \"aarch64\",\ndiff --git a/rust-toolchain.toml b/rust-toolchain.toml\ndeleted file mode 100644\nindex 79d20990..00000000\n--- a/rust-toolchain.toml\n+++ /dev/null\n@@ -1,2 +0,0 @@\n-[toolchain]\n-channel = \"1.93\"\n"
  },
  {
    "path": "recipes/wip/dev/python/uv/recipe.toml",
    "content": "#TODO nix and rustix crate error\n[source]\ngit = \"https://github.com/astral-sh/uv\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\ncargopackages = [\n    \"uv\"\n]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/bacon/recipe.toml",
    "content": "#TODO camino crate compilation error\n[source]\ngit = \"https://github.com/Canop/bacon\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\""
  },
  {
    "path": "recipes/wip/dev/rust-tools/c2rust/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/immunant/c2rust\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"c2rust\"]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/cbindgen/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/mozilla/cbindgen\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/clippy/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/rust-lang/rust-clippy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/coq-of-rust/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO require the rust-src rustc-dev llvm-tools-preview components\n[source]\ngit = \"https://github.com/formal-land/coq-of-rust\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"coq_of_rust_cli\",\n    \"coq_of_rust_lib\",\n]\n[package]\ndependencies = [\n    \"rust\",\n    \"llvm21-common\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/crater/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/rust-lang/crater\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/diplomat/recipe.toml",
    "content": "#TODO missing script to properly move the binary\n[source]\ngit = \"https://github.com/rust-diplomat/diplomat\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"diplomat\"]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/dylint/recipe.toml",
    "content": "#TODO cargo-util crate error\n[source]\ngit = \"https://github.com/trailofbits/dylint\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"cargo-dylint\",\n    \"dylint-link\",\n]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/evcxr-jupyter/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/evcxr/evcxr\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"evcxr_jupyter\"]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/evcxr-repl/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/evcxr/evcxr\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"evcxr_repl\"]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/ferrisup/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Jitpomi/ferrisup\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/kani/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/model-checking/kani\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/miri/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rust-lang/miri\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/rust-script/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/fornwall/rust-script\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/rust-to-npm/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/a11ywatch/rust-to-npm\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"rust-to-npm-cli\"]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/rustfmt/recipe.toml",
    "content": "#TODO serde crate error (after cargo update)\n[source]\ngit = \"https://github.com/rust-lang/rustfmt\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/rustup/recipe.toml",
    "content": "#TODO serde crate error\n[source]\ngit = \"https://github.com/rust-lang/rustup\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/sccache/recipe.toml",
    "content": "#TODO libc error\n[source]\ngit = \"https://github.com/mozilla/sccache\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/scriptisto/recipe.toml",
    "content": "#TODO users crate error\n[source]\ngit = \"https://github.com/igor-petruk/scriptisto\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/rust-tools/tagref/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/stepchowfun/tagref\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/training/gittype/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/unhappychoice/gittype\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/vcs/mercurial/recipe.toml",
    "content": "#TODO missing script for GNU Make, see https://wiki.mercurial-scm.org/UnixInstall\n#TODO require CPython header files\n[source]\ntar = \"https://www.mercurial-scm.org/release/mercurial-6.6.2.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/dev/wasm/binaryen/recipe.toml",
    "content": "#TODO compiled but not tested\n# build instructions: https://github.com/WebAssembly/binaryen#building\n[source]\ngit = \"https://github.com/WebAssembly/binaryen\"\nrev = \"version_125\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_TESTS=OFF\",\n    \"-DBYN_ENABLE_ASSERTIONS=OFF\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/wasm/trunk/recipe.toml",
    "content": "#TODO fs_at and libc crates error\n[source]\ngit = \"https://github.com/trunk-rs/trunk\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/wasm/wabt/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/WebAssembly/wabt#building-using-cmake-directly-linux-and-macos\n[source]\ntar = \"https://github.com/WebAssembly/wabt/releases/download/1.0.39/wabt-1.0.39.tar.xz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_TESTS=OFF\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/wasm/wasm-pack/recipe.toml",
    "content": "#TODO fs4 crate error\n[source]\ngit = \"https://github.com/rustwasm/wasm-pack\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/wasm/wasm-tools/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/bytecodealliance/wasm-tools\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/wasm/wasmer/recipe.toml",
    "content": "#TODO region crate error\n[source]\ngit = \"https://github.com/wasmerio/wasmer\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages wasmer-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/wasm/wasmi/recipe.toml",
    "content": "#TODO fs-set-times and rustix crates error\n[source]\ngit = \"https://github.com/wasmi-labs/wasmi\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages wasmi_cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/dev/wasm/wasminspect/recipe.toml",
    "content": "#TODO outdated redox_syscall crate\n[source]\ngit = \"https://github.com/kateinoigakukun/wasminspect\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/wasm/wasmtime/recipe.toml",
    "content": "#TODO requires *at functions in fcntl.h\n#TODO (willnode) push changes upstream\n[source]\ngit = \"https://github.com/willnode/wasmtime\"\nbranch = \"v36-redox\"\nshallow_clone = true\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/wasm/wepl/recipe.toml",
    "content": "#TODO fs-set-times crate error\n[source]\ngit = \"https://github.com/rylev/wepl\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/web/emscripten/recipe.toml",
    "content": "#TODO missing script for building: https://emscripten.org/docs/building_from_source/index.html\n[source]\ngit = \"https://github.com/emscripten-core/emscripten\"\nrev = \"5.0.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndev-dependencies = [\n    \"host:nodejs24\",\n]\n[package]\ndependencies = [\n    \"llvm21-common\",\n    \"binaryen\",\n]\n"
  },
  {
    "path": "recipes/wip/dev/web/vox/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/emmyoh/vox\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/web/zola/recipe.toml",
    "content": "#TODO compiled but not tested yet\n[source]\ngit = \"https://github.com/getzola/zola\"\nshallow_clone = true\nrev = \"33f03bb11158464e3ff877cdc5f1c55bbe7337ac\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/dev/web/zola/redox.patch",
    "content": "diff --git a/Cargo.lock b/Cargo.lock\nindex 25c8de7..23e44f4 100644\n--- a/Cargo.lock\n+++ b/Cargo.lock\n@@ -411,15 +411,6 @@ dependencies = [\n  \"generic-array\",\n ]\n \n-[[package]]\n-name = \"block2\"\n-version = \"0.6.2\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5\"\n-dependencies = [\n- \"objc2\",\n-]\n-\n [[package]]\n name = \"bstr\"\n version = \"1.12.1\"\n@@ -986,13 +977,12 @@ dependencies = [\n \n [[package]]\n name = \"ctrlc\"\n-version = \"3.5.1\"\n+version = \"3.4.7\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790\"\n+checksum = \"46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73\"\n dependencies = [\n- \"dispatch2\",\n  \"nix\",\n- \"windows-sys 0.61.2\",\n+ \"windows-sys 0.59.0\",\n ]\n \n [[package]]\n@@ -1048,18 +1038,6 @@ dependencies = [\n  \"crypto-common\",\n ]\n \n-[[package]]\n-name = \"dispatch2\"\n-version = \"0.3.0\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec\"\n-dependencies = [\n- \"bitflags 2.10.0\",\n- \"block2\",\n- \"libc\",\n- \"objc2\",\n-]\n-\n [[package]]\n name = \"displaydoc\"\n version = \"0.2.5\"\n@@ -3046,21 +3024,6 @@ dependencies = [\n  \"libc\",\n ]\n \n-[[package]]\n-name = \"objc2\"\n-version = \"0.6.3\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05\"\n-dependencies = [\n- \"objc2-encode\",\n-]\n-\n-[[package]]\n-name = \"objc2-encode\"\n-version = \"4.1.0\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33\"\n-\n [[package]]\n name = \"once_cell\"\n version = \"1.21.3\"\ndiff --git a/Cargo.toml b/Cargo.toml\nindex a08be28..a9df3da 100644\n--- a/Cargo.toml\n+++ b/Cargo.toml\n@@ -29,7 +29,7 @@ clap_complete = \"4\"\n axum = { version = \"0.8\", default-features = false, features = [\"http1\", \"tokio\", \"ws\"] }\n tokio = { version = \"1.0.1\", default-features = false, features = [\"rt\", \"fs\", \"time\", \"net\", \"sync\"] }\n notify-debouncer-full = \"0.6\"\n-ctrlc = \"3\"\n+ctrlc = \"=3.4.7\"\n open = \"5\"\n # For mimetype detection in serve mode\n mime_guess = \"2.0\"\n"
  },
  {
    "path": "recipes/wip/doc/bookokrat/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bugzmanov/bookokrat\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/doc/brief/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n[source]\ngit = \"https://github.com/shonebinu/Brief\"\nrev = \"v0.3.0\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/doc/doctave/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/Doctave/doctave\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/doc/gnome-doc-utils/recipe.toml",
    "content": "#TODO probably wrong template\n[source]\ntar = \"https://download.gnome.org/sources/gnome-doc-utils/0.20/gnome-doc-utils-0.20.10.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/doc/gtk-doc/recipe.toml",
    "content": "#TODO compiling, not tested\n[source]\ntar = \"https://download.gnome.org/sources/gtk-doc/1.33/gtk-doc-1.33.2.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=false\",\n    \"-Dyelp_manual=false\",\n]\ndev-dependencies = [\n    \"host:libxslt\",\n]\n"
  },
  {
    "path": "recipes/wip/doc/mdbook/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/rust-lang/mdBook\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/doc/newdoc/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/redhat-documentation/newdoc\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/doc/po4a/recipe.toml",
    "content": "#TODO missing script for installation, see https://github.com/mquinson/po4a#installation\n[source]\ntar = \"https://github.com/mquinson/po4a/releases/download/v0.69/po4a-0.69.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/doc/tendril-wiki/recipe.toml",
    "content": "#TODO require a patch to update the ring crate\n[source]\ngit = \"https://github.com/jamestthompson3/tendril-wiki\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages tendril@1.0.10\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/doc/texinfo/recipe.toml",
    "content": "#TODO Compilation error\n[source]\ntar = \"https://ftp.gnu.org/gnu/texinfo/texinfo-7.0.3.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/edu/bibiman/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/lukeflo/bibiman\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/edu/hacker-laws/recipe.toml",
    "content": "#TODO not tested\n[source]\ngit = \"https://github.com/dwmkerr/hacker-laws\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/hacker-laws\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/share/hacker-laws\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/edu/nanocore/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/AfaanBilal/NanoCore\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/nanocore\"\ncp -rv \"${COOKBOOK_SOURCE}\"/programs/* \"${COOKBOOK_STAGE}/usr/share/nanocore\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/edu/rustlings/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/rust-lang/rustlings\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/edu/rusty-tape/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Kkobarii/Rusty-Tape\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/rusty-tape\ncp -rv \"${COOKBOOK_SOURCE}\"/data/* \"${COOKBOOK_STAGE}\"/usr/share/rusty-tape\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/emu/cpu/6502-emulator/recipe.toml",
    "content": "#TODO ahash crate error (probably outdated)\n[source]\ngit = \"https://github.com/ArchUsr64/6502_emulator\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/emu/cpu/8086-emulator/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/YJDoc2/8086-Emulator\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/emu/cpu/mipsy/recipe.toml",
    "content": "#TODO users crate error\n[source]\ngit = \"https://github.com/insou22/mipsy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"mipsy\"]\n"
  },
  {
    "path": "recipes/wip/emu/cpu/rustzx/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/rustzx/rustzx\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"rustzx\"]\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/cpu/rvemu/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/d0iasm/rvemu\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"rvemu-cli\"]\n"
  },
  {
    "path": "recipes/wip/emu/cpu/scemu/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/sha0coder/scemu\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/emu/cpu/unicorn/recipe.toml",
    "content": "#TODO not compiled or tested \n# build instructions: https://github.com/unicorn-engine/unicorn/blob/master/docs/COMPILE.md\n[source]\ngit = \"https://github.com/unicorn-engine/unicorn\"\nrev = \"2.1.4\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DUNICORN_BUILD_TESTS=OFF\"\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/azahar/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n# build instructions - https://github.com/azahar-emu/azahar/wiki/Building-From-Source#linux\n[source]\ngit = \"https://github.com/azahar-emu/azahar\"\nrev = \"2123.3\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DUSE_SYSTEM_SDL2=ON\",\n    \"-DENABLE_QT=OFF\",\n    \"-DENABLE_TESTS=OFF\",\n    \"-DENABLE_WEB_SERVICE=OFF\",\n    \"-DENABLE_SCRIPTING=OFF\",\n    \"-DENABLE_LIBUSB=OFF\",\n    \"-DENABLE_VULKAN=OFF\",\n    \"-DCITRA_USE_PRECOMPILED_HEADERS=OFF\" # can be used?\n]\ndependencies = [\n    \"sdl2\",\n    #\"qt6-base\",\n    #\"qt6-multimedia\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/clementine/recipe.toml",
    "content": "#TODO the webbrowser crate needs to be ported\n[source]\ngit = \"https://github.com/RIP-Comm/clementine\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/emu/game-console/dolphin-emu/recipe.toml",
    "content": "#TODO not compiled or tested yet\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://github.com/dolphin-emu/dolphin/wiki/Building-for-Linux\n[source]\ngit = \"https://github.com/dolphin-emu/dolphin\"\nrev = \"71e15c2875f36458c8f29ee160f01606967bcd13\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_LTO=ON\",\n    \"-DUSE_UPNP=OFF\",\n    \"-DENABLE_ALSA=OFF\",\n    \"-DENABLE_PULSEAUDIO=OFF\",\n    \"-DENABLE_CUBEB=OFF\",\n    \"-DENABLE_TESTS=OFF\",\n    \"-DENABLE_VULKAN=OFF\",\n    \"-DUSE_DISCORD_PRESENCE=OFF\",\n    \"-DUSE_MGBA=OFF\",\n    \"-DENABLE_AUTOUPDATE=OFF\",\n    \"-DUSE_RETRO_ACHIEVEMENTS=OFF\",\n    \"=DENABLE_ANALYTICS=OFF\",\n    \"-DENCODE_FRAMEDUMPS=OFF\",\n    \"-DENABLE_LLVM=OFF\",\n    \"-DENABLE_QT=OFF\",\n]\n#dependencies = [\n    #\"ffmpeg6\",\n    #\"libevdev\",\n    #\"libusb\",\n    #\"pango\",\n    #\"cairo\",\n    #\"qt6-base\",\n    #\"qt6-svg\",\n    #\"mesa-x11\",\n    #\"curl\",\n    #\"libvulkan\",\n    #\"openal\",\n#]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/finalburn-neo/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/finalburnneo/FBNeo/blob/master/README-SDL.md#sdl2\n[source]\ngit = \"https://github.com/finalburnneo/FBNeo\"\nrev = \"a50ddd24dcd7bed4b625eeea9b25631072bbfe80\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-image\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/gameboy/boytacean/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/joamag/boytacean\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/gameboy/gameroy/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Rodrigodd/gameroy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"gameroy-native\"]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/gameboy/mimic/recipe.toml",
    "content": "#TODO update mio to 0.8\n[source]\ngit = \"https://github.com/jawline/Mimic\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/emu/game-console/gopher64/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/gopher64/gopher64\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/jgenesis/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/jsgroth/jgenesis\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"jgenesis-cli\"]\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/mame/recipe.toml",
    "content": "#TODO missing script for gnu make: https://docs.mamedev.org/initialsetup/compilingmame.html\n[source]\ngit = \"https://github.com/mamedev/mame\"\nrev = \"mame0282\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-ttf\",\n    \"fontconfig\",\n    \"qt5-base\",\n    \"qt5-tools\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/melonds/recipe.toml",
    "content": "#TODO not compiled or tested yet\n# build instructions: https://github.com/melonDS-emu/melonDS/blob/master/BUILD.md#linux\n[source]\ngit = \"https://github.com/melonDS-emu/melonDS\"\nrev = \"1.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_QT_SDL=OFF\"\n]\ndependencies = [\n    \"curl\",\n    \"libpcap\",\n    \"libenet\",\n    \"sdl2\",\n    #\"qt6-base\",\n    #\"qt6-multimedia\",\n    #\"qt6-svg\",\n    \"libarchive\",\n    \"zstd\",\n    \"faad2\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/meru/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/tanakh/meru\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"meru\"]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/mupen64plus/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/mupen64plus/mupen64plus-core/releases/download/2.6.0/mupen64plus-bundle-src-2.6.0.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"freetype2\",\n    \"liborbital\",\n    \"libpng\",\n    \"mesa\",\n    \"mesa-glu\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n#TODO: support Redox in UNAME\n\"${COOKBOOK_MAKE}\" \\\n    CROSS_COMPILE=\"${TARGET}-\" \\\n    GLES_LIB=\"\" \\\n    GL_CFLAGS=\"$(\"${TARGET}-pkg-config\" --cflags osmesa)\" \\\n    GL_LDLIBS=\"$(\"${TARGET}-pkg-config\" --libs osmesa)\" \\\n    HOST_CPU=\"${TARGET%%-*}\" \\\n    SDL_CFLAGS=\"$(\"${TARGET}-pkg-config\" --cflags sdl2)\" \\\n    SDL_LDFLAGS=\"$(\"${TARGET}-pkg-config\" --libs sdl2)\" \\\n    UNAME=Linux \\\n    USE_GLES=1 \\\n    V=1 \\\n    VULKAN=0 \\\n    -C projects/unix \\\n    -j \"${COOKBOOK_MAKE_JOBS}\" \\\n    all\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/emu/game-console/obliteration/recipe.toml",
    "content": "#TODO missing script: https://github.com/obhq/obliteration/blob/main/docs/building.md\n[source]\ngit = \"https://github.com/obhq/obliteration\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/emu/game-console/pcsx2/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO need to be built with clang for best performance\n# build instructions: https://pcsx2.net/docs/advanced/building#building-on-linux\n[source]\ngit = \"https://github.com/PCSX2/pcsx2\"\nbranch = \"2.4.x\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DCMAKE_CXX_COMPILER_LAUNCHER=ccache\",\n    \"-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON\",\n    \"-DENABLE_TESTS=OFF\",\n    \"-DLTO_PCSX2_CORE=ON\",\n    \"-DPACKAGE_MODE=ON\",\n    \"-DUSE_VULKAN=OFF\",\n    \"-DWAYLAND_API=OFF\",\n    \"-DUSE_BACKTRACE=OFF\",\n]\n# dependencies = [\n#     \"sdl2\",\n#     \"xz\",\n#     \"libpng\",\n#     \"qt6-base\",\n#     \"qt6-svg\",\n#     \"mesa-x11\",\n#     \"libaio\",\n#     \"harfbuzz\",\n#     \"libpcap\",\n#     \"pipewire\",\n#     \"libsamplerate\",\n#     \"soundtouch\",\n#     \"zlib\",\n#     \"libxml2\",\n#     \"ffmpeg6\",\n# ]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/picodrive/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover the minimum dependencies from autotools log\n[source]\ngit = \"https://github.com/notaz/picodrive\"\nrev = \"26ecb2b6358fefba24e3d68b9eb2efba7f10d5ee\"\nshallow_clone = true\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--platform=generic\",\n    \"--sound-drivers=sdl\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/play/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/jpd002/Play-#building-for-unix\n[source]\ngit = \"https://github.com/jpd002/Play-\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_TESTS=OFF\"\n]\ndependencies = [\n    \"openal\",\n    \"libevdev\",\n    \"freealut\",\n    \"qt5-base\",\n    \"qt5-x11extras\",\n    \"sqlite3\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/ppsspp/recipe.toml",
    "content": "#TODO not compiled or tested yet\n# build instructions: https://github.com/hrydgard/ppsspp/wiki/Build-instructions\n#git = \"https://github.com/jackpot51/ppsspp\" # wip orbital port\n[source]\ntar = \"https://github.com/hrydgard/ppsspp/releases/download/v1.19.3/ppsspp-1.19.3.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    #\"liborbital\",\n    \"mesa\",\n    \"mesa-glu\",\n    \"sdl2\",\n    \"sdl2-ttf\",\n    \"zlib\",\n    \"glew\",\n    \"fontconfig\",\n    \"curl\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DCMAKE_C_FLAGS=\"-I${COOKBOOK_SYSROOT}/include\" -I${COOKBOOK_SYSROOT}/include/SDL2\"\n    -DCMAKE_CXX_FLAGS=\"-I${COOKBOOK_SYSROOT}/include\" -I${COOKBOOK_SYSROOT}/include/SDL2\"\n    -DOPENGL_opengl_LIBRARY=\"/dev/null\"\n    -DOPENGL_glx_LIBRARY=\"/dev/null\"\n    -DUSE_DISCORD=OFF\n    -DUSE_FFMPEG=OFF\n    -DUSE_MINIUPNPC=OFF\n    -DUSE_SYSTEM_LIBSDL2=ON\n    -DUSING_EGL=OFF\n    -DUSING_FBDEV=OFF\n    -DUSING_GLES2=OFF\n    -DUSING_X11_VULKAN=OFF\n    -DUNIX=ON\n)\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/emu/game-console/ps1/duckstation/recipe.toml",
    "content": "#TODO not compiled or tested yet\n#TODO determine minimum dependencies from cmake log\n# build instructions: https://github.com/stenzek/duckstation#linux-1\n[source]\ngit = \"https://github.com/stenzek/duckstation\"\nrev = \"16e56d7824e15657be26e30030394d0668493635\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_OPENGL=OFF\",\n    \"-DENABLE_VULKAN=OFF\",\n    \"-DENABLE_WAYLAND=OFF\",\n    \"-DBUILD_QT_FRONTEND=OFF\",\n    \"-DBUILD_MINI_FRONTEND=ON\",\n]\n#dependencies = [\n    #\"sdl2\",\n    #\"qt6-base\",\n    #\"qt6-svg\",\n    #\"qt6-tools\",\n#]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/ps1/pcsx-rearmed/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover the minimum dependencies from autotools log\n# build instructions: https://github.com/notaz/pcsx_rearmed/blob/master/readme.txt#L22\n[source]\ngit = \"https://github.com/notaz/pcsx_rearmed\"\nrev = \"r25\"\nshallow_clone = true\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/emu/game-console/ps1/rpsx/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/KieronJ/rpsx\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/ps1/trapezoid/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Amjad50/Trapezoid\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"shaderc\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/rpcs3/recipe.toml",
    "content": "#TODO not compiled or tested yet\n#TODO determine minimum dependencies from cmake log\n# build instructions: https://github.com/RPCS3/rpcs3/blob/master/BUILDING.md\n# customization: https://wiki.rpcs3.net/index.php?title=Help:Building_RPCS3#CMake_Build_Options\n[source]\ngit = \"https://github.com/RPCS3/rpcs3\"\nrev = \"db8437b01cf24ba1146cf7d22e1be02202cc98f4\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DUSE_NATIVE_INSTRUCTIONS=OFF\",\n    \"-DWITH_LLVM=OFF\",\n    \"-DUSE_ALSA=OFF\",\n    \"-DUSE_PULSE=OFF\",\n    \"-DUSE_LIBEVDEV=OFF\",\n    \"-DBUILD_LLVM_SUBMODULE=OFF\",\n    \"-DUSE_SYSTEM_FFMPEG=ON\",\n    \"-DUSE_VULKAN=OFF\",\n    \"-DUSE_FAUDIO=OFF\",\n    \"-DUSE_SYSTEM_OPENAL=ON\",\n    \"-DUSE_SYSTEM_ZSTD=ON\",\n]\ndependencies = [\n    #\"mesa-x11\",\n    \"qt6-base\",\n    \"qt6-multimedia\",\n    \"qt6-svg\",\n    \"qt6-declarative\",\n    \"curl\",\n    \"opencv4\",\n    \"sdl3\",\n    #\"eudev\",\n    #\"glew\",\n    \"openal\",\n    \"zlib\",\n    \"zstd\",\n    #\"libpng\",\n    #\"libevdev\",\n    #\"libedit\",\n    #\"libvulkan\",\n    #\"libpulse\",\n    #\"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/shadps4/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies\n# build instructions - https://github.com/shadps4-emu/shadPS4/blob/main/documents/building-linux.md\n[source]\ngit = \"https://github.com/shadps4-emu/shadPS4\"\n[build]\ntemplate = \"cmake\"\n#cmakeflags = [\n    #\"-DENABLE_QT_GUI=ON\"\n#]\ndependencies = [\n    \"libpulse\",\n    \"openal\",\n    \"openssl3\",\n    \"libedit\",\n    \"eudev\",\n    \"libevdev\",\n    \"sdl2\",\n    \"sndio\",\n    #\"qt6-base\",\n    #\"qt6-multimedia\",\n    \"libvulkan\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/snes9x/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/snes9xgit/snes9x/wiki/Compiling\n[source]\ngit = \"https://github.com/snes9xgit/snes9x\"\nrev = \"1.63\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n    \"gtk3mm\",\n    \"libx11\",\n    \"libxext\",\n    \"libxrandr\",\n]\nscript = \"\"\"\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/gtk\"\nDYNAMIC_INIT\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/emu/game-console/tetanes/recipe.toml",
    "content": "#TODO Not compiled or tested yet\n[source]\ngit = \"https://github.com/lukexor/tetanes\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-image\",\n    \"sdl2-mixer\",\n    \"sdl2-ttf\",\n    \"sdl2-gfx\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/uoyabause/recipe.toml",
    "content": "#TODO not compiled or tested yet\n# build instructions: https://github.com/devmiyax/yabause/blob/master/yabause/README.LIN#L77\n[source]\ngit = \"https://github.com/devmiyax/yabause\"\nrev = \"71c973f92966d33de464c1ba4dac1953af6ec462\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk2\",\n    \"sdl2\",\n    \"mesa\",\n    \"gtkglext\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/yabause\"\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/emu/game-console/vita3k/recipe.toml",
    "content": "#TODO not compiled or tested yet\n# build instructions: https://github.com/Vita3K/Vita3K/blob/master/building.md#linux\n[source]\ngit = \"https://github.com/Vita3K/Vita3K\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DUSE_VITA3K_UPDATE=OFF\"\n]\ndependencies = [\n    \"sdl2\",\n    \"gtk3\",\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/xemu/recipe.toml",
    "content": "#TODO adapt build.sh script for cross-compilation\n# build instructions: https://xemu.app/docs/dev/building-from-source/#linux\n[source]\ntar = \"https://github.com/xemu-project/xemu/releases/download/v0.8.115/src.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n    \"libepoxy\",\n    \"libsamplerate\",\n    \"pixman\",\n    \"gtk3\",\n    \"openssl3\",\n    \"libpcap\",\n    \"libslirp\",\n]\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\nDYNAMIC_INIT\n./build.sh\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/emu/game-console/xenia-canary/recipe.toml",
    "content": "#TODO missing script: https://github.com/xenia-canary/xenia-canary/blob/canary_experimental/docs/building.md#linux\n[source]\ngit = \"https://github.com/xenia-canary/xenia-canary\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk3\",\n    \"sdl2\",\n    \"mesa-x11\",\n    \"lz4\",\n    \"libunwind\",\n    \"libpthread-stubs\",\n    \"libvulkan\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/game-console/zsnes/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/xyproto/zsnes#build\n[source]\ngit = \"https://github.com/xyproto/zsnes\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1\",\n    \"zlib\",\n    \"mesa\",\n    \"libpng\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/mobile/touchhle/recipe.toml",
    "content": "#TODO make boost work\n[source]\ngit = \"https://github.com/hikari-no-yume/touchHLE\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"boost\"\n]\n"
  },
  {
    "path": "recipes/wip/emu/mobile/wie/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/dlunch/wie\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"wie_cli\"]\n"
  },
  {
    "path": "recipes/wip/emu/pc/darling/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://docs.darlinghq.org/build-instructions.html#building-and-installing\n[source]\ngit = \"https://github.com/darlinghq/darling\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DTARGET_i386=OFF\"\n]\ndependencies = [\n    \"libfuse3\",\n    \"libevdev\",\n    \"cairo\",\n    \"mesa\",\n    \"libtiff\",\n    \"freetype2\",\n    \"libxml2\",\n    \"fontconfig\",\n    \"libbsd\",\n    \"libgif\",\n    \"ffmpeg6\",\n    \"openssl3\",\n    \"libxkbfile\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/pc/martypc/recipe.toml",
    "content": "#TODO nix crate error\n# build instructions: https://github.com/dbalsom/martypc/wiki/Building-MartyPC#building-for-linux\n[source]\ngit = \"https://github.com/dbalsom/martypc\"\nshallow_clone = true\nrev = \"0.4.1\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n# there's a lot of git dependencies\nCOOKBOOK_CARGO_FLAGS=( -Zgit=shallow-index,shallow-deps )\n\n# clang specifics\nPREFIX_INCLUDE=\"$COOKBOOK_HOST_SYSROOT/$TARGET/include\"\nexport CLANGFLAGS=\"-I $PREFIX_INCLUDE/c++/13.2.0 -I $PREFIX_INCLUDE/c++/13.2.0/$TARGET -I $PREFIX_INCLUDE/c++/13.2.0/backward -I $PREFIX_INCLUDE\"\n\ncookbook_cargo_packages martypc_eframe \n\"\"\"\ncargopackages = [\"martypc_eframe\"]\n"
  },
  {
    "path": "recipes/wip/emu/pc/opengmk/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/OpenGMK/OpenGMK\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"gm8emulator\"]\ndependencies = [\n    \"libalsa\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/pc/ruffle/recipe.toml",
    "content": "#TODO need wayland support, then patch rfd crate\n#TODO port host:jre (try not to use jdk recipe)\n# build instructions: https://github.com/ruffle-rs/ruffle#building-from-source\n[source]\ngit = \"https://github.com/ruffle-rs/ruffle\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"ruffle_desktop\"]\ndependencies = [\n\t\"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/security/rust-u2f/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/danstiner/rust-u2f#building\n[source]\ngit = \"https://github.com/danstiner/rust-u2f\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/emu/win/boxedwine/recipe.toml",
    "content": "#TODO runtime crash\n[source]\ngit = \"https://github.com/jackpot51/Boxedwine\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"curl\",\n    \"liborbital\",\n    \"mesa\",\n    \"mesa-glu\",\n    \"nghttp2\",\n    \"openssl3\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncd \"${COOKBOOK_SOURCE}/project/linux\"\n#TODO: USE MAKEFILE\n#TODO: USE X64 CPU CORE\n${TARGET}-gcc -std=c++17 -O2 \\\n  -Wall \\\n  -Wno-delete-incomplete \\\n  -Wno-unused-result \\\n  -Wno-unknown-pragmas \\\n  -Wno-unused-local-typedefs \\\n  -Wno-unused-variable \\\n  -Wno-unused-function \\\n  -Wno-unused-but-set-variable \\\n  -I \"${COOKBOOK_SYSROOT}/include/SDL2\" \\\n  -I../../include \\\n  -I../../lib/glew/include \\\n  -I../../lib/imgui \\\n  ../../lib/imgui/imgui.cpp \\\n  ../../lib/pugixml/src/*.cpp \\\n  ../../lib/imgui/imgui_draw.cpp \\\n  ../../lib/imgui/imgui_widgets.cpp \\\n  ../../lib/imgui/examples/imgui_impl_opengl2.cpp \\\n  ../../lib/imgui/examples/imgui_impl_sdl.cpp \\\n  ../../lib/imgui/addon/imguitinyfiledialogs.cpp \\\n  ../../source/sdl/*.cpp \\\n  ../../source/sdl/singleThreaded/*.cpp \\\n  ../../lib/glew/src/glew.cpp \\\n  ../../source/ui/*.cpp \\\n  ../../source/ui/controls/*.cpp \\\n  ../../source/ui/data/*.cpp \\\n  ../../source/ui/opengl/*.cpp \\\n  ../../source/ui/utils/*.cpp \\\n  ../../platform/sdl/*.cpp \\\n  ../../platform/linux/*.cpp \\\n  ../../source/emulation/cpu/*.cpp \\\n  ../../source/emulation/cpu/common/*.cpp \\\n  ../../source/emulation/cpu/normal/*.cpp \\\n  ../../source/emulation/softmmu/*.cpp \\\n  ../../source/io/*.cpp \\\n  ../../source/kernel/*.cpp \\\n  ../../source/kernel/devs/*.cpp \\\n  ../../source/kernel/proc/*.cpp \\\n  ../../source/kernel/sys/*.cpp \\\n  ../../source/kernel/loader/*.cpp \\\n  ../../source/util/*.cpp \\\n  ../../source/opengl/sdl/*.cpp \\\n  ../../source/opengl/*.cpp \\\n  ../../lib/tiny-process/process.cpp \\\n  ../../lib/tiny-process/process_unix.cpp \\\n  ../../lib/zlib/contrib/minizip/ioapi.c \\\n  ../../lib/zlib/contrib/minizip/mztools.c \\\n  ../../lib/zlib/contrib/minizip/unzip.c \\\n  ../../lib/zlib/contrib/minizip/zip.c \\\n  `${PKG_CONFIG} libcurl --cflags --libs` \\\n  `${PKG_CONFIG} sdl2 --cflags --libs` \\\n  -lz \\\n  -lstdc++ \\\n  \"-DGLH=<SDL_opengl.h>\" \\\n  -DBOXEDWINE_64 \\\n  -DBOXEDWINE_HAS_SETJMP \\\n  -DBOXEDWINE_OPENGL_IMGUI_V2 \\\n  -DBOXEDWINE_OPENGL_SDL \\\n  -DBOXEDWINE_POSIX \\\n  -DBOXEDWINE_ZLIB \\\n  -DGLEW_OSMESA \\\n  -DSDL2=1 \\\n  -DSIMDE_SSE2_NO_NATIVE \\\n  -o \"${COOKBOOK_BUILD}/boxedwine\"\nmkdir -p \"${COOKBOOK_STAGE}/usr/bin\"\ncp -v \"${COOKBOOK_BUILD}/boxedwine\" \"${COOKBOOK_STAGE}/usr/bin/boxedwine\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/emu/win/hangover/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/AndreRH/hangover/blob/master/docs/COMPILE.md\n[source]\ngit = \"https://github.com/AndreRH/hangover\"\nrev = \"hangover-11.0\"\nshallow_clone = true\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"fontconfig\",\n    \"freetype2\",\n    \"gnutls3\",\n    \"gstreamer\",\n    \"sdl2\",\n    \"mesa-x11\",\n    \"libstdcxx\",\n    \"libx11\",\n    \"libxcomposite\",\n    \"libxcursor\",\n    \"libxi\",\n    \"libxfixes\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxext\",\n    \"libxkbcommon\",\n    #\"libxkbregistry\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nmkdir -p wine-tools\npushd wine-tools\n#TODO: easier way to build for host?\nHOST_ENV=(\n    env\n    --unset=AR\n    --unset=AS\n    --unset=CC\n    --unset=CFLAGS\n    --unset=CPPFLAGS\n    --unset=CXX\n    --unset=GNU_TARGET\n    --unset=LD\n    --unset=LDFLAGS\n    --unset=NM\n    --unset=OBJCOPY\n    --unset=OBJDUMP\n    --unset=PKG_CONFIG\n    --unset=PKG_CONFIG_ALLOW_CROSS\n    --unset=PKG_CONFIG_FOR_BUILD\n    --unset=PKG_CONFIG_LIBDIR\n    --unset=PKG_CONFIG_PATH\n    --unset=PKG_CONFIG_SYSROOT_DIR\n    --unset=PREFIX_RUSTFLAGS\n    --unset=RANLIB\n    --unset=READELF\n    --unset=STRIP\n    --unset=TARGET\n)\n\"${HOST_ENV[@]}\" \"${COOKBOOK_CONFIGURE}\" --enable-win64\n\"${HOST_ENV[@]}\" \"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\" __tooldeps__\npopd\n\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --enable-win64\n\t--enable-archs=x86_64,i386,arm\n\t--disable-kerberos\n\t--disable-tests\n\t--without-capi\n\t--without-coreaudio\n\t--without-dbus\n\t--without-gettext\n    --without-gettextpo\n\t--without-gphoto\n\t--without-gssapi\n\t--without-inotify\n\t--without-krb5\n\t--without-netapi\n\t--without-opencl\n\t--without-osmesa\n\t--without-pcap\n\t--without-pcsclite\n\t--with-pthread\n\t--without-pulse\n\t--without-sane\n\t--with-sdl\n\t--without-udev\n\t--without-unwind\n\t--without-usb\n\t--with-mingw\n    --with-wine-tools=wine-tools\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/emu/win/retrowin32/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/evmar/retrowin32\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"retrowin32\"]\ncargoflags = [\"--x86-emu --sdl\"]\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/emu/win/wine-stable/recipe.toml",
    "content": "#TODO port to redox\n#build instructions: https://gitlab.winehq.org/wine/wine/-/wikis/Building-Wine\n[source]\ngit = \"https://gitlab.winehq.org/wine/wine\"\nbranch = \"stable\"\nshallow_clone = true\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"fontconfig\",\n    \"freetype2\",\n    \"gnutls3\",\n    \"gstreamer\",\n    \"sdl2\",\n    \"mesa-x11\",\n    \"libstdcxx\",\n    \"libx11\",\n    \"libxcomposite\",\n    \"libxcursor\",\n    \"libxi\",\n    \"libxfixes\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxext\",\n    \"libxkbcommon\",\n    #\"libxkbregistry\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\nmkdir -p wine-tools\npushd wine-tools\n#TODO: easier way to build for host?\nHOST_ENV=(\n    env\n    --unset=AR\n    --unset=AS\n    --unset=CC\n    --unset=CFLAGS\n    --unset=CPPFLAGS\n    --unset=CXX\n    --unset=GNU_TARGET\n    --unset=LD\n    --unset=LDFLAGS\n    --unset=NM\n    --unset=OBJCOPY\n    --unset=OBJDUMP\n    --unset=PKG_CONFIG\n    --unset=PKG_CONFIG_ALLOW_CROSS\n    --unset=PKG_CONFIG_FOR_BUILD\n    --unset=PKG_CONFIG_LIBDIR\n    --unset=PKG_CONFIG_PATH\n    --unset=PKG_CONFIG_SYSROOT_DIR\n    --unset=PREFIX_RUSTFLAGS\n    --unset=RANLIB\n    --unset=READELF\n    --unset=STRIP\n    --unset=TARGET\n)\n\"${HOST_ENV[@]}\" \"${COOKBOOK_CONFIGURE}\" --enable-win64\n\"${HOST_ENV[@]}\" \"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\" __tooldeps__\npopd\n\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --enable-win64\n\t--disable-kerberos\n\t--disable-tests\n\t--without-capi\n\t--without-coreaudio\n\t--without-dbus\n\t--without-gettext\n    --without-gettextpo\n\t--without-gphoto\n\t--without-gssapi\n\t--without-inotify\n\t--without-krb5\n\t--without-netapi\n\t--without-opencl\n\t--without-osmesa\n\t--without-pcap\n\t--without-pcsclite\n\t--with-pthread\n\t--without-pulse\n\t--without-sane\n\t--with-sdl\n\t--without-udev\n\t--without-unwind\n\t--without-usb\n    --with-wine-tools=wine-tools\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/files/exi/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/Rynux/exi\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/files/lsv/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/SecretDeveloper/lsv\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/files/mc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/MidnightCommander/mc/blob/master/doc/INSTALL\n[source]\ntar = \"https://ftp.osuosl.org/pub/midnightcommander/mc-4.8.33.tar.xz\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--without-x\",\n    \"--without-gpm-mouse\",\n]\ndependencies = [\n    \"ncurses\",\n]\n"
  },
  {
    "path": "recipes/wip/files/unf/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/io12/unf\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/bitcoin/btc-vanity/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Emivvvvv/btc-vanity\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/bitcoin/btcpay-server/recipe.toml",
    "content": "#TODO missing script for building: https://github.com/btcpayserver/btcpayserver#how-to-build\n#TODO determine minimum dependencies\n# dependencies and docker container setup: https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml\n# configuration: https://docs.btcpayserver.org/Development/LocalDevelopment/\n[source]\ngit = \"https://github.com/btcpayserver/btcpayserver\"\nrev = \"v2.3.4\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndev-dependencies = [\n    \"host:dotnet8\",\n]\n"
  },
  {
    "path": "recipes/wip/finance/crypto/bitcoin/electrum/recipe.toml",
    "content": "# runtime dependencies - https://electrum.org/#download\n[source]\ntar = \"https://download.electrum.org/4.5.5/Electrum-4.5.5.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/electrum\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/share/electrum\necho \"#!/usr/bin/env sh \\n python3 /usr/share/electrum/run_electrum\" > \"${COOKBOOK_STAGE}\"/usr/bin/electrum\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/electrum\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/bitcoin/liana/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/wizardsardine/liana\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/bitcoin/nakamoto-wallet/recipe.toml",
    "content": "#TODO hidapi crate error - redox not supported (after cargo update)\n[source]\ngit = \"https://github.com/cloudhead/nakamoto\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages nakamoto-wallet\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/bitcoin/nakatoshi/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ndelvalle/nakatoshi\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/bitcoin/ord/recipe.toml",
    "content": "#TODO the ring crate needs to be updated\n[source]\ngit = \"https://github.com/ordinals/ord\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/finance/crypto/bitcoin/pushtx/recipe.toml",
    "content": "#TODO compiled but not tested\n#TODO add a command to properly move the executable\n[source]\ngit = \"https://github.com/alfred-hodler/pushtx\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages pushtx-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/bitcoin/rusty-blockparser/recipe.toml",
    "content": "#TODO fs2 crate error\n[source]\ngit = \"https://github.com/gcarq/rusty-blockparser\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/eth/lighthouse/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://lighthouse-book.sigmaprime.io/installation_source.html\n[source]\ngit = \"https://github.com/sigp/lighthouse\"\nbranch = \"stable\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages lighthouse\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/eth/reth/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://reth.rs/installation/source\n[source]\ngit = \"https://github.com/paradigmxyz/reth\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages reth\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/monero/gupax/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/hinto-janai/gupax\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/finance/crypto/monero/xmrig/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://xmrig.com/docs/miner/build/ubuntu\n# customization - https://xmrig.com/docs/miner/cmake-options\n[source]\ngit = \"https://github.com/xmrig/xmrig\"\nrev = \"8084ff37a5c8935c649a2e362da0fe570c79a2c2\"\n[build]\ntemplate = \"cmake\"\n#cmakeflags = [\n#    \"-DOPENSSL_ROOT_DIR=${COOKBOOK_SYSROOT}\" # test if the program need this\n#]\ndependencies = [\n    \"openssl1\",\n    \"libuv\",\n]\n"
  },
  {
    "path": "recipes/wip/finance/donation/cargo-fund/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/acfoltzer/cargo-fund\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/finance/market/apcacli/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/d-e-s-o/apcacli\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/finance/market/merkato/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/sheep-farm/merkato\"\nrev = \"0.2.0.1\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n]\n"
  },
  {
    "path": "recipes/wip/finance/market/tick-rs/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/tarkah/tickrs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/finance/mgmt/gnucash/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover the minimum dependencies from cmake log\n# build instructions: https://wiki.gnucash.org/wiki/Building_On_Linux\n# dependencies: https://wiki.gnucash.org/wiki/Dependencies\n[source]\ntar = \"https://sourceforge.net/projects/gnucash/files/gnucash%20(stable)/5.13/gnucash-5.13.tar.bz2\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/finance/mgmt/tackler-ng/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/e257-fi/tackler-ng\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/tackler-ng/examples\ncp -rv \"${COOKBOOK_SOURCE}\"/examples/* \"${COOKBOOK_STAGE}\"/usr/share/tackler-ng/examples\ncookbook_cargo_packages tackler\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/finance/rex/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/TheRustyPickle/Rex\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/fonts/fontfor/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/7sDream/fontfor\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/fonts/fontforge/recipe.toml",
    "content": "#TODO missing script for Ninja, see https://github.com/fontforge/fontforge/blob/master/INSTALL.md\n[source]\ntar = \"https://github.com/fontforge/fontforge/releases/download/20230101/fontforge-20230101.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libtiff\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libgif\",\n    \"libxml2\",\n    \"gtk3\",\n    \"freetype2\",\n    \"pango\",\n    \"cairo\",\n    \"libspiro\",\n]\n"
  },
  {
    "path": "recipes/wip/fonts/gerb/recipe.toml",
    "content": "#TODO make GTK3 work\n[source]\ngit = \"https://github.com/epilys/gerb\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/fonts/nerd-fonts/recipe.toml",
    "content": "#TODO not tested\n[source]\ngit = \"https://github.com/ryanoasis/nerd-fonts\"\nrev = \"v3.4.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/fonts/Nerd\ncp -rv \"${COOKBOOK_SOURCE}\"/patched-fonts/* \"${COOKBOOK_STAGE}\"/usr/share/fonts/Nerd\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/fonts/noto/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/notofonts/notofonts.github.io\"\nrev = \"noto-monthly-release-2026.02.01\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/fonts/Noto\nfor f in \"${COOKBOOK_SOURCE}\"/fonts/*; do \necho cp -rv \"${f}/full/ttf/* \"${COOKBOOK_STAGE}/usr/share/fonts/Noto/$(basename ${f})/\"\ndone\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/fonts/noto-sans-cjk/recipe.toml",
    "content": "[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_BUILD}\"/fonts \"${COOKBOOK_STAGE}/usr/share/fonts/Noto-Sans-CJK\"\nwget https://github.com/notofonts/noto-cjk/releases/download/Sans2.004/02_NotoSansCJK-TTF-VF.zip\nunzip \"${COOKBOOK_BUILD}\"/02_NotoSansCJK-TTF-VF.zip -d \"${COOKBOOK_BUILD}\"/fonts\ncp -rv \"${COOKBOOK_BUILD}\"/fonts/Variable/TTF/* \"${COOKBOOK_STAGE}/usr/share/fonts/Noto-Sans-CJK\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/fonts/noto-serif-cjk/recipe.toml",
    "content": "[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_BUILD}\"/fonts \"${COOKBOOK_STAGE}/usr/share/fonts/Noto-Serif-CJK\"\nwget https://github.com/notofonts/noto-cjk/releases/download/Serif2.003/03_NotoSerifCJK-TTF-VF.zip\nunzip \"${COOKBOOK_BUILD}\"/03_NotoSerifCJK-TTF-VF.zip -d \"${COOKBOOK_BUILD}\"/fonts\ncp -rv \"${COOKBOOK_BUILD}\"/fonts/Variable/TTF/* \"${COOKBOOK_STAGE}/usr/share/fonts/Noto-Serif-CJK\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/fonts/sitra/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n[source]\ngit = \"https://github.com/sitraorg/sitra\"\nrev = \"af4cfcca680653aba93c44a384c134093e124e7c\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/fuse/archivemount/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/cybernoid/archivemount\"\nrev = \"78c306538065de9b14f48cfc2024f50f843d3b29\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse2\",\n    \"libarchive\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/btfs/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO maybe incomplete configuration\n# build instructions - https://github.com/johang/btfs#building-from-git-on-a-recent-debianubuntu\n[source]\ngit = \"https://github.com/johang/btfs\"\nrev = \"2b372f4596df3ff97e3b39d58b144a7cbfff012a\"\nscript = \"autoreconf -i\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse3\",\n    \"libtorrent\",\n    \"curl\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/cryfs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/cryfs/cryfs#building-from-source\n[source]\ntar = \"https://github.com/cryfs/cryfs/releases/download/1.0.1/cryfs-1.0.1.tar.xz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/cvmfs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://cvmfs.readthedocs.io/en/stable/cpt-quickstart.html#building-from-source\n[source]\ntar = \"https://ecsft.cern.ch/dist/cvmfs/cvmfs-2.11.2/source.tar.gz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/dislocker/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Aorimn/dislocker/blob/master/INSTALL.md\n[source]\ngit = \"https://github.com/Aorimn/dislocker\"\nrev = \"8b2aea09d431bd5497ae223c141ebaee7bdd481f\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libfuse3\",\n    \"mbedtls\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/dwarfs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/mhx/dwarfs#building\n#TODO missing dependencies, see https://github.com/mhx/dwarfs#dependencies\n[source]\ntar = \"https://github.com/mhx/dwarfs/releases/download/v0.7.2/dwarfs-0.7.2.tar.xz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libfuse3\",\n    \"boost\",\n    \"libbrotli\",\n    \"libevent\",\n    \"openssl1\",\n    \"lz4\",\n    \"xz\",\n    \"libunwind\",\n    \"libfmt\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/e2fsprogs/recipe.toml",
    "content": "#TODO maybe wrong template\n# build instructions - https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git/tree/INSTALL\n[source]\ntar = \"http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.47.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/fuse/exfat-fuse/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/relan/exfat/releases/download/v1.4.0/fuse-exfat-1.4.0.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/ffmpegfs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/nschlia/ffmpegfs/blob/master/INSTALL.md#building-ffmpegfs-yourself\n[source]\ntar = \"https://github.com/nschlia/ffmpegfs/releases/download/v2.17/ffmpegfs-2.17.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse3\",\n    \"sqlite3\",\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/fuse-ext2/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies\n# build instructions: https://github.com/alperakcan/fuse-ext2#building\n[source]\ngit = \"https://github.com/alperakcan/fuse-ext2\"\nrev = \"ae35afb9ab08d87c66c1e021df792b3a7c4308b0\"\nscript = \"./autogen.sh\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse2\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/fuse-nfs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/sahlberg/fuse-nfs\"\nrev = \"75827244f1615be20da880cbc68665416131088d\"\nscript = \"./setup.sh\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse3\",\n    \"libnfs\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/fuse-zip/recipe.toml",
    "content": "#TODO missing script for gnu make: https://bitbucket.org/agalanin/fuse-zip/src/master/INSTALL\n[source]\ngit = \"https://bitbucket.org/agalanin/fuse-zip\"\nrev = \"0.7.2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse2\",\n    \"libzip\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/glusterfs/recipe.toml",
    "content": "#TODO make all dependencies work\n#TODO probably missing dependencies, see https://docs.gluster.org/en/latest/Developer-guide/Building-GlusterFS/#build-requirements\n# customization - https://docs.gluster.org/en/latest/Developer-guide/Building-GlusterFS/#configuring-for-building\n[source]\ntar = \"https://download.gluster.org/pub/gluster/glusterfs/9/LATEST/glusterfs-9.6.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"openssl1\",\n    \"libxml2\",\n    \"libaio\",\n    \"sqlite3\",\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/goofys/recipe.toml",
    "content": "#TODO missing script for Go, see https://github.com/kahing/goofys/#installation\n[source]\ngit = \"https://github.com/kahing/goofys\"\nrev = \"45b8d78375af1b24604439d2e60c567654bcdf88\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/fuse/hfsfuse/recipe.toml",
    "content": "#TODO missing script for gnu make, see https://github.com/0x09/hfsfuse#building\n[source]\ntar = \"https://github.com/0x09/hfsfuse/releases/download/0.242/hfsfuse-0.242.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/httpdirfs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/fangfufu/httpdirfs#compilation\n[source]\ngit = \"https://github.com/fangfufu/httpdirfs\"\nrev = \"d91bb2b2789be8a0f72c7baddac63ffb78299ad9\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"libfuse3\",\n    \"openssl1\",\n    \"curl\",\n    \"expat\",\n    \"libuuid\",\n    \"libgumbo\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/ifuse/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/libimobiledevice/ifuse/releases/download/1.1.4/ifuse-1.1.4.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse3\",\n    \"libplist\",\n    \"libimobiledevice\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/indexfs/recipe.toml",
    "content": "#TODO make libfuse work\n#TODO probably missing dependencies\n# build instructions - https://github.com/MajenkoProjects/indexfs/blob/master/INSTALL\n[source]\ngit = \"https://github.com/MajenkoProjects/indexfs\"\nscript = \"./autogen.sh\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/fuse/lazyfs/recipe.toml",
    "content": "#TODO missing script for compilation: https://github.com/dsrhaslab/lazyfs#installation\n[source]\ngit = \"https://github.com/dsrhaslab/lazyfs\"\nrev = \"0.3.0\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/lis/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/riffcc/lis\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/littlefs/recipe.toml",
    "content": "#TODO missing script for gnu make\n[source]\ngit = \"https://github.com/littlefs-project/littlefs-fuse\"\nrev = \"v2.7.14\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/loggedfs/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions: https://github.com/rflament/loggedfs#installation-from-source\n[source]\ngit = \"https://github.com/rflament/loggedfs\"\nrev = \"82aba9a93489797026ad1a37b637823ece4a7093\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n    \"pcre2\",\n    \"libxml2\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/mergerfs/recipe.toml",
    "content": "#TODO missing script for gnu make: https://trapexit.github.io/mergerfs/preview/setup/build/\n[source]\ntar = \"https://github.com/trapexit/mergerfs/releases/download/2.40.2/mergerfs-2.40.2.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/moosefs/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/moosefs/moosefs#source-code\n[source]\ngit = \"https://github.com/moosefs/moosefs\"\nrev = \"79bca600d6ddfecfcb29af2fc6632b4e3d00f1a5\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n    \"libpcap\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/mount-zip/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/google/mount-zip/blob/main/INSTALL.md\n[source]\ngit = \"https://github.com/google/mount-zip\"\nrev = \"v1.10\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n    \"libzip\",\n    \"libicu\",\n    \"boost\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/ntfs-3g/recipe.toml",
    "content": "#TODO port to redox\n[source]\ntar = \"https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2022.10.3.tgz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/fuse/oku-fs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/OkuBrowser/oku-fs\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n]\nscript = \"\"\"\ncookbook_cargo --features fuse cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/fuse/pifs/recipe.toml",
    "content": "#TODO make libfuse 2.x works\n#TODO probably wrong script, see https://github.com/philipl/pifs#readme\n[source]\ngit = \"https://github.com/philipl/pifs\"\nscript = \"./autogen.sh\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse2\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/rencfs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/radumarias/rencfs\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/s3fs/recipe.toml",
    "content": "#TODO make libfuse2 work\n# build instructions - https://github.com/s3fs-fuse/s3fs-fuse/blob/master/COMPILATION.md\n[source]\ngit = \"https://github.com/s3fs-fuse/s3fs-fuse\"\nrev = \"5371cd1468c84423729c334ac997f9621b797e9f\"\nscript = \"./autogen.sh\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse2\",\n    \"curl\",\n    \"libxml2\",\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/securefs/recipe.toml",
    "content": "#TODO missing script for vcpkg: https://github.com/netheril96/securefs#build-from-source\n[source]\ngit = \"https://github.com/netheril96/securefs\"\nrev = \"v2.0.0\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/simple-mtpfs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions - https://github.com/phatina/simple-mtpfs/blob/master/INSTALL\n[source]\ngit = \"https://github.com/phatina/simple-mtpfs\"\nrev = \"19e7bb9b608b0c0dce2ee6f56fac75901bc69529\"\nscript = \"./autogen.sh\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse3\",\n    \"libmtp\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/squashfuse/recipe.toml",
    "content": "#TODO missing dependencies\n[source]\ntar = \"https://github.com/vasi/squashfuse/releases/download/0.5.2/squashfuse-0.5.2.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfuse3\",\n    \"zlib\",\n    \"liblzma\",\n    \"lz4\",\n    \"zstd\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/unionfs-fuse/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/rpodgorny/unionfs-fuse#how-to-build\n[source]\ngit = \"https://github.com/rpodgorny/unionfs-fuse\"\nrev = \"v3.7\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/fuse/unreliablefs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ligurio/unreliablefs\"\nrev = \"fa432252c117e82a0a36343895936f4fae246b56\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/games/action/battleship-rs/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/deepu105/battleship-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/action/bevy-combat/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ElliotB256/bevy_combat\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/data/0ad-data/recipe.toml",
    "content": "#TODO not tested\n[source]\ntar = \"https://releases.wildfiregames.com/0ad-0.0.26-alpha-unix-data.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/0ad/\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/share/0ad/\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/data/crosshare-data/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/crosshare-org/crosshare\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/crosshare-data\"\ncp -rv \"${COOKBOOK_SOURCE}\"/app/__tests__/converter/puz/*.puz \"${COOKBOOK_STAGE}/usr/share/crosshare-data\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/data/luanti-data/recipe.toml",
    "content": "#TODO not tested\n[source]\ngit = \"https://github.com/luanti-org/minetest_game\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/luanti/games/minetest_game\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/share/luanti/games/minetest_game\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/data/openjazz-shareware-data/jazzdemo.rar.sha",
    "content": "a71e91cc0136449e58e922dc555180a84b04562f2c04c45d1545765dc77e32fb  jazzdemo.rar\n"
  },
  {
    "path": "recipes/wip/games/data/openjazz-shareware-data/manifest",
    "content": "name=Jazz Jackrabbit (shareware)\ncategory=Games\nbinary=/usr/games/OpenJazz\nicon=/ui/icons/apps/OpenJazz.png\n"
  },
  {
    "path": "recipes/wip/games/data/openjazz-shareware-data/recipe.toml",
    "content": "# TODO: Requires unrar-free in the build container\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nASSETS_DIR=\"${COOKBOOK_STAGE}/usr/share/games/openjazz/\"\nAPP_DIR=\"${COOKBOOK_STAGE}/usr/share/ui/apps\"\n\ncurl -vJL https://archive.org/download/jazz-jackrabbit/Jazz%20Jackrabbit.rar -o jazzdemo.rar\nsha256sum -c \"${COOKBOOK_RECIPE}/jazzdemo.rar.sha\"\n\nunrar x -u jazzdemo.rar\nmkdir -p \"${ASSETS_DIR}\" \"${APP_DIR}\"\nunzip -uL Jazz/JAZZ.ZIP -d \"${ASSETS_DIR}\"\n\ncp -v manifest \"${APP_DIR}/openjazz\"\n\"\"\"\n\n[package]\ndependencies = [ \"openjazz\" ]\n"
  },
  {
    "path": "recipes/wip/games/data/quake1-shareware/manifest",
    "content": "name=Quake shareware\ncategory=Games\nbinary=/usr/games/quakespasm -basedir /use/share/games/quake/\n"
  },
  {
    "path": "recipes/wip/games/data/quake1-shareware/pak0.pak.sha",
    "content": "35a9c55e5e5a284a159ad2a62e0e8def23d829561fe2f54eb402dbc0a9a946af  /mnt/games1/home/steam_games/steamapps/common/Quake/id1/PAK0.PAK\n"
  },
  {
    "path": "recipes/wip/games/data/quake1-shareware/quake106.zip.sha",
    "content": "ec6c9d34b1ae0252ac0066045b6611a7919c2a0d78a3a66d9387a8f597553239  quake106.zip\n"
  },
  {
    "path": "recipes/wip/games/data/quake1-shareware/recipe.toml",
    "content": "# TODO: not tested\n\n[build]\ntemplate = \"custom\"\ndev-dependencies = [\n    \"host:lhasa\",\n    \"host:unzrip\",\n    \"host:7-zip\",\n]\nscript = \"\"\"\ncurl -O \"https://github.com/Jason2Brownlee/QuakeOfficialArchive/raw/refs/heads/main/bin/quake106.zip\"\nsha256sum -c quake106.zip.sha\n\n# The zip file contains a DOS installer which we don't need\n# The actual demo content is within another archive\n7z x quake106.zip\n\n# Actual game contents\nlha xv resource.1\nsha256sum -c pak0.pak.sha\n\n# Now, the ID1 folder contains PAK0, the demo file\n# Non-Windows/non-DOS systems expect the directory and file to be lowercased\nOUT_DIR = \"${COOKBOOK_STAGE}/usr/share/games/quake/id1/\"\nmkdir -p \"${OUT_DIR}\"\ncp -v ID1/PAK0.PAK \"${OUT_DIR}/pak0.pak\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/engines/chocolate-doom/recipe.toml",
    "content": "#TODO Not compiled or tested yet\n[source]\ntar = \"https://www.chocolate-doom.org/downloads/3.0.1/chocolate-doom-3.0.1.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-mixer\",\n    \"sdl2-net\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/crispy-doom/recipe.toml",
    "content": "#TODO Not compiled/tested yet\n[source]\ngit = \"https://github.com/fabiangreffrath/crispy-doom\"\nrev = \"crispy-doom-7.1\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-mixer\",\n    \"sdl2-net\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/gemrb/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/gemrb/gemrb/blob/master/INSTALL\n[source]\ntar = \"https://sourceforge.net/projects/gemrb/files/Releases//0.9.4/gemrb-0.9.4-sources.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DSDL_BACKEND=SDL2\",\n]\ndependencies = [\n    \"sdl2\",\n    \"sdl2-mixer\",\n    \"zlib\",\n    \"libiconv\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/ioquake3/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/ioquake/ioq3#compilation-and-installation\n[source]\ngit = \"https://github.com/ioquake/ioq3\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/love/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/love2d/love/archive/refs/tags/11.5.tar.gz\"\nblake3 = \"1fe441b04af1c0aa12b5d12f274fd892e6f307bcc882888c3a1ec048294a25c7\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"freetype2\",\n    \"libmodplug1\",\n    \"libogg\",\n    \"liborbital\",\n    \"libpng\",\n    \"libtheora\",\n    \"libvorbis\",\n    \"luajit\",\n    \"openal\",\n    \"mesa\",\n    \"mpg123\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include -I${COOKBOOK_SYSROOT}/include/SDL2\"\nexport CXXFLAGS=\"${CXXFLAGS} -I${COOKBOOK_SYSROOT}/include -I${COOKBOOK_SYSROOT}/include/SDL2\"\n\ncat > redox.cmake <<EOF\n# the name of the target operating system\nset(CMAKE_SYSTEM_NAME Generic)\nset(CMAKE_SYSTEM_PROCESSOR \"${TARGET%%-*}\")\n\n# which compilers to use for C and C++\nset(CMAKE_C_COMPILER \"${TARGET}-gcc\")\nset(CMAKE_CXX_COMPILER \"${TARGET}-g++\")\n\n# where is the target environment located\nset(CMAKE_FIND_ROOT_PATH \"${COOKBOOK_SYSROOT}\")\n\n# adjust the default behavior of the FIND_XXX() commands:\n# search programs in the host environment\nset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n\n# search headers, libraries, and packages in the target environment\nset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\nEOF\n\nLIBS=(\n    $(\"${TARGET}-pkg-config\" --libs libpng16)\n    $(\"${TARGET}-pkg-config\" --libs vorbis)\n    -lSDL2\n    -lorbital\n    $(\"${TARGET}-pkg-config\" --libs osmesa)\n    -lstdc++\n)\n\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_INSTALL_PREFIX=\"/usr\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_TOOLCHAIN_FILE=redox.cmake\n    -DCMAKE_VERBOSE_MAKEFILE=ON\n    -DOPENGL_opengl_LIBRARY=\"/dev/null\"\n    -DOPENGL_glx_LIBRARY=\"/dev/null\"\n    -DSDL2_INCLUDE_DIRS=\"${COOKBOOK_SYSROOT}/include/SDL2\"\n    -DSDL2_LIBRARIES=\"${LIBS[*]}\"\n    \"${COOKBOOK_SOURCE}\"\n)\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\n# make install not possible, just copy love\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\ncp -v love \"${COOKBOOK_STAGE}/usr/bin/love\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/engines/love/redox.patch",
    "content": "diff -ruwN source-old/CMakeLists.txt source/CMakeLists.txt\n--- source-old/CMakeLists.txt\t2023-12-03 05:44:36.000000000 -0700\n+++ source/CMakeLists.txt\t2025-10-29 07:23:56.896601947 -0600\n@@ -188,7 +188,7 @@\n \tfind_package(ModPlug REQUIRED)\r\n \tfind_package(OpenAL REQUIRED)\r\n \tfind_package(OpenGL REQUIRED)\r\n-\tfind_package(SDL2 REQUIRED CONFIG COMPONENTS SDL2main)\r\n+\t#find_package(SDL2 REQUIRED CONFIG COMPONENTS SDL2main)\r\n \tfind_package(Theora REQUIRED)\r\n \tfind_package(Vorbis REQUIRED)\r\n \tfind_package(ZLIB REQUIRED)\r\ndiff -ruwN source-old/src/common/config.h source/src/common/config.h\n--- source-old/src/common/config.h\t2023-12-03 05:44:36.000000000 -0700\n+++ source/src/common/config.h\t2025-10-28 18:38:57.870055872 -0600\n@@ -48,7 +48,7 @@\n #\t\tdefine LOVE_MACOSX 1\n #\tendif\n #endif\n-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)\n+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined (__redox__)\n // I know it's not linux, but it seems most \"linux-only\" code is bsd-compatible\n #\tdefine LOVE_LINUX 1\n #endif\ndiff -ruwN source-old/src/libraries/luasocket/libluasocket/compat.c source/src/libraries/luasocket/libluasocket/compat.c\n--- source-old/src/libraries/luasocket/libluasocket/compat.c\t2023-12-03 05:44:36.000000000 -0700\n+++ source/src/libraries/luasocket/libluasocket/compat.c\t2025-10-28 18:38:57.870118680 -0600\n@@ -1,6 +1,6 @@\n #include \"compat.h\"\n \n-#if LUA_VERSION_NUM==501\n+#if LUA_VERSION_NUM==501 && !defined(__redox__)\n /*\n ** Adapted from Lua 5.2\n */\ndiff -ruwN source-old/src/libraries/luasocket/libluasocket/compat.h source/src/libraries/luasocket/libluasocket/compat.h\n--- source-old/src/libraries/luasocket/libluasocket/compat.h\t2023-12-03 05:44:36.000000000 -0700\n+++ source/src/libraries/luasocket/libluasocket/compat.h\t2025-10-28 18:38:57.870166330 -0600\n@@ -4,7 +4,7 @@\n #include \"lua.h\"\n #include \"lauxlib.h\"\n \n-#if LUA_VERSION_NUM==501\n+#if LUA_VERSION_NUM==501 && !defined(__redox__)\n void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);\n #endif\n \n"
  },
  {
    "path": "recipes/wip/games/engines/luanti/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/minetest/minetest/blob/master/doc/compiling/linux.md\n# customization - https://github.com/minetest/minetest/tree/master/doc/compiling#cmake-options\n[source]\ngit = \"https://github.com/minetest/minetest\"\nbranch = \"stable-5\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"curl\",\n    \"freetype2\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libogg\",\n    \"libpng\",\n    \"libvorbis\",\n    \"luajit\",\n    \"openal\",\n    #TODO: openssl not detected by cmake\n    \"openssl1\",\n    \"sdl2\",\n    \"sqlite3\",\n    \"zlib\",\n    \"zstd\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DOPENGL_opengl_LIBRARY=/dev/null\n    -DOPENGL_glx_LIBRARY=/dev/null\n    -DSDL2_INCLUDE_DIRS=\"${COOKBOOK_SYSROOT}/include/SDL2\"\n    -DSDL2_LIBRARIES=\"$(\"${PKG_CONFIG}\" --libs sdl2)\"\n)\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/engines/luanti/redox.patch",
    "content": "diff --git a/irr/src/CGUIEditBox.cpp b/irr/src/CGUIEditBox.cpp\nindex 5639a36a6..37a0b6151 100644\n--- a/irr/src/CGUIEditBox.cpp\n+++ b/irr/src/CGUIEditBox.cpp\n@@ -464,10 +464,10 @@ void CGUIEditBox::processKeyLR(const SEvent::SKeyInput &input, s32 &new_mark_beg\n \t\t\tnew_pos = i;\n \t\t\tif (std::abs(i - CursorPos) > 2) {\n \t\t\t\t// End of word\n-\t\t\t\tif (!std::iswspace(prev_c) && std::iswspace(c))\n+\t\t\t\tif (!::iswspace(prev_c) && ::iswspace(c))\n \t\t\t\t\tbreak;\n \t\t\t\t// End of a sentence.\n-\t\t\t\tif (std::iswpunct(prev_c) && !std::iswpunct(c))\n+\t\t\t\tif (iswpunct(prev_c) && !iswpunct(c))\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t\tprev_c = c;\ndiff --git a/irr/src/CIrrDeviceSDL.cpp b/irr/src/CIrrDeviceSDL.cpp\nindex a44213d7c..dbf3611b1 100644\n--- a/irr/src/CIrrDeviceSDL.cpp\n+++ b/irr/src/CIrrDeviceSDL.cpp\n@@ -331,7 +331,9 @@ CIrrDeviceSDL::CIrrDeviceSDL(const SIrrlichtCreationParameters &param) :\n \t\t// Minetest has its own code to synthesize mouse events from touch events,\n \t\t// so we prevent SDL from doing it.\n \t\tSDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, \"0\");\n+#ifdef SDL_HINT_MOUSE_TOUCH_EVENTS\n \t\tSDL_SetHint(SDL_HINT_MOUSE_TOUCH_EVENTS, \"0\");\n+#endif\n \n #if defined(SDL_HINT_APP_NAME)\n \t\tSDL_SetHint(SDL_HINT_APP_NAME, \"Luanti\");\ndiff --git a/irr/src/CMakeLists.txt b/irr/src/CMakeLists.txt\nindex b7360311a..b1c578726 100644\n--- a/irr/src/CMakeLists.txt\n+++ b/irr/src/CMakeLists.txt\n@@ -232,7 +232,7 @@ if(USE_SDL2)\n \t\tset(USE_SDL2_SHARED TRUE)\n \tendif()\n \tif(NOT ANDROID)\n-\t\tfind_package(SDL2 REQUIRED)\n+\t\t#find_package(SDL2 REQUIRED)\n \telse()\n \t\t# provided by AndroidLibs.cmake\n \tendif()\n@@ -246,16 +246,16 @@ if(USE_SDL2)\n #error\\n\\\n #endif\\n\\\n int main() {}\" CHECK_SDL_VERSION)\n-\tif(NOT CHECK_SDL_VERSION)\n-\t\tmessage(FATAL_ERROR \"SDL2 is too old, required is at least 2.0.10!\")\n-\tendif()\n+\t#if(NOT CHECK_SDL_VERSION)\n+\t#\tmessage(FATAL_ERROR \"SDL2 is too old, required is at least 2.0.10!\")\n+\t#endif()\n \n \t# ...no target either.\n-\tif(NOT TARGET SDL2::SDL2)\n-\t\tadd_library(SDL2::SDL2 SHARED IMPORTED)\n-\t\tset_target_properties(SDL2::SDL2 PROPERTIES\n-\t\t\tIMPORTED_LOCATION \"${SDL2_LIBRARIES}\")\n-\tendif()\n+\t#if(NOT TARGET SDL2::SDL2)\n+\t#\tadd_library(SDL2::SDL2 SHARED IMPORTED)\n+\t#\tset_target_properties(SDL2::SDL2 PROPERTIES\n+\t#\t\tIMPORTED_LOCATION \"${SDL2_LIBRARIES}\")\n+\t#endif()\n endif()\n \n # More special config\n@@ -583,8 +583,9 @@ target_link_libraries(IrrlichtMt PRIVATE\n \t${ZLIB_LIBRARY}\n \t${JPEG_LIBRARY}\n \t${PNG_LIBRARY}\n-\t\"$<$<BOOL:${USE_SDL2_SHARED}>:SDL2::SDL2>\"\n-\t\"$<$<BOOL:${USE_SDL2_STATIC}>:SDL2::SDL2-static>\"\n+\t${SDL2_LIBRARIES}\n+\t#\"$<$<BOOL:${USE_SDL2_SHARED}>:SDL2::SDL2>\"\n+\t#\"$<$<BOOL:${USE_SDL2_STATIC}>:SDL2::SDL2-static>\"\n \n \t\"$<$<BOOL:${OPENGL_DIRECT_LINK}>:${OPENGL_LIBRARIES}>\"\n \t${EGL_LIBRARY}\ndiff --git a/src/client/client.cpp b/src/client/client.cpp\nindex b1dfa5993..aec96371c 100644\n--- a/src/client/client.cpp\n+++ b/src/client/client.cpp\n@@ -1808,10 +1808,12 @@ void Client::showUpdateProgressTexture(void *args, u32 progress, u32 max_progres\n \n \t\tif (do_draw) {\n \t\t\ttargs->last_time_ms = time_ms;\n+#if !defined(__redox__)\n \t\t\tstd::wostringstream strm;\n \t\t\tstrm << targs->text_base << L\" \" << targs->last_percent << L\"%...\";\n \t\t\tm_rendering_engine->draw_load_screen(strm.str(), targs->guienv, targs->tsrc, 0,\n \t\t\t\t72 + (u16) ((18. / 100.) * (double) targs->last_percent));\n+#endif\n \t\t}\n }\n \ndiff --git a/src/porting.cpp b/src/porting.cpp\nindex 711b65db6..32520eef9 100644\n--- a/src/porting.cpp\n+++ b/src/porting.cpp\n@@ -25,7 +25,7 @@\n #if !defined(_WIN32)\n \t#include <unistd.h>\n \t#include <sys/utsname.h>\n-\t#if !defined(__ANDROID__)\n+\t#if !defined(__ANDROID__) && !defined(__redox__)\n \t\t#include <spawn.h>\n \t#endif\n #endif\n@@ -883,7 +883,7 @@ static bool open_uri(const std::string &uri)\n \tconst char *argv[] = {\"open\", uri.c_str(), NULL};\n \treturn posix_spawnp(NULL, \"open\", NULL, NULL, (char**)argv,\n \t\t(*_NSGetEnviron())) == 0;\n-#else\n+#elif !defined(__redox__)\n \tconst char *argv[] = {\"xdg-open\", uri.c_str(), NULL};\n \treturn posix_spawnp(NULL, \"xdg-open\", NULL, NULL, (char**)argv, environ) == 0;\n #endif\ndiff --git a/src/porting.h b/src/porting.h\nindex 1a4bb9e7b..cc252f3e1 100644\n--- a/src/porting.h\n+++ b/src/porting.h\n@@ -162,6 +162,12 @@ inline void os_get_clock(struct timespec *ts)\n # endif\n \tstruct timeval tv;\n \tgettimeofday(&tv, NULL);\n+#ifndef TIMEVAL_TO_TIMESPEC\n+#define TIMEVAL_TO_TIMESPEC(tv, ts) ( \\\n+\t(ts)->tv_sec = (tv)->tv_sec, \\\n+\t(ts)->tv_nsec = (tv)->tv_usec * 1000, \\\n+\t(void)0 )\n+#endif\n \tTIMEVAL_TO_TIMESPEC(&tv, ts);\n #endif\n }\ndiff --git a/src/server.cpp b/src/server.cpp\nindex 3c03e68a6..4825bcd62 100644\n--- a/src/server.cpp\n+++ b/src/server.cpp\n@@ -245,10 +245,14 @@ void Server::ShutdownState::tick(float dtime, Server *server)\n \n std::wstring Server::ShutdownState::getShutdownTimerMessage() const\n {\n+#if defined(__redox__)\n+\treturn L\"\";\n+#else\n \tstd::wstringstream ws;\n \tws << L\"*** Server shutting down in \"\n \t\t<< duration_to_string(myround(m_timer)).c_str() << \".\";\n \treturn ws.str();\n+#endif\n }\n \n /*\n@@ -3180,11 +3184,15 @@ std::wstring Server::handleChat(const std::string &name,\n \tif (player) {\n \t\tswitch (player->canSendChatMessage()) {\n \t\tcase RPLAYER_CHATRESULT_FLOODING: {\n+#if defined(__redox__)\n+\t\t\treturn L\"\";\n+#else\n \t\t\tstd::wstringstream ws;\n \t\t\tws << L\"You cannot send more messages. You are limited to \"\n \t\t\t\t\t<< g_settings->getFloat(\"chat_message_limit_per_10sec\")\n \t\t\t\t\t<< L\" messages per 10 seconds.\";\n \t\t\treturn ws.str();\n+#endif\n \t\t}\n \t\tcase RPLAYER_CHATRESULT_KICK:\n \t\t\tDenyAccess(player->getPeerId(), SERVER_ACCESSDENIED_CUSTOM_STRING,\ndiff --git a/src/threading/thread.cpp b/src/threading/thread.cpp\nindex 679eaa113..59dc8cc63 100644\n--- a/src/threading/thread.cpp\n+++ b/src/threading/thread.cpp\n@@ -332,7 +332,7 @@ bool Thread::setPriority(int prio)\n \n \treturn SetThreadPriority(win32_native_handle(), prio);\n \n-#else\n+#elif !defined(__redox__)\n \n \tstruct sched_param sparam;\n \tint policy;\ndiff --git a/src/translation.cpp b/src/translation.cpp\nindex 71469507d..ecb9d1b52 100644\n--- a/src/translation.cpp\n+++ b/src/translation.cpp\n@@ -126,6 +126,7 @@ void Translations::loadTrTranslation(const std::string &data)\n \t\t// '\\n' may also be escaped by '@'.\n \t\t// All other escapes are preserved.\n \n+#if !defined(__redox__)\n \t\tsize_t i = 0;\n \t\tstd::wostringstream word1, word2;\n \t\twhile (i < wline.length() && wline[i] != L'=') {\n@@ -192,6 +193,7 @@ void Translations::loadTrTranslation(const std::string &data)\n \t\t}\n \n \t\taddTranslation(textdomain, word1.str(), word2.str());\n+#endif\n \t}\n }\n \n@@ -341,12 +343,14 @@ void Translations::loadPoEntry(const std::wstring &basefilename, const GettextPl\n \t\taddTranslation(textdomain, original, translated->second);\n \t} else {\n \t\tstd::vector<std::wstring> translations;\n+\t\t#if !defined(__redox__)\n \t\tfor (int i = 0; ; i++) {\n \t\t\tauto translated = entry.find(L\"msgstr[\" + std::to_wstring(i) + L\"]\");\n \t\t\tif (translated == entry.end())\n \t\t\t\tbreak;\n \t\t\ttranslations.push_back(translated->second);\n \t\t}\n+\t\t#endif\n \t\taddPluralTranslation(textdomain, plural_form, original, translations);\n \t\taddPluralTranslation(textdomain, plural_form, plural->second, translations);\n \t}\ndiff --git a/src/unittest/test_serialization.cpp b/src/unittest/test_serialization.cpp\nindex 839a09060..9cbcc056d 100644\n--- a/src/unittest/test_serialization.cpp\n+++ b/src/unittest/test_serialization.cpp\n@@ -61,15 +61,21 @@ template<size_t N> std::string mkstr(const char (&s)[N])\n void TestSerialization::buildTestStrings()\n {\n \tstd::ostringstream tmp_os;\n+#if !defined(__redox__)\n \tstd::wostringstream tmp_os_w;\n+#endif\n \tstd::ostringstream tmp_os_w_encoded;\n \tfor (int i = 0; i < 256; i++) {\n \t\ttmp_os << (char)i;\n+#if !defined(__redox__)\n \t\ttmp_os_w << (wchar_t)i;\n+#endif\n \t\ttmp_os_w_encoded << (char)0 << (char)i;\n \t}\n \tteststring2 = tmp_os.str();\n+#if !defined(__redox__)\n \tteststring2_w = tmp_os_w.str();\n+#endif\n \tteststring2_w_encoded = tmp_os_w_encoded.str();\n }\n \ndiff --git a/src/util/string.cpp b/src/util/string.cpp\nindex aeec51cb8..411bdc84a 100644\n--- a/src/util/string.cpp\n+++ b/src/util/string.cpp\n@@ -721,7 +721,9 @@ static void translate_string(std::wstring_view s, Translations *translations,\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\toutput += L'@';\n+\t\t\t#if !defined (__redox__)\n \t\t\toutput += std::to_wstring(arg_number);\n+\t\t\t#endif\n \t\t\t++arg_number;\n \t\t\tstd::wstring arg;\n \t\t\ttranslate_all(s, i, translations, arg);\ndiff --git a/src/util/string.h b/src/util/string.h\nindex 78881a9a4..f5a6ed95a 100644\n--- a/src/util/string.h\n+++ b/src/util/string.h\n@@ -325,7 +325,7 @@ inline bool my_isspace(const char c)\n \n inline bool my_isspace(const wchar_t c)\n {\n-\treturn std::iswspace(c);\n+\treturn ::iswspace(c);\n }\n \n /**\n"
  },
  {
    "path": "recipes/wip/games/engines/odamex/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/odamex/odamex#compilation-instructions\n[source]\ntar = \"https://github.com/odamex/odamex/releases/download/11.2.0/odamex/odamex-src-11.2.0.tar.xz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_SERVER=0\",\n    \"-DBUILD_CLIENT=1\",\n    \"-DBUILD_LAUNCHER=1\",\n]\ndependencies = [\n    \"sdl2\",\n    \"sdl2-mixer\",\n    \"libpng\",\n    \"zlib\",\n    \"wxwidgets-gtk3\",\n]\n[package]\ndependencies = [\"deutex\"]\n"
  },
  {
    "path": "recipes/wip/games/engines/openlara/assets/README.md",
    "content": "\nTo make assets working, purchase from https://www.gog.com/en/game/tomb_raider_123, then add 'audio', 'level', and 'video' to this folder. Additional info can be read from https://github.com/XProger/OpenLara/pull/414/files\n"
  },
  {
    "path": "recipes/wip/games/engines/openlara/recipe.toml",
    "content": "#TODO: Compiled, not tested further\n[source]\ngit = \"https://github.com/XProger/OpenLara\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nSRC=\"${COOKBOOK_SOURCE}/src\"\nmkdir -p \"${COOKBOOK_STAGE}/usr/games/OpenLara\"\n${CXX} \"-I${COOKBOOK_SYSROOT}/include\" \"-I$SRC/\" ${LDFLAGS} -DSDL2_GLES -D_GAPI_GLES2 -std=c++11 \\\n  -O3 -fno-exceptions -fno-rtti -ffunction-sections -fdata-sections -Wl,--gc-sections -DNDEBUG -D__SDL2__ \\\n  -dynamic -lSDL2 -lGLESv2 -lEGL $(\"${PKG_CONFIG}\" --libs osmesa) -o OpenLara \\\n  $SRC/platform/sdl2/main.cpp \"$SRC/libs/stb_vorbis/stb_vorbis.c\" \"$SRC/libs/minimp3/minimp3.cpp\" \"$SRC/libs/tinf/tinflate.c\"\ncp -rv \"${COOKBOOK_RECIPE}/assets\" \"${COOKBOOK_STAGE}/usr/games/sdl2_gears/\"\ncp OpenLara ${COOKBOOK_STAGE}/usr/games/OpenLara/OpenLara\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/engines/opentomb/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/opentomb/OpenTomb#compiling\n[source]\ngit = \"https://github.com/opentomb/OpenTomb\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"sdl2\",\n    \"libpng\",\n    \"zlib\",\n    \"openal\",\n    \"mesa\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/rbdoom3-bfg/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/RobertBeckebans/RBDOOM-3-BFG#compiling-on-linux-\n#TODO require the Vulkan SDK, see https://vulkan.lunarg.com/\n[source]\ngit = \"https://github.com/RobertBeckebans/RBDOOM-3-BFG\"\nrev = \"39ae1202b4e61ccb8d8e59609f5cd62b04a62a58\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"sdl2\",\n    \"openal\",\n    \"ffmpeg6\",\n    \"libvulkan\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/room4doom/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/flukejones/room4doom\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-mixer\"\n]\nscript = \"\"\"\ncookbook_cargo_packages room4doom\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/engines/rust-doom/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/hovinen/rust-doom\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo\nmv \"${COOKBOOK_STAGE}/usr/bin/rs_doom\" \"${COOKBOOK_STAGE}/usr/bin/doom-rs\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/engines/shockolate/recipe.toml",
    "content": "#TODO something wrong with keyboard input\n[source]\ngit = \"https://github.com/Interrupt/systemshock\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libogg\",\n    \"liborbital\",\n    \"libvorbis\",\n    \"mesa\",\n    \"sdl2\",\n    \"sdl2-mixer\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DCMAKE_C_FLAGS=\"-I${COOKBOOK_SYSROOT}/include -I${COOKBOOK_SYSROOT}/include/SDL2\"\n    -DCMAKE_CXX_FLAGS=\"-I${COOKBOOK_SYSROOT}/include -I${COOKBOOK_SYSROOT}/include/SDL2\"\n    -DENABLE_FLUIDSYNTH=OFF\n    -DENABLE_SDL2=ON\n    -DENABLE_SOUND=ON\n    -DOPENGL_INCLUDE_DIR=\"${COOKBOOK_SYSROOT}\"\n    -DOPENGL_opengl_LIBRARY=\"-lgl\"\n    -DOPENGL_glx_LIBRARY=\"-lglx\"\n    -DSDL2_MIXER_LIBRARIES=\"-lSDL2_mixer -lvorbisfile -lvorbis -logg -lSDL2 -lorbital $(\"${TARGET}-pkg-config\" --libs osmesa)\"\n)\ncookbook_cmake\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/systemshock\"\ncp -v systemshock \"${COOKBOOK_STAGE}/home/user/systemshock/systemshock\"\ncp -rv \"${COOKBOOK_SOURCE}/shaders\" \"${COOKBOOK_STAGE}/home/user/systemshock/shaders\"\n\"\"\"\n[package]\ndependencies = [\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/uzdoom/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minumum dependencies from cmake log\n# build instructions: https://github.com/UZDoom/UZDoom/wiki/Compilation#linux\n[source]\ngit = \"https://github.com/UZDoom/UZDoom\"\nbranch = \"4.14.3\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DHAVE_VULKAN=OFF\",\n    \"-DHAVE_GLES2=OFF\",\n]\ndependencies = [\n    \"sdl2\",\n    #\"mesa\",\n    #\"mesa-glu\",\n    \"openal\",\n    \"bzip2\",\n    \"openmp\",\n    #\"libvpx\",\n    #\"libwebp\",\n    #\"zmusic\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/vkquake/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Novum/vkQuake#linux-1\n[source]\ngit = \"https://github.com/Novum/vkQuake\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"sdl2\",\n    \"libvulkan\",\n    \"libvorbis\",\n    \"libmad\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/vkquake2/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions: https://github.com/kondrak/vkQuake2#linux\n[source]\ngit = \"https://github.com/kondrak/vkQuake2\"\nrev = \"bdd39b142fbadf581fd9d904968a83fb9b4a929a\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"mesa-x11\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/xash3d-fwgs/recipe.toml",
    "content": "#TODO missing script for waf, see https://github.com/FWGS/xash3d-fwgs#build-instructions\n[source]\ngit = \"https://github.com/FWGS/xash3d-fwgs\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n    \"fontconfig\",\n    \"freetype2\",\n]\n"
  },
  {
    "path": "recipes/wip/games/engines/yquake2/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/yquake2/yquake2/blob/master/doc/020_installation.md#compiling-with-gcc-clang-or-mingw\n[source]\ntar = \"https://deponie.yamagi.org/quake2/quake2-8.30.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"mesa\",\n    \"openal\",\n    \"curl\",\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/games/fps/assaultcube/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions: https://wiki.cubers.net/action/view/Linux_Support#Compiling_AssaultCube\n[source]\ngit = \"https://github.com/assaultcube/AC\"\nrev = \"v1.3.0.2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"sdl1\",\n    \"sdl1-image\",\n    \"openal\",\n    \"libogg\",\n    \"zlib\",\n    \"curl\",\n    \"libvorbis\",\n]\n"
  },
  {
    "path": "recipes/wip/games/fps/betterspades/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO probably missing dependencies, see https://github.com/xtreme8000/BetterSpades#build-requirements\n# build instructions: https://github.com/xtreme8000/BetterSpades#linux\n[source]\ngit = \"https://github.com/xtreme8000/BetterSpades\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"glfw3\",\n    \"openal\",\n    \"libenet\",\n    \"libdeflate\",\n    \"glew\",\n    \"mesa\",\n]\n"
  },
  {
    "path": "recipes/wip/games/fps/et-legacy/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/etlegacy/etlegacy#compile-and-install\n[source]\ngit = \"https://github.com/etlegacy/etlegacy\"\nrev = \"v2.83.2\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"sdl2\",\n    \"openssl1\",\n    \"mesa\",\n]\n"
  },
  {
    "path": "recipes/wip/games/fps/openarena/recipe.toml",
    "content": "#TODO missing script for building, lacking build instructions\n#TODO what is game code? - http://files.poulsander.com/~poul19/public_files/oa/dev088/oa-0.8.8.tar.bz2\n[source]\ntar = \"http://files.poulsander.com/~poul19/public_files/oa/dev088/openarena-engine-source-0.8.8.tar.bz2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1\",\n    \"openal\",\n    \"libvorbis\",\n    \"mesa\",\n]\n"
  },
  {
    "path": "recipes/wip/games/fps/openspades-free/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/yvt/openspades#on-unixes-from-source\n[source]\ngit = \"https://github.com/yvt/openspades\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n\t\"glew\",\n\t\"openssl3\",\n\t\"sdl2\",\n\t\"sdl2-image\",\n\t\"freealut\",\n\t\"freetype2\",\n\t\"opus\",\n\t\"opusfile\",\n\t\"libjpeg\",\n\t\"openal\",\n    \"curl\",\n    \"libxinerama\",\n    \"libxft\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DOPENSPADES_NONFREE_RESOURCES=OFF\n)\ncookbook_cmake\nwget https://github.com/DeathByDenim/openspades-free-pak/releases/download/latest/pak001-Free.pak \\\n\"${COOKBOOK_STAGE}\"/usr/share/openspades/Resources\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/fps/openspades-free-pak/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/DeathByDenim/openspades-free-pak\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nzip -r pak001-Free.pak \"${COOKBOOK_SOURCE}\"/*\nmkdir -p ${COOKBOOK_STAGE}/usr/share/openspades/Resources\ncp pak001-Free.pak ${COOKBOOK_STAGE}/usr/share/openspades/Resources/\n\"\"\""
  },
  {
    "path": "recipes/wip/games/fps/smokin-guns/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://trac.smokin-guns.org/wiki/SmokinGuns/Building/linux\n#TODO bundled with the ioquake3 engine?\n#TODO determine dependencies\n[source]\ngit = \"https://github.com/smokin-guns/SmokinGuns\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/games/fps/unvanquished/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/DaemonEngine/Daemon#build-instructions\n# data files - https://github.com/Unvanquished/Unvanquished#downloading-the-games-assets\n[source]\ngit = \"https://github.com/DaemonEngine/Daemon\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"zlib\",\n    \"libgmp\",\n    \"libnettle\",\n    \"curl\",\n    \"sdl2\",\n    \"glew\",\n    \"libpng\",\n    \"libjpeg\",\n    \"libwebp\",\n    \"freetype\",\n    \"openal\",\n    \"libogg\",\n    \"libvorbis\",\n    \"opus\",\n    \"opusfile\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/fps/xonotic/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://gitlab.com/xonotic/xonotic/-/wikis/Compiling\n[source]\ngit = \"https://gitlab.com/xonotic/xonotic\"\nrev = \"0100f2c8d7947267292db66714c1af55039809ad\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libgmp\",\n    \"sdl2\",\n    \"libjpeg\",\n    \"libpng\",\n    \"freetype2\",\n    \"libogg\",\n    \"libvorbis\",\n    \"curl\",\n    \"rsync\",\n]\n"
  },
  {
    "path": "recipes/wip/games/fps/zerospades-free/recipe.toml",
    "content": "#TODO dependency conflict. Glew wants GLX but mesa uses orbital backend.\n# build instructions: https://github.com/yvt/openspades#on-unixes-from-source\n[source]\ngit = \"https://github.com/siecvi/zerospades\"\nshallow_clone = true\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"glew\",\n    \"openssl3\",\n    \"sdl2\",\n    \"sdl2-image\",\n    \"freealut\",\n    \"freetype2\",\n    \"libopus\",\n    \"opusfile\",\n    \"libjpeg\",\n    \"openal\",\n    \"curl\",\n    # \"libxinerama\",\n    # \"libxft\",\n]\ndev-dependencies = [\n    \"libstdcxx\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport LDFLAGS+=\" $(\"${PKG_CONFIG}\" --libs osmesa)\"\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DOPENSPADES_NONFREE_RESOURCES=OFF\n    -DUSE_INTERNAL_OPENAL=OFF\n)\ncookbook_cmake\n\"\"\"\n\n[package]\ndependencies = [\n    \"openspades-free-pak\"\n]\n"
  },
  {
    "path": "recipes/wip/games/fps/zerospades-free/redox.patch",
    "content": "diff --git a/CMakeLists.txt b/CMakeLists.txt\nindex 2f59b92..9f98ab9 100644\n--- a/CMakeLists.txt\n+++ b/CMakeLists.txt\n@@ -145,7 +145,7 @@ if(CMAKE_COMPILER_IS_GNUCXX)\n \n \tif(CMAKE_BUILD_TYPE MATCHES \"Release\")\n \t\tset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -O3\")\n-\t\tset(CMAKE_EXE_LINKER_FLAGS \"-s\")\n+\t\tset(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -s\")\n \tendif()\n \n elseif (CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\ndiff --git a/Sources/Audio/ALFuncs.cpp b/Sources/Audio/ALFuncs.cpp\nindex 92c63f5..1eff792 100644\n--- a/Sources/Audio/ALFuncs.cpp\n+++ b/Sources/Audio/ALFuncs.cpp\n@@ -271,7 +271,8 @@ namespace al {\n \t}\n \n \tvoid Link(void) {\n-#ifdef OPENAL_SOFT\n+// redox: weak link errors\n+#ifndef OPENAL_SOFT\n \t\tSPLog(\"Using OpenAL Soft - direct linking, initializing function pointers.\");\n \t\t// Directly assign function pointers to OpenAL Soft functions\n \t\tqalEnable = alEnable;\ndiff --git a/Sources/CMakeLists.txt b/Sources/CMakeLists.txt\nindex 4438506..46ace0a 100644\n--- a/Sources/CMakeLists.txt\n+++ b/Sources/CMakeLists.txt\n@@ -181,8 +181,8 @@ endif()\n \n if(WIN32)\n \ttarget_link_libraries(OpenSpades ws2_32.lib winmm.lib)\n-elseif(UNIX AND NOT APPLE)\n-\ttarget_link_libraries(OpenSpades Xext)\n+#elseif(UNIX AND NOT APPLE)\n+#\ttarget_link_libraries(OpenSpades Xext)\n endif()\n \n if(UNIX)\ndiff --git a/openal-soft b/openal-soft\n--- a/openal-soft\n+++ b/openal-soft\n@@ -1 +1 @@\n"
  },
  {
    "path": "recipes/wip/games/math/binbreak/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/epic-64/binbreak\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/math/cosmic-ext-2048/recipe.toml",
    "content": "#TODO zbus crate error\n[source]\ngit = \"https://github.com/Kartonrealista/cosmic-ext-2048\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/applications\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/metainfo\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/icons\ncp -rv \"${COOKBOOK_SOURCE}\"/res/io.github.Kartonrealista.cosmic-ext-2048.desktop \"${COOKBOOK_STAGE}\"/usr/share/applications\ncp -rv \"${COOKBOOK_SOURCE}\"/res/io.github.Kartonrealista.cosmic-ext-2048.metainfo.xml \"${COOKBOOK_STAGE}\"/usr/share/metainfo\ncp -rv \"${COOKBOOK_SOURCE}\"/res/icons/hicolor \"${COOKBOOK_STAGE}\"/usr/share/icons\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/math/sudoku-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/crazymerlyn/sudoku\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/math/tuxmath/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/tux4kids/tuxmath/blob/master/doc/INSTALL\n[source]\ngit = \"https://github.com/tux4kids/tuxmath\"\nshallow_clone = true\nscript = \"\"\"\nDYNAMIC_INIT\nautotools_recursive_regenerate\n\"\"\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"t4kcommon\",\n    \"sdl1\",\n    \"sdl1-image\",\n    \"sdl1-mixer\",\n    \"sdl1-ttf\",\n    \"sdl2-net\",\n    \"sdl-pango\",\n    \"librsvg\",\n]\n"
  },
  {
    "path": "recipes/wip/games/music/performous/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions - https://github.com/performous/performous/wiki/Building-and-installing-from-source#build-and-install\n# dependencies - https://github.com/performous/performous/wiki/Building-and-installing-from-source#installing-build-dependencies\n[source]\ngit = \"https://github.com/performous/performous\"\nbranch = \"1.3.1\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"openblas\",\n    \"fftw\",\n    \"libicu\",\n    \"libepoxy\",\n    \"sdl2\",\n    \"freetype2\",\n    \"pango\",\n    \"librsvg\",\n    \"libxml2\",\n    \"ffmpeg6\",\n    \"libjpeg\",\n    \"portaudio\",\n    \"boost\",\n    \"nlohmann-json\",\n    \"aubio\",\n    \"libfmt\",\n]\n"
  },
  {
    "path": "recipes/wip/games/music/performous-composer/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions - https://github.com/performous/performous/wiki/Composer\n[source]\ngit = \"https://github.com/performous/composer\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt5-base\",\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/games/music/stepmania/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions - https://github.com/stepmania/stepmania/wiki/Compiling-StepMania-Linux\n# dependencies - https://github.com/stepmania/stepmania/wiki/Linux-Dependencies\n[source]\ngit = \"https://github.com/stepmania/stepmania\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"mesa\",\n    \"mesa-glu\",\n    \"glew\",\n    \"libx11\",\n    \"libxtst\",\n    \"libxrandr\",\n    \"libpng\",\n    \"libjpeg\",\n    \"zlib\",\n    \"bzip2\",\n    \"libogg\",\n    \"libvorbis\",\n    \"pulseaudio\",\n    \"libiberty\",\n    \"gtk3\",\n    \"libmad\",\n]\n"
  },
  {
    "path": "recipes/wip/games/open-world/all-is-cubes/recipe.toml",
    "content": "#TODO require rustc 1.87 or newer\n[source]\ngit = \"https://github.com/kpreid/all-is-cubes\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages all-is-cubes-desktop\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/open-world/asciicker/recipe.toml",
    "content": "#TODO missing script for gnu make\n#TODO build the game, term and server\n#TODO build the terminal and sdl2 frontends\n# makeflags: -DSERVER -DGAME -DUSE_SDL2 -DPURE_TERM -DUSE_GPM\n[source]\ngit = \"https://github.com/msokalski/asciicker\"\nrev = \"8ff75d0c5a8d2745a8ad6a8a841dd31a46e81635\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"mesa\",\n    \"sdl2\",\n    \"libgpm\",\n]\n"
  },
  {
    "path": "recipes/wip/games/open-world/cytopia/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/CytopiaTeam/Cytopia/wiki/Build-instructions\n[source]\ngit = \"https://github.com/CytopiaTeam/Cytopia\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-ttf\",\n    \"sdl2-image\",\n    \"openal\",\n    \"zlib\",\n    \"libogg\",\n    \"libvorbis\",\n    \"libpng\",\n    \"libnoise\",\n    \"imgui\",\n]\n"
  },
  {
    "path": "recipes/wip/games/open-world/cytopia-rs/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://codeberg.org/Esther1024/pia-fork\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/open-world/ethertia/recipe.toml",
    "content": "#TODO webbrowser crate error\n[source]\ngit = \"https://github.com/Dreamtowards/Ethertum\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/open-world/leafish/recipe.toml",
    "content": "#TODO make gtk3 work\n[source]\ngit = \"https://github.com/Lea-fish/Leafish\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk3\",\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/games/open-world/teloren/recipe.toml",
    "content": "#TODO quinn-udp crate error\n[source]\ngit = \"https://github.com/zesterer/teloren\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/open-world/veloren/recipe.toml",
    "content": "#TODO quinn-udp crate error\n[source]\ngit = \"https://github.com/veloren/veloren\"\nshallow = true\n[build]\ntemplate = \"cargo\"\npackage_path=\"client\"\ndependencies = [\n    \"glib\",\n    \"cairo\",\n    \"pango\",\n    \"atk\",\n    \"gdk-pixbuf\",\n    \"gtk3\",\n    \"eudev\",\n    \"mesa\",\n]\n"
  },
  {
    "path": "recipes/wip/games/other/blightmud/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Blightmud/Blightmud\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n    \"libalsa\",\n]\n"
  },
  {
    "path": "recipes/wip/games/other/mudlet/recipe.toml",
    "content": "#TODO missing dependencies\n# build instructions: https://wiki.mudlet.org/w/Compiling_Mudlet\n[source]\ngit = \"https://github.com/Mudlet/Mudlet\"\nbranch = \"release-4.19\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"zlib\",\n    \"pcre2\",\n    \"libzip\",\n    \"hunspell\",\n    \"boost\",\n    \"libpulse\",\n    \"glib\",\n    \"mesa-glu\",\n    \"mesa\",\n    \"libpugixml\",\n    \"gstreamer\",\n    \"qt6-multimedia\",\n    \"qt6-tools\",\n    \"qt6-speech\",\n    \"zstd\",\n]\n"
  },
  {
    "path": "recipes/wip/games/other/oxycards/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/BrookJeynes/oxycards\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/other/rust-sadari-cli/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/24seconds/rust-sadari-cli\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/other/rustorio/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/albertsgarde/rustorio\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages rustorio\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/other/sandbox-rs1/recipe.toml",
    "content": "#TODO make dependencies work\n[source]\ngit = \"https://github.com/hakolao/sandbox\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libvulkan\",\n    \"libxcb\",\n]\nscript = \"\"\"\ncookbook_cargo_packages sandbox\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/other/slint-tetris/recipe.toml",
    "content": "#TODO outdated proc-macro2 crate\n[source]\ngit = \"https://github.com/GaspardCulis/slint-tetris\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/other/sshattrick/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ricott1/sshattrick\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/other/terdle/recipe.toml",
    "content": "#TODO signal-hook and libc crate errors\n[source]\ngit = \"https://github.com/neelkarma/terdle\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/other/tetromino/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/d-e-s-o/tetromino\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/other/tintin/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/scandum/tintin/releases/download/2.02.51/tintin-2.02.51.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"zlib\",\n    \"pcre2\",\n    #\"gnutls3\", # optional\n]\n"
  },
  {
    "path": "recipes/wip/games/other/turdle/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/weiteck/turdle\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/games/other/unvanquished-benchmarks/recipe.toml",
    "content": "#TODO missing script for installation, probably data files\n[source]\ntar = \"https://dl.unvanquished.net/benchmark/demos/unvanquished-benchmark_0.54.0.dm_86.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/games/other/uqm/recipe.toml",
    "content": "#TODO download game data - https://sourceforge.net/projects/sc2/files/UQM/0.8/uqm-0.8.0-content.uqm/download\n#TODO missing script, read the INSTALL file inside the tarball\n[source]\ntar = \"https://sourceforge.net/projects/sc2/files/UQM/0.8/uqm-0.8.0-src.tgz/download\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n    \"libpng\",\n    \"libogg\",\n    \"libvorbis\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/games/other/vong/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/simbleau/vong\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/other/vvvvvv/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/xTibor/VVVVVV\"\nupstream = \"https://github.com/TerryCavanagh/VVVVVV\"\nbranch = \"redox\"\nscript = \"COOKBOOK_SOURCE=${COOKBOOK_SOURCE}/desktop_version\"\n[build]\ndependencies = [\n    \"sdl2-image\",\n    \"sdl2-mixer\",\n    \"sdl2\",\n    \"liborbital\",\n    \"mesa\",\n    \"mesa-glu\",\n    \"zlib\",\n    \"libogg\",\n    \"libvorbis\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/desktop_version\"\ncookbook_cmake \\\n    -DSDL2_INCLUDE_DIRS=\"${COOKBOOK_SYSROOT}/include/SDL2\" \\\n    -DSDL2_LIBRARIES=\"-lSDL2main -lSDL2_mixer -lSDL2 $(${TARGET}-pkg-config --libs glu) -lorbital -lz -lvorbisfile -lvorbis -logg\"\n\"\"\""
  },
  {
    "path": "recipes/wip/games/other/wesnoth/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/wesnoth/wesnoth\"\nbranch = \"1.14.6\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DCMAKE_TRY_COMPILE_TARGET_TYPE=DYNAMIC_LIBRARY\",\n    \"-DENABLE_SERVER=OFF\",\n    \"-DENABLE_TESTS=OFF\"\n    \"-DCRYPTO_LIBRARY=openssl\",\n    \"-DSDL2_LIBRARY=sdl2\",\n    \"-DSDL2_IMAGE_LIBRARY=SDL2_image\",\n    \"-DSDL2_MIXER_LIBRARY=SDL2_mixer\",\n    \"-DSDL2_TTF_LIBRARY=SDL2_ttf\",\n    \"-DVORBISFILE_INCLUDE_DIR=${COOKBOOK_SYSROOT}/include\",\n    \"-DVORBISFILE_LIBRARY=vorbisfile ..\",\n]\ndependencies = [\n    \"cairo\",\n    \"freetype2\",\n    \"glib\",\n    \"libjpeg\",\n    \"liborbital\",\n    \"libpng\",\n    \"libvorbis\",\n    \"mesa\",\n    \"mesa-glu\",\n    \"pcre\",\n    \"pixman\",\n    \"sdl2\",\n    \"sdl2-image\",\n    \"sdl2-mixer\",\n    \"sdl2-ttf\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/games/platform/irrlamb/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://gitlab.com/jazztickets/uploads/-/raw/main/irrlamb-1.0.7-d99c154-src.tar.gz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"openal\",\n    \"libvorbis\",\n    \"libogg\",\n    \"libjpeg\",\n    \"libpng\",\n    \"freetype2\",\n    \"sqlite3\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/games/platform/supertux/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/SuperTux/supertux/blob/master/INSTALL.md#compiling\n[source]\ntar = \"https://github.com/SuperTux/supertux/releases/download/v0.7.0-beta.1/SuperTux-v0.7.0-beta.1-Source.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_OPENGL=OFF\",\n    \"-DUSE_SYSTEM_SDL2_TTF=ON\",\n]\ndependencies = [\n    \"sdl2\",\n    \"sdl2-image\",\n    \"sdl2-ttf\",\n    \"zlib\",\n    \"libpng\",\n    \"freetype2\",\n    \"libfmt\",\n    \"libcurl\",\n    \"openal\",\n    \"libogg\",\n    \"libvorbis\",\n    \"physicsfs\",\n]\n"
  },
  {
    "path": "recipes/wip/games/puzzle/conduit/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/WizCrab/conduit-cli-game\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/puzzle/crosstui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/matrixfrog/crossword\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages crosstui\n\"\"\"\n[package]\ndependencies = [\n    \"crosshare-data\"\n]\n"
  },
  {
    "path": "recipes/wip/games/puzzle/setrixtui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Mjoyufull/Setrixtui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/racing/q3rally/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/Q3Rally-Team/q3rally/blob/master/engine/README.md\n[source]\ngit = \"https://github.com/Q3Rally-Team/q3rally\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/games/racing/supertuxkart/recipe.toml",
    "content": "#TODO requires ifaddrs.h\n# build instructions: https://github.com/supertuxkart/stk-code/blob/master/INSTALL.md#compiling\n[source]\ntar = \"https://github.com/supertuxkart/stk-code/releases/download/1.5/SuperTuxKart-1.5-src.tar.gz\"\npatches = [\"redox.patch\"]\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DNO_SHADERC=ON\",\n    \"-DUSE_WIIUSE=OFF\",\n    \"-DUSE_DNS_C=ON\",\n    \"-DBUILD_RECORDER=OFF\",\n    \"-DPTHREAD_LIBRARY=/dev/null\"\n]\ndependencies = [\n    \"openal\",\n    \"libogg\",\n    \"libvorbis\",\n    \"freetype2\",\n    \"harfbuzz\",\n    \"curl\",\n    \"openssl3\",\n    \"libpng\",\n    \"zlib\",\n    \"libjpeg\",\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/games/racing/supertuxkart/redox.patch",
    "content": "diff -ruwN source/src/guiengine/widgets/spinner_widget.cpp source-new/src/guiengine/widgets/spinner_widget.cpp\n--- source/src/guiengine/widgets/spinner_widget.cpp\t2025-10-20 04:04:17.000000000 +0700\n+++ source-new/src/guiengine/widgets/spinner_widget.cpp\t2025-11-09 11:29:52.678400188 +0700\n@@ -493,10 +493,7 @@\n         }\n         else\n         {\n-            std::wstringstream ws;\n-            ws << (m_value*m_step);\n-            std::wstring text = ws.str();\n-            m_children[1].m_element->setText( text.c_str() );\n+            m_children[1].m_element->setText( stringw(m_value*m_step).c_str() );\n         }\n     }\n }\n"
  },
  {
    "path": "recipes/wip/games/rpg/dcss/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/crawl/crawl/blob/master/crawl-ref/INSTALL.md#compiling\n[source]\ntar = \"https://github.com/crawl/crawl/releases/download/0.33.1/stone_soup-0.33.1.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-image\",\n    \"sqlite3\",\n    \"ncurses\",\n    \"pcre\",\n    \"zlib\",\n    \"libpng\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\"\"\"\n[package]\ndependencies = [\"dejavu\"]\n"
  },
  {
    "path": "recipes/wip/games/rpg/kingslayer/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Zaechus/kingslayer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/rts/mindustry/recipe.toml",
    "content": "#TODO waiting openjdk x11 feature creation\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\nwget https://github.com/Anuken/Mindustry/releases/download/v146/Mindustry.jar \"${COOKBOOK_STAGE}/usr/bin\"\necho \"#!/usr/bin/env sh \\n java -jar /usr/bin/Mindustry.jar\" > \"${COOKBOOK_STAGE}\"/usr/bin/mindustry\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/mindustry\n\"\"\"\n[package]\ndependencies = [\"openjdk17.x11\"]\n"
  },
  {
    "path": "recipes/wip/games/rts/mindustry-beta/recipe.toml",
    "content": "#TODO waiting openjdk x11 feature creation\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\nwget https://github.com/Anuken/Mindustry/releases/download/v154.3/Mindustry.jar \"${COOKBOOK_STAGE}/usr/bin\"\necho \"#!/usr/bin/env sh \\n java -jar /usr/bin/Mindustry.jar\" > \"${COOKBOOK_STAGE}\"/usr/bin/mindustry\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/mindustry\n\"\"\"\n[package]\ndependencies = [\"openjdk17.x11\"]\n"
  },
  {
    "path": "recipes/wip/games/servers/cuberite/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/cuberite/cuberite/blob/master/COMPILING.md#building-1\n[source]\ngit = \"https://github.com/cuberite/cuberite\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/games/shooter/asciiarena/recipe.toml",
    "content": "#TODO outdated mio crate\n[source]\ngit = \"https://github.com/lemunozm/asciiarena\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/shooter/call-of-ferris/recipe.toml",
    "content": "#TODO camino crate error (after a cargo update)\n[source]\ngit = \"https://github.com/Andy-Python-Programmer/CallOfFerris\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/shooter/empty-clip/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://gitlab.com/jazztickets/uploads/-/raw/main/emptyclip-2.0.3-0d97724f-src.tar.gz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"sdl3\",\n    \"libwebp\",\n    \"sqlite3\",\n    \"freetype2\",\n    \"openal\",\n    \"libvorbis\",\n    \"libogg\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/games/simulation/egregoria/recipe.toml",
    "content": "#TODO winit crate error\n[source]\ngit = \"https://github.com/Uriopass/Egregoria\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages native_app\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/simulation/formicarium/recipe.toml",
    "content": "#TODO outdated libc crate\n[source]\ngit = \"https://github.com/gliderkite/formicarium\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/simulation/game-of-life-piston/recipe.toml",
    "content": "#TODO outdated libc crate\n[source]\ngit = \"https://github.com/Arcterus/game-of-life\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/simulation/game-of-life-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/kachark/game-of-life-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/simulation/nbodysim/recipe.toml",
    "content": "#TODO outdated crates\n[source]\ngit = \"https://github.com/timokoesters/nbodysim\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/nbodysim\ncp -rv \"${COOKBOOK_SOURCE}\"/examples/* \"${COOKBOOK_STAGE}\"/usr/share/nbodysim\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/simulation/sandbox-rs2/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/JMS55/sandbox\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/simulation/symbiants/recipe.toml",
    "content": "#TODO the Bevy engine require rustc 1.76 or newer\n[source]\ngit = \"https://github.com/MeoMix/symbiants\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/space/endless-sky/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/endless-sky/endless-sky/blob/master/docs/readme-cmake.md#building-the-game\n[source]\ngit = \"https://github.com/endless-sky/endless-sky\"\nrev = \"95e72950e1554392666fa41bb18c978868aa6611\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"sdl2\",\n    \"libpng\",\n    \"libjpeg\",\n    \"mesa\",\n    \"glew\",\n    \"openal\",\n    \"libmad\",\n    \"libuuid\",\n]\n"
  },
  {
    "path": "recipes/wip/games/space/naev/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/naev/naev/wiki/Compiling-on-*nix\n[source]\ntar = \"https://github.com/naev/naev/releases/download/v0.10.6/naev-0.10.6-source.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-image\",\n    \"libpng\",\n    \"libxml2\",\n    \"libwebp\",\n    \"mesa\",\n    \"openal\",\n    \"openblas\",\n    \"freetype2\",\n    \"libvorbis\",\n]\n"
  },
  {
    "path": "recipes/wip/games/space/osirion/recipe.toml",
    "content": "#TODO make dependencies work\n# data files - http://osirion.org/files/osirion-0.2.8-data.zip\n[source]\ntar = \"http://osirion.org/files/osirion-0.2.8-src.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"zlib\",\n    \"bullet-physics\",\n    \"libpng\",\n    \"libjpeg\",\n    \"sdl2\",\n    \"openal\",\n    \"libvorbis\",\n]\n"
  },
  {
    "path": "recipes/wip/games/space/outfly/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/outfly/outfly\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/space/rebels-in-the-sky/recipe.toml",
    "content": "#TODO async-io and rustix crate error\n[source]\ngit = \"https://github.com/ricott1/rebels-in-the-sky\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/space/rust-belt/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/johnthagen/rust-belt\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"sdl2\",\n    \"sdl2-mixer\",\n]\n"
  },
  {
    "path": "recipes/wip/games/strategy/0ad/recipe.toml",
    "content": "#TODO Missing script for a make build system, see https://trac.wildfiregames.com/wiki/BuildInstructions#Linux\n#TODO The Atlas editor needs to be disabled with the build option \"--disable-atlas\" to avoid GTK3 dependency (WxWidgetsGTK)\n#TODO Maybe needs to run update-workspaces.sh before\n#TODO Require recipes for SpiderMonkey and libicu (Unicode)\n[source]\ntar = \"https://releases.wildfiregames.com/0ad-0.0.26-alpha-unix-build.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"boost\",\n    \"curl\",\n    \"libenet\",\n    \"libfmt\",\n    \"libgloox\",\n    \"libicu\",\n    \"libogg\",\n    \"libpng\",\n    \"libsodium\",\n    \"libvorbis\",\n    \"libxml2\",\n    \"miniupnpc\",\n    \"openal\",\n    \"sdl2\",\n    \"zlib\",\n    \"spidermonkey\",\n]\n"
  },
  {
    "path": "recipes/wip/games/strategy/asmfish/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/lantonov/asmFish#building\n[source]\ngit = \"https://github.com/lantonov/asmFish\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/balatro-tui/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Passeriform/BalatroTUI\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages balatro_tui\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/castle-game/recipe.toml",
    "content": "#TODO outdated crates\n[source]\ngit = \"https://github.com/tversteeg/castle-game\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/cell-graph-risk/recipe.toml",
    "content": "#TODO outdated libc crate\n[source]\ngit = \"https://github.com/PSteinhaus/Cell-Graph-Risk\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/chess-engine/recipe.toml",
    "content": "#TODO maybe wrong script\n[source]\ngit = \"https://github.com/adam-mcdaniel/chess-engine\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages chess-gui\ncookbook_cargo_examples terminal\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/chess-tui/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/thomas-mauran/chess-tui\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/chessmd/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ChessMD/ChessMD\"\nrev = \"v1.0\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt6-base\",\n]\n"
  },
  {
    "path": "recipes/wip/games/strategy/draughts/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tobagin/Draughts\"\nrev = \"v2.2.0\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=false\",\n]\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"libgee\",\n    \"libsoup\",\n    \"json-glib\",\n]\ndev-dependencies = [\"host:blueprint\"]\n"
  },
  {
    "path": "recipes/wip/games/strategy/hammurabi/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/stjepangolemac/hammurabi\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/hnefatafl-copenhagen/recipe.toml",
    "content": "# TODO:\n# 1. The CJK and runes fonts don't load.\n# 2. On a button press two characters are read in instead of one.\n# 3. Backspace does not work.\n# 4. TcpStream.shutdown() is not implemented.\n\n[source]\ngit = \"https://github.com/dcampbell24/hnefatafl\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n\"${COOKBOOK_CARGO}\" build \\\n    --manifest-path \"${COOKBOOK_SOURCE}/${COOKBOOK_CARGO_PATH}/Cargo.toml\" \\\n    --features client \\\n    --release \\\n    --no-default-features\n\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n\ncp -v \"target/${TARGET}/release/hnefatafl-ai\" \"${COOKBOOK_STAGE}/usr/bin/hnefatafl-ai\"\ncp -v \"target/${TARGET}/release/hnefatafl-client\" \"${COOKBOOK_STAGE}/usr/bin/hnefatafl-client\"\ncp -v \"target/${TARGET}/release/hnefatafl-server\" \"${COOKBOOK_STAGE}/usr/bin/hnefatafl-server\"\ncp -v \"target/${TARGET}/release/hnefatafl-text-protocol\" \"${COOKBOOK_STAGE}/usr/bin/hnefatafl-text-protocol\"\n\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/games\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/ui/apps\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/icons/apps\ncp -rv \"${COOKBOOK_SOURCE}\"/src/bin/hnefatafl-client/helmet.png \"${COOKBOOK_STAGE}\"/usr/share/icons/apps/helmet.png\ncp -rv \"${COOKBOOK_SOURCE}\"/packages/redox/manifest \"${COOKBOOK_STAGE}\"/usr/share/ui/apps/hnefatafl-client\nmv \"${COOKBOOK_STAGE}\"/usr/bin/hnefatafl-client \"${COOKBOOK_STAGE}\"/usr/games/hnefatafl-client\n\"\"\"\n\n[package]\ndependencies = [\n    \"dejavu\",\n    \"freefont\",\n    \"noto-color-emoji\",\n]\n"
  },
  {
    "path": "recipes/wip/games/strategy/mazter/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Canop/mazter\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/minesweep-rs/recipe.toml",
    "content": "#TODO ratatui crate error\n[source]\ngit = \"https://github.com/cpcloud/minesweep-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/offline-chess-puzzles/recipe.toml",
    "content": "#TODO iced_winit crate error\n[source]\ngit = \"https://github.com/brianch/offline-chess-puzzles\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/games/strategy/rust-sudoku/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/xairy/rust-sudoku\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/rustoku/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/huangsam/rustoku\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages rustoku-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/ship-of-harkinian/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/HarbourMasters/Shipwright/blob/develop/docs/BUILDING.md#linux\n[source]\ngit = \"https://github.com/HarbourMasters/Shipwright\"\nrev = \"818addfdda660f6b4b54edd19636d6fd9d839f28\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"sdl2\",\n    \"libpng\",\n    \"glew\",\n]\n"
  },
  {
    "path": "recipes/wip/games/strategy/stockfish/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://disservin.github.io/stockfish-docs/pages/Compiling-from-source.html\n[source]\ngit = \"https://github.com/official-stockfish/Stockfish\"\nrev = \"68e1e9b3811e16cad014b590d7443b9063b3eb52\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/tage/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/jacopograndi/tage\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/tetris-demo/recipe.toml",
    "content": "#TODO outdated libc crate\n[source]\ngit = \"https://github.com/da-x/tetris-demo\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/tic-tac-toe-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/thomas-mauran/tic-tac-toe\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/games/strategy/warsow/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ntar = \"https://warsow.net/warsow_21_sdk.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/games/syobonaction/01_redox.patch",
    "content": "diff -rupNw source-original/DxLib.cpp source/DxLib.cpp\n--- source-original/DxLib.cpp\t2018-12-08 19:59:16.777579338 +0100\n+++ source/DxLib.cpp\t2018-12-08 02:13:39.541585079 +0100\n@@ -24,7 +24,7 @@ int DxLib_Init()\n \treturn -1;\n     }\n \n-    SDL_WM_SetCaption(\"Syobon Action (しょぼんのアクション)\",\n+    SDL_WM_SetCaption(\"Syobon Action\",\n \t\t      NULL);\n     SDL_ShowCursor(SDL_DISABLE);\n \ndiff -rupNw source-original/main.cpp source/main.cpp\n--- source-original/main.cpp\t2018-12-08 19:59:16.781579399 +0100\n+++ source/main.cpp\t2018-12-08 18:11:33.716589712 +0100\n@@ -1,9 +1,11 @@\n #include \"main.h\"\n+#include <unistd.h>\n \n // プログラムは WinMain から始まります\n //Changed to ansi c++ main()\n int main(int argc, char *argv[])\n {\n+    chdir(\"file:/share/syobonaction/\");\n     parseArgs(argc, argv);\n     if (DxLib_Init() == -1)\n \treturn 1;\ndiff -rupNw source-original/Makefile source/Makefile\n--- source-original/Makefile\t2018-12-08 19:59:16.777579338 +0100\n+++ source/Makefile\t2018-12-08 01:32:40.319685337 +0100\n@@ -1,8 +1,8 @@\n SyobonAction:main.o loadg.o DxLib.o\n-\tgcc main.o loadg.o DxLib.o -o SyobonAction `sdl-config --libs` -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf\n+\t${CXX} ${LDFLAGS} main.o loadg.o DxLib.o -o SyobonAction `${SDL_CONFIG} --libs` -lSDL_gfx -lSDL_image -lSDL_mixer -lpng -ljpeg -lz -lSDL -lSDL_ttf -lfreetype -lvorbisfile -lvorbis -logg\n main.o:main.cpp\n-\tgcc -c main.cpp\n+\t${CXX} ${CPPFLAGS} `${SDL_CONFIG} --cflags` -c main.cpp\n loadg.o:loadg.cpp\n-\tgcc -c loadg.cpp\n+\t${CXX} ${CPPFLAGS} `${SDL_CONFIG} --cflags` -c loadg.cpp\n DxLib.o:DxLib.cpp\n-\tgcc -c DxLib.cpp\n+\t${CXX} ${CPPFLAGS} `${SDL_CONFIG} --cflags` -c DxLib.cpp\n"
  },
  {
    "path": "recipes/wip/games/syobonaction/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/angelXwind/OpenSyobonAction\"\npatches = [\n    \"01_redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1-mixer\",\n    \"sdl1-image\",\n    \"sdl-gfx\",\n    \"sdl1-ttf\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport LDFLAGS=\"$LDFLAGS -lorbital\"\nrsync -a --delete \"${COOKBOOK_SOURCE}/\" ./\nmake\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/syobonaction\"\ncp -Rv ./SyobonAction \"${COOKBOOK_STAGE}/usr/bin/syobonaction\"\ncp -Rv ./BGM \"${COOKBOOK_STAGE}/usr/share/syobonaction\"\ncp -Rv ./res \"${COOKBOOK_STAGE}/usr/share/syobonaction\"\ncp -Rv ./SE \"${COOKBOOK_STAGE}/usr/share/syobonaction\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/games/tools/deutex/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/Doom-Utils/deutex/releases/download/v5.2.3/deutex-5.2.3.tar.zst\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/games/tools/oxyromon/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/alucryd/oxyromon\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/gnome/aisleriot/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/aisleriot/3.22/aisleriot-3.22.35.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Ddocs=false\",\n    \"-Dsound=false\",\n]\ndependencies = [\n    \"glib\",\n    \"gtk3\",\n    \"cairo\",\n    \"libcanberra\",\n    \"qt5-svg\",\n    \"librsvg\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/brasero/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies: https://gitlab.gnome.org/GNOME/brasero/-/blob/master/README?ref_type=heads&plain=1#L64\n[source]\ntar = \"https://download.gnome.org/sources/brasero/3.12/brasero-3.12.3.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"gtk3\",\n    \"gstreamer\",\n    \"libxml2\",\n    \"cairo\",\n    \"libcanberra\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/cheese/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions: https://gitlab.gnome.org/GNOME/cheese/-/blob/master/meson.build\n# probably missing dependencies\n[source]\ntar = \"https://download.gnome.org/sources/cheese/44/cheese-44.1.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dgtk_doc=false\"\n]\ndependencies = [\n    \"gtk3\",\n    \"glib\",\n    \"gdk-pixbuf\",\n    \"gstreamer\",\n    \"libcanberra\",\n    \"clutter\",\n    \"clutter-gtk\",\n    \"clutter-gst\",\n    \"gnome-video-effects\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/evince/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/evince/48/evince-48.1.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dgtk_doc=false\",\n    \"-Duser_doc=false\",\n    \"-Dintrospection=false\",\n    \"-Ddbus=false\",\n]\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"cairo\",\n    \"libxml2\",\n    \"cairo\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/file-roller/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/file-roller#building-locally\n# the libportal dependency is for flatpak, maybe it's optional\n[source]\ntar = \"https://download.gnome.org/sources/file-roller/44/file-roller-44.3.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk3\",\n    \"libhandy\",\n    \"libarchive\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/geary/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO require pts3 and pts5 support in sqlite: https://gitlab.gnome.org/GNOME/geary/-/blob/main/BUILDING.md#dependencies\n[source]\ntar = \"https://download.gnome.org/sources/geary/46/geary-46.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dprofile=release\",\n    \"-Dlibunwind=disabled\",\n    \"-Dtnef=disabled\",\n    \"-Dvaladoc=disabled\",\n]\ndependencies = [\n    \"gtk3\",\n    \"webkitgtk3\",\n    \"sqlite3\",\n]\ndev-dependencies = [\"vala\"]\n"
  },
  {
    "path": "recipes/wip/gnome/gimp/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from autotools log\n# build instructions: https://developer.gimp.org/core/setup/build/3.0/INSTALL\n# all build options: https://gitlab.gnome.org/GNOME/gimp/-/blob/master/meson_options.txt?ref_type=heads\n[source]\ntar = \"https://download.gimp.org/gimp/v3.0/gimp-3.0.6.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dcheck-update=no\",\n    \"-Dlibbacktrace=false\",\n    \"-Dlibunwind=false\",\n    \"-Dprint=false\",\n]\n# dependencies = [\n#     \"gtk3\",\n#     \"gobject-introspection\",\n#     \"glib\",\n#     \"cairo\",\n#     \"pango\",\n#     \"liblcms\",\n#     \"libmypaint\",\n#     \"gexiv2\",\n#     \"gegl\",\n#     \"babl\",\n#     \"librsvg\",\n#     \"libtiff\",\n#     \"libjpeg\",\n#     \"libpng\",\n#     \"fontconfig\",\n#     \"freetype2\",\n#     \"atk\",\n#     \"harfbuzz\",\n#     \"bzip2\",\n#     \"zlib\",\n# ]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-2048/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/GNOME/gnome-2048\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-boxes/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n[source]\ntar = \"https://download.gnome.org/sources/gnome-boxes/49/gnome-boxes-49.1.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-builder/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n# build instructions: https://builder.readthedocs.io/installation.html#via-release-tarball\n[source]\ntar = \"https://download.gnome.org/sources/gnome-builder/49/gnome-builder-49.1.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dnetwork_tests=false\",\n    \"-Dwebkit=false\",\n]\n# dependencies = [\n#     \"cairo\",\n#     \"cmark\",\n#     \"dbus\",\n#     \"dspy\",\n#     \"enchant\",\n#     \"llvm18\",\n#     \"gdk-pixbuf\",\n#     \"glib\",\n#     \"gobject-introspection\",\n#     \"gtk4\",\n#     \"gtk4mm\",\n#     \"gtksourceview\",\n#     \"libadwaita\",\n#     \"libdex\",\n#     \"libgit2\",\n#     \"libgspell-gtk4\",\n#     \"libpanel\",\n#     \"libpeas\",\n#     \"libsoup\",\n#     \"vala\",\n#     \"libvte\",\n#     \"libxml2\",\n#     \"json-glib\",\n#     \"jsonrpc-glib\",\n#     \"pango\",\n#     \"webkitgtk4\",\n# ]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-calculator/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from meson log\n[source]\ntar = \"https://download.gnome.org/sources/gnome-calculator/49/gnome-calculator-49.1.1.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Ddisable-introspection=true\",\n    \"-Ddoc=false\",\n]\n#dependencies = [\n#    \"glib\",\n#    \"libsoup\",\n#    \"mpc\",\n#    \"mpfr\",\n#]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-chess/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies\n[source]\ntar = \"https://download.gnome.org/sources/gnome-chess/49/gnome-chess-49.2.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"librsvg\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-connections/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from meson log\n[source]\ntar = \"https://download.gnome.org/sources/gnome-connections/49/gnome-connections-49.0.tar.xz\"\n[build]\ntemplate = \"meson\"\n#dependencies = [\n#    \"libsecret\",\n#    \"libhandy\",\n#    \"libxml2\",\n#    \"gtk-vnc\",\n#    \"freerdp\",\n#    \"cairo\",\n#    \"gtk3\",\n#    \"glib\",\n#    \"gdk-pixbuf\",\n#]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-files/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n[source]\ntar = \"https://download.gnome.org/sources/nautilus/49/nautilus-49.1.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dextensions=false\",\n    \"-Dintrospection=false\",\n    \"-Dpackagekit=false\",\n    \"-Dselinux=disabled\",\n    \"-Dcloudproviders=disabled\",\n    \"-Dtests=none\",\n]\n#[package] # probably optional dependencies\n#dependencies = [\n#    \"localsearch\",\n#    \"xdg-user-dirs-gtk\",\n#]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-image-viewer/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/GNOME/loupe\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n    \"liblcms\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-keyring/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/gnome-keyring/48/gnome-keyring-48.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dsystemd=disabled\",\n    \"-Dpam=false\",\n    \"-Ddebug-mode=false\",\n    \"-Dmanpage=false\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-sudoku/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies\n[source]\ntar = \"https://download.gnome.org/sources/gnome-sudoku/49/gnome-sudoku-49.2.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"json-glib\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-text-editor/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/gnome-text-editor/49/gnome-text-editor-49.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Deditorconfig=false\"\n]\ndependencies = [\n    \"gtk4\",\n    \"gtksourceview\",\n    \"libadwaita\",\n    \"libspelling\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/gnome-web/recipe.toml",
    "content": "# TODO: Need to port more libs\r\n# newer version requires c_std=gnu23\r\n[source]\r\ntar = \"https://download.gnome.org/sources/epiphany/46/epiphany-46.5.tar.xz\"\r\n[build]\r\ntemplate = \"meson\"\r\nmesonflags = [\r\n  \"-Dunit_tests=disabled\",\r\n  \"-Dman-pages=disabled\",\r\n]\r\ndependencies = [\r\n  \"cairo\",\r\n#   \"gck2\",\r\n#   \"gcr4\",\r\n  \"gdk-pixbuf\",\r\n  \"gio2\",\r\n#   \"gio-unix2\",\r\n#   \"glib2\",\r\n#   \"granite7\",\r\n#   \"gsettings-desktop-schemas\",\r\n  \"gstreamer\",\r\n  \"gtk4\",\r\n#   \"gtk4-unix-print\",\r\n#   \"hogweed\",\r\n#   \"iso-codes\",\r\n  \"json-glib\",\r\n  \"libarchive\",\r\n  \"libadwaita\",\r\n#   \"libsecret\",\r\n  \"libsoup\",\r\n  \"libxml2\",\r\n  \"libnettle\",\r\n#   \"libportal-gtk4\",\r\n  \"sqlite3\",\r\n#   \"webkitgtk6\",\r\n#   \"webkitgtk-web-process-extension6\"\r\n]\r\n"
  },
  {
    "path": "recipes/wip/gnome/pitivi/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from meson log\n# lacking build instructions\n# the tarball lacks an important recent fix\n[source]\ngit = \"https://gitlab.gnome.org/GNOME/pitivi\"\nrev = \"b9864c4aca6d88dae38fde5609047d0ebd7b0506\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Ddisable-help=true\",\n]\n#dependencies = [\n#    \"gtk3\",\n#    \"gstreamer\",\n#    \"libpeas\",\n#]\n"
  },
  {
    "path": "recipes/wip/gnome/simple-scan/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n[source]\ntar = \"https://download.gnome.org/sources/simple-scan/49/simple-scan-49.1.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"sane-backends\",\n]\n"
  },
  {
    "path": "recipes/wip/gnome/snapshot/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/GNOME/snapshot\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/converters/inkdrop/recipe.toml",
    "content": "#TODO libc crate error\n[source]\ngit = \"https://github.com/matze/inkdrop\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages inkdrop-cli gcode-converter\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/converters/vtracer/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/visioncortex/vtracer\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages vtracer\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/editors/blender/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine the minimum dependencies from cmake log\n# build instructions: https://developer.blender.org/docs/handbook/building_blender/\n[source]\ntar = \"https://download.blender.org/source/blender-5.0.1.tar.xz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DWITH_GHOST_SDL=ON\",\n    \"-DWITH_SDL=ON\",\n    \"-DWITH_EXPERIMENTAL_FEATURES=OFF\",\n]\n# dependencies = [\n#     \"dbus\",\n#     \"libdecor\",\n#     \"libjpeg\",\n#     \"libpng\",\n#     \"freetype2\",\n#     \"fontconfig\",\n#     \"zstd\",\n#     \"bzip2\",\n#     \"xz\",\n#     \"sdl2\",\n#     \"libepoxy\",\n#     \"shaderc\",\n#     \"libxml2\",\n#     \"libharu\",\n#     \"mesa-x11\",\n#     \"libxkbcommon\",\n# ]\n"
  },
  {
    "path": "recipes/wip/graphics/editors/blender-lts/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine the minimum dependencies from cmake log\n# build instructions: https://developer.blender.org/docs/handbook/building_blender/\n[source]\ngit = \"https://projects.blender.org/blender/blender\"\nbranch = \"blender-v4.5-release\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DWITH_GHOST_SDL=ON\",\n    \"-DWITH_SDL=ON\",\n    \"-DWITH_EXPERIMENTAL_FEATURES=OFF\",\n]\n# dependencies = [\n#     \"dbus\",\n#     \"libdecor\",\n#     \"libjpeg\",\n#     \"libpng\",\n#     \"freetype2\",\n#     \"fontconfig\",\n#     \"zstd\",\n#     \"bzip2\",\n#     \"xz\",\n#     \"sdl2\",\n#     \"libepoxy\",\n#     \"shaderc\",\n#     \"libxml2\",\n#     \"libharu\",\n#     \"mesa-x11\",\n#     \"libxkbcommon\",\n# ]\n"
  },
  {
    "path": "recipes/wip/graphics/editors/eyedropper/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/FineFindus/eyedropper\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/editors/opentoonz/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies\n# build instructions: https://github.com/opentoonz/opentoonz/blob/master/doc/how_to_build_linux.md\n[source]\ngit = \"https://github.com/opentoonz/opentoonz\"\nrev = \"dd4cb36142ebf65a2aa74ff8575002863d3e17fc\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"boost\",\n    \"qt5-base\",\n    \"freetype2\",\n    \"libpng\",\n    \"libmypaint\",\n    \"opencv4\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/editors/pencil2d/recipe.toml",
    "content": "#TODO missing script for qmake and gnu make\n# build instructions - https://dev.pencil2d.org/build_linux.html\n[source]\ngit = \"https://github.com/pencil2d/pencil\"\nbranch = \"release/0.7.0\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"qt6-base\",\n    \"qt6-multimedia\",\n    \"qt6-svg\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/editors/texel/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/almindor/texel\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo --no-default-features --features ion\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/appleseed/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/appleseedhq/appleseed/wiki/Building-appleseed-on-Linux\n[source]\ngit = \"https://github.com/appleseedhq/appleseed\"\nrev = \"015adb503af58cb80103e0c3ddeefc20d99d204f\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"zlib\",\n    \"qt5-base\",\n    \"libnsl\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/c-ray/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/vkoskiv/c-ray#installation\n[source]\ngit = \"https://github.com/vkoskiv/c-ray\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/cmark/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/commonmark/cmark#installing\n[source]\ngit = \"https://github.com/commonmark/cmark\"\nrev = \"5ba25ff40eba44c811f79ab6a792baf945b8307c\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/curvis/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/fragarriss/CurVis\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/darktable/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/darktable-org/darktable#linux\n# dependencies: https://github.com/darktable-org/darktable#dependencies\n[source]\ntar = \"https://github.com/darktable-org/darktable/releases/download/release-4.8.0/darktable-4.8.0.tar.xz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"gtk3\",\n    \"glib\",\n    \"sqlite3\",\n    \"gexiv2\",\n    \"liblensfun\",\n    \"liblcms\",\n    \"libpugixml\",\n    \"libavif\",\n    \"libheif\",\n    \"libwebp\",\n    \"libgphoto2\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/derive-rs/recipe.toml",
    "content": "#TODO very outdated crates\n[source]\ngit = \"https://github.com/erik/derive.rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/dify/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/jihchi/dify\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/dssim/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/kornelski/dssim\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/embree/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/embree/embree#linux-and-macos\n[source]\ngit = \"https://github.com/embree/embree\"\nrev = \"be0accfd0b246e2b03355b8ee7710a22c1b49240\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"glfw\",\n    \"onetbb\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/flowbetween/recipe.toml",
    "content": "#TODO maybe missing dependencies, see https://github.com/Logicalshift/flowbetween/blob/master/user_interfaces/gtk_ui/Cargo.toml#L11\n[source]\ngit = \"https://github.com/Logicalshift/flowbetween\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk3\",\n]\nscript = \"\"\"\ncookbook_cargo --features gtk\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/gaffer/recipe.toml",
    "content": "#TODO missing script for SCons, see https://github.com/gafferHQ/gaffer#building\n#TODO missing dependencies, see https://github.com/GafferHQ/dependencies\n[source]\ngit = \"https://github.com/GafferHQ/gaffer\"\nrev = \"9fe2e9c9025447913872d77c138a03eabcfa5df2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"inkscape\",\n    \"boost\",\n    \"embree\",\n    \"libfmt\",\n    \"freetype2\",\n    \"glew\",\n    \"imath\",\n    \"lz4\",\n    \"libffi\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libtiff\",\n    \"openexr\",\n    \"openimageio\",\n    \"openssl1\",\n    \"onetbb\",\n    \"zlib\",\n    \"qt5-full\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/glou/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Nurrl/glou\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/gmic/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/GreycLab/gmic-community/wiki/Building-from-Source\n[source]\ntar = \"https://gmic.eu/files/source/gmic_3.3.2.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"fftw\",\n    \"libpng\",\n    \"libjpeg\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/gmic-qt/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/c-koi/gmic-qt#build-instructions\n#TODO probably missing dependencies\n[source]\ngit = \"https://github.com/c-koi/gmic-qt\"\nrev = \"b616829854c0e482d63b9fe8eca48e73d7cd3bd8\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/graphviz/recipe.toml",
    "content": "#TODO Not compiled or tested\n#TODO customization - https://graphviz.org/download/source/#dependencies\n[source]\ntar = \"https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/9.0.0/graphviz-9.0.0.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"cairo\",\n    \"expat\",\n    \"freetype2\",\n    \"fontconfig\",\n    \"glib\",\n    \"libpng\",\n    \"pango\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/halo/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/bungoboingo/halo\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/hdr10plus-tool/recipe.toml",
    "content": "#TODO yeslogic-fontconfig-sys crate error\n[source]\ngit = \"https://github.com/quietvoid/hdr10plus_tool\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/image-sieve/recipe.toml",
    "content": "#TODO glutin crate error\n[source]\ngit = \"https://github.com/Futsch1/image-sieve\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/incompact3d/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/xcompact3d/Incompact3d#source-download-and-compilation\n#TODO probably missing dependencies\n[source]\ngit = \"https://github.com/xcompact3d/Incompact3d\"\nrev = \"2546f404cf3bbf78bc745d6133173c37e46c82df\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/kantig/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/DenSASoftware/kantig\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/lpl/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/SOF3/lpl\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/luxcorerender/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://wiki.luxcorerender.org/Compiling_LuxCore\n#TODO probably missing dependencies\n[source]\ngit = \"https://github.com/LuxCoreRender/LuxCore\"\nrev = \"c8f10e9ddf5171fa705782a3da3f48123f96a4cb\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"bzip2\",\n    \"libtiff\",\n    \"libpng\",\n    \"gtk3\",\n    \"boost\",\n    \"mesa\",\n    \"openimageio\",\n    \"openexr\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/lyon/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/nical/lyon\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages lyon_cli wgpu-example svg-rendering-example\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/matugen/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/InioX/matugen\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/naga/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/gfx-rs/wgpu\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages naga-cli\nmv \"${COOKBOOK_STAGE}/usr/bin/naga_naga-cli\" \"${COOKBOOK_STAGE}/usr/bin/naga\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/ocrs/recipe.toml",
    "content": "#TODO add a command to move the executable to a propeer folder\n[source]\ngit = \"https://github.com/robertknight/ocrs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages ocrs-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/oculante/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/woelper/oculante\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk3\",\n    \"libxcb\",\n    \"libalsa\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/openscad/recipe.toml",
    "content": "#TODO missing script for building, see https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Building_on_Linux/UNIX#Build_the_OpenSCAD_binary\n#TODO missing dependencies - https://github.com/openscad/openscad/#prerequisites\n[source]\ntar = \"https://files.openscad.org/openscad-2021.01.src.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"qt5-base\",\n    \"libgmp\",\n    \"libmpfr\",\n    \"boost\",\n    \"glew\",\n    \"glib\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"harfbuzz\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/ospray/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/ospray/OSPRay#building-and-finding-ospray\n[source]\ngit = \"https://github.com/ospray/OSPRay\"\nrev = \"66fa8108485a8a92ff31ad2e06081bbaf391bc26\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"librkcommon\",\n    \"embree\",\n    \"ispc\",\n    \"onetbb\",\n    \"openvkl\",\n    \"open-image-denoise\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/ospray-studio/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/ospray/ospray_studio#standard-cmake-build\n[source]\ngit = \"https://github.com/ospray/ospray_studio\"\nrev = \"d2c83a67c841f1329f47cf9648a56b3dacbcdcaa\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"ospray\",\n    \"onetbb\",\n    \"librkcommon\",\n    \"mesa\",\n    \"glfw\",\n    \"open-image-denoise\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/oxipng/recipe.toml",
    "content": "#TODO working but don't exit\n[source]\ngit = \"https://github.com/shssoichiro/oxipng\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/paraview/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://kitware.github.io/paraviewweb/docs/configure_and_build_pvweb.html\n# build instructions (if the above doesn't work) - https://github.com/Kitware/ParaView/blob/master/Documentation/dev/build.md\n[source]\ntar = \"https://www.paraview.org/paraview-downloads/download.php?submit=Download&version=v5.11&type=source&os=Sources&downloadFile=ParaView-v5.11.2.tar.xz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/paraview-data/recipe.toml",
    "content": "#TODO missing script for installation, lacking instructions\n[source]\ntar = \"https://www.paraview.org/paraview-downloads/download.php?submit=Download&version=v5.11&type=data&os=Sources&downloadFile=ParaViewTestingDataFiles-v5.11.2.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/pix-image-viewer/recipe.toml",
    "content": "#TODO proc-macro2 crate error\n[source]\ngit = \"https://github.com/google/pix-image-viewer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/pixsort/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/1jz/pixsort\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/rascii/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/orhnk/RASCII\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/rawtherapee/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://rawpedia.rawtherapee.com/Linux#Compile_RawTherapee\n#TODO missing dependencies, see https://rawpedia.rawtherapee.com/Linux#Dependencies\n[source]\ntar = \"https://rawtherapee.com/shared/source/rawtherapee-5.9.tar.xz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"gexiv2\",\n    \"expat\",\n    \"fftw\",\n    \"glib\",\n    \"gtk3\",\n    \"gtk3mm\",\n    \"libjpeg\",\n    \"liblcms\",\n    \"libpng\",\n    \"librsvg\",\n    \"libsigc++\",\n    \"libtiff\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/reve/recipe.toml",
    "content": "#TODO clearscreen crate error (after cargo update)\n[source]\ngit = \"https://github.com/ONdraid/reve\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages reve-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/rimage/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/SalOne22/rimage\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/satty/recipe.toml",
    "content": "#TODO make gtk4 work\n[source]\ngit = \"https://github.com/gabm/Satty\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n    \"cairo\",\n    \"glib\",\n    \"pango\",\n    \"gdk-pixbuf\",\n]\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/applications\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/icons/hicolor/scalable/apps\ncp -rv \"${COOKBOOK_SOURCE}\"/satty.desktop \"${COOKBOOK_STAGE}\"/usr/share/applications\ncp -rv \"${COOKBOOK_SOURCE}\"/assets/satty.svg \"${COOKBOOK_STAGE}\"/usr/share/icons/hicolor/scalable/apps\ncookbook_cargo_packages satty\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/shadergarden/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/tonarino/shadergarden\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/simp/recipe.toml",
    "content": "#TODO wayland-backend crate error\n[source]\ngit = \"https://github.com/Kl4rry/simp\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/smag/recipe.toml",
    "content": "#TODO outdated redox_syscall crate (after cargo update)\n[source]\ngit = \"https://github.com/aantn/smag\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/toybrot/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/VileLasagna/toyBrot#building-toybrot\n[source]\ngit = \"https://gitlab.com/VileLasagna/toyBrot\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"sdl2\",\n    \"libpng\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/tungsten-renderer/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/tunabrain/tungsten#compilation\n[source]\ngit = \"https://github.com/tunabrain/tungsten\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/viu/recipe.toml",
    "content": "#TODO working but don't exit\n[source]\ngit = \"https://github.com/atanunq/viu\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/other/vulkan-tools/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/KhronosGroup/Vulkan-Tools/blob/main/BUILD.md\n[source]\ngit = \"https://github.com/KhronosGroup/Vulkan-Tools\"\nrev = \"7e75f4d389799129b79f90d1401f15f511796dbd\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DUPDATE_DEPS=ON\"\n]\n"
  },
  {
    "path": "recipes/wip/graphics/other/watch-stl/recipe.toml",
    "content": "#TODO update the winit version\n[source]\ngit = \"https://github.com/bddap/watch-stl-rust\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/shaders/glsl-viewer/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/patriciogonzalezvivo/glslViewer/wiki/Compile-on-linux#3-compile\n[source]\ngit = \"https://github.com/patriciogonzalezvivo/glslViewer\"\nrev = \"7eb6254cb4cedf03f1c78653f90905fe0c3b48fb\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"mesa-glu\",\n    \"ncurses\",\n    \"ncursesw\",\n    \"ffmpeg6\",\n    \"glfw3\",\n]\nscript = \"\"\"\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/shaders/glslang/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/KhronosGroup/glslang#building-cmake\n[source]\ngit = \"https://github.com/KhronosGroup/glslang\"\nrev = \"16.0.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/graphics/shaders/shadertoy-rs/recipe.toml",
    "content": "#TODO outdated crates\n[source]\ngit = \"https://github.com/fmenozzi/shadertoy-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/shaders/vibe/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/TornaxO7/vibe\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libxkbcommon\",\n    \"libwayland\",\n    \"libalsa\",\n]\n"
  },
  {
    "path": "recipes/wip/graphics/terminal/3d-terminal-renderer/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ryanweideman/3d-terminal-renderer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/terminal/aarty/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/0x61nas/aarty\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/terminal/ascii-image/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/kpberry/image-to-ascii\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/terminal/blockpaint/recipe.toml",
    "content": "#TODO don't fetch private submodule\n[source]\ngit = \"https://github.com/wooster0/blockpaint\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/terminal/display3d/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/redpenguinyt/display3d\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/display3d\ncp -rv \"${COOKBOOK_SOURCE}\"/resources/* \"${COOKBOOK_STAGE}\"/usr/share/display3d\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/graphics/terminal/img2text/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/yvt/img2text\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/terminal/kakikun/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/file-acomplaint/kakikun\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/terminal/sloth/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/ecumene/rust-sloth\"\nscript = \"rm Cargo.lock\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/terminal/tapciify/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/tapnisu/tapciify\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/graphics/viewers/exhibit/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Nokse22/Exhibit\"\nrev = \"v1.5.1\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/graphics/vr/alvr/recipe.toml",
    "content": "#TODO missing script for cargo-xtask, see: https://github.com/alvr-org/ALVR/wiki/Building-From-Source\n#TODO probably missing dependencies, see: https://github.com/alvr-org/ALVR/wiki/Building-From-Source#streamer-building\n[source]\ngit = \"https://github.com/alvr-org/ALVR\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n    \"gtk3\",\n    \"libvulkan\",\n    \"libunwind\",\n    \"x264\",\n    \"x265\",\n    \"libxcb\",\n    \"libxkbcommon\",\n    \"libva\",\n    \"pipewire\",\n]\n"
  },
  {
    "path": "recipes/wip/gui/gpcl/recipe.toml",
    "content": "#TODO wayland-backend crate error\n[source]\ngit = \"https://github.com/dngulin/gpcl\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/gui/ordinary/recipe.toml",
    "content": "#TODO update async-io and rustix\n[source]\ngit = \"https://gitlab.com/floers/ordinary\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages ordinary\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/gui/slop/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/naelstrof/slop\"\nrev = \"v7.7\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libxext\",\n    \"glew\",\n    \"libglm\",\n]\n"
  },
  {
    "path": "recipes/wip/health/blanket/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rafaelmardojai/blanket\"\nrev = \"0.8.0\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gstreamer\",\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/health/dosage/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n[source]\ngit = \"https://github.com/diegopvlk/Dosage\"\nrev = \"v2.1.2\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/hw/piper/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/libratbag/piper\"\nrev = \"0.8\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Druntime-dependency-checks=false\",\n]\ndependencies = [\n    \"libratbag\",\n    \"gtk3\",\n    \"cairo\",\n    \"libevdev\",\n]\n"
  },
  {
    "path": "recipes/wip/icons/adwaita-icon-theme/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/adwaita-icon-theme/49/adwaita-icon-theme-49.0.tar.xz\"\nblake3 = \"757eedf680c4ae564d887dd9eccfeab2d4101e0bdfdb10288a072ba4530fb0e5\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/icons/adwaita-icon-theme/redox.patch",
    "content": "diff -ruwN source-old/meson.build source/meson.build\n--- source-old/meson.build\t2025-09-12 05:48:02.000000000 -0600\n+++ source/meson.build\t2025-11-13 12:05:28.819996707 -0700\n@@ -90,14 +90,14 @@\n   endforeach\n endif\n \n-gtk_update_icon_cache = find_program(\n-  'gtk4-update-icon-cache',\n-  'gtk-update-icon-cache',\n-  required : true,\n-)\n-meson.add_install_script(\n-  gtk_update_icon_cache,\n-  '-qtf',\n-  get_option('prefix') / adwaita_dir,\n-  skip_if_destdir: true,\n-)\n+#gtk_update_icon_cache = find_program(\n+#  'gtk4-update-icon-cache',\n+#  'gtk-update-icon-cache',\n+#  required : true,\n+#)\n+#meson.add_install_script(\n+#  gtk_update_icon_cache,\n+#  '-qtf',\n+#  get_option('prefix') / adwaita_dir,\n+#  skip_if_destdir: true,\n+#)\n"
  },
  {
    "path": "recipes/wip/icons/breeze-icons/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/breeze-icons-5.112.0.tar.xz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/image/converters/dipc/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/doprz/dipc\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/editors/ascii-draw/recipe.toml",
    "content": "#TODO not compiled or tested\n# probably missing dependencies\n[source]\ngit = \"https://github.com/Nokse22/ascii-draw\"\nrev = \"v1.1.0\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/image/editors/drawing/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from meson log\n# build instructions: https://github.com/maoschanz/drawing/blob/master/CONTRIBUTING.md#install-from-source-code\n# dependencies: https://github.com/maoschanz/drawing/blob/master/CONTRIBUTING.md#dependencies\n[source]\ngit = \"https://github.com/maoschanz/drawing\"\nbranch = \"1.0.x-stable\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Denable-translations-and-appdata=false\"\n]\n#dependencies = [\n#    \"gtk3\",\n#    \"cairo\",\n#]\n"
  },
  {
    "path": "recipes/wip/image/editors/inkscape/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://inkscape.org/develop/getting-started/#compile\n# build options: https://gitlab.com/inkscape/inkscape/-/blob/master/CMakeLists.txt?ref_type=heads#L87\n[source]\ntar = \"https://inkscape.org/gallery/item/58914/inkscape-1.4.3.tar.xz\"\n[build]\ntemplate = \"cmake\"\n# dependencies = [\n#     \"boost\",\n#     \"glib\",\n#     \"glibmm\",\n#     \"gtk3\",\n#     \"gtk3mm\",\n#     \"gdk-pixbuf\",\n#     \"gtksourceview\",\n#     \"cairo\",\n#     \"cairomm\",\n#     \"pango\",\n#     \"pangomm\",\n#     \"readline\",\n#     \"fontconfig\",\n#     \"freetype2\",\n#     \"imagemagick\",\n#     \"potrace\",\n#     \"zlib\",\n#     \"lib2geom\",\n#     \"atkmm\",\n#     \"harfbuzz\",\n#     \"libblas\",\n#     \"libsoup\",\n#     \"libsigc++\",\n#     \"librsvg\",\n#     \"librevenge\",\n#     \"libwpd\",\n#     \"libpng\",\n#     \"libvisio\",\n#     \"libxml2\",\n#     \"libxslt\",\n#     \"libcdr\",\n#     \"libgsl\",\n#     \"libgspell-gtk3\",\n#     \"libjpeg\",\n#     \"liblcms\",\n#     \"liblapack\",\n# ]\n"
  },
  {
    "path": "recipes/wip/image/editors/rx/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/cloudhead/rx\"\nscript = \"rm Cargo.lock\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/editors/watermarker/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/xomvio/watermarker\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/editors/xpano/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/krupkat/xpano#development\n# linux script: https://github.com/krupkat/xpano/blob/main/misc/build/build-ubuntu-22.sh\n[source]\ngit = \"https://github.com/krupkat/xpano\"\nrev = \"5e626f66d2670a7f3fd04e805610ef98a506e401\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"gtk3\",\n    \"opencv4\",\n    \"sdl2\",\n    \"libspdlog\",\n]\n"
  },
  {
    "path": "recipes/wip/image/other/converseen/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Faster3ck/Converseen/blob/main/INSTALL.md#install-converseen-using-qt6\n[source]\ngit = \"https://github.com/Faster3ck/Converseen\"\nrev = \"9b2821b5ed6673a7abebbe4ee42f4718ab366485\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt6-base\",\n]\n"
  },
  {
    "path": "recipes/wip/image/other/curtail/recipe.toml",
    "content": "#TODO missing dependencies: https://github.com/Huluti/Curtail#tech\n# build instructions: https://github.com/Huluti/Curtail#build-from-source-nightly\n[source]\ngit = \"https://github.com/Huluti/Curtail\"\nrev = \"1.13.0\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/image/other/dominant-colours/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/alexwlchan/dominant_colours\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/other/ferrishot/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nik-rev/ferrishot\"\n[build]\ndependencies = [\n    \"mesa\",\n    \"libx11\",\n    \"libwayland\",\n    \"libxcb\",\n]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/other/graphicsmagick/recipe.toml",
    "content": "#TODO compilation error: missing sys/poll.h\n#TODO more features: http://www.graphicsmagick.org/README.html#add-on-libraries-programs\n[source]\ntar = \"https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/1.3.42/GraphicsMagick-1.3.42.tar.xz/download\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"bzip2\",\n    \"freetype2\",\n    #\"libwebp\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libtiff\",\n    \"libxml2\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/image/other/imageflow/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/imazen/imageflow\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n    \"libpng\",\n]\nscript = \"\"\"\ncookbook_cargo_packages imageflow_tool_lib\nmv \"${COOKBOOK_STAGE}/usr/bin/imageflow_tool\" \"${COOKBOOK_STAGE}/usr/bin/imageflow-tool\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/image/other/imagemagick/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://imagemagick.org/archive/releases/ImageMagick-7.1.1-23.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/image/other/jpegoptim/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/tjko/jpegoptim/releases/download/v1.5.6/jpegoptim-1.5.6.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libjpeg\",\n]\n"
  },
  {
    "path": "recipes/wip/image/other/jxl-oxide/recipe.toml",
    "content": "#TODO missing header on compilation\n[source]\ngit = \"https://github.com/tirr-c/jxl-oxide\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages jxl-oxide-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/image/other/lsix/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/hackerb9/lsix\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp \"${COOKBOOK_SOURCE}\"/lsix \"${COOKBOOK_STAGE}\"/usr/bin/lsix\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/lsix\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/image/other/oxvg/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/noahbald/oxvg\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages oxvg\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/image/other/pngquant/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/kornelski/pngquant\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/other/satpaper/recipe.toml",
    "content": "#TODO atools crate error\n[source]\ngit = \"https://github.com/Colonial-Dev/satpaper\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/other/sic/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/foresterre/sic\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/upscaling/jdpixelupscaler/recipe.toml",
    "content": "#TODO maybe incomplete script\n#TODO determine the dependencies\n[source]\ngit = \"https://codeberg.org/JakobDev/jdPixelUpscaler\"\nrev = \"05eb4f3a4a9d24b6d818522483d88caa6b201e2e\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"qt6-base\",\n]\n"
  },
  {
    "path": "recipes/wip/image/upscaling/rscale2x/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/ahmetmutlugun/rscale2x\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/upscaling/upscaler/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/World/Upscaler#meson\n[source]\ngit = \"https://gitlab.gnome.org/World/Upscaler\"\nrev = \"1.6.3\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dnetwork_tests=false\",\n]\ndev-dependencies = [\n    \"host:blueprint\" # add script for linux compilation\n]\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/image/upscaling/upscaler-rs/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/DhruvDh/upscaler\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/image/upscaling/upscayl-ncnn/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/upscayl/upscayl-ncnn\"\nrev = \"d02fa88e078e7109fd689932453362430144014d\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libvulkan\",\n    \"openmp\",\n]\nscript = \"\"\"\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/src\"\nDYNAMIC_INIT\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/image/upscaling/video2x/recipe.toml",
    "content": "#TODO maybe incomplete script\n[source]\ngit = \"https://github.com/k4yt3x/video2x\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/video2x\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/share/video2x\necho \"#!/usr/bin/env sh \\n cd /usr/share/video2x \\n python3 -m video2x\" > \"${COOKBOOK_STAGE}\"/usr/bin/video2x\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/video2x\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/kde/ark/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n[source]\ngit = \"https://invent.kde.org/utilities/ark\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libarchive\",\n]\n"
  },
  {
    "path": "recipes/wip/kde/discover/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n[source]\ngit = \"https://invent.kde.org/plasma/discover\"\nbranch = \"Plasma/6.6\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/kde/k3b/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://invent.kde.org/multimedia/k3b/-/blob/master/INSTALL.txt?ref_type=heads\n[source]\ngit = \"https://invent.kde.org/multimedia/k3b\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DK3B_DOC=OFF\",\n    \"-DK3B_ENABLE_TAGLIB=OFF\",\n    \"-DK3B_ENABLE_DVD_RIPPING=OFF\",\n    \"-DK3B_BUILD_MUSE_DECODER_PLUGIN=OFF\",\n    \"-DK3B_BUILD_FLAC_DECODER_PLUGIN=OFF\",\n    \"-DK3B_BUILD_SNDFILE_DECODER_PLUGIN=OFF\",\n    \"-DK3B_BUILD_LAME_ENCODER_PLUGIN=OFF\",\n    \"-DK3B_BUILD_SOX_ENCODER_PLUGIN=OFF\",\n    \"-DK3B_BUILD_EXTERNAL_ENCODER_PLUGIN=OFF\",\n    \"-DK3B_BUILD_WAVE_DECODER_PLUGIN=OFF\",\n]\ndependencies = [\n    \"libcdio-paranoia\",\n]\n"
  },
  {
    "path": "recipes/wip/kde/kamoso/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies: https://invent.kde.org/multimedia/kamoso/-/blob/master/CMakeLists.txt?ref_type=heads#L29\n[source]\ngit = \"https://invent.kde.org/multimedia/kamoso\"\nbranch = \"release/25.12\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_DOC=OFF\",\n]\ndependencies = [\n    \"qt6-base\",\n]\n"
  },
  {
    "path": "recipes/wip/kde/kde-dolphin/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n[source]\ngit = \"https://invent.kde.org/system/dolphin\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/kde/kdenlive/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://invent.kde.org/multimedia/kdenlive/-/blob/master/dev-docs/build.md#build-and-install-the-projects\n[source]\ngit = \"https://invent.kde.org/multimedia/kdenlive\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_TESTING=OFF\",\n    \"-DUSE_DBUS=OFF\",\n]\n# dependencies = [\n#     \"mlt\",\n#     \"ffmpeg6\",\n#     \"qt5-declarative\",\n#     \"qt5-tools\",\n#     \"qt5-multimedia\",\n#     \"qt5-svg\",\n#     \"qt5-quickcontrols\",\n#     \"qt5-quickcontrols2\",\n#     \"qt5-networkauth\",\n#     \"kf5-archive\",\n#     \"kf5-bookmarks\",\n#     \"kf5-codecs\",\n#     \"kf5-config\",\n#     \"kf5-configwidgets\",\n#     \"kf5-coreaddons\",\n#     \"kf5-crash\",\n#     \"kf5-dbusaddons\",\n#     \"kf5-declarative\",\n#     \"kf5-filemetadata\",\n#     \"kf5-guiaddons\",\n#     \"kf5-iconthemes\",\n#     \"kf5-init\",\n#     \"kf5-io\",\n#     \"kf5-newstuff\",\n#     \"kf5-notifications\",\n#     \"kf5-notifyconfig\",\n#     \"kf5-purpose\",\n#     \"kf5-textwidgets\",\n#     \"kf5-widgetaddons\",\n#     \"kf5-xmlgui\",\n#     \"breeze-icons\",\n# ]\n"
  },
  {
    "path": "recipes/wip/kde/kdevelop/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n[source]\ngit = \"https://invent.kde.org/kdevelop/kdevelop\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_DOC=OFF\",\n]\n# dependencies = [\n#     \"apr\",\n#     \"apr-util\",\n#     \"astyle\",\n#     \"boost\",\n#     \"libgrantlee\",\n#     \"libkomparediff2\",\n#     \"kf5-archive\",\n#     \"kf5-config\",\n#     \"kf5-crash\",\n#     \"kf5-cmutils\",\n#     \"kf5-extra-cmake-modules\",\n#     \"kf5-declarative\",\n#     \"kf5-doctools\",\n#     \"kf5-guiaddons\",\n#     \"kf5-i18n\",\n#     \"kf5-iconthemes\",\n#     \"kf5-itemmodels\",\n#     \"kf5-itemviews\",\n#     \"kf5-io\",\n#     \"kf5-jobwidgets\",\n#     \"kf5-newstuff\",\n#     \"kf5-notifications\",\n#     \"kf5-notifyconfig\",\n#     \"kf5-parts\",\n#     \"kf5-plasma-framework\",\n#     \"kf5-purpose\",\n#     \"kf5-runner\",\n#     \"kf5-service\",\n#     \"kf5-sonnet\",\n#     \"kf5-sysguard\",\n#     \"kf5-texteditor\",\n#     \"kf5-threadweaver\",\n#     \"kf5-widgetaddons\",\n#     \"kf5-windowsystem\",\n#     \"kf5-xmlgui\",\n#     \"qt5-base\",\n#     \"qt5-declarative\",\n#     \"qt5-tools\",\n#     \"qt5-webkit\",\n#     \"okteta\",\n#     \"shared-mime-info\",\n# ]\n"
  },
  {
    "path": "recipes/wip/kde/kpatience/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n[source]\ngit = \"https://invent.kde.org/games/kpat\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_DOC=OFF\",\n]\n"
  },
  {
    "path": "recipes/wip/kde/krita/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://docs.krita.org/en/untranslatable_pages/building_krita.html#building-on-linux\n[source]\ngit = \"https://invent.kde.org/graphics/krita\"\nbranch = \"release/5.2.14\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DLIMIT_LONG_TESTS=OFF\",\n    \"-DENABLE_UPDATERS=OFF\",\n]\n# dependencies = [\n#     \"gexiv2\",\n#     \"ffmpeg6\",\n#     \"fftw\",\n#     \"fontconfig\",\n#     \"freetype2\",\n#     \"fribidi\",\n#     \"libgif\",\n#     \"harfbuzz\",\n#     \"liblcms\",\n#     \"libpng\",\n#     \"libtiff\",\n#     \"libwebp\",\n#     \"qt5-base\",\n#     \"qt5-svg\",\n#     \"zlib\",\n#     \"libmypaint\",\n#     \"boost\",\n#     \"libheif\",\n#     \"libjpeg\",\n#     \"libjxl\",\n#     \"kf5-extra-cmake-modules\",\n#     \"kf5-completion\",\n#     \"kf5-config\",\n#     \"kf5-coreaddons\",\n#     \"kf5-crash\",\n#     \"kf5-guiaddons\",\n#     \"kf5-i18n\",\n#     \"kf5-itemviews\",\n#     \"kf5-widgetaddons\",\n#     \"kf5-windowsystem\",\n#     \"mlt\",\n#     \"opencolorio\",\n#     \"openexr\",\n#     \"openjpeg\",\n#     \"sdl2\",\n#     \"libxi\",\n#     \"zlib\",\n#     \"libeigen\",\n#     \"libgsl\",\n#     \"libseexpr-kde\",\n#     \"liblager\",\n#     \"libunibreak\",\n#     \"libxsimd\",\n#     \"libxtl\",\n# ]\n"
  },
  {
    "path": "recipes/wip/kde/ktorrent/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n[source]\ngit = \"https://invent.kde.org/network/ktorrent\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/kde/kwave/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://invent.kde.org/multimedia/kwave\"\nrev = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"--preset=release\",\n    \"-DWITH_DOC=OFF\",\n    \"-DWITH_FLAC=OFF\",\n    \"-DWITH_OSS=OFF\",\n]\ndependencies = [\n    \"libpulse\",\n    \"libmad\",\n    #\"libsamplerate\",\n    #\"libogg\",\n    #\"libvorbis\",\n    #\"libflac\",\n    #\"fftw\",\n]\n"
  },
  {
    "path": "recipes/wip/kde/marble/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n[source]\ngit = \"https://invent.kde.org/education/marble\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_WITH_DBUS=OFF\",\n]\n"
  },
  {
    "path": "recipes/wip/kde/okteta/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n#TODO missing dependencies\n[source]\ngit = \"https://invent.kde.org/utilities/okteta\"\nrev = \"fb6150f2dce791c96b95a12ee0c74942c1774c05\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/kde/skanpage/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n[source]\ngit = \"https://invent.kde.org/utilities/skanpage\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\"--preset=release\"]\ndependencies = [\n    \"sane-backends\",\n]\n"
  },
  {
    "path": "recipes/wip/lang/kana/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from meson log\n[source]\ngit = \"https://gitlab.gnome.org/fkinoshita/kana\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/lang/uroman-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/stellanomia/uroman-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/libs/archives/libzip/recipe.toml",
    "content": "#TODO Promote\n[source]\ntar = \"https://libzip.org/download/libzip-1.10.1.tar.gz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/audio/boca/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/enzo1982/boca/#installation\n[source]\ntar = \"https://github.com/enzo1982/BoCA/releases/download/v1.0.7/boca-1.0.7.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libsmooth\",\n    \"libpulse\",\n    \"libcdio\",\n    \"libcdio-paranoia\",\n    \"expat\",\n    \"liburiparser\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/audio/libalsa/recipe.toml",
    "content": "#TODO maybe wrong template\n# build instructions - https://git.alsa-project.org/?p=alsa-lib.git;a=blob;f=INSTALL;h=a2427e072bcaf951addc3e1db1fccccf44f3b59b;hb=HEAD\n[source]\ntar = \"http://www.alsa-project.org/files/pub/lib/alsa-lib-1.2.13.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/audio/libcanberra/recipe.toml",
    "content": "#TODO no audio backend supported\n[source]\ntar = \"http://0pointer.de/lennart/projects/libcanberra/libcanberra-0.30.tar.xz\"\nblake3 = \"ea02f4b5a00bfffce1d29ce73e1cf5351027208cbeb58bf9954e84ad120e6daa\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"gtk3\",\n    \"libtool\",\n    \"libvorbis\",\n]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/audio/libopenshot-audio/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n[source]\ngit = \"https://github.com/OpenShot/libopenshot-audio\"\nrev = \"v0.5.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_AUDIO_DOCS=OFF\",\n    \"-DAUTO_INSTALL_DOCS=OFF\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/audio/mpg123/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://mpg123.de/download/mpg123-1.33.2.tar.bz2\"\nblake3 = \"1e604dc14160a8852ef6b880643e3534f44e410af1fd5ba29a80ff960a54e834\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/audio/openal/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/kcat/openal-soft/archive/refs/tags/1.24.1.tar.gz\"\nblake3 = \"da65f839d4cee560371d08fc977f90757f964f49b14655b1d8d43f779c90a815\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"liborbital\",\n    \"libsndfile\",\n    \"mesa\",\n    \"sdl2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/include/SDL2\"\nexport CXXFLAGS=\"${CXXFLAGS} -I${COOKBOOK_SYSROOT}/include/SDL2\"\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DALSOFT_EXAMPLES=OFF\n    -DALSOFT_INSTALL_EXAMPLES=OFF\n    -DALSOFT_INSTALL_UTILS=OFF\n    -DALSOFT_UTILS=OFF\n    -DALSOFT_BACKEND_SDL2=ON\n    -DALSOFT_REQUIRE_SDL2=ON\n)\nif [ \"${COOKBOOK_DYNAMIC}\" == \"1\" ]\nthen\n    COOKBOOK_CMAKE_FLAGS+=(-DLIBTYPE=SHARED)\nelse\n    COOKBOOK_CMAKE_FLAGS+=(-DLIBTYPE=STATIC)\nfi\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/audio/openal/redox.patch",
    "content": "diff -ruwN openal-soft-1.24.1/CMakeLists.txt source/CMakeLists.txt\n--- openal-soft-1.24.1/CMakeLists.txt\t2024-11-27 20:21:16.000000000 -0700\n+++ source/CMakeLists.txt\t2025-01-09 14:35:09.422985283 -0700\n@@ -1200,7 +1200,7 @@\n         set(HAVE_SDL2 1)\n         set(ALC_OBJS  ${ALC_OBJS} alc/backends/sdl2.cpp alc/backends/sdl2.h)\n         set(BACKENDS  \"${BACKENDS} SDL2,\")\n-        set(EXTRA_LIBS ${EXTRA_LIBS} SDL2::SDL2)\n+        set(EXTRA_LIBS ${EXTRA_LIBS} ${SDL2_LIBRARIES})\n     else()\n         message(STATUS \"Could NOT find SDL2\")\n     endif()\ndiff -ruwN openal-soft-1.24.1/common/alstring.cpp source/common/alstring.cpp\n--- openal-soft-1.24.1/common/alstring.cpp\t2024-11-27 20:21:16.000000000 -0700\n+++ source/common/alstring.cpp\t2025-01-09 09:35:50.263542017 -0700\n@@ -40,8 +40,8 @@\n     auto ch1end = ch1 + std::min(str0.size(), str1.size());\n     while(ch1 != ch1end)\n     {\n-        const auto u0 = std::towupper(Traits::to_int_type(*ch0));\n-        const auto u1 = std::towupper(Traits::to_int_type(*ch1));\n+        const auto u0 = towupper(Traits::to_int_type(*ch0));\n+        const auto u1 = towupper(Traits::to_int_type(*ch1));\n         if(const auto diff = static_cast<int>(u0-u1)) return diff;\n         ++ch0; ++ch1;\n     }\ndiff -ruwN openal-soft-1.24.1/common/althreads.h source/common/althreads.h\n--- openal-soft-1.24.1/common/althreads.h\t2024-11-27 20:21:16.000000000 -0700\n+++ source/common/althreads.h\t2025-01-09 09:31:58.064326293 -0700\n@@ -9,7 +9,7 @@\n #define WIN32_LEAN_AND_MEAN\n #include <windows.h>\n \n-#elif defined(__APPLE__)\n+#elif defined(__APPLE__) || defined(__redox__)\n \n #include <pthread.h>\n \n@@ -79,7 +79,7 @@\n     [[nodiscard]]\n     auto get() const noexcept -> T { return from_ptr(TlsGetValue(mTss)); }\n \n-#elif defined(__APPLE__)\n+#elif defined(__APPLE__) || defined(__redox__)\n \n     pthread_key_t mTss{};\n \ndiff -ruwN openal-soft-1.24.1/core/helpers.cpp source/core/helpers.cpp\n--- openal-soft-1.24.1/core/helpers.cpp\t2024-11-27 20:21:16.000000000 -0700\n+++ source/core/helpers.cpp\t2025-01-09 09:36:47.992595649 -0700\n@@ -372,7 +372,7 @@\n bool SetRTPriorityPthread(int prio [[maybe_unused]])\n {\n     int err{ENOTSUP};\n-#if defined(HAVE_PTHREAD_SETSCHEDPARAM) && !defined(__OpenBSD__)\n+#if defined(HAVE_PTHREAD_SETSCHEDPARAM) && !defined(__OpenBSD__) && !defined(__redox__)\n     /* Get the min and max priority for SCHED_RR. Limit the max priority to\n      * half, for now, to ensure the thread can't take the highest priority and\n      * go rogue.\n"
  },
  {
    "path": "recipes/wip/libs/audio/soundtouch/recipe.toml",
    "content": "#TODO missing script for building\n[source]\ntar = \"https://www.surina.net/soundtouch/soundtouch-2.3.2.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/audio/speex/recipe.toml",
    "content": "#TODO Compiled but not tested\n[source]\ntar = \"http://downloads.xiph.org/releases/speex/speex-1.2.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/audio/speexdsp/recipe.toml",
    "content": "#TODO Compiled but not tested\n[source]\ntar = \"http://downloads.xiph.org/releases/speex/speexdsp-1.2.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/audio/zmusic/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/ZDoom/ZMusic#readme\n[source]\ngit = \"https://github.com/ZDoom/ZMusic\"\nrev = \"1.3.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/debug/libbacktrace/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ianlancetaylor/libbacktrace\"\nrev = \"b9e40069c0b47a722286b94eb5231f7f05c08713\"\nshallow_clone = true\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/fs/libattr/recipe.toml",
    "content": "#TODO can't find the sys/xattr.h file\n[source]\ntar = \"https://download.savannah.nongnu.org/releases/attr/attr-2.5.2.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/fs/libnfs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/sahlberg/libnfs/blob/master/INSTALL\n[source]\ngit = \"https://github.com/sahlberg/libnfs\"\nrev = \"libnfs-6.0.2\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/fs/physicsfs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/icculus/physfs/blob/main/docs/INSTALL.txt\n[source]\ngit = \"https://github.com/icculus/physfs\"\nbranch = \"stable-3.2\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DPHYSFS_BUILD_TEST=OFF\",\n    \"-DPHYSFS_BUILD_DOCS=OFF\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/at-spi2-core/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/at-spi2-core/-/blob/main/INSTALL?ref_type=heads\n[source]\ntar = \"https://download.gnome.org/sources/at-spi2-core/2.57/at-spi2-core-2.57.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Ddefault_bus=dbus-daemon\",\n    \"-Dintrospection=false\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/atkmm/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/atkmm/2.36/atkmm-2.36.3.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"atk\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/clutter/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/Archive/clutter#building-and-installation\n[source]\ntar = \"https://download.gnome.org/sources/clutter/1.26/clutter-1.26.4.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"glib\",\n    \"json-glib\",\n    \"atk\",\n    \"cairo\",\n    \"pango\",\n    \"cogl\",\n    \"libxcb\",\n    \"libxcomposite\n    \"libxdamage\",\n    \"libxext\",\n    \"libxkbcommon\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/clutter-gst/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/Archive/clutter-gst/-/blob/master/INSTALL\n[source]\ntar = \"https://download.gnome.org/sources/clutter-gst/3.0/clutter-gst-3.0.27.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"glib\",\n    \"cogl\",\n    \"clutter\",\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/clutter-gtk/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ntar = \"https://download.gnome.org/sources/clutter-gtk/1.8/clutter-gtk-1.8.4.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"clutter\",\n    \"gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/cogl/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/cogl/1.22/cogl-1.22.8.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"mesa-x11\",\n    \"libxcomposite\",\n    \"libxdamage\",\n    \"libxext\",\n    \"libxfixes\",\n    #\"libwayland\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/dconf/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/dconf/0.49/dconf-0.49.0.tar.xz\"\nblake3 = \"41ee23bdab3208f7a08efa134a481c852874dc5846433a665c5a5149511a7659\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"dbus\",\n    \"glib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dbash_completion=false\",\n    \"-Dman=false\",\n    \"-Dvapi=false\",\n    \"--force-fallback-for=gvdb\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/dconf/redox.patch",
    "content": "diff -ruwN source-old/shm/dconf-shm.c source/shm/dconf-shm.c\n--- source-old/shm/dconf-shm.c\t2025-09-15 09:53:57.000000000 -0600\n+++ source/shm/dconf-shm.c\t2025-11-15 08:08:47.412198178 -0700\n@@ -148,7 +148,7 @@\n \n       close (fd);\n \n-      unlink (filename);\n+      //TODO: redoxfs bug: unlink (filename);\n     }\n \n   g_free (filename);\n"
  },
  {
    "path": "recipes/wip/libs/gnome/dspy/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ntar = \"https://download.gnome.org/sources/dspy/1.2/dspy-1.2.1.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gegl/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/gegl/-/blob/master/docs/development.adoc?ref_type=heads#user-content-debugging\n[source]\ntar = \"https://download.gimp.org/pub/gegl/0.4/gegl-0.4.46.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Ddocs=false\",\n    \"-Dgi-docgen=false\",\n    \"-Dintrospection=false\",\n    \"-Dparallel-tests=false\",\n]\ndependencies = [\n    \"libpng\",\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gexiv2/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/gexiv2/-/blob/master/INSTALLING?ref_type=heads\n[source]\ntar = \"https://download.gnome.org/sources/gexiv2/0.14/gexiv2-0.14.2.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\"\n]"
  },
  {
    "path": "recipes/wip/libs/gnome/glib-networking/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/glib-networking/2.80/glib-networking-2.80.1.tar.xz\"\nblake3 = \"114a3ea41ea33d8cd01a61381b49fbf60278212ddd88c65f70c26137217be3fd\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"glib\",\n    \"gnutls3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Ddefault_library=shared \\\n    -Dgnome_proxy=disabled \\\n    -Dlibproxy=disabled\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/glib-networking/redox.patch",
    "content": "diff -ruwN source-old/tls/tests/meson.build source/tls/tests/meson.build\n--- source-old/tls/tests/meson.build\t2025-01-08 14:51:06.000000000 -0700\n+++ source/tls/tests/meson.build\t2025-11-10 20:33:28.041098208 -0700\n@@ -40,7 +40,7 @@\n test_programs = [\n   ['certificate', [], deps, [], [mock_pkcs11_module]],\n   ['file-database', [], deps, [], []],\n-  ['connection', ['mock-interaction.c'], deps, [], [mock_pkcs11_module]],\n+  #TODO: RTLD_NEXT on Redox: ['connection', ['mock-interaction.c'], deps, [], [mock_pkcs11_module]],\n # DTLS tests are disabled until we fix https://gitlab.gnome.org/GNOME/glib-networking/issues/49\n #  ['dtls-connection', ['mock-interaction.c', 'lossy-socket.c'], deps, [], [mock_pkcs11_module]],\n ]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/glibmm/recipe.toml",
    "content": "#TODO probably wrong template, see https://gitlab.gnome.org/GNOME/glibmm#building\n[source]\ntar = \"https://download.gnome.org/sources/glibmm/2.78/glibmm-2.78.0.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gnome2-common/recipe.toml",
    "content": "#TODO probably wrong template\n[source]\ntar = \"https://download.gnome.org/sources/gnome-common/2.34/gnome-common-2.34.0.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gnome3-common/recipe.toml",
    "content": "#TODO Needs to determine the build system script\n[source]\ntar = \"https://download.gnome.org/sources/gnome-common/3.18/gnome-common-3.18.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gobject-introspection/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/gobject-introspection/1.84/gobject-introspection-1.84.0.tar.xz\"\nblake3 = \"e01a810629b11b2fa415ba47d2df3ba521286e9933f6c2b364e959c26401eb96\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"cairo\",\n    \"glib\",\n    \"libffi\",\n    \"pcre2\",\n    \"python312\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson -Dpython=\"${COOKBOOK_SYSROOT}/usr/bin/python3.12\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/graphene/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/ebassi/graphene#installation\n[source]\ntar = \"https://download.gnome.org/sources/graphene/1.10/graphene-1.10.8.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=false\",\n    \"-Dintrospection=false\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtk-engines/recipe.toml",
    "content": "#TODO configuration problem, can't recognize the Redox target\n[source]\ntar = \"https://download.gnome.org/sources/gtk-engines/2.91/gtk-engines-2.91.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtk-vnc/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/gtk-vnc/1.5/gtk-vnc-1.5.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\"\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtk2/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-2-24/INSTALL.in\n[source]\ntar = \"https://download.gnome.org/sources/gtk%2B/2.24/gtk%2B-2.24.33.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"atk\",\n    \"glib\",\n    \"pango\",\n    \"gdk-pixbuf\",\n    \"cairo\",\n    \"gobject-introspection\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtk2mm/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/gtkmm/2.24/gtkmm-2.24.5.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"gtk2\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtk3/recipe.toml",
    "content": "#TODO promote\n[source]\ntar = \"https://download.gnome.org/sources/gtk+/3.24/gtk%2B-3.24.43.tar.xz\"\nblake3 = \"5feab2bad81e6b5906895f70ddce6227cf96a6a14b16af0ef72c79991a48ddf4\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    #TODO \"gobject-introspection\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libwayland\",\n    \"libx11\",\n    \"libxau\",\n    \"libxkbcommon\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxi\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"wayland-protocols\",\n    \"x11proto\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCFLAGS=\"${CFLAGS} -DM_SQRT2=1.41421356237309504880\"\ncookbook_meson \\\n    -Dintrospection=false\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtk3/redox.patch",
    "content": "diff -ruwN source-old/gdk/wayland/gdkdevice-wayland.c source/gdk/wayland/gdkdevice-wayland.c\n--- source-old/gdk/wayland/gdkdevice-wayland.c\t2024-07-10 11:03:14.000000000 -0600\n+++ source/gdk/wayland/gdkdevice-wayland.c\t2025-11-13 09:46:58.493081022 -0700\n@@ -44,6 +44,12 @@\n #include <dev/evdev/input.h>\n #elif defined(HAVE_LINUX_INPUT_H)\n #include <linux/input.h>\n+#else\n+#define BTN_LEFT 0x110\n+#define BTN_RIGHT 0x111\n+#define BTN_MIDDLE 0x112\n+#define BTN_STYLUS 0x14b\n+#define BTN_STYLUS2 0x14c\n #endif\n \n #define BUTTON_BASE (BTN_LEFT - 1) /* Used to translate to 1-indexed buttons */\ndiff -ruwN source-old/gdk/wayland/gdkdisplay-wayland.c source/gdk/wayland/gdkdisplay-wayland.c\n--- source-old/gdk/wayland/gdkdisplay-wayland.c\t2024-07-10 11:03:14.000000000 -0600\n+++ source/gdk/wayland/gdkdisplay-wayland.c\t2025-11-13 09:44:55.926622693 -0700\n@@ -28,7 +28,9 @@\n #endif\n \n #include <sys/mman.h>\n+#if defined (__NR_memfd_create)\n #include <sys/syscall.h>\n+#endif\n \n #include <glib.h>\n #include \"gdkwayland.h\"\ndiff -ruwN source-old/gtk/a11y/gtkaccessibility.c source/gtk/a11y/gtkaccessibility.c\n--- source-old/gtk/a11y/gtkaccessibility.c\t2024-07-10 11:03:14.000000000 -0600\n+++ source/gtk/a11y/gtkaccessibility.c\t2025-11-12 12:32:06.969908669 -0700\n@@ -37,7 +37,7 @@\n #include <gtk/gtktogglebutton.h>\n #include <gtk/gtkaccessible.h>\n \n-#ifdef GDK_WINDOWING_X11\n+#if defined(GDK_WINDOWING_X11) && !defined(__redox__)\n #include <atk-bridge.h>\n #endif\n \n@@ -254,7 +254,7 @@\n         }\n     }\n \n-#ifdef GDK_WINDOWING_X11\n+#if defined(GDK_WINDOWING_X11) && !defined(__redox__)\n   /*\n    * If the focus widget is a GtkSocket without a plug\n    * then ignore the focus notification as the embedded\n@@ -986,7 +986,7 @@\n   _gtk_accessibility_override_atk_util ();\n   do_window_event_initialization ();\n \n-#ifdef GDK_WINDOWING_X11\n+#if defined(GDK_WINDOWING_X11) && !defined(__redox__)\n   atk_bridge_adaptor_init (NULL, NULL);\n #endif\n \ndiff -ruwN source-old/gtk/gtkmain.c source/gtk/gtkmain.c\n--- source-old/gtk/gtkmain.c\t2024-07-10 11:03:14.000000000 -0600\n+++ source/gtk/gtkmain.c\t2025-11-12 12:32:06.970182803 -0700\n@@ -355,7 +355,7 @@\n check_setugid (void)\n {\n /* this isn't at all relevant on MS Windows and doesn't compile ... --hb */\n-#ifndef G_OS_WIN32\n+#if !defined(G_OS_WIN32) && !defined(__redox__)\n   uid_t ruid, euid, suid; /* Real, effective and saved user ID's */\n   gid_t rgid, egid, sgid; /* Real, effective and saved group ID's */\n   \ndiff -ruwN source-old/meson.build source/meson.build\n--- source-old/meson.build\t2024-07-10 11:03:14.000000000 -0600\n+++ source/meson.build\t2025-11-12 12:32:06.970463189 -0700\n@@ -565,7 +565,7 @@\n   xfixes_dep     = dependency('xfixes', required: false)\n   xcomposite_dep = dependency('xcomposite', required: false)\n   fontconfig_dep = dependency('fontconfig', fallback: ['fontconfig', 'fontconfig_dep'])\n-  atkbridge_dep  = dependency('atk-bridge-2.0', version: at_spi2_atk_req)\n+  #TODO atkbridge_dep  = dependency('atk-bridge-2.0', version: at_spi2_atk_req)\n \n   backend_immodules += ['xim']\n \n@@ -584,7 +584,7 @@\n     x11_pkgs += ['xdamage']\n   endif\n \n-  atk_pkgs += ['atk-bridge-2.0']\n+  #atk_pkgs += ['atk-bridge-2.0']\n \n   cdata.set('HAVE_XDAMAGE', xdamage_dep.found() ? 1 : false)\n   cdata.set('HAVE_XCURSOR', xcursor_dep.found() ? 1 : false)\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtk3mm/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gnome.pages.gitlab.gnome.org/gtkmm-documentation/sec-install-unix-and-linux.html\n[source]\ntar = \"https://download.gnome.org/sources/gtkmm/3.24/gtkmm-3.24.10.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\"-Dbuild-tests=false\"]\ndependencies = [\n    \"libsigcpp\",\n    \"gtk3\",\n    \"glibmm\",\n    \"cairomm10+\",\n    \"pangomm\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtk4/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://docs.gtk.org/gtk4/building.html\n[source]\ntar = \"https://download.gnome.org/sources/gtk/4.20/gtk-4.20.3.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dwayland-backend=false\",\n    \"-Dintrospection=false\",\n    \"-Dprofile=default\",\n    \"-Dbuild-testsuite=false\",\n    \"-Dbuild-tests=false\",\n]\ndependencies = [\n    \"glib\",\n    \"gdk-pixbuf\",\n    \"pango\",\n    \"cairo\",\n    \"libepoxy\",\n    \"atk\",\n    \"shared-mime-info\",\n    \"graphene\",\n    \"libxkbcommon\",\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtk4mm/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gnome.pages.gitlab.gnome.org/gtkmm-documentation/sec-install-unix-and-linux.html\n[source]\ntar = \"https://download.gnome.org/sources/gtkmm/4.21/gtkmm-4.21.3.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\"-Dbuild-tests=false\"]\ndependencies = [\n    \"libsigcpp\",\n    \"gtk4\",\n    \"glibmm\",\n    \"cairomm116+\",\n    \"pangomm\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtkglext/recipe.toml",
    "content": "#TODO configuration problem, can't recognize the Redox target\n[source]\ntar = \"https://download.gnome.org/sources/gtkglext/1.2/gtkglext-1.2.0.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/gtksourceview/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/gtksourceview#installation\n[source]\ntar = \"https://download.gnome.org/sources/gtksourceview/5.10/gtksourceview-5.10.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dbuild-testsuite=false\",\n    \"-Dintrospection=false\",\n]\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libxml2\",\n    \"fribidi\",\n    \"pcre\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/json-glib/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/json-glib/#build-and-installation\n[source]\ntar = \"https://download.gnome.org/sources/json-glib/1.8/json-glib-1.8.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n    \"-Ddocumentation=false\",\n    \"-Dgtk_doc=false\",\n    \"-Dtests=false\",\n    \"-Dconformance=false\",\n    \"-Dinstalled_tests=false\",\n]\ndependencies = [\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/jsonrpc-glib/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/jsonrpc-glib#building\n[source]\ntar = \"https://download.gnome.org/sources/jsonrpc-glib/3.44/jsonrpc-glib-3.44.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dwith_introspection=false\",\n    \"-Denable_tests=false\",\n]\ndependencies = [\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libadwaita/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/libadwaita#building\n[source]\ntar = \"https://download.gnome.org/sources/libadwaita/1.8/libadwaita-1.8.4.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\"-Dtests=false\"]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libart/recipe.toml",
    "content": "#TODO can't recognize the Redox target\n[source]\ntar = \"https://download.gnome.org/sources/libart_lgpl/2.3/libart_lgpl-2.3.21.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libayatana-appindicator-glib/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/AyatanaIndicators/libayatana-appindicator-glib/archive/refs/tags/2.0.1.tar.gz\"\nblake3 = \"5c7e39f29b23cd5c14a6eacbe0c0bf16dfd28b9b013ec011421d5d6e5742ba2d\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"glib\",\n]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libayatana-appindicator-glib/redox.patch",
    "content": "diff -ruwN source-old/bindings/CMakeLists.txt source/bindings/CMakeLists.txt\n--- source-old/bindings/CMakeLists.txt\t2025-06-15 04:50:44.000000000 -0600\n+++ source/bindings/CMakeLists.txt\t2025-11-15 08:33:35.889512652 -0700\n@@ -1 +1 @@\n-add_subdirectory (vala)\n+#TODO: valac: add_subdirectory (vala)\ndiff -ruwN source-old/CMakeLists.txt source/CMakeLists.txt\n--- source-old/CMakeLists.txt\t2025-06-15 04:50:44.000000000 -0600\n+++ source/CMakeLists.txt\t2025-11-15 08:33:53.996379724 -0700\n@@ -38,7 +38,7 @@\n \n add_subdirectory (src)\n add_subdirectory (bindings)\n-add_subdirectory (doc)\n+#TODO: gi-docgen: add_subdirectory (doc)\n \n if (ENABLE_TESTS)\n     include (CTest)\ndiff -ruwN source-old/src/CMakeLists.txt source/src/CMakeLists.txt\n--- source-old/src/CMakeLists.txt\t2025-06-15 04:50:44.000000000 -0600\n+++ source/src/CMakeLists.txt\t2025-11-15 08:32:53.644475333 -0700\n@@ -114,47 +114,49 @@\n target_link_options (\"ayatana-appindicator-glib\" PRIVATE \"LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/ayatana-appindicator.symbols\")\n install (TARGETS \"ayatana-appindicator-glib\" LIBRARY DESTINATION \"${CMAKE_INSTALL_FULL_LIBDIR}\")\n \n-# AyatanaAppIndicatorGlib-2.0.gir\n-\n-find_package (GObjectIntrospection REQUIRED)\n-\n-add_custom_command (\n-    OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\"\n-    DEPENDS \"ayatana-appindicator-glib\"\n-    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n-    COMMAND\n-    ${INTROSPECTION_SCANNER}\n-    ayatana-appindicator.c ayatana-appindicator.h\n-    --add-include-path=${CMAKE_CURRENT_BINARY_DIR}\n-    --c-include=libayatana-appindicator-glib/ayatana-appindicator.h\n-    --symbol-prefix=app\n-    --identifier-prefix=App\n-    --namespace=AyatanaAppIndicatorGlib\n-    --nsversion=2.0\n-    --quiet\n-    --warn-all\n-    --include=Gio-2.0\n-    --include=GObject-2.0\n-    --library-path=${CMAKE_CURRENT_BINARY_DIR}\n-    --library=\"ayatana-appindicator-glib\"\n-    --output \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\"\n-)\n-\n-install (FILES \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\" DESTINATION \"${CMAKE_INSTALL_FULL_DATADIR}/gir-1.0\")\n-\n-# AyatanaAppIndicatorGlib-2.0.typelib\n-\n-add_custom_command (\n-    OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.typelib\"\n-    DEPENDS \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\"\n-    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n-    COMMAND\n-    ${INTROSPECTION_COMPILER}\n-    --includedir=${CMAKE_CURRENT_BINARY_DIR}\n-    ${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\n-    -o \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.typelib\"\n-)\n-\n-install (FILES \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.typelib\" DESTINATION \"${CMAKE_INSTALL_FULL_LIBDIR}/girepository-1.0\")\n-\n-add_custom_target (\"src\" ALL DEPENDS \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.typelib\")\n+#TODO: gobject-introspection\n+## AyatanaAppIndicatorGlib-2.0.gir\n+#\n+#find_package (GObjectIntrospection REQUIRED)\n+#\n+#add_custom_command (\n+#    OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\"\n+#    DEPENDS \"ayatana-appindicator-glib\"\n+#    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}\n+#    COMMAND\n+#    ${INTROSPECTION_SCANNER}\n+#    ayatana-appindicator.c ayatana-appindicator.h\n+#    --add-include-path=${CMAKE_CURRENT_BINARY_DIR}\n+#    --c-include=libayatana-appindicator-glib/ayatana-appindicator.h\n+#    --symbol-prefix=app\n+#    --identifier-prefix=App\n+#    --namespace=AyatanaAppIndicatorGlib\n+#    --nsversion=2.0\n+#    --quiet\n+#    --warn-all\n+#    --include=Gio-2.0\n+#    --include=GObject-2.0\n+#    --library-path=${CMAKE_CURRENT_BINARY_DIR}\n+#    --library=\"ayatana-appindicator-glib\"\n+#    --output \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\"\n+#)\n+#\n+#install (FILES \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\" DESTINATION \"${CMAKE_INSTALL_FULL_DATADIR}/gir-1.0\")\n+#\n+## AyatanaAppIndicatorGlib-2.0.typelib\n+#\n+#add_custom_command (\n+#    OUTPUT \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.typelib\"\n+#    DEPENDS \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\"\n+#    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}\n+#    COMMAND\n+#    ${INTROSPECTION_COMPILER}\n+#    --includedir=${CMAKE_CURRENT_BINARY_DIR}\n+#    ${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.gir\n+#    -o \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.typelib\"\n+#)\n+#\n+#install (FILES \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.typelib\" DESTINATION \"${CMAKE_INSTALL_FULL_LIBDIR}/girepository-1.0\")\n+#\n+#add_custom_target (\"src\" ALL DEPENDS \"${CMAKE_CURRENT_BINARY_DIR}/AyatanaAppIndicatorGlib-2.0.typelib\")\n+#\n\\ No newline at end of file\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libdex/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/libdex#building\n[source]\ntar = \"https://download.gnome.org/sources/libdex/0.4/libdex-0.4.1.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n    \"-Dtests=false\",\n]\ndependencies = [\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libepoxy/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/libepoxy/1.5/libepoxy-1.5.10.tar.xz\"\nblake3 = \"0ccee9635115fe417cfc4bc33ffd160bf1e2852bd6c03816b4af771d59462f53\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"x11proto\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Degl=yes \\\n    -Dglx=yes \\\n    -Dtests=false\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libepoxy/redox.patch",
    "content": "diff -ruwN libepoxy-1.5.10/src/dispatch_common.c source/src/dispatch_common.c\n--- libepoxy-1.5.10/src/dispatch_common.c\t2022-02-17 05:56:12.000000000 -0700\n+++ source/src/dispatch_common.c\t2025-05-04 17:57:31.910921783 -0600\n@@ -264,13 +264,7 @@\n     long begin_count;\n };\n \n-static struct api api = {\n-#ifndef _WIN32\n-    .mutex = PTHREAD_MUTEX_INITIALIZER,\n-#else\n-\t0,\n-#endif\n-};\n+static struct api api = {0};\n \n static bool library_initialized;\n \n"
  },
  {
    "path": "recipes/wip/libs/gnome/libgee/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/libgee/0.20/libgee-0.20.8.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libgspell-gtk3/recipe.toml",
    "content": "#TODO make gtk3 work\n[source]\ntar = \"https://download.gnome.org/sources/gspell/1.12/gspell-1.12.2.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"gtk3\",\n    \"glib\",\n    \"libicu\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libgspell-gtk4/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://gitlab.gnome.org/otrocodigo/gspell/-/archive/1.11.1/gspell-1.11.1.tar.bz2\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libicu\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libhandy/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/libhandy#building\n[source]\ntar = \"https://download.gnome.org/sources/libhandy/1.8/libhandy-1.8.3.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=false\"\n    \"-Dintrospection=false\",\n]\ndependencies = [\n    \"glib\",\n    \"gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libnotify/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://download.gnome.org/sources/libnotify/0.8/libnotify-0.8.4.tar.xz\"\nblake3 = \"1c749e4f1cc85f88348bb363b6d78c8373baa19a6db4d2b3a4cf537c1af6b929\"\n\n[build]\ndependencies = [\n    \"gdk-pixbuf\",\n    \"gtk3\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dgtk_doc=false\",\n    \"-Dman=false\",\n    \"-Dtests=false\",\n    \"-Dintrospection=disabled\",\n]\n    \n"
  },
  {
    "path": "recipes/wip/libs/gnome/libpanel/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ntar = \"https://download.gnome.org/sources/libpanel/1.4/libpanel-1.4.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n    \"-Ddocs=false\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libpeas/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/libpeas\n[source]\ntar = \"https://download.gnome.org/sources/libpeas/2.0/libpeas-2.0.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\"\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/librsvg/recipe.toml",
    "content": "#TODO: version 2.59 and newer require cargo-c\n[source]\ntar = \"https://download.gnome.org/sources/librsvg/2.58/librsvg-2.58.5.tar.xz\"\nblake3 = \"15ccac6309992ced51128825e9c3ebeb041705aeb8371507ffc4cebb6a1e4ce5\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"cairo\",\n    \"freetype2\",\n    \"gdk-pixbuf\",\n    \"glib\",\n    \"harfbuzz\",\n    \"libffi\",\n    \"libxml2\",\n    \"pango\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport GDK_PIXBUF_QUERYLOADERS=\"/usr/lib/$(cc -dumpmachine)/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders\"\ncookbook_configure --disable-introspection\nmv ${COOKBOOK_STAGE}/${COOKBOOK_SYSROOT}/usr/lib/gdk-pixbuf-2.0 ${COOKBOOK_STAGE}/usr/lib/gdk-pixbuf-2.0\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libsecret/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/libsecret/0.21/libsecret-0.21.7.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dmanpage=false\",\n    \"-Dgtk_doc=false\",\n    \"-Dintrospection=false\",\n]\ndependencies = [\n    \"libgcrypt\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libsigcpp/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/libsigcplusplus/libsigcplusplus#building-from-a-release-tarball\n[source]\ntar = \"https://github.com/libsigcplusplus/libsigcplusplus/releases/download/3.8.0/libsigc++-3.8.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dbuild-manual=false\",\n    \"-Dbuild-tests=false\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libsoup/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://download.gnome.org/sources/libsoup/3.6/libsoup-3.6.5.tar.xz\"\nblake3 = \"9e5214dfb310ac1bbf8ceb85724f2c79a1d5c94382f306080a6cdea47230e960\"\n\n[build]\ndependencies = [\n    \"gettext\",\n    \"glib\",\n    \"libffi\",\n    \"libiconv\",\n    \"libpsl\",\n    \"nghttp2\",\n    \"pcre2\",\n    \"sqlite3\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Dintrospection=disabled \\\n    -Dsysprof=disabled \\\n    -Dtests=false \\\n    -Dtls_check=false\npatchelf --replace-needed \"${COOKBOOK_SYSROOT}/usr/lib/libsqlite3.so\" \"libsqlite3.so\" \"${COOKBOOK_STAGE}/usr/lib/libsoup-3.0.so\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libspelling/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ntar = \"https://download.gnome.org/sources/libspelling/0.4/libspelling-0.4.9.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Ddocs=false\",\n    \"-Dintrospection=false\",\n    \"-Dsysproof=false\",\n    \"-Dvapi=false\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libwnck3/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://download.gnome.org/sources/libwnck/43/libwnck-43.3.tar.xz\"\nblake3 = \"711e508f062cc90c660b56f21c5fd237db156ea51fe364fb5e9e766556c2de42\"\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxft\",\n    \"libxi\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"x11proto\",\n    \"zlib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=disabled\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/libxslt/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://download.gnome.org/sources/libxslt/1.1/libxslt-1.1.43.tar.xz\"\nblake3 = \"6c529acc02344fe48377810debadaee8eb0511a5553a8b7bea685d5282ab00cb\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libxml2\",\n    \"xz\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport CFLAGS=\"-llzma -lz\"\ncookbook_configure --without-python\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/pangomm/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/pangomm/2.50/pangomm-2.50.1.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"pango\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/totem-pl-parser/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ntar = \"https://download.gnome.org/sources/totem-pl-parser/3.26/totem-pl-parser-3.26.6.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\"\n]\ndependencies = [\n    \"libxml2\",\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/vte/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://download.gnome.org/sources/vte/0.82/vte-0.82.1.tar.xz\"\nblake3 = \"2d16b6808c0eaa801d59ccabcae13e76ccd6229869dad1efe0524a4c83b53a87\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"gnutls3\",\n    \"gtk3\",\n    \"lz4\",\n    \"simdutf\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dgir=false\",\n    \"-Dgtk4=false\",\n    \"-Dvapi=false\",\n    #TODO: package fast_float?\n    \"--force-fallback-for=fast_float\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gnome/vte/redox.patch",
    "content": "diff -ruwN source-old/src/pty.cc source/src/pty.cc\n--- source-old/src/pty.cc\t2025-10-11 14:43:24.000000000 -0600\n+++ source/src/pty.cc\t2025-11-17 17:54:03.387095202 -0700\n@@ -222,7 +222,7 @@\n         if (peer_fd == -1)\n                 _exit(127);\n \n-#ifdef TIOCSCTTY\n+#if defined(TIOCSCTTY) && !defined(__redox__)\n         /* On linux, opening the PTY peer above already made it our controlling TTY (since\n          * previously there was none, after the setsid() call). However, it appears that e.g.\n          * on *BSD, that doesn't happen, so we need this explicit ioctl here.\ndiff -ruwN source-old/src/spawn.cc source/src/spawn.cc\n--- source-old/src/spawn.cc\t2025-10-11 14:43:24.000000000 -0600\n+++ source/src/spawn.cc\t2025-11-17 17:53:20.394044419 -0700\n@@ -409,7 +409,7 @@\n         if (peer_fd == -1)\n                 return ExecError::GETPTPEER;\n \n-#ifdef TIOCSCTTY\n+#if defined(TIOCSCTTY) && !defined(__redox__)\n         /* On linux, opening the PTY peer above already made it our controlling TTY (since\n          * previously there was none, after the setsid() call). However, it appears that e.g.\n          * on *BSD, that doesn't happen, so we need this explicit ioctl here.\ndiff -ruwN source-old/src/vte.cc source/src/vte.cc\n--- source-old/src/vte.cc\t2025-10-11 14:43:24.000000000 -0600\n+++ source/src/vte.cc\t2025-11-17 17:54:44.394149937 -0700\n@@ -19,7 +19,9 @@\n #include \"config.h\"\n \n #include <math.h>\n+#if !defined(__redox__)\n #include <search.h>\n+#endif\n #include <stdlib.h>\n #include <string.h>\n #include <sys/ioctl.h>\ndiff -ruwN source-old/src/vteseq.cc source/src/vteseq.cc\n--- source-old/src/vteseq.cc\t2025-10-11 14:43:24.000000000 -0600\n+++ source/src/vteseq.cc\t2025-11-17 17:59:27.278790468 -0700\n@@ -19,7 +19,9 @@\n \n #include \"config.h\"\n \n+#if !defined(__redox__)\n #include <search.h>\n+#endif\n #include <stdlib.h>\n #include <string.h>\n #include <limits.h>\ndiff -ruwN source-old/src/widget.cc source/src/widget.cc\n--- source-old/src/widget.cc\t2025-10-11 14:43:24.000000000 -0600\n+++ source/src/widget.cc\t2025-11-17 18:22:10.229089619 -0700\n@@ -927,6 +927,9 @@\n         }\n \n         if (m_terminal->terminate_child()) {\n+                #ifndef W_EXITCODE\n+                #define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))\n+                #endif\n                 int status = W_EXITCODE(0, SIGKILL);\n                 emit_child_exited(status);\n         }\n"
  },
  {
    "path": "recipes/wip/libs/gnome/xdg-user-dirs-gtk/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/xdg-user-dirs-gtk/0.14/xdg-user-dirs-gtk-0.14.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/gnome/zenity/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://download.gnome.org/sources/zenity/3.44/zenity-3.44.5.tar.xz\"\nblake3 = \"de4c662bd33107e9247c23d248e4b1b51a68994b01ecefda77422e1007b11c1e\"\n\n[build]\ndependencies = [\n    \"gtk3\",\n]\ndev-dependencies = [\n    \"host:itstool\"\n]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/graphics/libnoise/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/qknight/libnoise\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/graphics/libvulkan/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/KhronosGroup/Vulkan-Loader/blob/main/BUILD.md\n[source]\ngit = \"https://github.com/KhronosGroup/Vulkan-Loader\"\nrev = \"v1.4.346\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libxkbcommon\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/graphics/vulkan-headers/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/KhronosGroup/Vulkan-Headers\"\nrev = \"v1.4.346\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/gui/girara/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://pwmt.org/projects/girara/installation/\n[source]\ntar = \"https://pwmt.org/projects/girara/download/girara-0.4.5.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=disabled\",\n    \"-Ddocs=disabled\",\n]\ndependencies = [\n    \"gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/gui/imgui/recipe.toml",
    "content": "#TODO not compiled or tested\n# cmake information: https://github.com/ocornut/imgui/pull/3027\n[source]\ngit = \"https://github.com/Qix-/imgui\"\nbranch = \"cmake\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\"sdl2\"]\n"
  },
  {
    "path": "recipes/wip/libs/gui/libappindicator/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://old-releases.ubuntu.com/ubuntu/pool/universe/liba/libappindicator/libappindicator_12.10.1+20.10.20200706.1.orig.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/hw/libratbag/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/libratbag/libratbag\"\nrev = \"v0.18\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=false\",\n    \"-Dlogind-provider=elogind\",\n    \"-Dsystemd=false\",\n]\ndependencies = [\n    \"elogind\",\n    \"eudev\",\n    \"libevdev\",\n    \"libunistring\",\n    \"json-glib\",\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/image/libavif/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/AOMediaCodec/libavif#build-notes\n[source]\ngit = \"https://github.com/AOMediaCodec/libavif\"\nrev = \"v1.4.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/image/libgphoto2/recipe.toml",
    "content": "#TODO can't find libtool\n[source]\ntar = \"https://sourceforge.net/projects/gphoto/files/libgphoto/2.5.31/libgphoto2-2.5.31.tar.xz/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/image/libheif/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/strukturag/libheif#compiling\n[source]\ntar = \"https://github.com/strukturag/libheif/releases/download/v1.17.5/libheif-1.17.5.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_DOCUMENTATION=OFF\",\n    \"-DBUILD_TESTING=OFF\",\n]\ndependencies = [\n    \"x265\",\n    \"libde265\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/image/libjxl/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/libjxl/libjxl/blob/main/BUILDING.md\n[source]\ngit = \"https://github.com/libjxl/libjxl\"\nbranch = \"v0.11.x\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_TESTING=OFF\",\n    \"-DJPEGXL_ENABLE_DOXYGEN=OFF\",\n    \"-DJPEGXL_ENABLE_MANPAGES=OFF\",\n]\ndependencies = [\n    \"libbrotli\",\n    \"libjpeg\",\n    \"libgif\",\n    \"libpng\",\n    \"libwebp\",\n    \"openexr\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/image/libraw/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://www.libraw.org/data/LibRaw-0.21.1.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"zlib\",\n    \"libjasper\",\n    \"libjpeg\",\n    \"liblcms\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/image/libsixel/recipe.toml",
    "content": "#TODO can't find libjpeg\n[source]\ntar = \"https://github.com/saitoha/libsixel/releases/download/v1.8.6/libsixel-1.8.6.tar.gz\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--with-jpeg\",\n    \"--with-png\",\n]\ndependencies = [\n    \"libpng\",\n    \"libjpeg\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/image/libwebp/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.5.0.tar.gz\"\nblake3 = \"8272270920a317b854b059e86c320dbdb5a2032937072bbfd5f3304d601a92cb\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libgif\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libtiff\",\n]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/image/libwebp2/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://chromium.googlesource.com/codecs/libwebp2/#compiling\n[source]\ngit = \"https://chromium.googlesource.com/codecs/libwebp2\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DWP2_BUILD_TESTS=OFF\",\n    \"-DWP2_INSTALL_TESTS=OFF\",\n]"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-activities/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kactivities-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-activities-stats/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kactivities-stats-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-apidox/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kapidox-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-archive/recipe.toml",
    "content": "#TODO maybe incomplete script, see https://invent.kde.org/frameworks/karchive/-/blob/master/INSTALL?ref_type=heads\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/karchive-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-attica/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/attica-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-auth/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kauth-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-baloo/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/baloo-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-bookmarks/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kbookmarks-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-calendarcore/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kcalendarcore-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-cmake-modules/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/extra-cmake-modules-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-cmutils/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kcmutils-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-codecs/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kcodecs-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-completion/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kcompletion-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-config/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kconfig-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-configwidgets/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kconfigwidgets-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-contacts/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kcontacts-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-coreaddons/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kcoreaddons-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-crash/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kcrash-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-dav/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kdav-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-dbusaddons/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kdbusaddons-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-declarative/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kdeclarative-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-dnssd/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kdnssd-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-doctools/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kdoctools-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-emoticons/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kemoticons-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-filemetadata/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kfilemetadata-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-frameworkintegration/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/frameworkintegration-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-globalaccel/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kglobalaccel-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-guiaddons/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kguiaddons-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-holidays/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kholidays-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-i18n/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/ki18n-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-iconthemes/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kiconthemes-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-idletime/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kidletime-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-init/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kinit-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-io/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kio-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-itemmodels/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kitemmodels-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-itemviews/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kitemviews-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-jobwidgets/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kjobwidgets-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-kded/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kded-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-kdesu/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kdesu-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-kirigami/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kirigami-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-modem-manager/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/modemmanager-qt5-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-networkmanager/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/networkmanager-qt5-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-newstuff/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/knewstuff-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-notifications/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/knotifications-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-notifyconfig/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/knotifyconfig-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-package/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kpackage-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-parts/recipe.toml",
    "content": "#TODO missing script for building, lacking build instructions\n[source]\ntar = \"https://invent.kde.org/frameworks/kparts/-/archive/v5.112.0/kparts-v5.112.0.tar.bz2\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-people/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kpeople-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-plasma-framework/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/plasma-framework-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-plotting/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kplotting-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-prison/recipe.toml",
    "content": "#TODO maybe incomplte script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/prison-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-pty/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kpty-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-purpose/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/purpose-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-qqc2-desktop-style/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/qqc2-desktop-style-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-quickcharts/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kquickcharts-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-runner/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/krunner-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-service/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kservice-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-solid/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/solid-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-sonnet/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/sonnet-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-syndication/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/syndication-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-syntax-highlighting/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/syntax-highlighting-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-sysguard/recipe.toml",
    "content": "#TODO missing script for building, lacking build instructions\n[source]\ntar = \"https://invent.kde.org/plasma/libksysguard/-/archive/v5.27.10/libksysguard-v5.27.10.tar.bz2\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-texteditor/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/ktexteditor-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-textwidgets/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/ktextwidgets-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-threadweaver/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/threadweaver-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-unitconversion/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kunitconversion-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-wayland/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kwayland-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-widgetaddons/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kwidgetaddons-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-windowsystem/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kwindowsystem-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf5/kf5-xmlgui/recipe.toml",
    "content": "#TODO maybe incomplete script, lacking build instructions\n[source]\ntar = \"https://download.kde.org/stable/frameworks/5.112/kxmlgui-5.112.0.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE=\"cmake\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    -DCMAKE_BUILD_TYPE=Release\n    -DCMAKE_CROSSCOMPILING=True\n    -DCMAKE_EXE_LINKER_FLAGS=\"-static\"\n    -DCMAKE_INSTALL_PREFIX=\"/\"\n    -DCMAKE_PREFIX_PATH=\"${COOKBOOK_SYSROOT}\"\n    -DCMAKE_SYSTEM_NAME=Generic\n    -DCMAKE_SYSTEM_PROCESSOR=\"$(echo \"${TARGET}\" | cut -d - -f1)\"\n    -DCMAKE_VERBOSE_MAKEFILE=On\n\"${COOKBOOK_SOURCE}\"\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf6/kcodecs6/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.kde.org/stable/frameworks/6.19/kcodecs-6.19.0.tar.xz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/kf6/ktexteditor6/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.kde.org/stable/frameworks/6.19/ktexteditor-6.19.0.tar.xz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/libkdcraw/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://invent.kde.org/graphics/libkdcraw/-/blob/master/README?ref_type=heads\n[source]\ngit = \"https://invent.kde.org/graphics/libkdcraw\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libraw\",\n    \"qt5-base\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/kde/libkomparediff2/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ngit = \"https://invent.kde.org/sdk/libkomparediff2\"\nbranch = \"release/25.12\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/kde/libseexpr-kde/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://invent.kde.org/graphics/kseexpr#super-impatient-cmake-building-and-installing-guide\n[source]\ngit = \"https://invent.kde.org/graphics/kseexpr\"\nrev = \"v6.0.0.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt5-base\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/lua/lpeg/recipe.toml",
    "content": "[source]\ntar = \"https://www.inf.puc-rio.br/~roberto/lpeg/lpeg-1.1.0.tar.gz\"\nblake3 = \"69fc6eaa1a1749937b7216e3d655cf47a7802ffe407f8f857664e999a7b7377b\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"luajit\",\n]\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\nmake linux CC=\"${CC} -I${COOKBOOK_SYSROOT}/include/luajit-2.1\"\nmkdir -p ${COOKBOOK_STAGE}/usr/lib/pkgconfig\ncp lpeg.so ${COOKBOOK_STAGE}/usr/lib/liblpeg.so.1\nln -s \"liblpeg.so.1\" ${COOKBOOK_STAGE}/usr/lib/liblpeg.so\n\"\"\""
  },
  {
    "path": "recipes/wip/libs/ml/libtorch/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/pytorch/pytorch/blob/main/docs/libtorch.rst#building-libtorch-using-cmake\n[source]\ngit = \"https://github.com/pytorch/pytorch\"\nbranch = \"release/2.3\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DPYTHON_EXECUTABLE=`which python3`\",\n    \"-DCMAKE_INSTALL_PREFIX=../pytorch-install ../pytorch\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/mobile/libimobiledevice/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/libimobiledevice/libimobiledevice/releases/download/1.3.0/libimobiledevice-1.3.0.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libtatsu\",\n    \"libplist\",\n    \"libusbmuxd\",\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/mobile/libusbmuxd/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/libimobiledevice/libusbmuxd/releases/download/2.1.0/libusbmuxd-2.1.0.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libplist\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/mozjs/recipe.toml",
    "content": "#TODO \"No suitable wgpu::Adapter found\" error on execution\n[source]\ngit = \"https://gitlab.redox-os.org/njskalski/mozjs.git\"\nbranch = \"redox_mods\"\n[build]\ntemplate = \"custom\"\n\n#these dependencies are copied from Servo recipe. Some of them may be redundant, but I needed to reproduce the build bug.\ndependencies = [\n    \"freetype2\",\n    \"gettext\",\n    \"glib\",\n    \"gstreamer\",\n    \"harfbuzz\",\n    \"libffi\",\n    \"libiconv\",\n    \"libx11\",\n    \"libxcb\",\n    \"libpng\",\n    \"openssl1\",\n    \"pcre\",\n    \"zlib\",\n\n    \"x11proto\",\n    \"x11proto-kb\",\n    \"xcb-proto\",\n    \"xextproto\",\n    \"libxau\",\n    \"libpthread-stubs\",\n    \"fontconfig\",\n    \"expat\",\n    \"gcc13\",\n]\n\nscript = \"\"\"\n# Build the library crates\n\"${COOKBOOK_REDOXER}\" build --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" --workspace --release\n# Library crates don't need installation, they're used as dependencies\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/net/c-ares/recipe.toml",
    "content": "#TODO: test again\n[source]\ntar = \"https://github.com/c-ares/c-ares/releases/download/v1.34.6/c-ares-1.34.6.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/net/libfilezilla/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions - https://svn.filezilla-project.org/filezilla/libfilezilla/trunk/INSTALL?view=markup\n[source]\ntar = \"https://dl2.cdn.filezilla-project.org/libfilezilla/libfilezilla-0.48.1.tar.xz?h=ABnRzj5uctW-vLCfNWW5mQ&x=1722822577\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libnettle\",\n    \"gnutls3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/net/libidn/recipe.toml",
    "content": "#TODO fix libunistring\n[source]\ntar = \"https://ftp.gnu.org/gnu/libidn/libidn2-2.3.7.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libunistring\",\n    \"libiconv\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/net/libtirpc/recipe.toml",
    "content": "#TODO: does not compile\n[source]\ntar = \"https://downloads.sourceforge.net/libtirpc/libtirpc-1.3.6.tar.bz2\"\nblake3 = \"3ca1feefee3a216bb82bba35dfb455cac8524b8d8404767b01772f3b8fd00eea\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"configure\"\nconfigureflags = [\"--disable-gssapi\"]\n"
  },
  {
    "path": "recipes/wip/libs/net/libtorrent/recipe.toml",
    "content": "#TODO missing script for bbv2: https://libtorrent.org/building.html\n[source]\ntar = \"https://github.com/arvidn/libtorrent/releases/download/v2.0.11/libtorrent-rasterbar-2.0.11.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/net/nghttp3/recipe.toml",
    "content": "#TODO: test again\n[source]\ntar = \"https://github.com/ngtcp2/nghttp3/releases/download/v1.15.0/nghttp3-1.15.0.tar.xz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/net/ngtcp2/recipe.toml",
    "content": "#TODO: test again\n#TODO Maybe need openssl 1.1.1\n[source]\ntar = \"https://github.com/ngtcp2/ngtcp2/releases/download/v1.21.0/ngtcp2-1.21.0.tar.xz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\"-DENABLE_OPENSSL=OFF\"]\n"
  },
  {
    "path": "recipes/wip/libs/other/appstream/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/ximion/appstream#build--install\n#TODO missing dependencies\n[source]\ntar = \"https://www.freedesktop.org/software/appstream/releases/AppStream-1.1.2.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dsystemd=false\",\n    \"-Dgir=false\",\n    \"-Dman=off\",\n]\ndependencies = [\n    \"glib\",\n    \"libxml2\",\n    \"curl\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/aws-lc-rs/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/njskalski/aws-lc-rs.git\"\nbranch = \"redox_mods\"\n[build]\ntemplate = \"custom\"\n\nscript = \"\"\"\n    # we need HOST != TARGET, because otherwise we get this error: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95189\n    # by this line https://gitlab.redox-os.org/njskalski/aws-lc-rs/-/blob/main/aws-lc-sys/builder/cc_builder.rs#L493\n    export HOST=x86_64-linux-gnu\n\n    rsync -a --delete \"${COOKBOOK_SOURCE}/\" ./\n    cargo build -p aws-lc-sys --target ${TARGET} --release\n    cargo build -p aws-lc-rs --target ${TARGET} --release\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/babl/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/GNOME/babl/-/blob/master/INSTALL.in?ref_type=heads\n[source]\ntar = \"https://download.gimp.org/pub/babl/0.1/babl-0.1.124.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dwith-docs=false\",\n    \"-Denable-gir=false\",\n    \"-Denable-vapi=false\",\n    \"-Dgi-docgen=false\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/boost/recipe.toml",
    "content": "# TODO: Compiled, not tested\n[source]\ntar = \"https://archives.boost.io/release/1.90.0/source/boost_1_90_0.tar.gz\"\nblake3 = \"1c1b0fe7596e3f72dba529b2d0bc6d330cc00610f8d3b3e3b6f20bad43fc388d\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    # \"libiconv\", # TODO: more locale functions, relibc locales are stubs anyway\n   # \"openssl3\", # TODO: not linked\n   # \"zstd\", # TODO: not linked\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\ncase \"${TARGET}\" in\n    i586-unknown-redox)   ADDRESS_MODEL=32 ARCHITECTURE=x86 ABI=sysv;;\n    x86_64-unknown-redox) ADDRESS_MODEL=64 ARCHITECTURE=x86 ABI=sysv;;\n    aarch64-unknown-redox) ADDRESS_MODEL=64 ARCHITECTURE=arm ABI=aapcs;;\n    riscv64gc-unknown-redox) ADDRESS_MODEL=64 ARCHITECTURE=riscv ABI=sysv;;\nesac\n\n# See https://beta.boost.org/build/doc/html/bbv2/reference/tools.html#bbv2.reference.tools.compiler.gcc\necho \"using gcc : : ${CXX} : <cflags>\\\"${CFLAGS} ${CPPFLAGS}\\\" <cxxflags>\\\"${CXXFLAGS} ${CPPFLAGS}\\\" <linkflags>\\\"${LDFLAGS}\\\" <link>\\\"shared\\\" ; \" > ./user-config.jam\n# echo \"using openssl ; \" >> ./user-config.jam\n# echo \"using zstd ; \" >> ./user-config.jam\n\nskip_libraries=(\n    stacktrace # requires dlsym(RTLD_NEXT)\n    python     # TODO\n)\n\nexport OPENSSL_ROOT=\"${COOKBOOK_SYSROOT}/usr\"\npushd \"${COOKBOOK_SOURCE}\"\n./bootstrap.sh --without-libraries=$(IFS=, ; echo \"${skip_libraries[*]}\")  \\\n    --with-toolset=gcc --with-libraries=all --prefix=${COOKBOOK_STAGE}/usr\n# TODO: add \"-sICONV_PATH=${COOKBOOK_SYSROOT}\" when locales work\n# TODO: implement target-os=redox\n./b2 \"--user-config=${COOKBOOK_BUILD}/user-config.jam\" target-os=linux pch=off \\\n    \"--build-dir=${COOKBOOK_BUILD}\" toolset=gcc architecture=${ARCHITECTURE} address-model=${ADDRESS_MODEL} abi=${ABI} binary-format=elf install\npopd\n\"\"\"\n\n[[optional-packages]]\nname = \"dev\"\nfiles = [\n    \"usr/include/**\",\n    \"usr/lib/*.a\",\n    \"usr/lib/cmake/**\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/boost/redox.patch",
    "content": "diff -ruwN source/boost/asio/detail/config.hpp source-new/boost/asio/detail/config.hpp\n--- source/boost/asio/detail/config.hpp\t2025-12-03 20:46:38.000000000 +0700\n+++ source-new/boost/asio/detail/config.hpp\t2026-03-13 20:55:39.534429549 +0700\n@@ -1395,7 +1395,7 @@\n # if defined(__linux__)\n #  define BOOST_ASIO_HAS_MSG_NOSIGNAL 1\n # elif defined(_POSIX_VERSION)\n-#  if (_POSIX_VERSION >= 200809L)\n+#  if (_POSIX_VERSION >= 200809L) && !defined(__redox__)\n #   define BOOST_ASIO_HAS_MSG_NOSIGNAL 1\n #  endif // _POSIX_VERSION >= 200809L\n # endif // defined(_POSIX_VERSION)\ndiff -ruwN source/boost/config/detail/select_platform_config.hpp source-new/boost/config/detail/select_platform_config.hpp\n--- source/boost/config/detail/select_platform_config.hpp\t2025-12-03 20:46:39.000000000 +0700\n+++ source-new/boost/config/detail/select_platform_config.hpp\t2026-03-13 20:45:55.392659272 +0700\n@@ -69,6 +69,10 @@\n // QNX:\n #  define BOOST_PLATFORM_CONFIG \"boost/config/platform/qnxnto.hpp\"\n \n+#elif defined(__redox__)\n+// Redox:\n+#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/redox.hpp\"\n+\n #elif defined(__VXWORKS__)\n // vxWorks:\n #  define BOOST_PLATFORM_CONFIG \"boost/config/platform/vxworks.hpp\"\n@@ -135,6 +139,7 @@\n #  include \"boost/config/platform/aix.hpp\"\n #  include \"boost/config/platform/amigaos.hpp\"\n #  include \"boost/config/platform/qnxnto.hpp\"\n+#  include \"boost/config/platform/redox.hpp\"\n #  include \"boost/config/platform/vxworks.hpp\"\n #  include \"boost/config/platform/symbian.hpp\" \n #  include \"boost/config/platform/cray.hpp\" \ndiff -ruwN source/boost/config/platform/redox.hpp source-new/boost/config/platform/redox.hpp\n--- source/boost/config/platform/redox.hpp\t1970-01-01 07:00:00.000000000 +0700\n+++ source-new/boost/config/platform/redox.hpp\t2026-03-14 02:47:45.335839093 +0700\n@@ -0,0 +1,23 @@\n+//  (C) Copyright Jim Douglas 2005. \n+//  Use, modification and distribution are subject to the \n+//  Boost Software License, Version 1.0. (See accompanying file \n+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n+\n+//  See http://www.boost.org for most recent version.\n+\n+//  REDOX specific config options:\n+\n+#define BOOST_PLATFORM \"REDOX\"\n+\n+#undef  BOOST_HAS_LOG1P\n+#undef  BOOST_HAS_EXPM1\n+\n+#define BOOST_HAS_PTHREADS\n+\n+#define BOOST_HAS_GETTIMEOFDAY\n+#define BOOST_HAS_CLOCK_GETTIME\n+#define BOOST_HAS_SCHED_YIELD\n+\n+// boilerplate code:\n+#define BOOST_HAS_UNISTD_H\n+#include <boost/config/detail/posix_features.hpp>\ndiff -ruwN source/boost/interprocess/detail/workaround.hpp source-new/boost/interprocess/detail/workaround.hpp\n--- source/boost/interprocess/detail/workaround.hpp\t2025-12-03 20:46:42.000000000 +0700\n+++ source-new/boost/interprocess/detail/workaround.hpp\t2026-03-13 20:53:19.211459550 +0700\n@@ -41,7 +41,7 @@\n    //////////////////////////////////////////////////////\n    //Check for XSI shared memory objects. They are available in nearly all UNIX platforms\n    //////////////////////////////////////////////////////\n-   #if !defined(__QNXNTO__) && !defined(__ANDROID__) && !defined(__HAIKU__) && !(__VXWORKS__) && !(__EMSCRIPTEN__)\n+   #if !defined(__QNXNTO__) && !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__redox__) && !(__VXWORKS__) && !(__EMSCRIPTEN__)\n       #define BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS\n    #endif\n \ndiff -ruwN source/boost/interprocess/mapped_region.hpp source-new/boost/interprocess/mapped_region.hpp\n--- source/boost/interprocess/mapped_region.hpp\t2025-12-03 20:46:42.000000000 +0700\n+++ source-new/boost/interprocess/mapped_region.hpp\t2026-03-13 21:29:41.935220888 +0700\n@@ -816,7 +816,7 @@\n    }\n    int ret = -1;\n    switch(mode){\n-      #if defined(POSIX_MADV_NORMAL)\n+      #if defined(POSIX_MADV_NORMAL) && !defined(__redox__)\n          case mode_padv:\n          {\n          ret = posix_madvise(this->priv_map_address(), this->priv_map_size(), unix_advice);\ndiff -ruwN source/boost/process/v2/detail/environment_posix.hpp source-new/boost/process/v2/detail/environment_posix.hpp\n--- source/boost/process/v2/detail/environment_posix.hpp\t2025-12-03 20:46:45.000000000 +0700\n+++ source-new/boost/process/v2/detail/environment_posix.hpp\t2026-03-14 03:07:36.937337542 +0700\n@@ -19,7 +19,7 @@\n # if !defined(environ)\n #  define environ (*_NSGetEnviron())\n # endif\n-#elif defined(__MACH__) || defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__sun)\n+#elif defined(__MACH__) || defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__sun) || defined(__redox__)\n  extern \"C\" { extern char **environ; }\n #endif\n \ndiff -ruwN source/boost/process/v2/posix/default_launcher.hpp source-new/boost/process/v2/posix/default_launcher.hpp\n--- source/boost/process/v2/posix/default_launcher.hpp\t2025-12-03 20:46:45.000000000 +0700\n+++ source-new/boost/process/v2/posix/default_launcher.hpp\t2026-03-14 03:07:38.549349038 +0700\n@@ -35,7 +35,7 @@\n # if !defined(environ)\n #  define environ (*_NSGetEnviron())\n # endif\n-#elif defined(__MACH__) || defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__sun)\n+#elif defined(__MACH__) || defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__sun) || defined(__redox__)\n  extern \"C\" { extern char **environ; }\n #endif\n \ndiff -ruwN source/libs/process/src/shell.cpp source-new/libs/process/src/shell.cpp\n--- source/libs/process/src/shell.cpp\t2025-12-03 20:46:45.000000000 +0700\n+++ source-new/libs/process/src/shell.cpp\t2026-03-14 03:24:59.034513769 +0700\n@@ -19,7 +19,7 @@\n #if defined(BOOST_PROCESS_V2_WINDOWS)\n #include <windows.h>\n #include <shellapi.h>\n-#elif !defined(__OpenBSD__) && !defined(__ANDROID__)\n+#elif !defined(__OpenBSD__) && !defined(__ANDROID__) && !defined(__redox__)\n #include <wordexp.h>\n #endif\n \n@@ -30,7 +30,7 @@\n {\n     return system_category();\n }\n-#elif !defined(__OpenBSD__) && !defined(__ANDROID__)\n+#elif !defined(__OpenBSD__) && !defined(__ANDROID__) && !defined(__redox__)\n \n struct shell_category_t final : public error_category\n {\n@@ -99,7 +99,7 @@\n     return input_.c_str();\n }\n \n-#elif !defined(__OpenBSD__) && !defined(__ANDROID__)\n+#elif !defined(__OpenBSD__) && !defined(__ANDROID__) && !defined(__redox__)\n \n void shell::parse_()\n {\n"
  },
  {
    "path": "recipes/wip/libs/other/bullet-physics/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/bulletphysics/bullet3#build-instructions-for-bullet-using-premake-you-can-also-use-cmake-instead\n[source]\ngit = \"https://github.com/bulletphysics/bullet3\"\nrev = \"3.25\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_UNIT_TESTS=OFF\",\n    \"-DBUILD_EXTRAS=OFF\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/cairomm10+/recipe.toml",
    "content": "#TODO patch the GNU Autotools configuration to recognize Redox\n[source]\ntar = \"https://www.cairographics.org/releases/cairomm-1.15.5.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"cairo\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/cairomm116+/recipe.toml",
    "content": "#TODO mm-common-prepare: not found\n[source]\ntar = \"https://www.cairographics.org/releases/cairomm-1.18.0.tar.xz\"\nscript = \"./autogen.sh\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"cairo\",\n]\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\nCOOKBOOK_CONFIGURE=\"./configure\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/dcmtk/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://git.dcmtk.org/?p=dcmtk.git;a=blob;f=INSTALL;h=97087f9a05e65040264d90027912c736958e67f3;hb=HEAD#l667\n[source]\ntar = \"https://dicom.offis.de/download/dcmtk/dcmtk370/dcmtk-3.7.0.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DDCMTK_WITH_DOXYGEN=OFF\"\n]\n#dependencies = [\n    #\"libiconv\",\n    #\"libicu\",\n    #\"libpng\",\n    #\"libxml2\",\n    #\"libtiff\",\n    #\"zlib\",\n    #\"openjpeg\",\n#]\n"
  },
  {
    "path": "recipes/wip/libs/other/fftw/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://fftw.org/fftw-3.3.10.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/fltk13/recipe.toml",
    "content": "#TODO: not compiled or tested\n# probably wrong template, see https://github.com/fltk/fltk/blob/master/README.Unix.txt\n# commented out dependencies are optional but recommended, needs to be determined\n[source]\ntar = \"https://github.com/fltk/fltk/releases/download/release-1.3.11/fltk-1.3.11-source.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"mesa-glu\",\n    \"libx11\",\n    \"libxft\",\n    \"libxcursor\",\n    #\"freeglut\",\n    #\"cairo\",\n    #\"fontconfig\",\n    #\"glew\",\n    #\"libalsa\",\n    #\"libjpeg\",\n    #\"libpng\",\n    #\"libxinerama\",\n    #\"pango\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/fltk14/recipe.toml",
    "content": "#TODO probably wrong template, see https://github.com/fltk/fltk/blob/master/README.Unix.txt\n# commented out dependencies are optional but recommended, needs to be determined\n[source]\ntar = \"https://github.com/fltk/fltk/releases/download/release-1.4.4/fltk-1.4.4-source.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"mesa-glu\",\n    \"libx11\",\n    \"libxft\",\n    \"libxcursor\",\n    #\"freeglut\",\n    #\"cairo\",\n    #\"fontconfig\",\n    #\"glew\",\n    #\"libalsa\",\n    #\"libjpeg\",\n    #\"libpng\",\n    #\"libxinerama\",\n    #\"pango\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/freealut/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/vancegroup/freealut\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DBUILD_TESTS=OFF\"\n]\ndependencies = [\n    \"openal\"\n]\ndev-dependencies = [\n    \"libstdcxx\"\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/freeglut/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/freeglut/freeglut/releases/download/v3.4.0/freeglut-3.4.0.tar.gz\"\n#blake3 = \"08c8874d6ddad5be4860813865d4d4e2a84c294da0f3cf82a29e43920806b0da\"\n[build]\ndependencies = [\n    \"mesa\",\n    \"mesa-glu\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncat > redox.cmake <<EOF\n# the name of the target operating system\nset(CMAKE_SYSTEM_NAME Generic)\nset(CMAKE_SYSTEM_PROCESSOR \"${TARGET%%-*}\")\n\n# which compilers to use for C and C++\nset(CMAKE_C_COMPILER \"${TARGET}-gcc\")\nset(CMAKE_CXX_COMPILER \"${TARGET}-g++\")\n\n# where is the target environment located\nset(CMAKE_FIND_ROOT_PATH \"${COOKBOOK_SYSROOT}\")\n\n# adjust the default behavior of the FIND_XXX() commands:\n# search programs in the host environment\nset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n\n# search headers, libraries, and packages in the target environment\nset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\nEOF\n\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DCMAKE_TOOLCHAIN_FILE=redox.cmake\n    -DFREEGLUT_GLES=0\n)\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/freetype-sys/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/PistonDevelopers/freetype-sys.git\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"freetype2\",\n    \"zlib\",\n    \"libpng\"\n]\n\nscript = \"\"\"\n    # export PKG_CONFIG_PATH=\"${COOKBOOK_SYSROOT}/lib/pkgconfig\"\n    # #:${COOKBOOK_SYSROOT}/usr/lib/pkgconfig:${COOKBOOK_SYSROOT}/usr/share/pkgconfig\"\n    # export PKG_CONFIG_LIBDIR=\"${COOKBOOK_SYSROOT}/lib/pkgconfig\"\n    # #:${COOKBOOK_SYSROOT}/usr/lib/pkgconfig\"\n    # export PKG_CONFIG_SYSROOT_DIR=\"${COOKBOOK_SYSROOT}\"\n\n    # # I'm tired trying figure out why multiple pkgconfig paths are ignored by cargo building stuff\n    # # rsync -a -v ${COOKBOOK_SYSROOT}/usr/share/pkgconfig/*.pc ${COOKBOOK_SYSROOT}/lib/pkgconfig/\n    # rsync -a -v ${COOKBOOK_SYSROOT}/usr/lib/pkgconfig/*.pc ${COOKBOOK_SYSROOT}/lib/pkgconfig/\n\n    # ls -al $PKG_CONFIG_PATH\n\n    # env\n\n    rsync -a --delete \"${COOKBOOK_SOURCE}/\" ./\n    cargo build --release\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/gdbm/recipe.toml",
    "content": "[source]\ntar= \"https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz\"\npatches = [\n    \"redox.patch\",\n]\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/gdbm/redox.patch",
    "content": "diff --git a/build-aux/config.sub b/build-aux/config.sub\nindex 7ffe373..e2368e0 100755\n--- a/build-aux/config.sub\n+++ b/build-aux/config.sub\n@@ -1393,7 +1393,7 @@ case $os in\n \t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n \t      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \\\n \t      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \\\n-\t      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)\n+\t      | -skyos* | -haiku* | -rdos* |  -redox* | -toppers* | -drops* | -es* | -tirtos*)\n \t# Remember, each alternative MUST END IN *, to match a version number.\n \t\t;;\n \t-qnx*)\ndiff --git a/tools/gdbmshell.c b/tools/gdbmshell.c\nindex 22c4938..bf75dc8 100644\n--- a/tools/gdbmshell.c\n+++ b/tools/gdbmshell.c\n@@ -2890,16 +2890,6 @@ struct timing\n   struct timeval sys;\n };\n \n-void\n-timing_start (struct timing *t)\n-{\n-  struct rusage r;\n-  gettimeofday (&t->real, NULL);\n-  getrusage (RUSAGE_SELF, &r);\n-  t->user  = r.ru_utime;\n-  t->sys = r.ru_stime;\n-}\n-\n static inline struct timeval\n timeval_sub (struct timeval a, struct timeval b)\n {\n@@ -2916,19 +2906,6 @@ timeval_sub (struct timeval a, struct timeval b)\n   return diff;\n }\n \n-void\n-timing_stop (struct timing *t)\n-{\t   \n-  struct rusage r;\n-  struct timeval now;\n-  \n-  gettimeofday (&now, NULL);\n-  getrusage (RUSAGE_SELF, &r);\n-  t->real = timeval_sub (now, t->real);\n-  t->user = timeval_sub (r.ru_utime, t->user);\n-  t->sys = timeval_sub (r.ru_stime, t->sys);\n-}\n-\n static int\n argsprep (struct command *cmd, struct gdbmarglist *arglist,\n \t  struct command_param *param)\n@@ -3047,22 +3024,12 @@ run_command (struct command *cmd, struct gdbmarglist *arglist)\n \t  else\n \t    cenv.fp = stdout;\n \t  \n-\t  timing_start (&tm);\n \t  rc = cmd->handler (&param, &cenv);\n-\t  timing_stop (&tm);\n \t  if (cmd->end)\n \t    cmd->end (cenv.data);\n \t  else if (cenv.data)\n \t    free (cenv.data);\n \n-\t  if (variable_is_true (\"timing\"))\n-\t    {\n-\t      fprintf (cenv.fp, \"[%s r=%lu.%06lu u=%lu.%06lu s=%lu.%06lu]\\n\",\n-\t\t       cmd->name,\n-\t\t       tm.real.tv_sec, tm.real.tv_usec,\n-\t\t       tm.user.tv_sec, tm.user.tv_usec,\n-\t\t       tm.sys.tv_sec, tm.sys.tv_usec);\n-\t    }\n \t  \n \t  if (pagfp)\n \t    pclose (pagfp);\n"
  },
  {
    "path": "recipes/wip/libs/other/gflags/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/gflags/gflags/blob/master/INSTALL.md#compiling-the-source-code-with-cmake\n[source]\ngit = \"https://github.com/gflags/gflags\"\nrev = \"v2.3.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/glew/recipe.toml",
    "content": "#TODO: compiled but not tested\n[source]\ntar = \"https://github.com/nigels-com/glew/releases/download/glew-2.3.1/glew-2.3.1.tgz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"mesa\",\n    \"mesa-glu\",\n]\nscript = \"\"\"\n# Build system is a standalone Makefile\nCOOKBOOK_CONFIGURE=\"true\"\nCOOKBOOK_CONFIGURE_FLAGS=\"\"\n\n# See Makefile for variables to override\nexport GLEW_PREFIX=\"/usr\"\nexport GLEW_DEST=\"/usr\"\nexport GLEW_OSMESA\nexport PYTHON=\"python3\"\n\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n# The auto directory needs to be built first and can't be built in parallel\n# because the Makefile creates files (using Perl and Python!!) that are needed later\n\"${COOKBOOK_MAKE}\" -C \"${COOKBOOK_BUILD}/auto\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/glfw3/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://www.glfw.org/docs/latest/compile.html\n[source]\ngit = \"https://github.com/glfw/glfw\"\nrev = \"3.4\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DGLFW_BUILD_TESTS=OFF\",\n    \"-DGLFW_BUILD_DOCS=OFF\",\n    \"-DGLFW_BUILD_WAYLAND=OFF\",\n]\ndependencies = [\n    \"libxkbcommon\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/gpgme/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://gnupg.org/ftp/gcrypt/gpgme/gpgme-1.20.0.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libgcrypt\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/grpc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/grpc/grpc/blob/v1.76.x/BUILDING.md\n[source]\ngit = \"https://github.com/grpc/grpc\"\nbranch = \"v1.78.x\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/hdf5/recipe.toml",
    "content": "#TODO not compiled or tested\n# in case of errors, read: https://github.com/HDFGroup/hdf5/blob/develop/release_docs/INSTALL\n[source]\ntar = \"https://github.com/HDFGroup/hdf5/releases/download/hdf5-1_14_3/hdf5-1_14_3.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"zlib\",\n    \"openmpi\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/hwdata/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://github.com/vcrhonek/hwdata/archive/refs/tags/v0.400.tar.gz\"\nblake3 = \"d56a0863502e528025ddb84b0968a87a713365d91927c92bfe35842d47387e77\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\nCOOKBOOK_CONFIGURE=\"./configure\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/hwloc/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.open-mpi.org/release/hwloc/v2.9/hwloc-2.9.3.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libxml2\",\n    \"libevdev\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/imlib2/recipe.toml",
    "content": "#TODO compilation error - unknown type name \"sigjmp_buf\"\n[source]\ntar = \"https://downloads.sourceforge.net/project/enlightenment/imlib2-src/1.12.5/imlib2-1.12.5.tar.xz\"\nblake3 = \"535b6a986538295af5194e81281a11a1d7e79ae518959ca434f1e53bfa67e86d\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"configure\"\nconfigureflags = [\"--without-x-shm-fd\"]\ndependencies = [\n    \"freetype2\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"x11proto\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/imlib2/redox.patch",
    "content": "diff -ruwN '--exclude=Makefile.in' source-old/src/lib/x11_grab.c source/src/lib/x11_grab.c\n--- source-old/src/lib/x11_grab.c\t2024-12-24 07:45:18.000000000 -0700\n+++ source/src/lib/x11_grab.c\t2025-10-30 12:54:08.011156248 -0600\n@@ -4,8 +4,10 @@\n #include <X11/Xutil.h>\n #include <X11/extensions/shape.h>\n #include <X11/extensions/XShm.h>\n+#if !defined(__redox__)\n #include <sys/ipc.h>\n #include <sys/shm.h>\n+#endif\n \n #include \"x11_grab.h\"\n #include \"x11_ximage.h\"\ndiff -ruwN '--exclude=Makefile.in' source-old/src/lib/x11_rend.c source/src/lib/x11_rend.c\n--- source-old/src/lib/x11_rend.c\t2025-04-06 07:16:45.000000000 -0600\n+++ source/src/lib/x11_rend.c\t2025-10-30 12:55:57.324410357 -0600\n@@ -474,20 +474,24 @@\n             gcm = XCreateGC(x11->dpy, m, GCGraphicsExposures, &gcv);\n         }\n         /* write the mask */\n+#if !defined(__redox__)\n         if (shm)\n             /* write shm XImage */\n             XShmPutImage(x11->dpy, m, gcm, mxim, 0, 0, dx, dy, dw, dh, False);\n         /* write regular XImage */\n         else\n+#endif\n             XPutImage(x11->dpy, m, gcm, mxim, 0, 0, dx, dy, dw, dh);\n     }\n \n     /* write the image */\n+#if !defined(__redox__)\n     if (shm)\n         /* write shm XImage */\n         XShmPutImage(x11->dpy, w, gc, xim, 0, 0, dx, dy, dw, dh, False);\n     /* write regular XImage */\n     else\n+#endif\n         XPutImage(x11->dpy, w, gc, xim, 0, 0, dx, dy, dw, dh);\n \n     /* free the XImage and put onto our free list */\ndiff -ruwN '--exclude=Makefile.in' source-old/src/lib/x11_ximage.c source/src/lib/x11_ximage.c\n--- source-old/src/lib/x11_ximage.c\t2024-01-02 06:11:28.000000000 -0700\n+++ source/src/lib/x11_ximage.c\t2025-10-30 12:57:02.128925585 -0600\n@@ -11,8 +11,10 @@\n #include <xcb/shm.h>\n #include <sys/mman.h>\n #endif\n+#if !defined(__redox__)\n #include <sys/ipc.h>\n #include <sys/shm.h>\n+#endif\n \n #include \"x11_ximage.h\"\n \n@@ -56,6 +58,7 @@\n     int             val;\n \n     /* if its there set x_does_shm flag */\n+#if !defined(__redox__)\n     if (XShmQueryExtension(d))\n     {\n #ifdef HAVE_X11_SHM_FD\n@@ -72,6 +75,7 @@\n     }\n     /* clear the flag - no shm at all */\n     else\n+#endif\n     {\n         x_does_shm = 0;\n         return;\n@@ -121,6 +125,7 @@\n         return NULL;\n \n     /* try create an shm image */\n+#if !defined(__redox__)\n     xim = XShmCreateImage(x11->dpy, x11->vis, depth, ZPixmap, NULL, si, w, h);\n     if (!xim)\n         return NULL;\n@@ -230,6 +235,7 @@\n             shmctl(si->shmid, IPC_RMID, 0);\n         }\n     }\n+#endif\n \n     /* couldnt create SHM image ? */\n     /* destroy previous image */\n@@ -243,6 +249,7 @@\n                          XShmSegmentInfo *si)\n {\n     XSync(x11->dpy, False);\n+#if !defined(__redox__)\n     XShmDetach(x11->dpy, si);\n #ifdef HAVE_X11_SHM_FD\n     if (x_does_shm_fd)\n@@ -255,6 +262,7 @@\n         shmdt(si->shmaddr);\n         shmctl(si->shmid, IPC_RMID, 0);\n     }\n+#endif\n     XDestroyImage(xim);\n }\n \n"
  },
  {
    "path": "recipes/wip/libs/other/inih/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/benhoyt/inih#meson-notes\n[source]\ngit = \"https://github.com/benhoyt/inih\"\nrev = \"r62\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=false\"\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/iniparser/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ndevilla/iniparser\"\nrev = \"v4.2.6\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/json-c/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/json-c/json-c#build-instructions--\n[source]\ngit = \"https://github.com/json-c/json-c\"\nbranch = \"json-c-0.18\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/kerberos5/recipe.toml",
    "content": "#TODO missing script for building, lacking build instructions\n[source]\ntar = \"https://kerberos.org/dist/krb5/1.21/krb5-1.21.2.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/lame/recipe.toml",
    "content": "#TODO The redox target is not supported on the configure script\n[source]\ntar = \"https://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/lammps/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://docs.lammps.org/Build_cmake.html\n[source]\ngit = \"https://github.com/lammps/lammps\"\nrev = \"27e8d0f19cfd60ff513828af74d07d2c8f3c4451\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/lib2geom/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/inkscape/lib2geom#building\n[source]\ngit = \"https://gitlab.com/inkscape/lib2geom\"\nrev = \"18fc32f9972dfaee597055b3226c5b7ef3bfbb4c\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"boost\",\n    \"libgsl\",\n    \"glib\",\n    \"cairo\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/liba52/recipe.toml",
    "content": "#TODO The redox target is not supported on the configure script\n[source]\ntar = \"https://liba52.sourceforge.io/files/a52dec-0.7.4.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libabsl/recipe.toml",
    "content": "#TODO: compile error on redox, need patches\n# Also see https://github.com/protocolbuffers/protobuf/blob/main/cmake/README.md\n[source]\ngit = \"https://github.com/abseil/abseil-cpp\"\nrev = \"20260107.1\"\nshallow_clone = true\n\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libaio/recipe.toml",
    "content": "#TODO linux specific <sys/syscall.h>\n[source]\ntar = \"https://releases.pagure.org/libaio/libaio-0.3.113.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nmake -C ${COOKBOOK_SOURCE}\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libaom/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://aomedia.googlesource.com/aom/#basic-build\n[source]\ngit = \"https://aomedia.googlesource.com/aom\"\nrev = \"aca387522ccc0a1775716923d5489dd2d4b1e628\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libargon2/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/P-H-C/phc-winner-argon2#usage\n[source]\ngit = \"https://github.com/P-H-C/phc-winner-argon2\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libaspell/recipe.toml",
    "content": "#TODO can't recognize Redox target\n[source]\ntar = \"https://ftp.gnu.org/gnu/aspell/aspell-0.60.8.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libass/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/libass/libass/releases/download/0.17.3/libass-0.17.3.tar.xz\"\nblake3 = \"bfbcc2a97193eb5c2a6c54d07c508d42ff62387a8a9d8b3959d15b6115bca8b6\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"glib\",\n    \"harfbuzz\",\n    \"libpng\",\n    \"pcre2\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --disable-asm\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libatomic-ops/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://github.com/ivmai/libatomic_ops/releases/download/v7.8.0/libatomic_ops-7.8.0.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libbluray/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://download.videolan.org/pub/videolan/libbluray/1.3.4/libbluray-1.3.4.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libxml2\",\n    \"freetype2\",\n    \"zlib\",\n    \"libpng\",\n    \"fontconfig\",\n    \"expat\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libbotan/recipe.toml",
    "content": "#TODO missing script for building\n[source]\ntar = \"https://botan.randombit.net/releases/Botan-3.2.0.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libbrotli/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/google/brotli#cmake\n[source]\ngit = \"https://github.com/google/brotli\"\nrev = \"ed738e842d2fbdf2d6459e39267a633c4a9b2f5d\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libbsd/recipe.toml",
    "content": "#TODO Can't find required MD5 functions in \"libc\" or \"libmd\"\n[source]\ntar = \"https://libbsd.freedesktop.org/releases/libbsd-0.11.7.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libburn/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"http://files.libburnia-project.org/releases/libburn-1.5.4.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libcaca/recipe.toml",
    "content": "#TODO can't recognize Redox target\n[source]\ntar = \"http://caca.zoy.org/files/libcaca/libcaca-0.99.beta19.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libcamera/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://libcamera.org/getting-started.html\n[source]\ngit = \"https://git.libcamera.org/libcamera/libcamera\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"libyaml\",\n    \"libevdev\",\n    \"gstreamer\",\n    \"libjpeg\",\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libcap/recipe.toml",
    "content": "#TODO missing script for \"make\" (maybe need the Go), see https://git.kernel.org/pub/scm/libs/libcap/libcap.git/tree/README#n20\n[source]\ntar = \"https://kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.69.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libcdio/recipe.toml",
    "content": "#TODO missing script for building, see https://git.savannah.gnu.org/cgit/libcdio.git/tree/INSTALL\n[source]\ngit = \"https://git.savannah.gnu.org/git/libcdio.git\"\nrev = \"9c7a2779846da161279bc1501e83c849cf89a594\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libcdio-paranoia/recipe.toml",
    "content": "#TODO missing script for building\n[source]\ngit = \"https://github.com/rocky/libcdio-paranoia\"\nrev = \"db4dfff9e11c516ae35d87e568f511002ddae9d7\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libcdr/recipe.toml",
    "content": "#TODO make all dependencies work\n[source]\ntar = \"https://dev-www.libreoffice.org/src/libcdr/libcdr-0.1.7.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"boost\",\n    \"libicu\",\n    \"liblcms\",\n    \"librevenge\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libcpuid/recipe.toml",
    "content": "#TODO libtool error\n# require a POSIX-compatible shell, see https://github.com/anrieff/libcpuid#prerequisites\n[source]\ntar = \"https://github.com/anrieff/libcpuid/releases/download/v0.6.4/libcpuid-0.6.4.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libcups/recipe.toml",
    "content": "#TODO make gnutls work\n[source]\ntar = \"https://github.com/OpenPrinting/cups/releases/download/v2.4.7/cups-2.4.7-source.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"gnutls3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libde265/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://github.com/strukturag/libde265/releases/download/v1.0.14/libde265-1.0.14.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-dec265\n    --disable-sherlock265\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libdecor/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.freedesktop.org/libdecor/libdecor#build--install\n[source]\ntar = \"https://gitlab.freedesktop.org/libdecor/libdecor/uploads/ee5ef0f2c3a4743e8501a855d61cb397/libdecor-0.1.1.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"pango\",\n    \"libwayland\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libdeflate/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/ebiggers/libdeflate#building\n[source]\ntar = \"https://github.com/ebiggers/libdeflate/releases/download/v1.19/libdeflate-1.19.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libdmx/recipe.toml",
    "content": "#TODO xorg-macros package not found\n[source]\ntar = \"https://www.x.org/releases/individual/lib/libdmx-1.1.5.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libdotconf/recipe.toml",
    "content": "#TODO missing \"configure\" file, see https://github.com/williamh/dotconf/blob/master/INSTALL\n[source]\ngit = \"https://github.com/williamh/dotconf\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libdouble-conversion/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/google/double-conversion#building\n[source]\ngit = \"https://github.com/google/double-conversion\"\nrev = \"4f7a25d8ced8c7cf6eee6fd09d6788eaa23c9afe\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libdvbpsi/recipe.toml",
    "content": "#TODO Compilation error\n[source]\ntar = \"https://download.videolan.org/pub/libdvbpsi/1.3.3/libdvbpsi-1.3.3.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libdvdcss/recipe.toml",
    "content": "#TODO Compilation error\n[source]\ntar = \"https://download.videolan.org/pub/libdvdcss/1.4.3/libdvdcss-1.4.3.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libdvdnav/recipe.toml",
    "content": "#TODO can't recognize Redox target\n[source]\ntar = \"http://www.videolan.org/pub/videolan/libdvdnav/5.0.1/libdvdnav-5.0.1.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libdvdread/recipe.toml",
    "content": "#TODO can't recognize Redox target\n[source]\ntar = \"http://www.videolan.org/pub/videolan/libdvdread/5.0.0/libdvdread-5.0.0.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libebml/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Matroska-Org/libebml#building-and-installing\n[source]\ntar = \"https://dl.matroska.org/downloads/libebml/libebml-1.4.4.tar.xz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libedit/recipe.toml",
    "content": "#TODO promote\n[source]\ntar = \"https://www.thrysoee.dk/editline/libedit-20250104-3.1.tar.gz\"\npatches = [\n    \"redox.patch\"\n]\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"ncurses\",\n    \"termcap\",\n    \"terminfo\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libedit/redox.patch",
    "content": "diff --color -ruwN source/configure source-new/configure\n--- source/configure\t2025-01-05 00:16:30.000000000 +0700\n+++ source-new/configure\t2025-09-18 06:50:23.667443238 +0700\n@@ -6384,7 +6384,7 @@\n   ;;\n \n # This must be glibc/ELF.\n-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu* | redox*)\n   lt_cv_deplibs_check_method=pass_all\n   ;;\n \n@@ -7715,7 +7715,7 @@\n   ;;\n \n x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \\\n-s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*)\n+s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu**|x86_64-redox*)\n   # Find out what ABI is being produced by ac_compile, and set linker\n   # options accordingly.  Note that the listed cases only cover the\n   # situations where additional linker options are needed (such as when\n@@ -7734,7 +7734,7 @@\n \t  x86_64-*kfreebsd*-gnu)\n \t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n \t    ;;\n-\t  x86_64-*linux*|x86_64-gnu*)\n+\t  x86_64-*linux*|x86_64-gnu*|x86_64-redox*)\n \t    case `$FILECMD conftest.o` in\n \t      *x86-64*)\n \t\tLD=\"${LD-ld} -m elf32_x86_64\"\n@@ -7763,7 +7763,7 @@\n \t  x86_64-*kfreebsd*-gnu)\n \t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n \t    ;;\n-\t  x86_64-*linux*|x86_64-gnu*)\n+\t  x86_64-*linux*|x86_64-gnu*|x86_64-*redox*)\n \t    LD=\"${LD-ld} -m elf_x86_64\"\n \t    ;;\n \t  powerpcle-*linux*)\n@@ -12168,7 +12168,7 @@\n   ;;\n \n # This must be glibc/ELF.\n-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu* | redox*)\n   version_type=linux # correct to gnu/linux during the next big refactor\n   need_lib_prefix=no\n   need_version=no\ndiff --color -ruwN source/src/chartype.h source-new/src/chartype.h\n--- source/src/chartype.h\t2022-06-11 14:57:59.000000000 +0700\n+++ source-new/src/chartype.h\t2025-09-18 06:38:37.401509690 +0700\n@@ -39,7 +39,8 @@\n \t!(defined(__APPLE__) && defined(__MACH__)) && \\\n \t!defined(__OpenBSD__) && \\\n \t!defined(__FreeBSD__) && \\\n-\t!defined(__DragonFly__)\n+\t!defined(__DragonFly__) && \\\n+\t!defined(__redox__)\n #ifndef __STDC_ISO_10646__\n /* In many places it is assumed that the first 127 code points are ASCII\n  * compatible, so ensure wchar_t indeed does ISO 10646 and not some other\ndiff --color -ruwN source/src/editline/readline.h source-new/src/editline/readline.h\n--- source/src/editline/readline.h\t2023-08-27 14:25:53.000000000 +0700\n+++ source-new/src/editline/readline.h\t2025-09-18 06:41:15.169232816 +0700\n@@ -78,7 +78,7 @@\n \n #ifndef CTRL\n #include <sys/ioctl.h>\n-#if !defined(__sun) && !defined(__hpux) && !defined(_AIX)\n+#if !defined(__sun) && !defined(__hpux) && !defined(_AIX) && !defined(__redox__)\n #include <sys/ttydefaults.h>\n #endif\n #ifndef CTRL\ndiff --color -ruwN source/src/sys.h source-new/src/sys.h\n--- source/src/sys.h\t2024-08-09 01:03:34.000000000 +0700\n+++ source-new/src/sys.h\t2025-09-18 06:40:02.388537017 +0700\n@@ -116,10 +116,6 @@\n typedef unsigned int\tu_int32_t;\n #endif\n \n-#ifndef HAVE_SIZE_MAX\n-#define SIZE_MAX\t((size_t)-1)\n-#endif\n-\n #define\tREGEX\t\t/* Use POSIX.2 regular expression functions */\n #undef\tREGEXP\t\t/* Use UNIX V8 regular expression functions */\n \ndiff --color -ruwN source/src/wcsdup.c source-new/src/wcsdup.c\n--- source/src/wcsdup.c\t2022-06-11 14:57:59.000000000 +0700\n+++ source-new/src/wcsdup.c\t2025-09-18 06:44:01.365917599 +0700\n@@ -11,7 +11,7 @@\n  * code is also granted without any restrictions.\n  */\n \n-#ifndef HAVE_WCSDUP\n+#if !defined(HAVE_WCSDUP) && !defined(__redox__)\n \n #include \"config.h\"\n \n"
  },
  {
    "path": "recipes/wip/libs/other/libeditline/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://ftp.troglobit.com/editline/editline-1.17.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libeigen/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/libeigen/eigen/-/blob/master/INSTALL?ref_type=heads\n[source]\ngit = \"https://gitlab.com/libeigen/eigen\"\nrev = \"3147391d946bb4b6c68edd901f2add6ac1f31f8c\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libenet/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"http://enet.bespin.org/download/enet-1.3.17.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/liberty-eiffel/recipe.toml",
    "content": "#TODO missing script for \"install.sh\", adapt to Redox\n[source]\ntar = \"http://download.savannah.gnu.org/releases/liberty-eiffel/bell.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libev/recipe.toml",
    "content": "[source]\ntar = \"https://dist.schmorp.de/libev/libev-4.33.tar.gz\"\nblake3 = \"d56e7f06baa52d5068b6184a307cf27c32f71b60e13d98ee6d4d9c1786393424\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libevdev/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://www.freedesktop.org/software/libevdev/libevdev-1.12.1.tar.xz\"\nblake3 = \"d4be83e6f6cb4972cf5052f5a046eb820aa529427202f043a9d95b945e73edcd\"\n\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libevent/recipe.toml",
    "content": "#TODO compiles, not tested\n[source]\ntar = \"https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz\"\n\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libfmt/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://fmt.dev/latest/usage.html#building-the-library\n[source]\ngit = \"https://github.com/fmtlib/fmt\"\nrev = \"f5e54359df4c26b6230fc61d38aa294581393084\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libfs/recipe.toml",
    "content": "#TODO xorg-macros package not found\n[source]\ntar = \"https://www.x.org/releases/individual/lib/libFS-1.0.9.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libfuse2/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/libfuse/libfuse#installation\n#TODO require a redox daemon (userspace equivalent of the Linux kernel module)\n[source]\ntar = \"https://github.com/libfuse/libfuse/releases/download/fuse-2.9.9/fuse-2.9.9.tar.gz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libfuse3/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/libfuse/libfuse#installation\n#TODO require a redox daemon (userspace equivalent of the Linux kernel module)\n[source]\ntar = \"https://github.com/libfuse/libfuse/releases/download/fuse-3.16.2/fuse-3.16.2.tar.gz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libgav1/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://chromium.googlesource.com/codecs/libgav1/#compile\n[source]\ngit = \"https://chromium.googlesource.com/codecs/libgav1\"\nrev = \"e386d8f1fb983200972d159b9be47fd5d0776708\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libgc/recipe.toml",
    "content": "#TODO compilation error - pthreads not supported by the GC on this platform\n[source]\ntar = \"https://www.hboehm.info/gc/gc_source/gc-8.2.4.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libgcrypt/recipe.toml",
    "content": "[source]\ntar = \"https://gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-1.11.1.tar.bz2\"\nblake3 = \"68844e12b92960d66c4ce85a4c3db1df8377b232980f1218b4c5d904e9c02511\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\"libgpg-error\"]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport GPGRT_CONFIG=\"${COOKBOOK_SYSROOT}/usr/bin/gpgrt-config\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libgcrypt/redox.patch",
    "content": "--- libgcrypt-1.11.1/tests/stopwatch.h\t2025-03-17 03:55:24.000000000 -0600\n+++ source/tests/stopwatch.h\t2025-05-10 08:42:52.113921935 -0600\n@@ -45,6 +45,8 @@\n                    &started_at.creation_time, &started_at.exit_time,\n                    &started_at.kernel_time, &started_at.user_time);\n   stopped_at = started_at;\n+#elif defined(__redox__)\n+  //TODO: times on redox\n #else\n   struct tms tmp;\n \n@@ -60,6 +62,8 @@\n   GetProcessTimes (GetCurrentProcess (),\n                    &stopped_at.creation_time, &stopped_at.exit_time,\n                    &stopped_at.kernel_time, &stopped_at.user_time);\n+#elif defined(__redox__)\n+  //TODO: times on redox\n #else\n   struct tms tmp;\n \n"
  },
  {
    "path": "recipes/wip/libs/other/libgdal/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gdal.org/development/building_from_source.html\n[source]\ntar = \"https://github.com/OSGeo/gdal/releases/download/v3.8.4/gdal-3.8.4.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libgit2/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/libgit2/libgit2#building-libgit2---using-cmake\n[source]\ngit = \"https://github.com/libgit2/libgit2\"\nrev = \"a2bde63741977ca0f4ef7db2f609df320be67a08\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libglm/recipe.toml",
    "content": "#TODO Needs to determine the script\n[source]\ngit = \"https://github.com/g-truc/glm\"\nrev = \"bf71a834948186f4097caa076cd2663c69a10e1e\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libgloox/recipe.toml",
    "content": "#TODO make gnutls work\n[source]\ntar = \"https://camaya.net/download/gloox-1.0.27.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"gnutls3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libgpg-error/recipe.toml",
    "content": "[source]\ntar = \"https://gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-1.55.tar.bz2\"\nblake3 = \"6c363dd8c6bcf2601dd5ff3b11fa2f699baa2aae40de2acd92461af0fd8178f0\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\ncat > \"${COOKBOOK_SOURCE}/src/syscfg/lock-obj-pub.${TARGET}.h\" << EOF\n## lock-obj-pub.x86_64-unknown-redox.h\n## File created by gen-lock-obj.sh - DO NOT EDIT\n## To be included by mkheader into gpg-error.h\n\ntypedef struct\n{\n  long _vers;\n  union {\n    volatile char _priv[12];\n    long _x_align;\n    long *_xp_align;\n  } u;\n} gpgrt_lock_t;\n\n#define GPGRT_LOCK_INITIALIZER {1,{{}}}\n##\n## Local Variables:\n## mode: c\n## buffer-read-only: t\n## End:\n##\nEOF\ncookbook_configure --enable-threads=posix\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libgpm/recipe.toml",
    "content": "#TODO undefined macro: AC_PROG_LIBTOOL\n[source]\ntar = \"https://www.nico.schottelius.org/software/gpm/archives/gpm-1.20.7.tar.bz2\"\nscript = \"./autogen.sh\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libgrantlee/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/steveire/grantlee#installation\n[source]\ntar = \"https://github.com/steveire/grantlee/releases/download/v5.3.1/grantlee-5.3.1.tar.gz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt5-base\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libgsl/recipe.toml",
    "content": "#TODO can't recognize Redox target\n[source]\ntar = \"https://ftp.gnu.org/gnu/gsl/gsl-2.7.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libgumbo/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://codeberg.org/gumbo-parser/gumbo-parser\"\nrev = \"23af2f7c5a9da7e7ea42fcc2c573df52e4a3a5be\"\nscript = \"./autogen.sh\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libharu/recipe.toml",
    "content": "#TODO the git repository contents aren't copied to the \"build\" folder\n[source]\ngit = \"https://github.com/libharu/libharu\"\nrev = \"0c598becaadaef8e3d12b883f9fc2864a118c12d\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n./buildconf.sh\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libhidapi/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/libusb/hidapi/blob/master/BUILD.cmake.md\n[source]\ngit = \"https://github.com/libusb/hidapi\"\nrev = \"d3013f0af3f4029d82872c1a9487ea461a56dee4\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libiconv\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libhyphen/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/hunspell/hyphen/blob/master/README#L49\n[source]\ngit = \"https://github.com/hunspell/hyphen\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libicu/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/unicode-org/icu/releases/download/release-77-1/icu4c-77_1-src.tgz\"\nblake3 = \"8f51c4e4c6577b61d02921e800ddb0a2d4778addf7717eef4c5bb0e8a5582c3a\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE=\"${COOKBOOK_SOURCE}/source/configure\"\nmkdir -p host\npushd host\n#TODO: easier way to build for host?\nHOST_ENV=(\n    env\n    --unset=AR\n    --unset=AS\n    --unset=CC\n    --unset=CFLAGS\n    --unset=CPPFLAGS\n    --unset=CXX\n    --unset=GNU_TARGET\n    --unset=LD\n    --unset=LDFLAGS\n    --unset=NM\n    --unset=OBJCOPY\n    --unset=OBJDUMP\n    --unset=PKG_CONFIG\n    --unset=PKG_CONFIG_ALLOW_CROSS\n    --unset=PKG_CONFIG_FOR_BUILD\n    --unset=PKG_CONFIG_LIBDIR\n    --unset=PKG_CONFIG_PATH\n    --unset=PKG_CONFIG_SYSROOT_DIR\n    --unset=PREFIX_RUSTFLAGS\n    --unset=RANLIB\n    --unset=READELF\n    --unset=STRIP\n    --unset=TARGET\n)\n\"${HOST_ENV[@]}\" printenv | sort\n\"${HOST_ENV[@]}\" \"${COOKBOOK_CONFIGURE}\"\n\"${HOST_ENV[@]}\" \"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\npopd\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --with-cross-build=\"${COOKBOOK_BUILD}/host\"\n    icu_cv_host_frag=mh-linux\n)\n# libicu uses TARGET for something else\nunset TARGET\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libicu/redox.patch",
    "content": "diff -ruwN icu/source/common/unicode/ptypes.h source/source/common/unicode/ptypes.h\n--- icu/source/common/unicode/ptypes.h\t2025-03-13 12:31:23.000000000 -0600\n+++ source/source/common/unicode/ptypes.h\t2025-04-11 13:46:44.105116183 -0600\n@@ -56,7 +56,7 @@\n // implementations (looking at you, Apple, spring 2024) actually do this, so\n // ICU4C must detect and deal with that.\n #if !defined(__cplusplus) && !defined(U_IN_DOXYGEN)\n-#   if U_HAVE_CHAR16_T\n+#   if U_HAVE_CHAR16_T && !defined(__redox__)\n #       include <uchar.h>\n #   else\n         typedef uint16_t char16_t;\n"
  },
  {
    "path": "recipes/wip/libs/other/libimath/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://imath.readthedocs.io/en/latest/install.html#linux-macos\n[source]\ngit = \"https://github.com/AcademySoftwareFoundation/Imath\"\nrev = \"d690a3fcff4e877ead5ae56c7e964595ade8a35e\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libimmer/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/arximboldi/immer#usage\n[source]\ngit = \"https://github.com/arximboldi/immer\"\nrev = \"5875f7739a6c642ad58cbedadb509c86d421217e\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libinput/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://wayland.freedesktop.org/libinput/doc/latest/building.html#building\n[source]\ngit = \"https://gitlab.freedesktop.org/libinput/libinput\"\nrev = \"1680f2fbaa63a91739012c6b57988ab1918ea0b7\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"eudev\",\n    \"libevdev\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libisoburn/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"http://files.libburnia-project.org/releases/libisoburn-1.5.4.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libisofs/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"http://files.libburnia-project.org/releases/libisofs-1.5.4.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libjasper/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/jasper-software/jasper/blob/master/INSTALL.txt\n[source]\ntar = \"https://github.com/jasper-software/jasper/releases/download/version-4.1.1/jasper-4.1.1.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/liblager/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/arximboldi/lager#usage\n[source]\ngit = \"https://github.com/arximboldi/lager\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libzug\",\n    \"boost\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/liblapack/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Reference-LAPACK/lapack#installation\n[source]\ngit = \"https://github.com/Reference-LAPACK/lapack\"\nrev = \"04b044e020a3560ccfa9988c8a80a1fb7083fc2e\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/liblcms/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://github.com/mm2/Little-CMS/releases/download/lcms2.15/lcms2-2.15.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libtiff\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/liblensfun/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/lensfun/lensfun?tab=readme-ov-file#build-instructions\n[source]\ngit = \"https://github.com/lensfun/lensfun\"\nrev = \"35b19fb38e7250ea646709ef9e528d54a6a79648\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"glib\",\n    \"libpng\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/liblo/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"http://downloads.sourceforge.net/liblo/liblo-0.31.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libm17n/recipe.toml",
    "content": "#TODO missing plural.h\n[source]\ntar = \"https://download.savannah.nongnu.org/releases/m17n/m17n-lib-1.8.4.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libmad/recipe.toml",
    "content": "#TODO the redox target is not supported on the configure script\n[source]\ntar = \"https://sourceforge.net/projects/mad/files/libmad/0.15.1b/libmad-0.15.1b.tar.gz/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libmd/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://archive.hadrons.org/software/libmd/libmd-1.1.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libmpeg2/recipe.toml",
    "content": "#TODO the redox target is not supported on the configure script\n[source]\ntar = \"https://libmpeg2.sourceforge.io/files/libmpeg2-0.5.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libmtp/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://sourceforge.net/projects/libmtp/files/libmtp/1.1.21/libmtp-1.1.21.tar.gz/download\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libusb\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libmypaint/recipe.toml",
    "content": "#TODO probably missing dependencies, see: https://github.com/mypaint/libmypaint/#dependencies\n[source]\ntar = \"https://github.com/mypaint/libmypaint/releases/download/v1.6.0/libmypaint-1.6.0.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"glib\",\n    \"gobject-introspection\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libnlopt/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/stevengj/nlopt#readme\n[source]\ngit = \"https://github.com/stevengj/nlopt\"\nrev = \"09b3c2a6da71cabcb98d2c8facc6b83d2321ed71\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libnsl/recipe.toml",
    "content": "#TODO missing headers for compilation\n[source]\ntar = \"https://github.com/thkukuk/libnsl/releases/download/v2.0.1/libnsl-2.0.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libonig/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/kkos/oniguruma\"\nrev = \"f95747b462de672b6f8dbdeb478245ddf061ca53\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libotf/recipe.toml",
    "content": "#TODO can't recognize redox target\n[source]\ntar = \"https://download.savannah.nongnu.org/releases/m17n/libotf-0.9.16.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libpcap/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://www.tcpdump.org/release/libpcap-1.10.4.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libpcsclite/recipe.toml",
    "content": "#TODO require POSIX threads support\n[source]\ntar = \"https://pcsclite.apdu.fr/files/pcsc-lite-2.0.3.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libplist/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://github.com/libimobiledevice/libplist/releases/download/2.6.0/libplist-2.6.0.tar.bz2\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --without-cython\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libpoppler/recipe.toml",
    "content": "#TODO needs encoding data - https://poppler.freedesktop.org/poppler-data-0.4.12.tar.gz\n[source]\ntar = \"https://poppler.freedesktop.org/poppler-25.08.0.tar.xz\"\nblake3 = \"0732ef20594d084ae3c24cb75079a2be347df78acac80fdcbd6149b8dce197d4\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"cairo\",\n    \"curl\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"gettext\",\n    \"glib\",\n    \"libffi\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"nghttp2\",\n    \"openssl1\",\n    \"pcre2\",\n    \"pixman\",\n    #TODO: compile dylib \"libtiff\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cmake \\\n    -DCMAKE_C_FLAGS=\"-I${COOKBOOK_SYSROOT}/include\" \\\n    -DCMAKE_CXX_FLAGS=\"-I${COOKBOOK_SYSROOT}/include\" \\\n    -DENABLE_BOOST=OFF \\\n    -DENABLE_GPGME=OFF \\\n    -DENABLE_LCMS=OFF \\\n    -DENABLE_LIBOPENJPEG=none \\\n    -DENABLE_LIBTIFF=OFF \\\n    -DENABLE_QT5=OFF \\\n    -DENABLE_QT6=OFF \\\n    -DENABLE_NSS3=OFF\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libportaudio/recipe.toml",
    "content": "#TODO compilation error\n#TODO require some Linux audio server\n[source]\ngit = \"https://github.com/PortAudio/portaudio\"\nrev = \"147dd722548358763a8b649b3e4b41dfffbcfbb6\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libpthread-stubs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://www.x.org/releases/individual/xcb/libpthread-stubs-0.5.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libpugixml/recipe.toml",
    "content": "#TODO missing script for building, see https://pugixml.org/docs/quickstart.html#install\n[source]\ntar = \"https://github.com/zeux/pugixml/releases/download/v1.14/pugixml-1.14.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libqalculate/recipe.toml",
    "content": "#TODO make libicu work\n[source]\ntar = \"https://github.com/Qalculate/libqalculate/releases/download/v4.9.0/libqalculate-4.9.0.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libgmp\",\n    \"libmpfr\",\n    \"libxml2\",\n    \"readline\",\n    \"libiconv\",\n    \"libicu\",\n    \"curl\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libqrcodegenc/recipe.toml",
    "content": "#TODO missing script to build the C implementation, see https://github.com/nayuki/QR-Code-generator/tree/master/c\n[source]\ngit = \"https://github.com/nayuki/QR-Code-generator\"\nrev = \"720f62bddb7226106071d4728c292cb1df519ceb\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libraptor2/recipe.toml",
    "content": "#TODO customization - https://librdf.org/raptor/INSTALL.html\n#TODO pending dependency configuration\n[source]\ntar = \"http://download.librdf.org/source/raptor2-2.0.16.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libxml2\",\n    \"libxslt\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/librasqal/recipe.toml",
    "content": "#TODO customization - https://librdf.org/rasqal/INSTALL.html\n#TODO compilation error\n[source]\ntar = \"http://download.librdf.org/source/rasqal-0.9.33.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/librdf/recipe.toml",
    "content": "#TODO customization - https://librdf.org/INSTALL.html\n#TODO compilation error\n[source]\ntar = \"http://download.librdf.org/source/redland-1.0.17.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/librevenge/recipe.toml",
    "content": "#TODO make boost work\n[source]\ntar = \"https://sourceforge.net/projects/libwpd/files/librevenge/librevenge-0.0.5/librevenge-0.0.5.tar.xz/download\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"boost\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/librist/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://code.videolan.org/rist/librist#compile-using-mesonninja-linux-osx-and-windows-mingw\n[source]\ngit = \"https://code.videolan.org/rist/librist\"\nrev = \"1e805500dc14a507598cebdd49557c32e514899f\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/librkcommon/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/ospray/rkcommon#building\n[source]\ngit = \"https://github.com/ospray/rkcommon\"\nrev = \"f15291d4789a53e5980fd9b3d2639f705d675dd7\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"onetbb\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libsamplerate/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://github.com/libsndfile/libsamplerate/releases/download/0.2.2/libsamplerate-0.2.2.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libskia/recipe.toml",
    "content": "#TODO missing script for GN, see https://skia.org/docs/user/build/\n[source]\ngit = \"https://skia.googlesource.com/skia\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libslirp/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.freedesktop.org/slirp/libslirp#building\n[source]\ntar = \"https://gitlab.freedesktop.org/slirp/libslirp/uploads/60113f60cfd6abe2c16dde9f6c81b631/libslirp-4.7.0.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libsmooth/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions - https://github.com/enzo1982/smooth/#installation\n[source]\ntar = \"https://github.com/enzo1982/smooth/releases/download/v0.9.10/smooth-0.9.10.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"bzip2\",\n    \"curl\",\n    \"fribidi\",\n    \"gtk3\",\n    \"libjpeg\",\n    \"libxml2\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libsndfile/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/libsndfile/libsndfile/releases/download/1.2.0/libsndfile-1.2.0.tar.xz\"\nblake3 = \"7ec1be7cc47fdffc38cf0cbf02857e6a34a13df22d19f541f04215929e1d7684\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    #TODO \"libflac\",\n    \"libogg\",\n    \"libvorbis\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libsoundio/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/andrewrk/libsoundio#building\n[source]\ngit = \"https://github.com/andrewrk/libsoundio\"\nrev = \"dc4f84339039ac518b6cd1c0e7683e88e25be470\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libspdlog/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/gabime/spdlog\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libspiro/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://github.com/fontforge/libspiro/releases/download/20221101/libspiro-dist-20221101.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libsrt/recipe.toml",
    "content": "#TODO CMake error\n# build instructions: https://github.com/Haivision/srt/blob/master/docs/build/build-linux.md\n[source]\ngit = \"https://github.com/Haivision/srt\"\nrev = \"09f35c0f1743e23f514cb41444504a7faeacf89e\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libssh/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://git.libssh.org/projects/libssh.git/tree/INSTALL#n36\n[source]\ntar = \"https://www.libssh.org/files/0.10/libssh-0.10.6.tar.xz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"zlib\",\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libstatgrab/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://github.com/libstatgrab/libstatgrab/releases/download/LIBSTATGRAB_0_92_1/libstatgrab-0.92.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libstk/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"http://ccrma.stanford.edu/software/stk/release/stk-4.6.2.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libtasn1/recipe.toml",
    "content": "[source]\ntar = \"https://ftp.gnu.org/gnu/libtasn1/libtasn1-4.20.0.tar.gz\"\nblake3 = \"374103da2b2ac47e18b57cb5d1d41f7e42f3725c269cf35fba8e4717f0c392b5\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libtatsu/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://github.com/libimobiledevice/libtatsu/releases/download/1.0.3/libtatsu-1.0.3.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libplist\",\n    \"curl\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libtheora/recipe.toml",
    "content": "[source]\ntar = \"http://downloads.xiph.org/releases/theora/libtheora-1.2.0.tar.gz\"\nblake3 = \"b2413d6a29669063c30679eb46e09bd55b47d51e1516282bd1f5a752a8ecae91\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libogg\",\n    \"libvorbis\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libtickit/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/leonerd/libtickit\n[source]\ntar = \"https://www.leonerd.org.uk/code/libtickit/libtickit-0.4.5.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncursesw\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" install-inc install-lib DESTDIR=\"${COOKBOOK_STAGE}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libtiff/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://download.osgeo.org/libtiff/tiff-4.5.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libunibreak/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://github.com/adah1972/libunibreak/releases/download/libunibreak_5_1/libunibreak-5.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libunistring/recipe.toml",
    "content": "#TODO port the fseterr function\n[source]\ntar = \"https://ftp.gnu.org/gnu/libunistring/libunistring-1.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libunwind/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://download.savannah.nongnu.org/releases/libunwind/libunwind-1.6.2.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/liburiparser/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/uriparser/uriparser/releases/download/uriparser-0.9.8/uriparser-0.9.8.tar.bz2\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libusb/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://github.com/libusb/libusb/releases/download/v1.0.26/libusb-1.0.26.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libuuid/recipe.toml",
    "content": "[source]\ntar = \"https://sourceforge.net/projects/libuuid/files/libuuid-1.0.3.tar.gz/download\"\nblake3 = \"ac6582304401d2be6e5db4570c0d9d6d1500f12c918591a05066679bb2e41e55\"\npatches = [\n  \"redox.patch\"\n]\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libuuid/redox.patch",
    "content": "diff -ruwN source/config.sub source-new/config.sub\n--- source/config.sub\t2014-08-12 15:19:20.000000000 +0700\n+++ source-new/config.sub\t2025-09-19 21:11:57.907457211 +0700\n@@ -1376,7 +1376,7 @@\n \t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n \t      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \\\n \t      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \\\n-\t      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)\n+\t      | -skyos* | -haiku* | -rdos* | -redox* | -toppers* | -drops* | -es*)\n \t# Remember, each alternative MUST END IN *, to match a version number.\n \t\t;;\n \t-qnx*)\ndiff -ruwN source/configure source-new/configure\n--- source/configure\t2014-08-12 15:19:19.000000000 +0700\n+++ source-new/configure\t2025-09-19 21:20:30.460699979 +0700\n@@ -5312,7 +5312,7 @@\n   ;;\n \n # This must be glibc/ELF.\n-linux* | k*bsd*-gnu | kopensolaris*-gnu)\n+linux* | k*bsd*-gnu | kopensolaris*-gnu | redox*)\n   lt_cv_deplibs_check_method=pass_all\n   ;;\n \n@@ -8866,7 +8866,7 @@\n       archive_expsym_cmds='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n       ;;\n \n-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | redox*)\n       tmp_diet=no\n       if test \"$host_os\" = linux-dietlibc; then\n \tcase $cc_basename in\n@@ -10534,7 +10534,7 @@\n   ;;\n \n # This must be glibc/ELF.\n-linux* | k*bsd*-gnu | kopensolaris*-gnu)\n+linux* | k*bsd*-gnu | kopensolaris*-gnu | redox*)\n   version_type=linux # correct to gnu/linux during the next big refactor\n   need_lib_prefix=no\n   need_version=no\ndiff -ruwN source/gen_uuid.c source-new/gen_uuid.c\n--- source/gen_uuid.c\t2014-08-12 04:07:18.000000000 -0400\n+++ source-new/gen_uuid.c\t2025-12-09 10:49:12.580466005 -0500\n@@ -59,9 +59,7 @@\n #include <sys/time.h>\n #endif\n #include <sys/stat.h>\n-#ifdef HAVE_SYS_FILE_H\n #include <sys/file.h>\n-#endif\n #ifdef HAVE_SYS_IOCTL_H\n #include <sys/ioctl.h>\n #endif\ndiff -ruwN source/randutils.c source-new/randutils.c\n--- source/randutils.c\t2014-08-12 15:07:18.000000000 +0700\n+++ source-new/randutils.c\t2025-09-19 21:11:57.907659403 +0700\n@@ -13,7 +13,7 @@\n #include <string.h>\n #include <sys/time.h>\n \n-#include <sys/syscall.h>\n+// #include <sys/syscall.h>\n \n #include \"randutils.h\"\n \n"
  },
  {
    "path": "recipes/wip/libs/other/libuuid-ossp/recipe.toml",
    "content": "#TODO require a data type for FTP\n# download link - ftp://ftp.ossp.org/pkg/lib/uuid/uuid-1.6.2.tar.gz\n#TODO if this template doesn't work, read this http://cvs.ossp.org/fileview?f=ossp-pkg/uuid/INSTALL&v=1.6\n[source]\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libva/recipe.toml",
    "content": "#TODO can't recognize the redox target\n#TODO probably require libdrm\n[source]\ntar = \"https://github.com/intel/libva/releases/download/2.19.0/libva-2.19.0.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libvisio/recipe.toml",
    "content": "#TODO make dependencies work\n[source]\ntar = \"https://dev-www.libreoffice.org/src/libvisio/libvisio-0.1.7.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"boost\",\n    \"libicu\",\n    \"librevenge\",\n    \"libxml2\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libvncserver/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/LibVNC/libvncserver#how-to-build\n[source]\ngit = \"https://github.com/LibVNC/libvncserver\"\nrev = \"10e9eb75f73e973725dc75c373de5d89807af028\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DWITH_OPENSSL=ON\",\n    \"-DWITH_GCRYPT=OFF\",\n]\ndependencies = [\n    \"openssl1\",\n    \"ffmpeg6\",\n    \"libssh2\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libvterm/recipe.toml",
    "content": "#TODO missing script for \"make\"\n[source]\ntar = \"https://launchpad.net/libvterm/trunk/v0.3/+download/libvterm-0.3.3.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\n${COOKBOOK_MAKE} -j ${COOKBOOK_MAKE_JOBS} install \\\n  PREFIX=\"${COOKBOOK_STAGE}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libwebsocket++/recipe.toml",
    "content": "#TODO missing script for installation, lacking build instructions\n[source]\ngit = \"https://github.com/zaphoyd/websocketpp\"\nrev = \"56123c87598f8b1dd471be83ca841ceae07f95ba\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libwebsockets/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/warmcat/libwebsockets\"\nrev = \"4415e84c095857629863804e941b9e1c2e9347ef\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libwmf/recipe.toml",
    "content": "#TODO can't recognize the redox target\n[source]\ntar = \"https://sourceforge.net/projects/wvware/files/libwmf/0.2.8.4/libwmf-0.2.8.4.tar.gz/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libwpd/recipe.toml",
    "content": "#TODO make dependencies work\n[source]\ntar = \"https://sourceforge.net/projects/libwpd/files/libwpd/libwpd-0.10.3/libwpd-0.10.3.tar.xz/download\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"boost\",\n    \"librevenge\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libxcrypt/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/besser82/libxcrypt/releases/download/v4.4.36/libxcrypt-4.4.36.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libxcursor/recipe.toml",
    "content": "#TODO make dependencies work\n[source]\ntar = \"https://www.x.org/releases/individual/lib/libXcursor-1.2.1.tar.xz\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libx11\",\n    \"libxcb\",\n    \"libxfixes\",\n    \"libxrender\",\n    \"x11proto\",\n    \"x11proto-kb\",\n    \"libxrender\",\n    \"xcb-proto\",\n    \"libxau\",\n    \"libpthread-stubs\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n\n# Force libtool to build shared libraries for Redox\n# Override libtool's platform detection\nexport lt_cv_deplibs_check_method=pass_all\nexport ac_cv_lib_dl_dlopen=yes\nexport enable_shared=yes\nexport enable_static=yes\n\n#Configure with shared library support\n\"${COOKBOOK_CONFIGURE}\" \\\n    --host=\"${GNU_TARGET}\" \\\n    --prefix=\"/usr\" \\\n    --enable-shared \\\n    --enable-static \\\n    --with-pic \\\n    ac_cv_search_sendmsg=no \\\n    lt_cv_prog_compiler_pic=\"-fPIC\" \\\n    lt_cv_prog_compiler_pic_works=yes\n\n# Build\n\"${COOKBOOK_MAKE}\"\n\n#After make, manually create the shared library if libtool didn't\nif [ ! -f src/.libs/libXcursor.so ]; then\n    echo \"Creating shared library manually...\"\n    cd src/.libs\n    # Extract all object files from the static library\n    ${GNU_TARGET}-ar x libXcursor.a\n    # Create the shared library from the object files\n    ${GNU_TARGET}-gcc -shared -fPIC -o libXcursor.so.1.0.2 *.o \\\n        -L${COOKBOOK_SYSROOT}/lib -L${COOKBOOK_SYSROOT}/usr/lib \\\n        -lXfixes -lXrender -lX11 -lxcb -lXau\n    # Create symlinks\n    ln -sf libXcursor.so.1.0.2 libXcursor.so.1\n    ln -sf libXcursor.so.1 libXcursor.so\n    cd ../..\nfi\n\n\"${COOKBOOK_MAKE}\" install DESTDIR=\"${COOKBOOK_STAGE}\"\n\n# Also copy the shared libraries if they exist\nif [ -f src/.libs/libXcursor.so.1.0.2 ]; then\n    mkdir -p \"${COOKBOOK_STAGE}/usr/lib\"\n    cp -P src/.libs/libXcursor.so* \"${COOKBOOK_STAGE}/usr/lib/\"\nfi\n\"\"\"\n\n\n# script = \"\"\"\n\n# # this /usr/share/pkgconfig comes from x11proto, that stages pc files in wrong dir.\n# export PKG_CONFIG_PATH=\"${COOKBOOK_SYSROOT}/lib/pkgconfig\"\n# #:${COOKBOOK_SYSROOT}/usr/lib/pkgconfig:${COOKBOOK_SYSROOT}/usr/share/pkgconfig\"\n# export PKG_CONFIG_LIBDIR=\"${COOKBOOK_SYSROOT}/lib/pkgconfig\"\n# #:${COOKBOOK_SYSROOT}/usr/lib/pkgconfig\"\n# export PKG_CONFIG_SYSROOT_DIR=\"${COOKBOOK_SYSROOT}\"\n\n# rsync -a \"${COOKBOOK_SOURCE}/\" ./\n\n# # I'm tired trying figure out why multiple pkgconfig paths are ignored by cargo building stuff\n# # rsync -a -v ${COOKBOOK_SYSROOT}/usr/share/pkgconfig/*.pc ${COOKBOOK_SYSROOT}/lib/pkgconfig/\n# rsync -a -v ${COOKBOOK_SYSROOT}/usr/lib/pkgconfig/*.pc ${COOKBOOK_SYSROOT}/lib/pkgconfig/\n\n# echo \"listing ${COOKBOOK_SYSROOT}/lib/pkgconfig\"\n# ls -al ${COOKBOOK_SYSROOT}/lib/pkgconfig\n\n# cookbook_configure\n# \"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libxkbcommon/recipe.toml",
    "content": "[source]\ntar = \"https://xkbcommon.org/download/libxkbcommon-1.7.0.tar.xz\"\nb3sum = \"5001ca0b8562feeef2010bf16c05657e3875fda3ed5fdedbf48b9135e5cdfcbc\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libxml2\",\n    \"xz\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Denable-wayland=false \\\n    -Denable-x11=false\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libxsimd/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/xtensor-stack/xsimd#install-from-sources\n[source]\ngit = \"https://github.com/xtensor-stack/xsimd\"\nrev = \"c1247bffa8fc36de7380a5cd42673a3b32f74c97\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libxss/recipe.toml",
    "content": "#TODO missing xorg-macros package\n[source]\ntar = \"https://www.x.org/releases/individual/lib/libXScrnSaver-1.2.4.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libxtl/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/xtensor-stack/xtl#install-from-sources\n[source]\ngit = \"https://github.com/xtensor-stack/xtl\"\nrev = \"c95f6c8b13ffb7f74f16d3fd6882668b79bd8412\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libxtst/recipe.toml",
    "content": "#TODO missing dependencies\n[source]\ntar = \"https://www.x.org/releases/individual/lib/libXtst-1.2.4.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libx11\",\n    \"libxi\",\n    \"libxext\",\n]"
  },
  {
    "path": "recipes/wip/libs/other/libxv/recipe.toml",
    "content": "#TODO missing xorg-macros package\n[source]\ntar = \"https://www.x.org/releases/individual/lib/libXv-1.0.12.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libxvmc/recipe.toml",
    "content": "#TODO missing xorg-macros package\n[source]\ntar = \"https://www.x.org/releases/individual/lib/libXvMC-1.0.13.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libyaml/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"http://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libzimg/recipe.toml",
    "content": "#TODO missing script\n[source]\ngit = \"https://github.com/sekrit-twc/zimg\"\nrev = \"e5b0de6bebbcbc66732ed5afaafef6b2c7dfef87\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/libzug/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/arximboldi/zug#usage\n[source]\ngit = \"https://github.com/arximboldi/zug\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"boost\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/libzvbi/recipe.toml",
    "content": "#TODO the redox target is not supported on the configure script\n[source]\ntar = \"https://sourceforge.net/projects/zapping/files/zvbi/0.2.35/zvbi-0.2.35.tar.bz2/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/lilv/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/lv2/lilv/-/blob/master/INSTALL.md?ref_type=heads\n[source]\ntar = \"https://download.drobilla.net/lilv-0.24.20.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/liquid-dsp/recipe.toml",
    "content": "#TODO missing script, see https://github.com/jgaeddert/liquid-dsp#installation-and-dependencies\n[source]\ngit = \"https://github.com/jgaeddert/liquid-dsp\"\nrev = \"8bf87b6fe325d98c250d6911fa50518d14175d86\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"fftw\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/livedotcom/recipe.toml",
    "content": "#TODO missing script for the build system, see http://www.live555.com/liveMedia/#config-unix\n[source]\ntar = \"http://www.live555.com/liveMedia/public/live555-latest.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/lrdf/recipe.toml",
    "content": "#TODO configuration error\n[source]\ngit = \"https://github.com/x42/LRDF\"\nrev = \"e61f7aa4a1e240a884e3a0cb4b2db65046cfcaa6\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/lv2/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/lv2/lv2/-/blob/master/INSTALL.md\n[source]\ntar = \"https://lv2plug.in/spec/lv2-1.18.10.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/lzlib/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://download.savannah.gnu.org/releases/lzip/lzlib/lzlib-1.14.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/m4/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.xz\"\n[build]\ntemplate = \"configure\""
  },
  {
    "path": "recipes/wip/libs/other/maven/recipe.toml",
    "content": "#TODO missing script for building, lacking build instructions\n[source]\ntar = \"https://dlcdn.apache.org/maven/maven-3/3.9.5/source/apache-maven-3.9.5-src.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/mimalloc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/microsoft/mimalloc#macos-linux-bsd-etc\n[source]\ngit = \"https://github.com/microsoft/mimalloc\"\nrev = \"43ce4bd7fd34bcc730c1c7471c99995597415488\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/mlt/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/mltframework/mlt#readme\n[source]\ntar = \"https://github.com/mltframework/mlt/releases/download/v7.22.0/mlt-7.22.0.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/mozangle/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/njskalski/mozangle.git\"\nbranch = \"redox_mods\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"freetype2\",\n    \"gettext\",\n    \"glib\",\n    \"gstreamer\",\n    \"harfbuzz\",\n    \"libffi\",\n    \"libiconv\",\n    \"libx11\",\n    \"libxcb\",\n    \"libpng\",\n    \"openssl1\",\n    \"pcre\",\n    \"zlib\",\n\n    \"x11proto\",\n    \"x11proto-kb\",\n    \"xcb-proto\",\n    \"xextproto\",\n    \"libxau\",\n    \"libpthread-stubs\",\n    \"fontconfig\",\n    \"expat\",\n    \"relibc\",\n    \"gcc13\",\n]\n\nscript = \"\"\"\n    export TARGET=${TARGET}\n    export TARGET_CC=${TARGET}-gcc\n    export TARGET_CXX=${TARGET}-g++\n    export TARGET_AR=${TARGET}-ar\n\n    rsync -a --delete \"${COOKBOOK_SOURCE}/\" ./\n    cargo build --release --target ${TARGET}\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/musepack/recipe.toml",
    "content": "#TODO missing script for building, verify the tarball\n[source]\ntar = \"https://files.musepack.net/source/musepack_src_r475.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/nlohmann-json/recipe.toml",
    "content": "#TODO missing script for installation, lacking a build system\n[source]\ntar = \"https://github.com/nlohmann/json/releases/download/v3.11.2/json.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/oidn/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/OpenImageDenoise/oidn#compiling-on-linuxmacos\n[source]\ngit = \"https://github.com/OpenImageDenoise/oidn\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"ispc\",\n    \"onetbb\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/onednn/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://oneapi-src.github.io/oneDNN/dev_guide_build.html#linux-macos\n[source]\ngit = \"https://github.com/oneapi-src/oneDNN\"\nrev = \"16720eaaab9557158ff77ebf3bc610e9682928d6\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"onetbb\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/onetbb/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/oneapi-src/oneTBB/blob/master/INSTALL.md\n[source]\ngit = \"https://github.com/oneapi-src/oneTBB\"\nrev = \"8b829acc65569019edb896c5150d427f288e8aba\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/openblas/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/OpenMathLib/OpenBLAS/wiki/Installation-Guide\n#TODO require the Fortran frontend from GCC\n[source]\ntar = \"https://github.com/OpenMathLib/OpenBLAS/releases/download/v0.3.25/OpenBLAS-0.3.25.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/opencolorio/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://opencolorio.readthedocs.io/en/latest/quick_start/installation.html\n#TODO missing dependencies, see https://opencolorio.readthedocs.io/en/latest/quick_start/installation.html#dependencies\n[source]\ngit = \"https://github.com/AcademySoftwareFoundation/OpenColorIO\"\nrev = \"92db29b9e7e298c4c2cc67c8a74944c2e7e716e5\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"expat\",\n    \"imath\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/opencv4/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ngit = \"https://github.com/opencv/opencv\"\nbranch = \"4.x\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DOPENCV_FORCE_3RDPARTY_BUILD=ON\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/openexr/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://openexr.com/en/latest/install.html#linux-macos\n[source]\ngit = \"https://github.com/AcademySoftwareFoundation/openexr\"\nrev = \"737b2707a001e67f3812d86a639c3d037efe2ea8\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libdeflate\",\n    \"libimath\"\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/openimageio/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/AcademySoftwareFoundation/OpenImageIO/blob/master/INSTALL.md#building-openimageio-on-linux-or-os-x\n# optional dependencies are disabled to make the program work with less effort\n[source]\ngit = \"https://github.com/AcademySoftwareFoundation/OpenImageIO\"\nrev = \"5c29caab40a3913d415ac5d37cd84983e824c75b\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"imath\",\n    \"libtiff\",\n    \"libjpeg\",\n    \"openexr\",\n    \"libfmt\",\n    #\"libpng\",\n    #\"boost\",\n    #\"opencv4\",\n    #\"ffmpeg6\",\n    #\"libwebp\",\n    #\"freetype2\",\n    #\"libraw\",\n    #\"openjpeg\",\n    #\"tbb\",\n    #\"libgif\",\n    #\"libheif\",\n    #\"libwebp\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/openjpeg/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/uclouvain/openjpeg/blob/master/INSTALL.md\n[source]\ngit = \"https://github.com/uclouvain/openjpeg\"\nrev = \"a5891555eb49ed7cc26b2901ea680acda136d811\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/openmpi/recipe.toml",
    "content": "#TODO missing dependencies, see https://docs.open-mpi.org/en/v5.0.x/installing-open-mpi/required-support-libraries.html\n#TODO make libevent works\n[source]\ntar = \"https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.0.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libevent\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/openvkl/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/openvkl/openvkl#building-open-vkl-from-source\n[source]\ngit = \"https://github.com/openvkl/openvkl\"\nrev = \"712bdb8035487606096d7af90a4c9bde5503515d\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"ispc\",\n    \"librkcommon\",\n    \"embree\",\n    \"level-zero\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/pjsip/recipe.toml",
    "content": "#TODO make libvpx work\n# customization - https://docs.pjsip.org/en/latest/get-started/posix/build_instructions.html\n[source]\ngit = \"https://github.com/pjsip/pjproject\"\nrev = \"08578e86eea120c5ab2ab1af5a18b7840120d87b\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"openssl1\",\n    \"ffmpeg6\",\n    \"libvpx\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/popt/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ntar = \"https://ftp.osuosl.org/pub/rpm/popt/releases/popt-1.x/popt-1.19.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/projectm/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/projectM-visualizer/projectm/wiki/Building-libprojectM#build-and-install-projectm\n[source]\ngit = \"https://github.com/projectM-visualizer/projectm\"\nrev = \"422af469731559c32c93e9513cebf2fe6c2fec78\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"mesa\",\n    \"qt5-base\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/pystring/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ngit = \"https://github.com/imageworks/pystring\"\nrev = \"7d16bc814ccb4cad03c300dcb77440034caa84f7\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/quantlib/recipe.toml",
    "content": "#TODO make boost work\n#TODO probably wrong template, see https://www.quantlib.org/install/linux.shtml\n[source]\ntar = \"https://github.com/lballabio/QuantLib/releases/download/v1.32/QuantLib-1.32.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"boost\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/raylib/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/raysan5/raylib/wiki/Working-on-GNU-Linux\n[source]\ngit = \"https://github.com/raysan5/raylib\"\nrev = \"ae50bfa2cc569c0f8d5bc4315d39db64005b1b08\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"mesa\",\n    \"libxkbcommon\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/rdflib/recipe.toml",
    "content": "#TODO missing script for installation, the \"pip\" method can't be used, investigate the tarball\n[source]\ntar = \"https://github.com/RDFLib/rdflib/releases/download/7.0.0/rdflib-7.0.0.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/rnnoise/recipe.toml",
    "content": "#TODO missing script for building\n[source]\ngit = \"https://gitlab.xiph.org/xiph/rnnoise\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/libs/other/rubberband/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://hg.sr.ht/~breakfastquay/rubberband/browse/COMPILING.md?rev=tip\n[source]\ntar = \"https://breakfastquay.com/files/releases/rubberband-3.2.1.tar.bz2\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/rustls-openssl-compat/recipe.toml",
    "content": "#TODO missing script for GNU Make\n[source]\ngit = \"https://github.com/rustls/rustls-openssl-compat\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/rustls-libssl\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/scotch/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.inria.fr/scotch/scotch#installation\n#TODO probably missing dependencies\n[source]\ngit = \"https://gitlab.inria.fr/scotch/scotch\"\nrev = \"82ec87f558f4acb7ccb69a079f531be380504c92\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/sdl-pango/recipe.toml",
    "content": "#TODO can't recognize the redox target\n#TODO probably missing dependencies\n[source]\ntar = \"https://sourceforge.net/projects/sdlpango/files/SDL_Pango/0.1.2/SDL_Pango-0.1.2.tar.gz/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/sdl2-net/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ntar = \"https://github.com/libsdl-org/SDL_net/releases/download/release-2.2.0/SDL2_net-2.2.0.tar.gz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/sdl2-pango/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/markuskimius/SDL2_Pango\"\nrev = \"v2.1.5\"\nshallow_clone = true\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"pango\",\n    \"freetype2\",\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/sdl3/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from the cmake log\n# build instructions: https://github.com/libsdl-org/SDL/blob/main/docs/README-cmake.md\n# dependencies: https://github.com/libsdl-org/SDL/blob/main/docs/README-linux.md\n[source]\ntar = \"https://github.com/libsdl-org/SDL/releases/download/release-3.4.0/SDL3-3.4.0.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DSDL_SHARED=ON\",\n    \"-DSDL_STATIC=OFF\",\n    \"-DSDL_TEST_LIBRARY=OFF\",\n    \"-DSDL_DISABLE_INSTALL_DOCS=ON\",\n    \"-DSDL_DBUS=OFF\",\n    \"-DSDL_LIBURING=OFF\",\n    \"-DSDL_IBUS=OFF\",\n    \"-DSDL_OPENGL=OFF\",\n    \"-DSDL_OPENGLES=OFF\",\n    \"-DSDL_LIBUDEV=OFF\",\n    \"-DSDL_AUDIO=OFF\",\n]\ndependencies = [\n    #\"liborbital\",\n    \"mesa\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/simdjson/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/simdjson/simdjson\"\nrev = \"0c0ce1bd48baa0677dc7c0945ea7cd1e8b52b297\" # 3.13.0\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/simdutf/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/simdutf/simdutf\"\nrev = \"df8bfed3256cf5ca29969a9dd1db677e835b2c6c\" # 7.3.5\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/snappy/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/google/snappy#building\n[source]\ngit = \"https://github.com/google/snappy\"\nrev = \"dc05e026488865bc69313a68bcc03ef2e4ea8e83\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/sord/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/drobilla/sord/-/blob/master/INSTALL.md?ref_type=heads\n[source]\ntar = \"https://download.drobilla.net/sord-0.16.14.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/sratom/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/lv2/sratom/-/blob/master/INSTALL.md?ref_type=heads\n[source]\ntar = \"https://download.drobilla.net/sratom-0.6.14.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/suil/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/lv2/suil/-/blob/master/INSTALL.md?ref_type=heads\n[source]\ntar = \"https://download.drobilla.net/suil-0.10.18.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/libs/other/t4kcommon/recipe.toml",
    "content": "#TODO missing script for GNU Autotools, see https://github.com/tux4kids/t4kcommon/blob/master/INSTALL#L33\n[source]\ngit = \"https://github.com/tux4kids/t4kcommon\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sdl1\",\n    \"sdl1_mixer\",\n    \"sdl1_image\",\n    \"sdl-pango\",\n    \"sdl2-net\",\n    \"libpng\",\n    \"libxml2\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/taglib/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/taglib/taglib/blob/master/INSTALL.md\n[source]\ntar = \"https://taglib.org/releases/taglib-1.13.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/tree-sitter/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v0.25.8.tar.gz\"\nblake3 = \"a9bce1e3c610441dc9d7dcc3d7d38e6a74e0b06d6b7d40e22982d927006dbfc4\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CARGO_PATH=cli cookbook_cargo \\\n    --config 'patch.crates-io.rustix.git = \"https://github.com/bytecodealliance/rustix\"' \\\n    --config 'patch.crates-io.rustix.rev = \"8bf15a0\"'\ncookbook_cmake \"${COOKBOOK_SOURCE}\"/lib\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/tree-sitter/redox.patch",
    "content": "diff --color -ruwN source/Cargo.toml source-new/Cargo.toml\n--- source/Cargo.toml\t2025-07-14 01:32:42.000000000 +0700\n+++ source-new/Cargo.toml\t2025-09-16 11:37:28.820646655 +0700\n@@ -118,7 +118,7 @@\n dialoguer = { version = \"0.11.0\", features = [\"fuzzy-select\"] }\n etcetera = \"0.8.0\"\n filetime = \"0.2.25\"\n-fs4 = \"0.12.0\"\n+fs4 = { git = \"https://github.com/al8n/fs4-rs\" } # for redox support, still not published yet\n git2 = \"0.20.0\"\n glob = \"0.3.2\"\n heck = \"0.5.0\"\n@@ -151,7 +151,7 @@\n url = { version = \"2.5.4\", features = [\"serde\"] }\n walkdir = \"2.5.0\"\n wasmparser = \"0.224.0\"\n-webbrowser = \"1.0.3\"\n+webbrowser = \"1.0.5\"\n \n tree-sitter = { version = \"0.25.1\", path = \"./lib\" }\n tree-sitter-generate = { version = \"0.25.1\", path = \"./cli/generate\" }\ndiff --color -ruwN source/cli/src/fuzz/allocations.rs source-new/cli/src/fuzz/allocations.rs\n--- source/cli/src/fuzz/allocations.rs\t2025-07-14 01:32:42.000000000 +0700\n+++ source-new/cli/src/fuzz/allocations.rs\t2025-09-16 11:39:56.112458323 +0700\n@@ -7,6 +7,7 @@\n     },\n };\n \n+#[cfg(not(target_os = \"redox\"))]\n #[ctor::ctor]\n unsafe fn initialize_allocation_recording() {\n     tree_sitter::set_allocator(\ndiff --color -ruwN source/lib/src/portable/endian.h source-new/lib/src/portable/endian.h\n--- source/lib/src/portable/endian.h\t2025-07-14 01:32:42.000000000 +0700\n+++ source-new/lib/src/portable/endian.h\t2025-09-16 11:27:12.315211556 +0700\n@@ -24,7 +24,8 @@\n     defined(__CYGWIN__) || \\\n     defined(__MSYS__) || \\\n     defined(__EMSCRIPTEN__) || \\\n-    defined(__wasi__)\n+    defined(__wasi__) || \\\n+    defined(__redox__)\n \n #if defined(__NetBSD__)\n #define _NETBSD_SOURCE 1\n"
  },
  {
    "path": "recipes/wip/libs/other/twolame/recipe.toml",
    "content": "#TODO Compiled but not tested\n[source]\ntar = \"https://downloads.sourceforge.net/twolame/twolame-0.4.0.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/vamp-plugin-sdk/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://code.soundsoftware.ac.uk/attachments/download/2588/vamp-plugin-sdk-2.9.0.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libsndfile\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/volk/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/gnuradio/volk#building-on-most-x86-32-bit-and-64-bit-platforms\n[source]\ntar = \"https://www.libvolk.org/releases/volk-3.0.0.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/webkit/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://webkitgtk.org/releases/webkit-1.9.6.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/other/wxpython/recipe.toml",
    "content": "#TODO missing script for Python, see https://wiki.wxpython.org/How%20to%20install%20wxPython#Installing_wxPython_from_source\n[source]\ntar = \"https://files.pythonhosted.org/packages/aa/64/d749e767a8ce7bdc3d533334e03bb1106fc4e4803d16f931fada9007ee13/wxPython-4.2.1.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"wxwidgets-gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/wxwidgets-gtk3/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/wxWidgets/wxWidgets/blob/master/docs/gtk/install.md\n[source]\ntar = \"https://github.com/wxWidgets/wxWidgets/releases/download/v3.2.4/wxWidgets-3.2.4.tar.bz2\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--with-gtk\",\n]\ndependencies = [\n    \"gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/other/xxhash/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/Cyan4973/xxHash\"\nrev = \"bab7e27f4c6ae4efbb83dd99ae8a554423571635\" # 0.8.3-dev (cmake support)\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}\"/build/cmake\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/other/yajl/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/lloyd/yajl/archive/refs/tags/2.1.0.tar.gz\"\nblake3 = \"25cbfe28df82d5699b8fa5db8b32797b34aff995c7ce35a5fb622cc68f90f0cb\"\n\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/other/zlib-ng/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/zlib-ng/zlib-ng\"\nrev = \"2bc66887ddc0c50776811a27be68e34430d665e1\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n    export LDFLAGS=\"--static\"\n    # See https://stackoverflow.com/questions/21396988/zlib-build-not-configuring-properly-with-cross-compiler-ignores-ar.\n    CHOST=\"${TARGET}\" \"${COOKBOOK_CONFIGURE}\" \\\n        --prefix=\"\" \\\n        --static\n    \"${COOKBOOK_MAKE}\" -j \"$(nproc)\"\n    \"${COOKBOOK_MAKE}\" install DESTDIR=\"${COOKBOOK_STAGE}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/perf/openmp/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/llvm/llvm-project/blob/main/openmp/README.rst\n[source]\ntar = \"https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.6/openmp-21.1.6.src.tar.xz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"llvm21\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt4/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"http://download.qt.io/official_releases/qt/4.8/4.8.7/qt-everywhere-opensource-src-4.8.7.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-3d/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qt3d-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-activeqt/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtactiveqt-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-base/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine dependencies\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtbase-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-charts/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtcharts-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-coap/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtcoap-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-connectivity/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtconnectivity-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-datavis3d/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtdatavis3d-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-declarative/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtdeclarative-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-doc/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtdoc-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-full/recipe.toml",
    "content": "#TODO not compiled or tested\n# probably missing dependencies: https://doc.qt.io/archives/qt-5.15/linux-requirements.html\n# build instructions: https://doc.qt.io/qt-5/linux-building.html\n# customization: https://doc.qt.io/qt-5/configure-options.html\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.18/single/qt-everywhere-opensource-src-5.15.18.tar.xz\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"-no-opengl\",\n    \"-no-feature-accessibility\",\n]\ndependencies = [\n    \"fontconfig\",\n    \"freetype2\",\n    #\"mesa\",\n    \"libxkbcommon\",\n    \"libxcb\",\n    \"libx11\",\n    \"libxrender\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libsm\",\n    \"libice\",\n    \"glib\",\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-gamepad/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtgamepad-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-graphical-effects/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtgraphicaleffects-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-imageformats/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtimageformats-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-knx/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtknx-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-location/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtlocation-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-lottie/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtlottie-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-mqtt/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtmqtt-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-multimedia/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtmultimedia-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-networkauth/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtnetworkauth-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-opcua/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtopcua-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-purchasing/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtpurchasing-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-quick3d/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtquick3d-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-quickcontrols/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtquickcontrols-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-quickcontrols2/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtquickcontrols2-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-quicktimeline/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtquicktimeline-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-remoteobjects/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtremoteobjects-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-script/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtscript-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-scxml/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtscxml-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-sensors/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtsensors-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-serialbus/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtserialbus-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-serialport/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtserialport-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-speech/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtspeech-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-svg/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtsvg-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-tools/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qttools-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-tqtc/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/tqtc-qt5-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-translations/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qttranslations-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-virtualkeyboard/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtvirtualkeyboard-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-wayland/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtwayland-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-webchannel/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtwebchannel-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-webengine/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtwebengine-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-webglplugin/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtwebglplugin-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-webkit/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/qtwebkit/qtwebkit/wiki/Building-QtWebKit-on-Linux\n#TODO determine dependencies\n# probably wrong branch\n[source]\ngit = \"https://github.com/movableink/webkit\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt5-base\",\n    \"qt5-guiaddons\",\n    \"qt5-connectivity\",\n    \"qt5-networkauth\",\n    \"qt5-positioning\",\n    \"qt5-sensors\",\n    \"qt5-declarative\",\n    \"qt5-webchannel\",\n    \"sqlite3\",\n    \"libicu\",\n    \"libhyphen\",\n    \"libxml2\",\n    \"libxslt\",\n    \"libjpeg\",\n    \"libpng\",\n    \"zlib\",\n    \"glib\",\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-websockets/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtwebsockets-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-webview/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtwebview-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-x11extras/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtx11extras-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt5/qt5-xmlpatterns/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/5.15/5.15.11/submodules/qtxmlpatterns-everywhere-opensource-src-5.15.11.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-3d/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qt3d-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-activeqt/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtactiveqt-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-base/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine dependencies\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.10/6.10.0/submodules/qtbase-everywhere-src-6.10.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-charts/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtcharts-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-connectivity/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtconnectivity-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-datavis3d/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtdatavis3d-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-declarative/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.10/6.10.0/submodules/qtdeclarative-everywhere-src-6.10.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-doc/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtdoc-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-full/recipe.toml",
    "content": "#TODO not compiled or tested\n# probably wrong template\n# build instructions: https://doc.qt.io/qt-6/linux-building.html\n# customization: https://doc.qt.io/qt-6/configure-options.html\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.10/6.10.0/single/qt-everywhere-src-6.10.0.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"fontconfig\",\n    \"freetype2\",\n    #\"mesa\",\n    \"libxkbcommon\",\n    \"libxcb\",\n    \"libx11\",\n    \"libxrender\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libsm\",\n    \"libice\",\n    \"glib\",\n    \"gstreamer\",\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    -no-opengl\n    -no-feature-accessibility\n    -openssl-linked\n)\ncookbook_configure\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-graphs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtgraphs-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-grpc/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtgrpc-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-httpserver/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qthttpserver-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-imageformats/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtimageformats-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-languageserver/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtlanguageserver-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-location/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtlocation-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-lottie/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtlottie-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-multimedia/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.10/6.10.0/submodules/qtmultimedia-everywhere-src-6.10.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-networkauth/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtnetworkauth-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-positioning/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtpositioning-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-qt5compat/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qt5compat-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-quick3d/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtquick3d-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-quick3dphysics/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtquick3dphysics-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-quickeffectmaker/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtquickeffectmaker-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-quicktimeline/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtquicktimeline-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-remoteobjects/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtremoteobjects-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-scxml/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtscxml-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-sensors/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtsensors-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-serialbus/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtserialbus-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-serialport/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtserialport-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-shadertools/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtshadertools-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-speech/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtspeech-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-svg/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.10/6.10.0/submodules/qtsvg-everywhere-src-6.10.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-tools/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qttools-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-translations/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qttranslations-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-virtualkeyboard/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtvirtualkeyboard-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-wayland/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtwayland-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-webchannel/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtwebchannel-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-webengine/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtwebengine-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-websockets/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtwebsockets-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/qt/qt6/qt6-webview/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.qt.io/official_releases/qt/6.6/6.6.1/submodules/qtwebview-everywhere-src-6.6.1.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/security/libacl/recipe.toml",
    "content": "#TODO can't find the attr/error_context.h file\n[source]\ntar = \"https://download.savannah.nongnu.org/releases/acl/acl-2.3.2.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/text/hunspell/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/hunspell/hunspell#compiling-on-gnulinux-and-unixes\n[source]\ntar = \"https://github.com/hunspell/hunspell/releases/download/v1.7.2/hunspell-1.7.2.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/libs/tikv-jemallocator/recipe.toml",
    "content": "#TODO \"No suitable wgpu::Adapter found\" error on execution\n[source]\ngit = \"https://gitlab.redox-os.org/njskalski/jemallocator.git\"\nbranch = \"redox_mods\"\n[build]\ntemplate = \"custom\"\n\nscript = \"\"\"\n# Build the library crates\n\"${COOKBOOK_REDOXER}\" build --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" --workspace --release\n# Library crates don't need installation, they're used as dependencies\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/tls/gnutls3/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://www.gnupg.org/ftp/gcrypt/gnutls/v3.7/gnutls-3.7.10.tar.xz\"\nblake3 = \"edcd8a505867226722ae50e0e9bb2bf57a1f38b5674a3028e26f69d2d61957e6\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--with-included-libtasn1\",\n    \"--with-included-unistring\",\n    \"--without-p11-kit\",\n    \"gl_cv_func_malloc_posix=no\",\n    \"gl_cv_socket_ipv6=no\",\n]\ndependencies = [\n    \"libbrotli\",\n    \"libgmp\",\n    \"libnettle\",\n    \"zlib\",\n    \"zstd\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/tls/mbedtls3/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://mbed-tls.readthedocs.io/en/latest/getting_started/building/#building-with-cmake\n[source]\nhttps://github.com/Mbed-TLS/mbedtls/releases/download/mbedtls-3.6.5/mbedtls-3.6.5.tar.bz2\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/tls/mbedtls4/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://mbed-tls.readthedocs.io/en/latest/getting_started/building/#building-with-cmake\n[source]\nhttps://github.com/Mbed-TLS/mbedtls/releases/download/mbedtls-4.0.0/mbedtls-4.0.0.tar.bz2\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/tls/openssl3/recipe.toml",
    "content": "#TODO: promote\n[source]\ntar = \"https://github.com/openssl/openssl/releases/download/openssl-3.5.3/openssl-3.5.3.tar.gz\"\npatches = [ \"redox.patch\" ]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"zlib\",\n    \"zstd\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nARCH=\"${TARGET%%-*}\"\nOS=$(echo \"${TARGET}\" | cut -d - -f3)\nexport ARFLAGS=cr\nCOOKBOOK_CONFIGURE=\"${COOKBOOK_SOURCE}/Configure\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    no-tests\n    no-unit-test\n    zlib\n    enable-zstd\n    \"${OS}-${ARCH}\"\n    --prefix=\"/usr\"\n    --openssldir=\"/etc/ssl\"\n)\n\nif [ \"${COOKBOOK_DYNAMIC}\" = \"1\" ]; then\n    COOKBOOK_CONFIGURE_FLAGS+=(shared)\nelse\n    COOKBOOK_CONFIGURE_FLAGS+=(no-shared no-dso)\nfi\n\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\n\"${COOKBOOK_MAKE}\" -j1 # bug in make/ar\n\"${COOKBOOK_MAKE}\" install_sw install_ssldirs DESTDIR=\"${COOKBOOK_STAGE}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/libs/tls/openssl3/redox.patch",
    "content": "diff -ruwN source/apps/lib/apps.c source-new/apps/lib/apps.c\n--- source/apps/lib/apps.c\t2025-09-16 19:05:33.000000000 +0700\n+++ source-new/apps/lib/apps.c\t2025-09-20 12:29:36.439917319 +0700\n@@ -2839,7 +2839,7 @@\n     return ret;\n }\n \n-#elif defined(_SC_CLK_TCK)      /* by means of unistd.h */\n+#elif defined(_SC_CLK_TCK) && !defined(__redox__)      /* by means of unistd.h */\n # include <sys/times.h>\n \n double app_tminterval(int stop, int usertime)\ndiff -ruwN source/Configurations/10-main.conf source-new/Configurations/10-main.conf\n--- source/Configurations/10-main.conf\t2025-09-16 19:05:33.000000000 +0700\n+++ source-new/Configurations/10-main.conf\t2025-09-20 13:13:14.569456910 +0700\n@@ -208,6 +208,40 @@\n         shared_extension => \".so\",\n     },\n \n+### Redox configurations\n+    \"redox-common\" => {\n+        inherit_from     => [ \"BASE_unix\" ],\n+        cc               => \"gcc\",\n+        thread_scheme    => \"pthreads\",\n+        dso_scheme       => \"dlfcn\",\n+        shared_target    => \"linux-shared\",\n+        shared_cflag     => \"-fPIC\",\n+        shared_ldflag    => sub { $disabled{pinshared} ? () : \"-Wl,-znodelete\" },\n+        shared_extension => \".so.\\$(SHLIB_VERSION_NUMBER)\",\n+    },\n+    \"redox-generic64\" => {\n+        inherit_from     => [ \"redox-common\" ],\n+        bn_ops           => \"SIXTY_FOUR_BIT_LONG RC4_CHAR\",\n+    },\n+    \"redox-aarch64\" => {\n+        inherit_from     => [ \"redox-generic64\" ],\n+        perlasm_scheme   => \"linux64\",\n+    },\n+    \"redox-i586\" => {\n+        inherit_from     => [ \"redox-common\" ],\n+        bn_ops           => \"BN_LLONG\",\n+        perlasm_scheme   => \"elf\",\n+    },\n+    \"redox-riscv64gc\" => {\n+        inherit_from     => [ \"redox-generic64\" ],\n+        perlasm_scheme   => \"linux64\",\n+    },\n+    \"redox-x86_64\" => {\n+        inherit_from     => [ \"redox-generic64\" ],\n+        perlasm_scheme   => \"elf\",\n+    },\n+\n+\n #### Solaris configurations\n     \"solaris-common\" => {\n         inherit_from     => [ \"BASE_unix\" ],\n"
  },
  {
    "path": "recipes/wip/libs/tls/wolfssl5/recipe.toml",
    "content": "#TODO compiled but not tested\n# build instructions:\n# https://www.wolfssl.com/documentation/manuals/wolfssl/chapter02.html\n# https://www.wolfssl.com/documentation/manuals/wolfssl/chapter02.html#building-in-a-non-standard-environment\n# https://www.wolfssl.com/documentation/manuals/wolfssl/chapter02.html#building-with-configure-with-cross-compile\n# https://www.wolfssl.com/documentation/manuals/wolfssl/chapter02.html#cross-compiling\n# build options: https://www.wolfssl.com/documentation/manuals/wolfssl/chapter02.html#build-options\n# porting guide: https://www.wolfssl.com/documentation/manuals/wolfssl-porting-guide/\n[source]\ngit = \"https://github.com/wolfSSL/wolfssl\"\nrev = \"v5.8.4-stable\"\nshallow_clone = true\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--disable-crypttests\",\n]\n"
  },
  {
    "path": "recipes/wip/libs/video/libgif/recipe.toml",
    "content": "[source]\ntar = \"https://sourceforge.net/projects/giflib/files/giflib-5.2.2.tar.gz/download\"\nblake3 = \"025cd79ba2d524c24b33a3d2750c146c6823adf96e1dbcc380ca6210bc7058a8\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\n\"${COOKBOOK_MAKE}\" libgif.so libgif.a -j \"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" install-include install-lib DESTDIR=\"${COOKBOOK_STAGE}\"\n\"\"\"\n\n"
  },
  {
    "path": "recipes/wip/libs/video/libgif/redox.patch",
    "content": "diff -ruwN giflib-5.2.1/Makefile source/Makefile\n--- giflib-5.2.1/Makefile\t2019-06-24 10:08:57.000000000 -0600\n+++ source/Makefile\t2025-05-10 13:15:44.301303744 -0600\n@@ -14,7 +14,7 @@\n TAR = tar\n INSTALL = install\n \n-PREFIX = /usr/local\n+PREFIX = /usr\n BINDIR = $(PREFIX)/bin\n INCDIR = $(PREFIX)/include\n LIBDIR = $(PREFIX)/lib\n"
  },
  {
    "path": "recipes/wip/libs/video/libmatroska/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Matroska-Org/libmatroska#building-and-installing\n[source]\ntar = \"https://dl.matroska.org/downloads/libmatroska/libmatroska-1.7.1.tar.xz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/libs/video/libopenshot/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n# build instructions: https://github.com/OpenShot/libopenshot/wiki/Linux-Build-Instructions\n[source]\ngit = \"https://github.com/OpenShot/libopenshot\"\nrev = \"v0.5.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_PARALLEL_CTEST=OFF\",\n    \"-DENABLE_LIB_DOCS=OFF\",\n    \"-DUSE_HW_ACCEL=OFF\",\n    \"-DENABLE_OPENCV=OFF\",\n]\n# dependencies = [\n#     \"libopenshot-audio\",\n#     \"ffmpeg6\",\n#     \"qt5-base\",\n#     \"qt5-svg\",\n#     \"qt5-multimedia\",\n#     \"libzmq\",\n#     #\"opencv4\",\n#     \"protobuf\",\n#     \"babl\",\n#     \"imagemagick\",\n# ]"
  },
  {
    "path": "recipes/wip/libs/video/libvpx/recipe.toml",
    "content": "#TODO redox target error\n[source]\ngit = \"https://chromium.googlesource.com/webm/libvpx\"\nrev = \"v1.16.0\"\nshallow_clone = true\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/logging/krapslog/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/acj/krapslog-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/math/cosmic-ext-calculator/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO verify if the desktop shortcut and icon configuration is correct\n[source]\ngit = \"https://github.com/cosmic-utils/calculator\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/applications\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/metainfo\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/icons/hicolor/scalable/apps\ncp -rv \"${COOKBOOK_SOURCE}\"/res/app.desktop \"${COOKBOOK_STAGE}\"/usr/share/applications/dev.edfloreshz.Calculator.desktop\ncp -rv \"${COOKBOOK_SOURCE}\"/res/metainfo.xml \"${COOKBOOK_STAGE}\"/usr/share/metainfo/dev.edfloreshz.Calculator.metainfo.xml\ncp -rv \"${COOKBOOK_SOURCE}\"/res/icons/hicolor/scalable/apps/icon.svg \"${COOKBOOK_STAGE}\"/usr/share/icons/hicolor/scalable/apps/dev.edfloreshz.Calculator.svg\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/math/fend/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/printfn/fend\"\n\n[build]\ndependencies = [\n    \"openssl1\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages fend\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/math/fractal-explorer/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/boclair/fractal-explorer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/math/kalc/recipe.toml",
    "content": "#TODO gmp-mpfr-sys crate error\n[source]\ngit = \"https://github.com/bgkillas/kalc\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/math/kalker/recipe.toml",
    "content": "#TODO gmp-mpfr-sys crate error (after cargo update)\n[source]\ngit = \"https://github.com/PaddiM8/kalker\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libgmp\",\n    \"libmpfr\",\n    \"mpc\",\n]\nscript = \"\"\"\ncookbook_cargo_packages kalker\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/math/numbat/recipe.toml",
    "content": "#TODO compiled but not tested\n#TODO missing script to properly move the binary\n[source]\ngit = \"https://github.com/sharkdp/numbat\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages numbat-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/math/numr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nasedkinpv/numr\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages numr-cli numr-tui\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/math/primesieve/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/kimwalisch/primesieve/blob/master/doc/BUILD.md\n[source]\ngit = \"https://github.com/kimwalisch/primesieve\"\nrev = \"f3114488ddded8edf2c201e31ad308ed9e6a9f78\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/math/qalculate-gtk/recipe.toml",
    "content": "#TODO make gtk3 work\n[source]\ntar = \"https://github.com/Qalculate/qalculate-gtk/releases/download/v4.9.0/qalculate-gtk-4.9.0.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"gtk3\",\n    \"libqalculate\",\n]\n"
  },
  {
    "path": "recipes/wip/math/rink/recipe.toml",
    "content": "#TODO async-io and rustix crates error\n[source]\ngit = \"https://github.com/tiffany352/rink-rs\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages rink\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/media/effy/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/aNNiMON/effy\"\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/mobile/android-tools/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/nmeum/android-tools/releases/download/35.0.2/android-tools-35.0.2.tar.xz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"libusb\",\n    \"pcre\",\n    \"protobuf\",\n    \"libbrotli\",\n    \"zstd\",\n    \"lz4\",\n]\ndev-dependencies = [\"host:go\"]\n"
  },
  {
    "path": "recipes/wip/monitors/bandwhich/recipe.toml",
    "content": "#TODO redox_syscall crate error\n[source]\ngit = \"https://github.com/imsnif/bandwhich\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/monitors/bottom/recipe.toml",
    "content": "#TODO missing data\n[source]\ngit = \"https://github.com/jackpot51/bottom\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/monitors/conky/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://conky.cc/documents/compiling\n[source]\ngit = \"https://github.com/brndnmtthws/conky\"\nrev = \"bbdc7081aec27daafca07fc40523335a2ea0a992\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"imlib2\",\n    \"ncurses\",\n    \"libxml2\",\n    \"curl\",\n]\nscript = \"\"\"\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/monitors/cosmic-ext-observatory/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO verify if the resource commands are correct\n[source]\ngit = \"https://github.com/cosmic-utils/observatory\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/applications\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/metainfo\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/icons\ncp -rv \"${COOKBOOK_SOURCE}\"/observatory/res/app.desktop \"${COOKBOOK_STAGE}\"/usr/share/applications/io.github.cosmic_utils.observatory.desktop\ncp -rv \"${COOKBOOK_SOURCE}\"/observatory/res/metainfo.xml \"${COOKBOOK_STAGE}\"/usr/share/metainfo/io.github.cosmic_utils.observatory.metainfo.xml\ncp -rv \"${COOKBOOK_SOURCE}\"/observatory/res/icons/hicolor/scalable/apps/icon.svg \"${COOKBOOK_STAGE}\"/usr/share/icons/hicolor/scalable/apps/io.github.cosmic_utils.observatory.svg\ncookbook_cargo_packages observatory\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/monitors/fluere/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/SkuldNorniern/fluere\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/monitors/hearth/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/aheart/hearth\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/monitors/htop/recipe.toml",
    "content": "#TODO Promote\n[source]\ngit = \"https://github.com/willnode/htop\"\nbranch = \"redox\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"ncursesw\",\n]\n\n[package]\ndependencies = [\n    \"terminfo\"\n]\n"
  },
  {
    "path": "recipes/wip/monitors/latencymon/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/alttch/latencymon\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/monitors/mountstatus/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/acdha/mountstatus\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/monitors/resources/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nokyan/resources\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dprofile=default\",\n]\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/monitors/rtop/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/narendasan/rtop\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/monitors/sentrum/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/sommerfelddev/sentrum\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/monitors/serial-monitor-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/hacknus/serial-monitor-rust\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libxkbcommon\",\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/monitors/sniffnet/recipe.toml",
    "content": "#TODO make the libpcap dependency work\n[source]\ngit = \"https://github.com/GyulyVGC/sniffnet\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libpcap\",\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/monitors/socktop/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jasonwitty/socktop\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages socktop socktop_agent\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/monitors/sysinfo/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/sysinfo\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_examples simple\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/monitors/xtop/recipe.toml",
    "content": "# TODO compiles but fails to run\n# ratatui-widgets-0.3.0 src/guage.rs 313:9 Ratio should be between 0 and 1 inclusively\n[source]\ngit = \"https://github.com/mabognar/xtop\"\n\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/admin/webmin/recipe.toml",
    "content": "#TODO not tested\n# how to setup: https://webmin.com/download/#freebsd-and-any-other-linux-installation-from-source\n[source]\ntar = \"https://github.com/webmin/webmin/releases/download/2.600/webmin-2.600-minimal.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/webmin\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user/webmin\"\n\"\"\"\n[package]\ndependencies = [\"perl5\"]\n"
  },
  {
    "path": "recipes/wip/net/analysis/angryether-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/pg3uk/AngryEtherRust\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/analysis/echo/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/lo2dev/Echo\"\nrev = \"2.0\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/net/analysis/pepe/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/omarmhaimdat/pepe\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/analysis/r-lanscan/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/robgonnella/r-lanscan\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"r-lancli\",\n    \"r-lanterm\",\n]\n"
  },
  {
    "path": "recipes/wip/net/analysis/rkik/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/aguacero7/rkik\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/analysis/ttl/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/lance0/ttl\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/aquatic-udp/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/greatest-ape/aquatic\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages aquatic_udp\nmv \"${COOKBOOK_STAGE}/usr/bin/aquatic_udp\" \"${COOKBOOK_STAGE}/usr/bin/aquatic-udp\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/attractorr/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/rnestler/attractorr\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/btpd/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/btpd/btpd?tab=readme-ov-file#building\n[source]\ngit = \"https://github.com/btpd/btpd\"\nrev = \"a3a10dfe1ece4a726530353a7b208c0cb4ff7e0d\"\nshallow_clone = true\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/rtorrent/recipe.toml",
    "content": "#TODO can't find pthreads support\n[source]\ntar = \"https://github.com/rakshasa/rtorrent-archive/raw/master/rtorrent-0.9.8.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/superseedr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Jagalite/superseedr\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/synapse-bt/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Luminarys/synapse\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/transg-tui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/PanAeon/transg-tui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/transmission-cli/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://github.com/transmission/transmission/blob/4.0.x/docs/Building-Transmission.md#on-unix\n# build options: https://github.com/transmission/transmission/blob/4.0.x/CMakeLists.txt#L45\n[source]\ntar = \"https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_CLI=ON\",\n    \"-DINSTALL_WEB=OFF\",\n    \"-DENABLE_TESTS=OFF\",\n    \"-DINSTALL_DOC=OFF\",\n]\n#dependencies = [\n    #\"openssl3\",\n    #\"curl\",\n#]\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/transmission-daemon/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://github.com/transmission/transmission/blob/4.0.x/docs/Building-Transmission.md#on-unix\n# build options: https://github.com/transmission/transmission/blob/4.0.x/CMakeLists.txt#L45\n[source]\ntar = \"https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DINSTALL_WEB=OFF\",\n    \"-DENABLE_UTILS=OFF\",\n    \"-DENABLE_TESTS=OFF\",\n    \"-DINSTALL_DOC=OFF\",\n]\n#dependencies = [\n#    \"openssl3\",\n#    \"curl\",\n#]\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/transmission-gtk/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://github.com/transmission/transmission/blob/4.0.x/docs/Building-Transmission.md#on-unix\n# build options: https://github.com/transmission/transmission/blob/4.0.x/CMakeLists.txt#L45\n[source]\ntar = \"https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DINSTALL_WEB=OFF\",\n    \"-DENABLE_TESTS=OFF\",\n    \"-DINSTALL_DOC=OFF\",\n]\ndependencies = [\n    #\"openssl3\",\n    #\"curl\",\n    \"gtk3mm\",\n]\n"
  },
  {
    "path": "recipes/wip/net/bittorrent/webtorrent-cli/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/webtorrent/webtorrent-cli\"\nrev = \"v5.1.3\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin/webtorrent-dir\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/bin/webtorrent-dir\necho \"#!/usr/bin/env sh \\n cd /usr/bin/webtorrent-dir \\n npx webtorrent-cli\" > \"${COOKBOOK_STAGE}\"/usr/bin/webtorrent\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/webtorrent\n\"\"\"\n[package]\ndependencies = [\"nodejs24\"]\n"
  },
  {
    "path": "recipes/wip/net/chat/bitchat-tui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/vaibhav-mattoo/bitchat-tui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/chat/gosuto/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO build libwebrtc from source: https://github.com/MaikBuse/gosuto#voip--prebuilt-libwebrtc\n[source]\ngit = \"https://github.com/MaikBuse/gosuto\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/chat/halloy/recipe.toml",
    "content": "#TODO xdg-home crate error (after cargo update)\n[source]\ngit = \"https://github.com/squidowl/halloy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/chat/iamb/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ulyssa/iamb\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/chat/jami/recipe.toml",
    "content": "#TODO missing cross-compilation variables in build.py script\n#TODO build with libwrap instead of dbus\n#TODO discover minimum dependencies\n# build instructions: https://docs.jami.net/en_US/build/index.html\n[source]\ngit = \"https://git.jami.net/savoirfairelinux/jami-client-qt\"\nbranch = \"stable/20260216.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\n./build.py --install\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/chat/pidgin/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from gnu autotools log\n[source]\ntar = \"https://sourceforge.net/projects/pidgin/files/Pidgin/2.14.12/pidgin-2.14.12.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/net/chat/telegram-desktop/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n[source]\ntar = \"https://github.com/telegramdesktop/tdesktop/releases/download/v6.5.1/tdesktop-6.5.1-full.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DDESKTOP_APP_DISABLE_AUTOUPDATE=1\",\n    #\"-DDESKTOP_APP_ENABLE_LTO=ON\",\n]\n# dependencies = [\n#     \"qt6-svg\",\n#     \"qt6-imageformats\",\n#     \"fontconfig\",\n#     \"freetype2\",\n#     \"glib\",\n#     \"expat\",\n#     \"libuuid\",\n#     \"libpng\",\n#     \"zlib\",\n#     \"libffi\",\n#     \"libpcre\",\n#     \"libbsd\",\n#     \"libmd\",\n#     \"libbrotli\",\n# ]\n"
  },
  {
    "path": "recipes/wip/net/chat/termchat/recipe.toml",
    "content": "#TODO update the mio crate to 0.8.x\n[source]\ngit = \"https://github.com/lemunozm/termchat\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--all-features\"]\n"
  },
  {
    "path": "recipes/wip/net/chat/tiny/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update and a patch on ring)\n[source]\ngit = \"https://github.com/osa1/tiny\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages tiny\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/download/aim/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mihaigalos/aim\"\nshallow_clone = true\n[build]\ndependencies = [\n    \"openssl3\",\n]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/download/anime-downloader/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/B0SEmc/Anime-Downloader\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/download/apkeep/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/EFForg/apkeep\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/download/aria2/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/aria2/aria2/releases/download/release-1.37.0/aria2-1.37.0.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"openssl3\",\n    \"zlib\",\n    \"libxml2\",\n    \"libgcrypt\",\n]\n"
  },
  {
    "path": "recipes/wip/net/download/curlio/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Kei-K23/curlio\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/download/kget/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/davimf721/KGet\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n#dependencies = [\n#    \"openssl3\",\n#]\n"
  },
  {
    "path": "recipes/wip/net/download/kitget/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/adamperkowski/kitget\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/download/parabolic/recipe.toml",
    "content": "#TODO missing script for .net: https://github.com/NickvisionApps/Parabolic#-building\n#TODO requires .net 10\n[source]\ngit = \"https://github.com/NickvisionApps/Parabolic\"\nrev = \"2026.2.4\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\ndev-dependencies = [\n    \"host:blueprint\",\n    \"host:dotnet10\",\n]\n"
  },
  {
    "path": "recipes/wip/net/download/rusty-psn-cli/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/RainbowCookie32/rusty-psn\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--features cli\"]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/download/rusty-psn-gui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/RainbowCookie32/rusty-psn\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/download/wget2/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from gnu autotools log\n# build instructions: https://gitlab.com/gnuwget/wget2#build-requirements\n[source]\ntar = \"https://ftp.gnu.org/gnu/wget/wget2-2.2.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n# dependencies = [\n#     \"gettext\",\n#     \"libiconv\",\n#     \"zlib\",\n#     \"pcre\",\n#     \"gnutls3\",\n#     \"bzip2\",\n#     \"xz\",\n#     \"zstd\",\n# ]\n"
  },
  {
    "path": "recipes/wip/net/download/yaydl/recipe.toml",
    "content": "#TODO compilation error (after cargo update)\n[source]\ngit = \"https://github.com/dertuxmalwieder/yaydl\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/download/youtube-tui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Siriusmart/youtube-tui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--no-default-features\"]\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/download/yt-dlp/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin/yt-dlp-dir\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/bin/yt-dlp-dir\necho \"/usr/bin/yt-dlp-dir/yt-dlp.sh\" > \"${COOKBOOK_STAGE}\"/usr/bin/yt-dlp\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/yt-dlp-dir/yt-dlp.sh \"${COOKBOOK_STAGE}\"/usr/bin/yt-dlp\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/email/neverest/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/pimalaya/neverest\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/email/thunderbird/mozconfig",
    "content": "ac_add_options --enable-project=comm/mail\nac_add_options --prefix=\"{COOKBOOK_STAGE}/usr\"\nac_add_options --enable-release\nac_add_options --target=\"{TARGET}\"\nac_add_options --enable-bootstrap\nac_add_options --disable-jack\nac_add_options --disable-crashreporter\nac_add_options --disable-updater\n"
  },
  {
    "path": "recipes/wip/net/email/thunderbird/recipe.toml",
    "content": "#TODO missing cross-compilation variables and a command to move the executable to the package\n#TODO determine minimum dependencies from mach log\n# build instructions - https://developer.thunderbird.net/thunderbird-development/building-thunderbird\n[source]\ntar = \"https://archive.mozilla.org/pub/thunderbird/releases/140.7.0esr/source/thunderbird-140.7.0esr.source.tar.xz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\nexport MOZCONFIG=\"{COOKBOOK_RECIPE}/mozconfig\"\n./mach build\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/ftp/filezilla-client/recipe.toml",
    "content": "#TODO not compiled or tested\n# build intructions: https://wiki.filezilla-project.org/Client_Compile\n[source]\ntar = \"https://dl3.cdn.filezilla-project.org/client/FileZilla_3.67.1_src.tar.xz?h=HG1-LUZAqtxJaEQhlQ9oNg&x=1722821782\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfilezilla\",\n    \"gnutls3\",\n    \"libidn\",\n    \"dbus\",\n]\n"
  },
  {
    "path": "recipes/wip/net/ftp/filezilla-server/recipe.toml",
    "content": "#TODO not compiled or tested\n# build intructions: https://wiki.filezilla-project.org/Client_Compile\n[source]\ntar = \"https://dl2.cdn.filezilla-project.org/server/FileZilla_Server_1.8.2_src.tar.xz?h=05HQOZtMOkV85GW9u3rrsg&x=1722821856\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libfilezilla\",\n    \"gnutls3\",\n    \"libidn\",\n]\n"
  },
  {
    "path": "recipes/wip/net/ftp/unftp/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bolcom/unFTP\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/gemini/lagrange/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/skyjake/lagrange#how-to-compile\n[source]\ntar = \"https://git.skyjake.fi/gemini/lagrange/releases/download/v1.19.4/lagrange-1.19.4.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_GAMEPAD=OFF\",\n    \"-DENABLE_POPUP_MENUS=OFF\",\n    \"-DENABLE_MPG123=OFF\"\n]\ndependencies = [\n    \"sdl2\",\n    \"openssl3\",\n    \"zlib\",\n    \"harfbuzz\",\n    \"pcre\",\n    \"fribidi\",\n    \"libunistring\",\n    #\"mpg123\",\n]\n"
  },
  {
    "path": "recipes/wip/net/http/apache-httpd/recipe.toml",
    "content": "#TODO compiles but requires setgroups syscall at startup\n[source]\ntar= \"https://archive.apache.org/dist/httpd/httpd-2.4.61.tar.bz2\"\npatches = [\n    \"redox.patch\",\n]\n[build]\ndependencies = [\n    \"apr\",\n    \"apr-util\",\n    \"curl\",\n    \"expat\",\n    \"gdbm\",\n    \"libuuid\",\n    \"libxcrypt\",\n    \"libxml2\",\n    \"openssl3\",\n    \"pcre\",\n    \"zlib\",\n]\n\ntemplate = \"custom\"\nscript = \"\"\"\n# cookbook_configure\n\nDYNAMIC_INIT\nexport COOKBOOK_MAKE_JOBS=1\nexport CPPFLAGS=\"$CPPFLAGS -I${COOKBOOK_SYSROOT}/include/apr-1 -DDEBUG=1\"\nexport LTFLAGS=\"$LTFLAGS -Wall\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --build=$(/usr/bin/cc -dumpmachine)\n    --host=${TARGET}\n    --with-apr=$COOKBOOK_SYSROOT\n    --with-apr-util=$COOKBOOK_SYSROOT\n    --enable-unixd=shared\n    --enable-authz_core=shared\n    --enable-authz_host=shared\n    ac_cv_prog_PCRE_CONFIG=$COOKBOOK_SYSROOT/bin/pcre-config\n    ap_cv_void_ptr_lt_long=no\n)\ncd ${COOKBOOK_SOURCE}\nsed -i build/rules.mk.in -e 's/--mode=compile/& --tag=CC/'\nsed -i build/rules.mk.in -e 's/--mode=link/& --tag=CC/'\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\n\"${COOKBOOK_MAKE}\" install DESTDIR=\"${COOKBOOK_STAGE}\"\nsed -s 's/^LoadModule /# &/' -i ${COOKBOOK_STAGE}/usr/local/apache2/conf/httpd.conf\nsed -s 's/^User daemon/User user/' -i ${COOKBOOK_STAGE}/usr/local/apache2/conf/httpd.conf\nsed -s 's/^Group daemon/Group #1000/' -i ${COOKBOOK_STAGE}/usr/local/apache2/conf/httpd.conf\ntouch ${COOKBOOK_STAGE}/usr/local/apache2/logs/keep_dir\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/http/apache-httpd/redox.patch",
    "content": "diff --git a/Makefile.in b/Makefile.in\nindex ebf7a16..296e661 100644\n--- a/Makefile.in\n+++ b/Makefile.in\n@@ -1,5 +1,5 @@\n \n-SUBDIRS = srclib os server modules support\n+SUBDIRS = srclib os server modules\n CLEAN_SUBDIRS = test\n \n PROGRAM_NAME         = $(progname)\n@@ -7,9 +7,10 @@ PROGRAM_SOURCES      = modules.c\n PROGRAM_LDADD        = buildmark.o $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(PCRE_LIBS) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS)\n PROGRAM_PRELINK      = $(COMPILE) -c $(top_srcdir)/server/buildmark.c\n PROGRAM_DEPENDENCIES = \\\n+  -lc \\\n+  $(MPM_LIB) \\\n   server/libmain.la \\\n   $(BUILTIN_LIBS) \\\n-  $(MPM_LIB) \\\n   os/$(OS_DIR)/libos.la\n \n sbin_PROGRAMS   = $(PROGRAM_NAME)\n@@ -290,28 +291,7 @@ install-man:\n \t  cd $(DESTDIR)$(manualdir) && find . -name \".svn\" -type d -print | xargs rm -rf 2>/dev/null || true; \\\n \tfi\n \n-install-suexec: install-suexec-$(INSTALL_SUEXEC)\n-\n-install-suexec-binary:\n-\t@if test -f $(builddir)/support/suexec; then \\\n-            test -d $(DESTDIR)$(sbindir) || $(MKINSTALLDIRS) $(DESTDIR)$(sbindir); \\\n-            $(INSTALL_PROGRAM) $(top_builddir)/support/suexec $(DESTDIR)$(sbindir); \\\n-\tfi\n-\n-install-suexec-setuid: install-suexec-binary\n-\t@if test -f $(builddir)/support/suexec; then \\\n-\t    chmod 4755 $(DESTDIR)$(sbindir)/suexec; \\\n-\tfi\n-\n-install-suexec-caps: install-suexec-binary\n-\t@if test -f $(builddir)/support/suexec; then \\\n-            setcap 'cap_setuid,cap_setgid+pe' $(DESTDIR)$(sbindir)/suexec; \\\n-\tfi\n-\n-suexec:\n-\tcd support && $(MAKE) suexec\n-\n-x-local-distclean:\n+-local-distclean:\n \t@rm -rf autom4te.cache\n \n # XXX: This looks awfully platform-specific [read: bad form and style]\ndiff --git a/configure b/configure\nindex 6eb60fd..46b490e 100755\n--- a/configure\n+++ b/configure\n@@ -4998,7 +4998,7 @@ else\n       done\n       if test $apr_addto_duplicate = \"0\"; then\n         test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to LDFLAGS\"\n-        LDFLAGS=\"$LDFLAGS $i\"\n+        # LDFLAGS=\"$LDFLAGS $i\"\n       fi\n     done\n   fi\n@@ -5006,6 +5006,7 @@ else\n   APU_BINDIR=`$apu_config --bindir`\n   APU_INCLUDEDIR=`$apu_config --includedir`\n   APU_INCLUDES=`$apu_config --includes`\n+  echo \"$apu_config --includes\" = \"$APU_INCLUDES\"\n   APU_VERSION=`$apu_config --version`\n   APU_CONFIG=\"$APU_BINDIR/apu-`echo ${APU_VERSION} | sed 's,\\..*,,'`-config\"\n fi\n@@ -6268,9 +6269,9 @@ $as_echo \"$as_me: Using external PCRE library from $PCRE_CONFIG\" >&6;}\n \n   if test \"x$PCRE_LIBS\" = \"x\"; then\n     test \"x$silent\" != \"xyes\" && echo \"  setting PCRE_LIBS to \\\"`$PCRE_CONFIG --libs8 2>/dev/null || $PCRE_CONFIG --libs`\\\"\"\n-    PCRE_LIBS=\"`$PCRE_CONFIG --libs8 2>/dev/null || $PCRE_CONFIG --libs`\"\n+    PCRE_LIBS=\"-lpcre\"\n   else\n-    apr_addto_bugger=\"`$PCRE_CONFIG --libs8 2>/dev/null || $PCRE_CONFIG --libs`\"\n+    apr_addto_bugger=\"-lpcre\"\n     for i in $apr_addto_bugger; do\n       apr_addto_duplicate=\"0\"\n       for j in $PCRE_LIBS; do\n@@ -40691,9 +40692,11 @@ fi\n \n \n if test x${apu_found} != xobsolete; then\n-  AP_LIBS=\"$AP_LIBS `$apu_config --avoid-ldap --link-libtool --libs`\"\n+  # AP_LIBS=\"$AP_LIBS `$apu_config --avoid-ldap --link-libtool --libs`\" -ldb-5.3\n+  AP_LIBS=\"$AP_LIBS -laprutil-1  -lgdbm  -lexpat\"\n fi\n-AP_LIBS=\"$AP_LIBS `$apr_config --link-libtool --libs`\"\n+# AP_LIBS=\"$AP_LIBS `$apr_config --link-libtool --libs`\"\n+AP_LIBS=\"$AP_LIBS -lapr-1 -luuid -lrt -lcrypt  -lpthread -ldl\"\n \n   APACHE_VAR_SUBST=\"$APACHE_VAR_SUBST AP_LIBS\"\n \ndiff --git a/os/unix/unixd.c b/os/unix/unixd.c\nindex 0245720..cd241d2 100644\n--- a/os/unix/unixd.c\n+++ b/os/unix/unixd.c\n@@ -231,31 +231,6 @@ AP_DECLARE(apr_status_t) ap_unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex)\n         apr_lockmech_e mech = proc_mutex_mech(pmutex);\n \n         switch(mech) {\n-#if APR_HAS_SYSVSEM_SERIALIZE\n-        case APR_LOCK_SYSVSEM:\n-        {\n-            apr_os_proc_mutex_t ospmutex;\n-#if !APR_HAVE_UNION_SEMUN\n-            union semun {\n-                long val;\n-                struct semid_ds *buf;\n-                unsigned short *array;\n-            };\n-#endif\n-            union semun ick;\n-            struct semid_ds buf = { { 0 } };\n-\n-            apr_os_proc_mutex_get(&ospmutex, pmutex);\n-            buf.sem_perm.uid = ap_unixd_config.user_id;\n-            buf.sem_perm.gid = ap_unixd_config.group_id;\n-            buf.sem_perm.mode = 0600;\n-            ick.buf = &buf;\n-            if (semctl(ospmutex.crossproc, 0, IPC_SET, ick) < 0) {\n-                return errno;\n-            }\n-        }\n-        break;\n-#endif\n #if APR_HAS_FLOCK_SERIALIZE\n         case APR_LOCK_FLOCK:\n         {\ndiff --git a/server/Makefile.in b/server/Makefile.in\nindex 8111877..0449553 100644\n--- a/server/Makefile.in\n+++ b/server/Makefile.in\n@@ -1,5 +1,5 @@\n \n-CLEAN_TARGETS = gen_test_char test_char.h \\\n+CLEAN_TARGETS = \\\n \tApacheCoreOS2.def httpd.exp export_files \\\n \texports.c export_vars.h\n \n@@ -24,12 +24,6 @@ TARGETS = delete-exports $(LTLIBRARY_NAME) $(CORE_IMPLIB_FILE) export_vars.h htt\n include $(top_builddir)/build/rules.mk\n include $(top_srcdir)/build/library.mk\n \n-gen_test_char_OBJECTS = gen_test_char.lo\n-gen_test_char: $(gen_test_char_OBJECTS)\n-\t$(LINK) $(EXTRA_LDFLAGS) $(gen_test_char_OBJECTS) $(EXTRA_LIBS)\n-\n-test_char.h: gen_test_char\n-\t./gen_test_char > test_char.h\n \n util.lo: test_char.h\n \ndiff --git a/server/gen_test_char.c b/server/gen_test_char.c\ndeleted file mode 100644\nindex 248216b..0000000\n--- a/server/gen_test_char.c\n+++ /dev/null\n@@ -1,192 +0,0 @@\n-/* Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-#ifdef CROSS_COMPILE\n-\n-#include <ctype.h>\n-#define apr_isalnum(c) (isalnum(((unsigned char)(c))))\n-#define apr_isalpha(c) (isalpha(((unsigned char)(c))))\n-#define apr_iscntrl(c) (iscntrl(((unsigned char)(c))))\n-#define apr_isprint(c) (isprint(((unsigned char)(c))))\n-#define APR_HAVE_STDIO_H 1\n-#define APR_HAVE_STRING_H 1\n-\n-#else\n-\n-#include \"apr.h\"\n-#include \"apr_lib.h\"\n-\n-#endif\n-\n-#if defined(WIN32) || defined(OS2)\n-#define NEED_ENHANCED_ESCAPES\n-#endif\n-\n-#if APR_HAVE_STDIO_H\n-#include <stdio.h>\n-#endif\n-#if APR_HAVE_STRING_H\n-#include <string.h>\n-#endif\n-\n-/* A bunch of functions in util.c scan strings looking for certain characters.\n- * To make that more efficient we encode a lookup table.\n- */\n-#define T_ESCAPE_SHELL_CMD    (0x01)\n-#define T_ESCAPE_PATH_SEGMENT (0x02)\n-#define T_OS_ESCAPE_PATH      (0x04)\n-#define T_HTTP_TOKEN_STOP     (0x08)\n-#define T_ESCAPE_LOGITEM      (0x10)\n-#define T_ESCAPE_FORENSIC     (0x20)\n-#define T_ESCAPE_URLENCODED   (0x40)\n-#define T_HTTP_CTRLS          (0x80)\n-#define T_VCHAR_OBSTEXT      (0x100)\n-#define T_URI_UNRESERVED     (0x200)\n-\n-int main(int argc, char *argv[])\n-{\n-    unsigned c;\n-    unsigned short flags;\n-\n-    printf(\"/* this file is automatically generated by gen_test_char, \"\n-           \"do not edit */\\n\"\n-           \"#define T_ESCAPE_SHELL_CMD     (%u)\\n\"\n-           \"#define T_ESCAPE_PATH_SEGMENT  (%u)\\n\"\n-           \"#define T_OS_ESCAPE_PATH       (%u)\\n\"\n-           \"#define T_HTTP_TOKEN_STOP      (%u)\\n\"\n-           \"#define T_ESCAPE_LOGITEM       (%u)\\n\"\n-           \"#define T_ESCAPE_FORENSIC      (%u)\\n\"\n-           \"#define T_ESCAPE_URLENCODED    (%u)\\n\"\n-           \"#define T_HTTP_CTRLS           (%u)\\n\"\n-           \"#define T_VCHAR_OBSTEXT        (%u)\\n\"\n-           \"#define T_URI_UNRESERVED       (%u)\\n\"\n-           \"\\n\"\n-           \"static const unsigned short test_char_table[256] = {\",\n-           T_ESCAPE_SHELL_CMD,\n-           T_ESCAPE_PATH_SEGMENT,\n-           T_OS_ESCAPE_PATH,\n-           T_HTTP_TOKEN_STOP,\n-           T_ESCAPE_LOGITEM,\n-           T_ESCAPE_FORENSIC,\n-           T_ESCAPE_URLENCODED,\n-           T_HTTP_CTRLS,\n-           T_VCHAR_OBSTEXT,\n-           T_URI_UNRESERVED\n-        );\n-\n-    for (c = 0; c < 256; ++c) {\n-        flags = 0;\n-        if (c % 8 == 0)\n-            printf(\"\\n    \");\n-\n-        /* escape_shell_cmd */\n-#ifdef NEED_ENHANCED_ESCAPES\n-        /* Win32/OS2 have many of the same vulnerable characters\n-         * as Unix sh, plus the carriage return and percent char.\n-         * The proper escaping of these characters varies from unix\n-         * since Win32/OS2 use carets or doubled-double quotes,\n-         * and neither lf nor cr can be escaped.  We escape unix\n-         * specific as well, to assure that cross-compiled unix\n-         * applications behave similarly when invoked on win32/os2.\n-         *\n-         * Rem please keep in-sync with apr's list in win32/filesys.c\n-         */\n-        if (c && strchr(\"&;`'\\\"|*?~<>^()[]{}$\\\\\\n\\r%\", c)) {\n-            flags |= T_ESCAPE_SHELL_CMD;\n-        }\n-#else\n-        if (c && strchr(\"&;`'\\\"|*?~<>^()[]{}$\\\\\\n\", c)) {\n-            flags |= T_ESCAPE_SHELL_CMD;\n-        }\n-#endif\n-\n-        if (!apr_isalnum(c) && !strchr(\"$-_.+!*'(),:@&=~\", c)) {\n-            flags |= T_ESCAPE_PATH_SEGMENT;\n-        }\n-\n-        if (!apr_isalnum(c) && !strchr(\"$-_.+!*'(),:;@&=/~\", c)) {\n-            flags |= T_OS_ESCAPE_PATH;\n-        }\n-\n-        if (!apr_isalnum(c) && !strchr(\".-*_ \", c)) {\n-            flags |= T_ESCAPE_URLENCODED;\n-        }\n-\n-        /* Stop for any non-'token' character, including ctrls, obs-text,\n-         * and \"tspecials\" (RFC2068) a.k.a. \"separators\" (RFC2616), which\n-         * is easier to express as characters remaining in the ASCII token set\n-         */\n-        if (!c || !(apr_isalnum(c) || strchr(\"!#$%&'*+-.^_`|~\", c))) {\n-            flags |= T_HTTP_TOKEN_STOP;\n-        }\n-\n-        /* Catch CTRLs other than VCHAR, HT and SP, and obs-text (RFC7230 3.2)\n-         * This includes only the C0 plane, not C1 (which is obs-text itself.)\n-         * XXX: We should verify that all ASCII C0 ctrls/DEL corresponding to\n-         * the current EBCDIC translation are captured, and ASCII C1 ctrls\n-         * corresponding are all permitted (as they fall under obs-text rule)\n-         */\n-        if (!c || (apr_iscntrl(c) && c != '\\t')) {\n-            flags |= T_HTTP_CTRLS;\n-        }\n-\n-        /* From RFC3986, the specific sets of gen-delims, sub-delims (2.2),\n-         * and unreserved (2.3) that are possible somewhere within a URI.\n-         * Spec requires all others to be %XX encoded, including obs-text.\n-         */\n-        if (c && !apr_iscntrl(c) && c != ' ') {\n-            flags |= T_VCHAR_OBSTEXT;\n-        }\n-\n-        /* For logging, escape all control characters,\n-         * double quotes (because they delimit the request in the log file)\n-         * backslashes (because we use backslash for escaping)\n-         * and 8-bit chars with the high bit set\n-         */\n-        if (c && (!apr_isprint(c) || c == '\"' || c == '\\\\' || apr_iscntrl(c))) {\n-            flags |= T_ESCAPE_LOGITEM;\n-        }\n-\n-        /* For forensic logging, escape all control characters, top bit set,\n-         * :, | (used as delimiters) and % (used for escaping).\n-         */\n-        if (!apr_isprint(c) || c == ':' || c == '|' || c == '%'\n-            || apr_iscntrl(c) || !c) {\n-            flags |= T_ESCAPE_FORENSIC;\n-        }\n-\n-        /* Characters in the RFC 3986 \"unreserved\" set.\n-         * https://datatracker.ietf.org/doc/html/rfc3986#section-2.3 */\n-        if (c && (apr_isalnum(c) || strchr(\"-._~\", c))) {\n-            flags |= T_URI_UNRESERVED;\n-        }\n-        \n-        printf(\"0x%03x%c\", flags, (c < 255) ? ',' : ' ');\n-    }\n-\n-    printf(\"\\n};\\n\\n\");\n-\n-    printf(\n-      \"/* we assume the folks using this ensure 0 <= c < 256... which means\\n\"\n-      \" * you need a cast to (unsigned char) first, you can't just plug a\\n\"\n-      \" * char in here and get it to work, because if char is signed then it\\n\"\n-      \" * will first be sign extended.\\n\"\n-      \" */\\n\"\n-      \"#define TEST_CHAR(c, f) (test_char_table[(unsigned char)(c)] & (f))\\n\"\n-    );\n-\n-    return 0;\n-}\ndiff --git a/server/mpm_fdqueue.c b/server/mpm_fdqueue.c\nindex 3697ca7..9f9d36e 100644\n--- a/server/mpm_fdqueue.c\n+++ b/server/mpm_fdqueue.c\n@@ -17,6 +17,7 @@\n #include \"mpm_fdqueue.h\"\n \n #if APR_HAS_THREADS\n+#warning \"apr_has_threads\"\n \n #include <apr_atomic.h>\n \n@@ -531,4 +532,6 @@ apr_status_t ap_queue_term(fd_queue_t *queue)\n     return queue_interrupt(queue, 1, 1);\n }\n \n+#else\n+#warning \"no apr_has_threads\"\n #endif /* APR_HAS_THREADS */\ndiff --git a/server/test_char.h b/server/test_char.h\nnew file mode 100644\nindex 0000000..ebd7395\n--- /dev/null\n+++ b/server/test_char.h\n@@ -0,0 +1,53 @@\n+/* this file is automatically generated by gen_test_char, do not edit */\n+#define T_ESCAPE_SHELL_CMD     (1)\n+#define T_ESCAPE_PATH_SEGMENT  (2)\n+#define T_OS_ESCAPE_PATH       (4)\n+#define T_HTTP_TOKEN_STOP      (8)\n+#define T_ESCAPE_LOGITEM       (16)\n+#define T_ESCAPE_FORENSIC      (32)\n+#define T_ESCAPE_URLENCODED    (64)\n+#define T_HTTP_CTRLS           (128)\n+#define T_VCHAR_OBSTEXT        (256)\n+#define T_URI_UNRESERVED       (512)\n+\n+static const unsigned short test_char_table[256] = {\n+    0x0a8,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,\n+    0x0fe,0x07e,0x0ff,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,\n+    0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,\n+    0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,0x0fe,\n+    0x00e,0x140,0x15f,0x146,0x141,0x166,0x141,0x141,\n+    0x149,0x149,0x101,0x140,0x148,0x300,0x300,0x14a,\n+    0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,\n+    0x300,0x300,0x168,0x14b,0x14f,0x148,0x14f,0x14f,\n+    0x148,0x300,0x300,0x300,0x300,0x300,0x300,0x300,\n+    0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,\n+    0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,\n+    0x300,0x300,0x300,0x14f,0x15f,0x14f,0x147,0x300,\n+    0x147,0x300,0x300,0x300,0x300,0x300,0x300,0x300,\n+    0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,\n+    0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,\n+    0x300,0x300,0x300,0x14f,0x167,0x14f,0x341,0x0fe,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,\n+    0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e,0x17e \n+};\n+\n+/* we assume the folks using this ensure 0 <= c < 256... which means\n+ * you need a cast to (unsigned char) first, you can't just plug a\n+ * char in here and get it to work, because if char is signed then it\n+ * will first be sign extended.\n+ */\n+#define TEST_CHAR(c, f) (test_char_table[(unsigned char)(c)] & (f))\n"
  },
  {
    "path": "recipes/wip/net/http/easyp/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine how to configure this part of the deployment script: https://github.com/gmatht/easyp/blob/main/deploy.sh#L39\n[source]\ngit = \"https://github.com/gmatht/easyp-crate\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/http/ferron/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ferronweb/ferron\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages ferron\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/http/freenginx/recipe.toml",
    "content": "#TODO can't find the options file\n[source]\ntar = \"https://freenginx.org/download/nginx-1.24.0.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/net/http/http-server-rs/recipe.toml",
    "content": "#TODO camino crate error\n# broken since https://github.com/http-server-rs/http-server/pull/461\n# because it needs https://trunkrs.dev to work\n[source]\ngit = \"https://github.com/http-server-rs/http-server\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\"${COOKBOOK_CARGO}\" build \\\n        --manifest-path \"${COOKBOOK_SOURCE}/crates/file-explorer-plugin/Cargo.toml\" \\\n        --locked ${build_flags} --lib\ncp -v \\\n    \"target/${TARGET}/${build_type}/libfile_explorer_plugin.dylib\" \\\n    \"${COOKBOOK_SOURCE}\"/lib/http-server/inline/file_explorer.plugin.httprs\nCOOKBOOK_CARGO_PATH=crates/http-server cookbook_cargo --bin http-server\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/http/lighttpd/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.82.tar.xz\"\nb3sum = \"1890d4d63dab35ed8c6e994f11f408aaf9e6dd7cda959d2533a3c80d20c93029\"\npatches = [\n    \"redox.patch\"\n]\n\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DWITH_OPENSSL=ON\"\n]\ndependencies = [\n    \"pcre2\",\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/http/lighttpd/redox.patch",
    "content": "diff --color -ruwN source/src/fdevent.c source-new/src/fdevent.c\n--- source/src/fdevent.c\t2025-09-13 02:08:20.000000000 +0700\n+++ source-new/src/fdevent.c\t2026-03-14 14:16:21.543520177 +0700\n@@ -321,7 +321,7 @@\n \tint fd;\n \tsocklen_t len = (socklen_t) *addrlen;\n \n-      #if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK)\n+      #if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) && !defined(__redox__)\n        #if defined(__NetBSD__)\n \tconst int sock_cloexec = 1;\n \tfd = paccept(listenfd, addr, &len, NULL, SOCK_CLOEXEC | SOCK_NONBLOCK);\n"
  },
  {
    "path": "recipes/wip/net/http/miniserve/recipe.toml",
    "content": "#TODO compiled but not tested\r\n[source]\r\ngit = \"https://github.com/svenstaro/miniserve\"\r\nshallow_clone = true\r\n[build]\r\ntemplate = \"cargo\"\r\n"
  },
  {
    "path": "recipes/wip/net/http/miniserve/redox.patch",
    "content": "diff --git a/Cargo.toml b/Cargo.toml\nindex 68f26c9..98c4dde 100644\n--- a/Cargo.toml\n+++ b/Cargo.toml\n@@ -39,7 +39,6 @@ futures = \"0.3\"\n grass = { version = \"0.13\", features = [\"macro\"], default-features = false }\n hex = \"0.4\"\n httparse = \"1\"\n-if-addrs = \"0.15\"\n libflate = \"2\"\n log = \"0.4\"\n maud = \"0.27\"\n@@ -62,6 +61,9 @@ thiserror = \"2\"\n tokio = { version = \"1.47.1\", features = [\"fs\", \"macros\"] }\n zip = { version = \"8\", default-features = false }\n \n+[target.'cfg(not(target_os = \"redox\"))'.dependencies]\n+if-addrs = \"0.15\"\n+\n [features]\n default = [\"tls\"]\n # This feature allows us to use rustls only on architectures supported by ring.\ndiff --git a/src/main.rs b/src/main.rs\nindex aea9ed9..3c91968 100644\n--- a/src/main.rs\n+++ b/src/main.rs\n@@ -193,6 +193,7 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), StartupError> {\n             .partition(|addr| !addr.is_unspecified());\n \n         // Replace wildcard addresses with local interface addresses\n+        #[cfg(not(target_os=\"redox\"))]\n         if !wildcard.is_empty() {\n             let all_ipv4 = wildcard.iter().any(|addr| addr.is_ipv4());\n             let all_ipv6 = wildcard.iter().any(|addr| addr.is_ipv6());\n"
  },
  {
    "path": "recipes/wip/net/http/quark/recipe.toml",
    "content": "#TODO missing script for gnu make\n[source]\ngit = \"https://git.suckless.org/quark\"\nrev = \"5ad0df91757fbc577ffceeca633725e962da345d\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/net/http/sozu/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/sozu-proxy/sozu\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages sozu\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/http/sws/recipe.toml",
    "content": "#TODO signal-hook crate error\n[source]\ngit = \"https://github.com/static-web-server/static-web-server\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/http/thttpd/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: read the INSTALL file\n[source]\ntar = \"https://acme.com/software/thttpd/thttpd-2.29.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/net/lan/lantun/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/maxomatic458/lantun\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages lantun-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/lan/malai/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/fastn-stack/kulfi\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages malai\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/lan/zerotier/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/zerotier/ZeroTierOne/blob/dev/build.md\n#TODO discover minimum dependencies\n[source]\ngit = \"https://github.com/zerotier/ZeroTierOne\"\nrev = \"1.16.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n#dependencies = [\n#    \"openssl3\",\n#]\n"
  },
  {
    "path": "recipes/wip/net/lan/ztui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/erikh/ztui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/monitor/network-monitor-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/grigio/network-monitor\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/net/monitor/rustnet/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/domcyrus/rustnet\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libpcap\",\n]\n"
  },
  {
    "path": "recipes/wip/net/monitor/somo/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/theopfr/somo\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/onion-routing/arti/recipe.toml",
    "content": "#TODO pwd-grp crate error\n[source]\ngit = \"https://gitlab.torproject.org/tpo/core/arti\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages arti\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/onion-routing/i2pd/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://i2pd.readthedocs.io/en/latest/devs/building/unix/\n[source]\ngit = \"https://github.com/PurpleI2P/i2pd\"\nrev = \"2.59.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"boost\",\n    \"openssl3\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/net/onion-routing/tor/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://dist.torproject.org/tor-0.4.8.9.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libevent\",\n    \"openssl3\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/net/onion-routing/tor-browser/mozconfig",
    "content": "mk_add_options MOZ_OBJDIR=COOKBOOK_BUILD\nac_add_options --target=TARGET\nac_add_options --disable-debug\nac_add_options --disable-tests\nac_add_options --disable-audio-backends\nac_add_options --disable-crashreporter\nac_add_options --disable-updater\nac_add_options --disable-dbus\nac_add_options --disable-gecko-profiler\nac_add_options --disable-profiling\nac_add_options --disable-dmd # dark matter detector\nac_add_options --without-wasm-sandboxed-libraries # need clang wasi\n\n# TODO: cairo-gtk3-x11-wayland or separate cairo-gtk3-wayland-only\nac_add_options --enable-default-toolkit=cairo-gtk3-x11-only\nac_add_options --enable-bootstrap=-clang # only use our clang\nac_add_options --enable-optimize\nac_add_options --with-system-nspr\nac_add_options --with-gl-provider=EGL\n\nexport MOZ_REQUIRE_SIGNING=\nexport MOZ_TELEMETRY_REPORTING=\nexport CC=\"TARGET_CC\"\nexport CXX=\"TARGET_CXX\"\n"
  },
  {
    "path": "recipes/wip/net/onion-routing/tor-browser/recipe.toml",
    "content": "#TODO patches for quinn-udp crate, switch into git fork\n# mach: https://firefox-source-docs.mozilla.org/setup/linux_build.html\n[source]\ntar = \"https://dist.torproject.org/torbrowser/15.0.6/src-firefox-tor-browser-140.7.1esr-15.0-1-build1.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    # \"fontconfig\",\n    # \"atk\",\n    # \"cairo\",\n    \"dbus\",\n    # \"libffi\",\n    # \"freetype2\",\n    # \"gdk-pixbuf\",\n    # \"glib\",\n    \"gtk3\",\n    \"pango\",\n    \"libxkbcommon-x11\",\n    \"libice\",\n    \"mesa-x11\",\n    \"x11proto-kb\",\n    \"xcb-proto\",\n    \"xextproto\",\n    \"nspr\",\n    \"libxrandr\",\n    \"libsm\",\n# TODO: Should separate clang library and runtime \n    \"clang21\"\n    # \"sqlite3\",\n    # \"nss-nspr\",\n    # \"startup-notification\",\n    # \"zlib\",\n    # \"ffmpeg6\",\n    # \"expat\",\n    # \"libepoxy\",\n    # \"pipewire\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\ncat ${COOKBOOK_RECIPE}/mozconfig > mozconfig\nsed -i \"s|COOKBOOK_BUILD|${COOKBOOK_BUILD}|g\" mozconfig\nsed -i \"s|TARGET_CC|${CC}|g\" mozconfig\nsed -i \"s|TARGET_CXX|${CXX}|g\" mozconfig\nsed -i \"s|TARGET|${TARGET}|g\" mozconfig\nexport MOZCONFIG=\"${COOKBOOK_BUILD}/mozconfig\"\nexport PYTHONDONTWRITEBYTECODE=1\nunset CC_WRAPPER\nif [[ -z \"$CI\" ]]; then export MACH_NO_TERMINAL_FOOTER=1; fi;\n\n# clang-sys specifics\nPREFIX_INCLUDE=\"$COOKBOOK_HOST_SYSROOT/$TARGET/include\"\nexport CLANGFLAGS=\"-I $PREFIX_INCLUDE/c++/13.2.0 -I $PREFIX_INCLUDE/c++/13.2.0/$TARGET -I $PREFIX_INCLUDE/c++/13.2.0/backward\"\nexport CLANGFLAGS=\"$CLANGFLAGS -I $PREFIX_INCLUDE -I $COOKBOOK_SYSROOT/lib/clang/21/include -D__redox__\"\nexport BINDGEN_EXTRA_CLANG_ARGS_x86_64_unknown_redox=\"-target x86_64-unknown-redox -nostdinc $CLANGFLAGS\"\nexport LLVM_CONFIG_PATH=\"$COOKBOOK_TOOLCHAIN/bin/llvm-config\"\n\n# Don't poison the stage1 compiler (host -> host)\nunset AR AS CC CXX LD LDFLAGS NM OBJCOPY OBJDUMP RANLIB READELF RUSTFLAGS STRIP\n\n(cd ${COOKBOOK_SOURCE} && ./mach build)\nrsync -a ./dist ${COOKBOOK_STAGE}\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/agnos/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/krtab/agnos\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/altuntun/recipe.toml",
    "content": "#TODO source code error\n[source]\ngit = \"https://github.com/cableguard/altuntun\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages altuntun-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/arp-scanner/recipe.toml",
    "content": "#TODO pnet_sys crate error\n[source]\ngit = \"https://github.com/kongbytes/arp-scan-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/bita/recipe.toml",
    "content": "#TODO compilation error (after a cargo update and a patch on the ring and tokio crates)\n[source]\ngit = \"https://github.com/oll3/bita\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo --no-default-features --features rustls-tls\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/bore/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/ekzhang/bore\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/celeste/recipe.toml",
    "content": "#TODO missing script for \"just\" and require Go, see https://github.com/hwittenborn/celeste/blob/develop/BUILDING.md\n[source]\ngit = \"https://github.com/hwittenborn/celeste\"\nrev = \"2ea8dc00ed001d045792e974b46264d920090606\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/cobalt/recipe.toml",
    "content": "#TODO compilation error (after an update on proc-macro2)\n[source]\ngit = \"https://github.com/cobalt-org/cobalt.rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/crab-dlna/recipe.toml",
    "content": "#TODO get_if_addrs crate error\n[source]\ngit = \"https://github.com/gabrielmagno/crab-dlna\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/dnst/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/NLnetLabs/dnst\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo --features ring\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/dqy/recipe.toml",
    "content": "#TODO mlua-sys crate can't detect the lua54 dependency\n[source]\ngit = \"https://github.com/dandyvica/dqy\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"lua54\",\n]\nscript = \"\"\"\ncookbook_cargo_packages dqy\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/drill/recipe.toml",
    "content": "#TODO OpenSSL error (after a cargo update and a patch to update tokio on Cargo.toml)\n[source]\ngit = \"https://github.com/fcsonline/drill\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/dufs/recipe.toml",
    "content": "#TODO if-addrs crate error\n[source]\ngit = \"https://github.com/sigoden/dufs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/floresta/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/Davidson-Souza/Floresta\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages florestad\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/guacamole-client/recipe.toml",
    "content": "#TODO this recipe require this data type to download the Java bytecode - https://gitlab.redox-os.org/redox-os/cookbook/-/issues/190\n# download link - https://apache.org/dyn/closer.lua/guacamole/1.5.5/binary/guacamole-1.5.5.war?action=download\n[source]\n\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/net/other/gws/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/googleworkspace/cli\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/havn/recipe.toml",
    "content": "#TODO scanning loop, broken Redox support\n[source]\ngit = \"https://github.com/mrjackwills/havn\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/hinoki/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/jplatte/hinoki\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/hurl/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/Orange-OpenSource/hurl\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n    \"curl\",\n    \"libxml2\",\n]\nscript = \"\"\"\ncookbook_cargo_packages hurl\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/impala/recipe.toml",
    "content": "#TODO port to redox\n[source]\ngit = \"https://github.com/pythops/impala\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/lldap/recipe.toml",
    "content": "#TODO program source code error (after cargo update and a patch on ring)\n[source]\ngit = \"https://github.com/lldap/lldap\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages lldap\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/lychee/recipe.toml",
    "content": "#TODO async-io crate error (after cargo update)\n[source]\ngit = \"https://github.com/lycheeverse/lychee\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages lychee\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/lynx/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://invisible-island.net/archives/lynx/tarballs/lynx2.9.2.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"ncursesw\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/meli/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://git.meli-email.org/meli/meli\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sqlite3\",\n]\nscript = \"\"\"\ncookbook_cargo_packages meli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/miniupnpc/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/miniupnp/miniupnp/tree/master/miniupnpc#readme\n[source]\ntar = \"http://miniupnp.free.fr/files/miniupnpc-2.2.4.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/net/other/moonfire-nvr-server/recipe.toml",
    "content": "#TODO cookbook_cargo function error\n[source]\ngit = \"https://github.com/scottlamb/moonfire-nvr\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sqlite3\",\n]\nscript = \"\"\"\ncd \"${COOKBOOK_SOURCE}/server\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/netop/recipe.toml",
    "content": "#TODO make libpcap work\n[source]\ngit = \"https://github.com/ZingerLittleBee/netop\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libpcap\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/netscanner/recipe.toml",
    "content": "#TODO pnet_sys crate error\n[source]\ngit = \"https://github.com/Chleba/netscanner\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/nmap/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://nmap.org/dist/nmap-7.98.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/net/other/nspr/recipe.toml",
    "content": "# TODO: Using patched mozjs from servo, maybe move patcehs into to upstream patches?\n[source]\n# tar = \"https://ftp.mozilla.org/pub/nspr/releases/v4.9.6/src/nspr-4.9.6.tar.gz\"\ngit = \"https://github.com/willnode/mozjs\"\nbranch = \"redox\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nexport HOST_CC=\"cc\"\nexport CC=\"$GNU_TARGET-gcc\"\nexport CXX=\"$GNU_TARGET-g++\"\nexport LDFLAGS=\"-shared\"\nexport CFLAGS=\"-fPIC\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --enable-optimize\n    --disable-debug\n    --enable-64bit\n    --with-pthreads\n    ac_cv_path_LD=\"$LD\"\n)\nCOOKBOOK_MAKE_JOBS=1\nCOOKBOOK_CONFIGURE=\"$COOKBOOK_SOURCE/mozjs-sys/mozjs/nsprpub/configure\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/nss/recipe.toml",
    "content": "#TODO missing script for building\n[source]\ntar = \"https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_9_2_RTM/src/nss-3.9.2.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/net/other/nss-pem/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/kdudka/nss-pem/blob/master/README\n[source]\ntar = \"https://github.com/kdudka/nss-pem/releases/download/nss-pem-1.1.0/nss-pem-1.1.0.tar.xz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/net/other/oha/recipe.toml",
    "content": "#TODO jmalloc-sys crate error\n[source]\ngit = \"https://github.com/hatoo/oha\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo --no-default-features --features rustls\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/pavao/recipe.toml",
    "content": "#TODO: fails to link libcrypto.so\n[source]\ngit = \"https://github.com/jackpot51/pavao.git\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nbuild_flags=\"${build_flags} --features vendored\"\ncookbook_cargo_examples tree\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/phantun/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/dndx/phantun\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages phantun\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/quincy/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/M0dEx/quincy\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/rallyup/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/darwindarak/rallyup\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/rathole/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rapiz1/rathole\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/realm/recipe.toml",
    "content": "#TODO realm_syscall crate error\n[source]\ngit = \"https://github.com/zhboner/realm\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/rlt/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/kaichaosun/rlt\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages localtunnel localtunnel-client localtunnel-server\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/rqbit/recipe.toml",
    "content": "#TODO network-interface crate error\n[source]\ngit = \"https://github.com/ikatson/rqbit\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages rqbit\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/rustscan/recipe.toml",
    "content": "#TODO Make nmap work\n[source]\ngit = \"https://github.com/RustScan/RustScan\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"nmap\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/samba/answers.txt",
    "content": "Checking for HAVE_LITTLE_ENDIAN - runtime: OK\nChecking for large file support without additional flags: OK\nChecking for HAVE_SECURE_MKSTEMP: OK\nChecking for HAVE_MREMAP: OK\nChecking whether setreuid is available: OK\n"
  },
  {
    "path": "recipes/wip/net/other/samba/recipe.toml",
    "content": "#TODO: needs libmodule-build-parse-yapp-perl dependency\n[source]\ngit = \"https://gitlab.redox-os.org/redox-os/samba.git\"\nupstream = \"https://github.com/samba-team/samba.git\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gnutls3\",\n    \"libarchive\",\n    \"libnettle\",\n    \"jansson\",\n    \"zlib\",\n]\nscript = \"\"\"\nrsync -av --delete --exclude .git \"${COOKBOOK_SOURCE}/\" ./\ncp -v \"${COOKBOOK_RECIPE}/answers.txt\" answers.txt\n\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --builtin-libraries=ALL\n    --cross-compile\n    --cross-answers=answers.txt\n    --disable-python\n    --disable-rpath\n    --enable-fhs\n    --host=\"${TARGET}\"\n    --localstatedir=/var\n    --prefix=/usr\n    --sysconfdir=/etc\n    --with-static-modules=ALL,!vfs_snapper\n    --without-acl-support\n    --without-ad-dc\n    --without-ads\n    --without-gettext\n    --without-ldap\n    --without-libunwind\n    --without-pam\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/sandhole/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/EpicEric/sandhole\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/slumber/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/LucasPickering/slumber\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/smb-rs/recipe.toml",
    "content": "#TODO: fix aws-lc-sys compilation\n[source]\ngit = \"https://github.com/AvivNaaman/smb-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"smb-cli\"]\n"
  },
  {
    "path": "recipes/wip/net/other/socat/recipe.toml",
    "content": "#TODO: network interfaces (ifreq)\n[source]\ntar = \"http://www.dest-unreach.org/socat/download/socat-1.8.1.1.tar.bz2\"\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"ac_cv_type_sig_atomic_t=yes\",\n    \"sc_cv_type_struct_timeval_tv_usec=5\",\n    \"--disable-ip6\",\n    \"--disable-termios\",\n]"
  },
  {
    "path": "recipes/wip/net/other/speedtest-rs/recipe.toml",
    "content": "#TODO openssl-sys crate error (after cargo update)\n[source]\ngit = \"https://github.com/nelsonjchen/speedtest-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/spiko/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/trinhminhtriet/spiko\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/spis/recipe.toml",
    "content": "#TODO maybe incomplete script, see the Makefile on the repository\n[source]\ngit = \"https://github.com/gbbirkisson/spis\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages spis-server\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/srsran-4g/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://docs.srsran.com/projects/4g/en/latest/general/source/1_installation.html#installation-from-source\n[source]\ngit = \"https://github.com/srsran/srsRAN_4G\"\nrev = \"eea87b1d893ae58e0b08bc381730c502024ae71f\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"fftw\",\n    \"mbedtls\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/srsran-project/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/srsran/srsRAN_Project#build-instructions\n#TODO missing dependencies\n[source]\ngit = \"https://github.com/srsran/srsRAN_Project\"\nrev = \"374200deefd8e1b96fab7328525fd593a808a641\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"fftw\",\n    \"mbedtls\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/tobaru/recipe.toml",
    "content": "#TODO compiled but not tested (after a patch on ring)\n[source]\ngit = \"https://github.com/cfal/tobaru\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/trippy/recipe.toml",
    "content": "#TODO source code error\n[source]\ngit = \"https://github.com/fujiapple852/trippy\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/turn-rs/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/mycrl/turn-rs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages turn-cli turn-server\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/unbound/recipe.toml",
    "content": "#TODO Compilation error\n[source]\ntar = \"https://nlnetlabs.nl/downloads/unbound/unbound-1.17.1.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"expat\",\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/updns/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/wyhaya/updns\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/varia/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/giantpinkrobots/varia#building\n# probably missing dependencies\n[source]\ngit = \"https://github.com/giantpinkrobots/varia\"\nrev = \"515bef5536b4947b3ae8dd3c23b7643ea590d73c\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/net/other/vimini/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://git.sr.ht/~lufte/vimini\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"sqlite3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/other/vopono/recipe.toml",
    "content": "#TODO users crate error\n[source]\ngit = \"https://github.com/jamesmcm/vopono\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/vpncloud/recipe.toml",
    "content": "#TODO libc and nix crate error\n#TODO require Ruby and asciidoctor at runtime\n[source]\ngit = \"https://github.com/dswd/vpncloud\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/vsd/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/clitic/vsd\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ffmpeg6\",\n]\nscript = \"\"\"\ncookbook_cargo_packages vsd\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/wireguard-rs/recipe.toml",
    "content": "#TODO update mio to 0.8 (after cargo update)\n[source]\ngit = \"https://git.zx2c4.com/wireguard-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/other/wstunnel/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/erebe/wstunnel\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages wstunnel-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/other/yazi/recipe.toml",
    "content": "#TODO trash and mlua-sys crate errors\n[source]\ngit = \"https://github.com/sxyazi/yazi\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages yazi-fm\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/p2p/dumbpipe/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/n0-computer/dumbpipe\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/p2p/easytier/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/EasyTier/EasyTier\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages easytier\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/p2p/oku/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/OkuBrowser/oku\"\nshallow_clone = true\nscript = \"./prebuild.sh\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk4\",\n    \"glib\",\n    \"pango\",\n    \"webkitgtk4\",\n    \"libfuse3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/proxy/hitch/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://www.hitch-tls.org/source/hitch-1.8.0.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libev\",\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/proxy/stunnel/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://www.stunnel.org/downloads/stunnel-5.76.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/net/remote/bayesian-ssh/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/abdoufermat5/bayesian-ssh\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/remote/do-ssh/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/doEggi/do-ssh\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/remote/ethersync/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ethersync/ethersync\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/daemon\"\nDYNAMIC_INIT\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/remote/iroh-ssh/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rustonbsd/iroh-ssh\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/remote/jupii/recipe.toml",
    "content": "#TODO not compiled or tested\n# missing dependencies? - https://github.com/mkiol/Jupii#libraries\n[source]\ngit = \"https://github.com/mkiol/Jupii\"\nrev = \"ed80ca0ea29081a2bff038faf4884e3acabb14b7\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DWITH_DESKTOP=ON\"\n]\n"
  },
  {
    "path": "recipes/wip/net/remote/remmina/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/Remmina/Remmina/-/wikis/Compilation/Compilation-guide\n#TODO dependencies need a cleanup (outdated and up-to-date information is mixed in the build instructions)\n[source]\ngit = \"https://gitlab.com/Remmina/Remmina\"\nrev = \"2a455eadd6462457d08c2d066c5c245e0dee3bf9\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"openssl3\",\n    \"libxml2\",\n    \"gstreamer\",\n    \"ffmpeg6\",\n    \"gtk3\",\n    \"libgcrypt\",\n    \"libssh\",\n    \"libvte\",\n    \"libjpeg\",\n    \"gnutls3\",\n    \"libsodium\",\n    \"pcre\",\n]\n"
  },
  {
    "path": "recipes/wip/net/remote/rustconn/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/totoshko88/RustConn\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n    \"vte\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages rustconn\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/remote/sanzu/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/cea-sec/sanzu\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages sanzu\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/remote/shared/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mateolafalce/shared\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/remote/ssh-portfolio/recipe.toml",
    "content": "#TODO not compiled or tested\n# require nerdfonts\n[source]\ngit = \"https://github.com/CompeyDev/ssh-portfolio\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\"nerd-fonts\"]\n"
  },
  {
    "path": "recipes/wip/net/remote/tigervnc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/TigerVNC/tigervnc/blob/1.16-branch/BUILDING.txt\n[source]\ngit = \"https://github.com/TigerVNC/tigervnc\"\nbranch = \"1.16-branch\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"zlib\",\n    \"pixman\",\n    \"fltk14\",\n    \"libjpeg\",\n    #\"gnutls3\",\n    #\"libnettle\",\n]\n"
  },
  {
    "path": "recipes/wip/net/remote/zeco/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/julianbuettner/zeco\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/scan/netpeek/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from meson log\n[source]\ngit = \"https://github.com/ZingyTomato/NetPeek\"\nrev = \"v0.2.4\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/net/security/yadb/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/izya4ka/yadb\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/server/bitcoin-core/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md\n[source]\ntar = \"https://bitcoincore.org/bin/bitcoin-core-30.2/bitcoin-30.2.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_WALLET=OFF\",\n    \"-DENABLE_IPC=OFF\",\n    \"-DBUILD_TESTS=OFF\",\n    \"-DINSTALL_MAN=OFF\",\n]\ndependencies = [\n    \"boost\",\n    \"libevent\",\n]\n"
  },
  {
    "path": "recipes/wip/net/server/devserver/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/kettle11/devserver\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/server/doh-server/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/DNSCrypt/doh-server\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/server/dora/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bluecatengineering/dora\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\n    \"dora-bin\",\n    \"dora-cfg\",\n]\n"
  },
  {
    "path": "recipes/wip/net/server/electrs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/romanz/electrs/blob/master/doc/install.md\n[source]\ngit = \"https://github.com/romanz/electrs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\"rocksdb\"]\n[package]\ndependencies = [\n    \"bitcoin-core\",\n    \"electrum\",\n]\n"
  },
  {
    "path": "recipes/wip/net/server/encrypted-dns-server/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/DNSCrypt/encrypted-dns-server\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/server/feox-server/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mehrantsi/feox-server\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/server/guacamole-server/recipe.toml",
    "content": "#TODO not compiled or tested\n# dependencies: https://guacamole.apache.org/doc/gug/installing-guacamole.html#required-dependencies\n[source]\ntar = \"https://apache.org/dyn/closer.lua/guacamole/1.5.5/source/guacamole-server-1.5.5.tar.gz?action=download\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"cairo\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libuuid\",\n    \"libssh2\",\n    \"openssl3\",\n    \"pango\",\n    \"libpulse\",\n    \"libvorbis\",\n]\n"
  },
  {
    "path": "recipes/wip/net/server/nea/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tweedegolf/nea\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"nea\"]\ndev-dependencies = [\"host:mold\"]\n"
  },
  {
    "path": "recipes/wip/net/server/nostr-rs-relay/recipe.toml",
    "content": "#TODO tikv-jemalloc-sys crate error\n[source]\ngit = \"https://github.com/scsibug/nostr-rs-relay\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl3\",\n]\n"
  },
  {
    "path": "recipes/wip/net/server/quick-serve/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/joaofl/quick-serve\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/server/rustdesk-server/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/rustdesk/rustdesk-server\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/server/rustypaste/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/orhun/rustypaste-cli\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/server/shoes/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/cfal/shoes\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/server/spadesx/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/SpadesX/SpadesX#installation\n[source]\ngit = \"https://github.com/SpadesX/SpadesX\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"readline\",\n    \"zlib\",\n    \"json-c\",\n]\n"
  },
  {
    "path": "recipes/wip/net/server/toe-beans/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/black-cat/toe-beans\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ncargopackages = [\"toe-beans\"]\n"
  },
  {
    "path": "recipes/wip/net/server/vproxy/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/0x676e67/vproxy\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/sharing/gday/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/manforowicz/gday\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages gday gday_server\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/sharing/hakanai/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/czerwonk/hakanai\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages hakanai hakanai-server\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/sharing/lan-mouse/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/feschber/lan-mouse\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libadwaita\",\n    \"gtk4\",\n]\n"
  },
  {
    "path": "recipes/wip/net/sharing/magic-wormhole-rs/recipe.toml",
    "content": "#TODO async-tar and rustix crates error\n[source]\ngit = \"https://github.com/magic-wormhole/magic-wormhole.rs\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages magic-wormhole\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/sharing/microbin/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/szabodanika/microbin\"\nshallow_clone = true\n[build]\nDYNAMIC_INIT\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/sharing/qft/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/CramBL/quick-file-transfer\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/sharing/sendme/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/n0-computer/sendme\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/sharing/warp/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.gnome.org/World/warp#meson\n[source]\ngit = \"https://gitlab.gnome.org/World/warp\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/net/social/nostui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/akiomik/nostui\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/social/perch/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ricardodantas/perch\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/social/reddix/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ck-zhang/reddix\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/social/tuba/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/GeopJr/Tuba#from-source\n[source]\ngit = \"https://github.com/GeopJr/Tuba\"\nrev = \"v0.10.3\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"json-glib\",\n    \"libxml2\",\n    \"libgee\",\n    \"libsoup\",\n    \"libadwaita\",\n    \"libsecret\",\n    \"gtksourceview\",\n]\ndev-dependencies = [\"vala\"]\n"
  },
  {
    "path": "recipes/wip/net/ssh/color-ssh/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/karsyboy/color-ssh\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\n    \"openssh\",\n]\n"
  },
  {
    "path": "recipes/wip/net/ssh/dropbear/recipe.toml",
    "content": "#TODO test dynamic linking\n[source]\ngit = \"https://gitlab.redox-os.org/tfinnegan937/dropbear.git\"\nrev = \"4c6828d39f988712cf4d2a64c7acf15d76f24aa9\"\nshallow_clone = true\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--disable-syslog\",\n    \"--disable-utmpx\",\n    \"--disable-utmp\",\n    \"--disable-lastlog\",\n    \"--disable-loginfunc\",\n    \"--disable-wtmp\",\n    \"--disable-wtmpx\",\n]\ndependencies = [\n    \"openssl3\",\n    \"zlib\"\n]\n"
  },
  {
    "path": "recipes/wip/net/ssh/fastssh/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Julien-R44/fast-ssh\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/ssh/filessh/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/JayanAXHF/filessh\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/ssh/mosh/recipe.toml",
    "content": "#TODO protobuf in redox\n[source]\ngit = \"https://github.com/mobile-shell/mosh\"\nrev = \"mosh-1.4.0\"\nshallow_clone = true\nscript = \"\"\"\n./autogen.sh\n\"\"\"\n\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"openssl3\",\n    \"ncursesw\",\n    \"zlib\",\n    \"protobuf\"\n]\ndev-dependencies = [\n    \"host:protobuf\"\n]\n"
  },
  {
    "path": "recipes/wip/net/ssh/russh/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/russh\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CARGO_FLAGS=() # remove --locked\ncookbook_cargo_examples client_exec_simple client_exec_interactive sftp_client sftp_server\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/ssh/ssh-pilot/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mfat/sshpilot\"\nrev = \"v4.3.8\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin/ssh-pilot-dir\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/usr/bin/ssh-pilot-dir\"\necho \"python3 /usr/bin/ssh-pilot-dir/run.py\" > \"${COOKBOOK_STAGE}\"/usr/bin/ssh-pilot\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/ssh-pilot\n\"\"\"\n[package]\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/net/ssh/sshfs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/libfuse/sshfs#installation\n[source]\ntar = \"https://github.com/libfuse/sshfs/releases/download/sshfs-3.7.3/sshfs-3.7.3.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"libfuse3\",\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/net/ssh/sshs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/quantumsheep/sshs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/net/ssh/sshx/recipe.toml",
    "content": "#TODO program source code error (after cargo update)\n#TODO require NodeJS and NPM\n[source]\ngit = \"https://github.com/ekzhang/sshx\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages sshx\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/net/ssh/termirs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/caelansar/termirs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/news/feedr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bahdotsh/feedr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/news/moccasin/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rektdeckard/moccasin\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/news/news-rs/recipe.toml",
    "content": "#TODO update mio to 0.8 (after cargo update)\n[source]\ngit = \"https://github.com/Atticus64/news\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/news/newsflash/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.com/news-flash/news_flash_gtk\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n    \"webkitgtk4\",\n    \"sqlite3\",\n    \"gettext\",\n    \"openssl3\",\n    \"clapper\",\n]\ndev-dependencies = [\"blueprint\"]\n"
  },
  {
    "path": "recipes/wip/news/tuifeed/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/veeso/tuifeed\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/office/cactui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/vkobinski/CacTui\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/office/doxx/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bgreenwell/doxx\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/office/letters/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies\n[source]\ntar = \"https://codeberg.org/eyekay/letters/archive/0.2.0.tar.gz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/office/libreoffice/recipe.toml",
    "content": "#TODO determine minimum dependencies\n# dependencies reference: https://wiki.documentfoundation.org/Development/BuildingOnLinux#Build_dependencies\n[source]\ntar = \"https://download.documentfoundation.org/libreoffice/src/25.8.2/libreoffice-25.8.2.2.tar.xz\"\n[build]\ntemplate = \"configure\"\n#dependencies = [\n#    \"kerberos5\",\n#    \"qt5-base\",\n#    \"gtk3\",\n#    \"nss\",\n#    \"fontconfig\",\n#    \"gstreamer\",\n#    \"libcups\",\n#]\n"
  },
  {
    "path": "recipes/wip/office/libreoffice-dictionaries/recipe.toml",
    "content": "#TODO probably wrong template\n[source]\ntar = \"https://download.documentfoundation.org/libreoffice/src/25.8.2/libreoffice-dictionaries-25.8.2.2.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/office/libreoffice-translations/recipe.toml",
    "content": "#TODO probably wrong template\n[source]\ntar = \"https://download.documentfoundation.org/libreoffice/src/25.8.2/libreoffice-translations-25.8.2.2.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/office/sheetsui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/zaphar/sheetsui\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/office/xleak/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bgreenwell/xleak\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/office/zathura/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://pwmt.org/projects/zathura/installation/\n[source]\ntar = \"https://pwmt.org/projects/zathura/download/zathura-0.5.14.tar.xz\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"girara\",\n    \"gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/players/clapper/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Rafostar/clapper\"\nrev = \"0.10.0\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dclapper=enabled\",\n    \"-Dclapper-gtk=enabled\",\n    \"-Dclapper-app=disabled\",\n    \"-Dintrospection=disabled\",\n    \"-Denhancers-loader=disabled\",\n]"
  },
  {
    "path": "recipes/wip/players/cmus/recipe.toml",
    "content": "#TODO can't detect the configure script\n[source]\ngit = \"https://github.com/cmus/cmus\"\nrev = \"ade6e2a7253d7a256e87fdac3da17c9158e6700e\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncurses\",\n]\nscript = \"\"\"\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/players/cosmic-player/manifest",
    "content": "name=COSMIC Media Player\nbinary=/usr/bin/cosmic-player\nicon=/ui/icons/apps/multimedia-photo-viewer.png\nauthor=Jeremy Soller\ndescription=COSMIC Media Player\naccept=*.avi\naccept=*.mkv\naccept=*.mov\naccept=*.mp4\naccept=*.ogv\n"
  },
  {
    "path": "recipes/wip/players/cosmic-player/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/pop-os/cosmic-player.git\"\nbranch = \"master\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ffmpeg6\",\n    \"gettext\",\n    \"glib\",\n    \"gstreamer\",\n    \"libffi\",\n    \"libiconv\",\n    \"pcre2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\"${COOKBOOK_CARGO}\" rustc \\\n    --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n    --release \\\n    --bin cosmic-player \\\n    --no-default-features \\\n    -- \\\n    -C link-args=\"-lgmodule-2.0 -lffi -liconv -lpcre2-8 -lz\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin/\"\ncp -v \"target/${TARGET}/release/cosmic-player\" \"${COOKBOOK_STAGE}/usr/bin/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/ui/apps/\"\ncp -v \"${COOKBOOK_RECIPE}/manifest\" \"${COOKBOOK_STAGE}/usr/share/ui/apps/cosmic-player\"\n#TODO: install with just?\nAPPID=\"com.system76.CosmicPlayer\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/applications/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.desktop\" \"${COOKBOOK_STAGE}/usr/share/applications/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\ncp -v \"${COOKBOOK_SOURCE}/res/${APPID}.metainfo.xml\" \"${COOKBOOK_STAGE}/usr/share/metainfo/\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/icons/\"\ncp -rv \"${COOKBOOK_SOURCE}/res/icons/hicolor/\" \"${COOKBOOK_STAGE}/usr/share/icons/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/players/festival/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/hinto-janai/festival\"\n[build]\ntemplate = \"custom\"\n#dependencies = [\n#    \"dbus\",\n#]\nscript = \"\"\"\n#DYNAMIC_INIT # if dbus is needed\ncookbook_cargo_packages festival-gui\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/players/glide/recipe.toml",
    "content": "#TODO Make gtk4 work\n[source]\ngit = \"https://github.com/philn/glide\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk4\",\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/players/kronos/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/TrevorSatori/kronos\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/players/mpv/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO missing dependencies\n# build instructions: https://github.com/mpv-player/mpv#compilation\n[source]\ngit = \"https://github.com/mpv-player/mpv\"\nbranch = \"release/0.40\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"ffmpeg6\",\n    \"libass\",\n    \"libjpeg\",\n    \"libiconv\",\n    \"zlib\",\n    \"mesa\",\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/players/podcasts/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/World/podcasts\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"gstreamer\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/players/pragha/recipe.toml",
    "content": "#TODO Make GTK3 work\n[source]\ngit = \"https://github.com/pragha-music-player/pragha\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"gtk3\",\n    \"glib\",\n    \"gstreamer\",\n    \"taglib\",\n    \"sqlite3\",\n    \"libpeas\",\n    \"totem-plparser\",\n]\n"
  },
  {
    "path": "recipes/wip/players/recordbox/recipe.toml",
    "content": "#TODO missing dependencies\n[source]\ngit = \"https://codeberg.org/edestcroix/Recordbox\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sqlite3\",\n    \"gtk4\",\n    \"glib\",\n    \"libadwaita\",\n    \"liblcms\",\n    \"gstreamer\",\n]\nscript = \"DYNAMIC_INIT cookbook_cargo\"\n"
  },
  {
    "path": "recipes/wip/players/rustcloud/recipe.toml",
    "content": "#TODO openssl error (after cargo update)\n[source]\ngit = \"https://github.com/cetra3/rustcloud\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/players/rustic/recipe.toml",
    "content": "#TODO can't update the crates, patch the \"fragile\" crate version\n[source]\ngit = \"https://github.com/rustic-music-player/rustic\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/players/spoify/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/slyeet03/spoify\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/players/spotify-player/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/aome510/spotify-player\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\npackage=spotify_player\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --package \"${package}\" \\\n            --release\n            --no-default-features\n            --rodio-backend\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${package}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${package}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/players/symphonia-play/recipe.toml",
    "content": "#TODO compiled and tested\n#TODO cpal can't find an audio device\n[source]\ngit = \"https://github.com/pdeljanov/Symphonia\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages symphonia-play\nmv \"${COOKBOOK_STAGE}/usr/bin/symphonia-play_symphonia-play\" \"${COOKBOOK_STAGE}/usr/bin/symphonia-play\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/players/tap/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/timdubbins/tap\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/players/termusic/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/tramhao/termusic#from-source\n[source]\ngit = \"https://github.com/tramhao/termusic\"\nrev = \"109405465bd5873567b5387c20e9b149e477b176\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gstreamer\",\n    \"dbus\",\n    \"mpv\",\n]\n"
  },
  {
    "path": "recipes/wip/players/tplay/recipe.toml",
    "content": "#TODO Make opencv4 work\n[source]\ngit = \"https://github.com/maxcurzi/tplay\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"ffmpeg6\",\n    \"openssl1\",\n    \"opencv4\",\n]\n"
  },
  {
    "path": "recipes/wip/players/ttv/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nik-rev/ttv\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/players/vlc/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies\n# customization: https://wiki.videolan.org/Configure/\n[source]\ntar = \"https://get.videolan.org/vlc/3.0.21/vlc-3.0.21.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    # \"libvorbis\",\n    # \"libogg\",\n    # \"speex\",\n    # \"libflac\",\n    # \"libtheora\",\n    # \"x264\",\n    # \"liba52\",\n    # \"libmpeg2\",\n    # \"lame\",\n    \"ffmpeg6\",\n    # \"libmad\",\n    # \"libdca\",\n    # \"twolame\",\n    # \"musepack\",\n    # \"libass\",\n    # \"libzvbi\",\n    # \"opus\",\n    # \"libebml\",\n    # \"libmatroska\",\n    # \"libdvbpsi\",\n    # \"libdvdcss\",\n    # \"libdvdread\",\n    # \"libdvdnav\",\n    # \"libbluray\",\n    # \"libgpg-error\",\n    # \"libgcrypt\",\n    # \"gnutls\",\n    \"libxml2\",\n    # \"libvncserver\",\n    # \"libpng\",\n    # \"libjpeg\",\n    # \"libiconv\",\n    # \"gettext\",\n    \"zlib\",\n    \"freetype2\",\n    # \"fribidi\",\n    \"fontconfig\",\n    # \"taglib\",\n    \"wxwidgets-gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/players/ytermusic/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ccgauche/ytermusic\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/recorders/asciinema/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/asciinema/asciinema\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/recorders/autocast/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/k9withabone/autocast\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/recorders/gpu-screen-recorder/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://git.dec05eba.com/gpu-screen-recorder\"\nrev = \"422f214283ba50649acca4d9b5a9778d313fe05b\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"mesa\",\n    \"libvulkan\",\n    \"ffmpeg6\",\n    \"libx11\",\n    \"libxcomposite\",\n    \"libxrandr\",\n    \"libxfixes\",\n    \"libxdamage\",\n    \"pulseaudio\",\n    \"libva\",\n    \"libcap\",\n    \"libwayland\",\n]\n"
  },
  {
    "path": "recipes/wip/recorders/gpu-screen-recorder-gtk/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://git.dec05eba.com/gpu-screen-recorder-gtk\"\nrev = \"7fb7608b720068d3c114330e8d274b04ef310cf2\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk3\",\n    \"libx11\",\n]\n[package]\ndependencies = [\n    \"gpu-screen-recorder\",\n]\n"
  },
  {
    "path": "recipes/wip/recorders/obs-studio/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://github.com/obsproject/obs-studio/wiki/Building-OBS-Studio\n[source]\ntar = \"https://github.com/obsproject/obs-studio/releases/download/32.0.4/OBS-Studio-32.0.4-Sources.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_UI=OFF\",\n    \"-DENABLE_SCRIPTING=OFF\",\n    \"-DENABLE_HEVC=OFF\",\n]\n# dependencies = [\n#     \"boost\",\n#     \"librsvg\",\n#     \"dbus\",\n#     \"fontconfig\",\n#     \"freetype2\",\n#     \"jansson\",\n#     \"pipewire\",\n#     \"mesa\",\n#     \"speexdsp\",\n#     \"ffmpeg6\",\n#     \"x264\",\n#     \"curl\",\n#     \"mbedtls\",\n#     \"libva\",\n#     \"qt5-base\",\n#     \"qt5-svg\",\n#     \"eudev\",\n#     \"pciutils\",\n#     \"libqrcodegenc\",\n#     \"librist\",\n#     \"libsrt\",\n#     \"libwebsocket++\",\n# ]\n"
  },
  {
    "path": "recipes/wip/scan/sane-backends/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/sane-project/backends/-/blob/master/README?ref_type=heads\n[source]\ntar = \"https://gitlab.com/-/project/429008/uploads/843c156420e211859e974f78f64c3ea3/sane-backends-1.4.0.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libusb\",\n    \"libjpeg\",\n]\n"
  },
  {
    "path": "recipes/wip/scan/zbar/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine the dependencies\n[source]\ntar = \"http://sourceforge.net/projects/zbar/files/zbar/0.10/zbar-0.10.tar.bz2/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/science/alevin-fry/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/COMBINE-lab/alevin-fry\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/science/astroterm/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/da-luce/astroterm\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/science/celestia/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/CelestiaProject/Celestia/blob/master/INSTALL.md#celestia-install-instructions-for-unix\n# sdl2 frontend is limited, qt6 or qt5 is preferred\n[source]\ntar = \"https://github.com/CelestiaProject/Celestia/releases/download/1.6.4/celestia-1.6.4.tar.xz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DENABLE_INTERFACE=ON\",\n    \"-DENABLE_SDL=ON\",\n]\ndependencies = [\n    \"mesa\",\n    \"mesa-glu\",\n    \"sdl2\",\n    \"libepoxy\",\n    \"libeigen\",\n    \"libfmt\",\n    \"freetype2\",\n    \"libpng\",\n    \"libjpeg\",\n    \"luajit\",\n    #\"qt6-base\",\n]\n"
  },
  {
    "path": "recipes/wip/science/celestia-data/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/CelestiaProject/Celestia/blob/master/INSTALL.md#installing-the-content\n[source]\ngit = \"https://github.com/CelestiaProject/CelestiaContent\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/science/chem-creator/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/pumken/chemcreator\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/science/cosmic-weather/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jwestall/cosmic-weather\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/science/gaia-sky/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://gaia.ari.uni-heidelberg.de/gaiasky/releases/latest/gaiasky-3.6.4-2.3bfeec0f9.tar.gz\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/gaia-sky\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/share/gaia-sky\necho \"#!/usr/bin/env bash \\n /usr/share/gaia-sky\" > \"${COOKBOOK_STAGE}\"/usr/bin/gaia-sky\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/gaia-sky\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/science/gromacs/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://manual.gromacs.org/current/install-guide/index.html\n[source]\ntar = \"https://ftp.gromacs.org/gromacs/gromacs-2025.3.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/science/mrbayes/recipe.toml",
    "content": "#TODO don't recognize the redox target\n[source]\ngit = \"https://github.com/NBISweden/MrBayes\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/science/nucleus/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from meson log\n[source]\ntar = \"https://codeberg.org/lo-vely/nucleus/archive/v2.tar.gz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/science/oarfish/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/COMBINE-lab/oarfish\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/science/openfoam/recipe.toml",
    "content": "#TODO missing script for building, see https://openfoam.org/download/11-source/\n[source]\ntar = \"http://dl.openfoam.org/source/11\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"paraview\",\n    \"scotch\",\n]\n"
  },
  {
    "path": "recipes/wip/science/openspace/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://docs.openspaceproject.com/en/latest/dev/compiling/index.html#\n[source]\ngit = \"https://github.com/OpenSpace/OpenSpace\"\nrev = \"b3681167a3b95d49ac7aa7d06b07cbd88c687e9a\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt6-base\",\n    \"libgdal\",\n]\n"
  },
  {
    "path": "recipes/wip/science/piscem/recipe.toml",
    "content": "#TODO CMake error\n[source]\ngit = \"https://github.com/COMBINE-lab/piscem\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/science/polypolish/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/rrwick/Polypolish\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/science/qmcpack/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://qmcpack.readthedocs.io/en/develop/installation.html#building-with-cmake\n# probably missing dependencies\n[source]\ngit = \"https://github.com/QMCPACK/qmcpack\"\nrev = \"9d0d968139fc33f71dbf9159f526dd7b47f10a3b\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"openmpi\",\n    \"openblas\",\n    \"hdf5\",\n    \"libxml2\",\n    \"boost\",\n    \"fftw\",\n]\n"
  },
  {
    "path": "recipes/wip/science/scidataflow/recipe.toml",
    "content": "#TODO async-io and rustix crates error\n[source]\ngit = \"https://github.com/vsbuffalo/scidataflow\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/science/simpleaf/recipe.toml",
    "content": "#TODO faccess crate error\n[source]\ngit = \"https://github.com/COMBINE-lab/simpleaf\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/science/siril/recipe.toml",
    "content": "#TODO missing cross-compilation script\n#TODO missing dependencies - https://gitlab.com/free-astro/siril#requirements\n# build instructions - https://gitlab.com/free-astro/siril#building-siril-for-gnulinux\n[source]\ntar = \"https://free-astro.org/download/siril-1.2.4.tar.bz2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"glib\",\n    \"gtk3\",\n    \"liblcms\",\n    \"fftw\",\n    \"opencv4\",\n]\n"
  },
  {
    "path": "recipes/wip/science/sonde/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rnleach/sonde\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk4\",\n]\n"
  },
  {
    "path": "recipes/wip/science/specfem2d/recipe.toml",
    "content": "#TODO missing script for GNU Autotools\", see https://specfem2d.readthedocs.io/en/latest/02_getting_started/\n[source]\ngit = \"https://github.com/SPECFEM/specfem2d\"\nrev = \"0bbc7858dcd0ac9c1c64a35a41c83fa7f6847205\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/science/specfem3d/recipe.toml",
    "content": "#TODO missing script for GNU Autotools, see https://specfem3d.readthedocs.io/en/latest/02_getting_started/\n[source]\ngit = \"https://github.com/SPECFEM/specfem3d\"\nrev = \"c97d521a9a19ed41523837f161c70deacdb180cc\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/science/specfem3d-globe/recipe.toml",
    "content": "#TODO missing script for GNU Autotools, see https://specfem3d-globe.readthedocs.io/en/latest/02_getting_started/\n[source]\ngit = \"https://github.com/SPECFEM/specfem3d_globe\"\nrev = \"59f5e68c468c53a07011a795e6fa1650d6be0fd9\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/science/stellarium/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Stellarium/stellarium/blob/master/BUILDING.md#building\n#TODO missing dependencies: https://github.com/Stellarium/stellarium/blob/master/BUILDING.md#qt6\n[source]\ntar = \"https://github.com/Stellarium/stellarium/releases/download/v25.3/stellarium-25.3.tar.xz\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"mesa\",\n    \"zlib\",\n    \"gstreamer\",\n    \"qt6-base\",\n    \"qt6-multimedia\",\n    \"qt6-webengine\",\n    \"qt6-positioning\",\n    \"qt6-charts\",\n    \"qt6-imageformats\",\n    \"qt6-translations\",\n    \"qt6-tools\",\n    \"libxkbcommon\",\n    \"gexiv2\",\n    \"libnlopt\",\n]\n"
  },
  {
    "path": "recipes/wip/science/vidoxide/recipe.toml",
    "content": "#TODO require camera drivers, see https://github.com/GreatAttractor/vidoxide#3-building\n[source]\ngit = \"https://github.com/GreatAttractor/vidoxide\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/science/weather/cosmic-ext-forecast/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO verify if the resource commands are correct\n[source]\ngit = \"https://github.com/cosmic-utils/forecast\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/applications\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/metainfo\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/icons\ncp -rv \"${COOKBOOK_SOURCE}\"/res/com.jwestall.Forecast.desktop \"${COOKBOOK_STAGE}\"/usr/share/applications\ncp -rv \"${COOKBOOK_SOURCE}\"/res/com.jwestall.Forecast.metainfo.xml \"${COOKBOOK_STAGE}\"/usr/share/metainfo\ncp -rv \"${COOKBOOK_SOURCE}\"/res/icons/hicolor \"${COOKBOOK_STAGE}\"/usr/share/icons\ncookbook_cargo\n\"\"\""
  },
  {
    "path": "recipes/wip/science/wthrr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ttytm/wthrr-the-weathercrab\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/search/clapgrep/recipe.toml",
    "content": "#TODO write a script to copy the data files, see: https://github.com/luleyleo/clapgrep/blob/main/makefile\n[source]\ngit = \"https://github.com/luleyleo/clapgrep\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk4\",\n]\nscript = \"\"\"\ncookbook_cargo_packages clapgrep-gnome\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/search/fzf/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/junegunn/fzf/blob/master/BUILD.md\n[source]\ngit = \"https://github.com/junegunn/fzf\"\nrev = \"v0.67.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndev-dependencies = [\"host:go\"]\n"
  },
  {
    "path": "recipes/wip/search/localsearch/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n[source]\ntar = \"https://download.gnome.org/sources/localsearch/3.10/localsearch-3.10.1.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dfunctional_tests=false\",\n    \"-Dsandbox_tests=false\",\n    \"-Dseccomp=false\",\n    \"-Dbattery_detection=none\",\n    \"-Dsystemd_user_services=false\",\n    \"-Dman=false\",\n]\n"
  },
  {
    "path": "recipes/wip/search/lstr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bgreenwell/lstr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/search/scout/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jhbabon/scout\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/search/srgn/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/alexpovel/srgn\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/search/television/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/alexpasmantier/television\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/search/ugrep/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO maybe wrong template\n[source]\ngit = \"https://github.com/Genivia/ugrep\"\nrev = \"7ddb6d9690e70bc426da5fed3e1031973823fc69\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/security/airgorah/recipe.toml",
    "content": "#TODO make gtk4 work\n[source]\ngit = \"https://github.com/martin-olivier/airgorah\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk4\",\n]\n"
  },
  {
    "path": "recipes/wip/security/angryoxide/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Ragnt/AngryOxide#building-from-source\n[source]\ngit = \"https://github.com/Ragnt/AngryOxide\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/apbf/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://gitlab.com/timvisee/apbf\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/authenticator/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/World/Authenticator\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"gstreamer\",\n    \"gobject-introspection\",\n]\n"
  },
  {
    "path": "recipes/wip/security/authoscope/recipe.toml",
    "content": "#TODO funty crate version deleted by the owner\n[source]\ngit = \"https://github.com/kpcyrd/authoscope\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\nexport OPENSSL_STATIC=\"true\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/security/binsec/recipe.toml",
    "content": "#TODO yara-sys crate error (after cargo update)\n[source]\ngit = \"https://github.com/ex0dus-0x/binsec\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/breakmancer/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/timmc/breakmancer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/burrow/recipe.toml",
    "content": "#TODO cargo package error\n[source]\ngit = \"https://github.com/hackclub/burrow\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages burrow\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/security/capstone/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/capstone-engine/capstone/blob/next/COMPILE.TXT\n[source]\ngit = \"https://github.com/capstone-engine/capstone\"\nrev = \"097c04d9413c59a58b00d4d1c8d5dc0ac158ffaa\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/security/cargo-scan/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/PLSysSec/cargo-scan\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/security/clamav/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://docs.clamav.net/manual/Installing/Installing-from-source-Unix.html\n#TODO missing Sendmail Mail Filter API (Milter)\n[source]\ntar = \"https://www.clamav.net/downloads/production/clamav-1.5.0.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"curl\",\n    \"ncurses\",\n    \"bzip2\",\n    \"json-c\",\n    \"pcre\",\n    \"openssl1\",\n    \"libxml2\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/security/cotp/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/replydev/cotp\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libxkbcommon\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/security/deoptimizer/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/EgeBalci/deoptimizer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/dfir-toolkit/recipe.toml",
    "content": "#TODO forensic-rs crate error\n[source]\ngit = \"https://github.com/dfir-dd/dfir-toolkit\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/security/feroxbuster/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/epi052/feroxbuster\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/flawz/recipe.toml",
    "content": "#TODO webbrowser crate error\n[source]\ngit = \"https://github.com/orhun/flawz\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/security/gnupg/recipe.toml",
    "content": "#TODO compilation error on libgcrypt\n[source]\ntar = \"https://gnupg.org/ftp/gcrypt/gnupg/gnupg-2.4.1.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libiconv\",\n    \"libgcrypt\",\n]\n"
  },
  {
    "path": "recipes/wip/security/gnupg-lts/recipe.toml",
    "content": "#TODO compilation error on libgcrypt\n[source]\ntar = \"https://gnupg.org/ftp/gcrypt/gnupg/gnupg-2.2.41.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libiconv\",\n    \"libgcrypt\",\n]\n"
  },
  {
    "path": "recipes/wip/security/john-the-ripper/recipe.toml",
    "content": "#TODO missing script for GNU Autotools, see https://github.com/openwall/john/blob/bleeding-jumbo/doc/INSTALL\n[source]\ntar = \"https://www.openwall.com/john/k/john-1.9.0-jumbo-1.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n    \"nss\",\n    \"kerberos5\",\n    \"libgmp\",\n]\n"
  },
  {
    "path": "recipes/wip/security/kanha/recipe.toml",
    "content": "#TODO linking error (after cargo update)\n[source]\ngit = \"https://github.com/pwnwriter/kanha\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/keepassxc/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#linux\n# probably missing dependencies, see https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-Linux#install-the-required-dependencies\n[source]\ntar = \"https://github.com/keepassxreboot/keepassxc/releases/download/2.7.10/keepassxc-2.7.10-src.tar.xz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DWITH_XC_AUTOTYPE=OFF\",\n    \"-DWITH_XC_UPDATECHECK=OFF\",\n    \"-DKEEPASSXC_BUILD_TYPE=Release\",\n    \"-DWITH_APP_BUNDLE=OFF\",\n]\ndependencies = [\n    \"qt5-base\",\n    \"qt5-svg\",\n    \"zlib\",\n    \"libbotan\",\n    \"libargon2\",\n    \"libxi\",\n    \"libxtst\",\n    \"readline\",\n]\n"
  },
  {
    "path": "recipes/wip/security/keyscope/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/SpectralOps/keyscope\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages keyscope\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/security/lynis/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/CISOfy/lynis\"\nrev = \"60afce6d8110ee9e88ac9e9d0e0346b1cf222b5e\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/lynis\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/usr/share/lynis\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/security/motus/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/oleiade/motus\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/nitrocli/recipe.toml",
    "content": "#TODO make libhidapi work\n[source]\ngit = \"https://github.com/d-e-s-o/nitrocli\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libhidapi\",\n]\n"
  },
  {
    "path": "recipes/wip/security/openpgp-ca/recipe.toml",
    "content": "#TODO make the libpcsclite dependency work\n[source]\ngit = \"https://gitlab.com/openpgp-ca/openpgp-ca\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages openpgp-ca openpgp-ca-restd\n\"\"\"\ndependencies = [\n    \"openssl1\",\n    \"libpcsclite\",\n]\n"
  },
  {
    "path": "recipes/wip/security/otti/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/dnaka91/otti\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/pass/recipe.toml",
    "content": "#TODO missing script for gnu make: https://git.zx2c4.com/password-store/tree/INSTALL\n#TODO determine compile-time and run-time dependencies: https://git.zx2c4.com/password-store/tree/README#n15\n[source]\ntar = \"https://git.zx2c4.com/password-store/snapshot/password-store-1.7.4.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/security/please/recipe.toml",
    "content": "#TODO users crate error (after cargo update)\n[source]\ngit = \"https://gitlab.com/edneville/please\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/plutus-rustus/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/a137x/plutus-rustus\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/rage/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/str4d/rage\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages rage\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/security/retdec/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/avast/retdec#process\n[source]\ngit = \"https://github.com/avast/retdec\"\nrev = \"53e55b4b26e9b843787f0e06d867441e32b1604e\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"openssl1\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/security/rowhammer-test/recipe.toml",
    "content": "#TODO missing script for the \"make.sh\" file, see https://github.com/google/rowhammer-test#readme\n[source]\ngit = \"https://github.com/google/rowhammer-test\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/security/rshijack/recipe.toml",
    "content": "#TODO pnet_sys crate error (after cargo update)\n[source]\ngit = \"https://github.com/kpcyrd/rshijack\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/rustyvault/recipe.toml",
    "content": "#TODO async-io and rustix crates error\n[source]\ngit = \"https://github.com/Tongsuo-Project/RustyVault\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/security/safecloset/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Canop/safecloset\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/sn0int/recipe.toml",
    "content": "#TODO outdated redox_syscall crate\n[source]\ngit = \"https://github.com/kpcyrd/sn0int\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libsodium\",\n    \"sqlite3\",\n]\n"
  },
  {
    "path": "recipes/wip/security/sniffglue/recipe.toml",
    "content": "#TODO make the libpcap dependency work\n[source]\ngit = \"https://github.com/kpcyrd/sniffglue\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libpcap\",\n]\n"
  },
  {
    "path": "recipes/wip/security/sq/recipe.toml",
    "content": "#TODO make libnettle work\n[source]\ngit = \"https://gitlab.com/sequoia-pgp/sequoia-sq\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n    \"libnettle\",\n]\n"
  },
  {
    "path": "recipes/wip/security/sqop/recipe.toml",
    "content": "#TODO make libnettle work\n[source]\ngit = \"https://gitlab.com/sequoia-pgp/sequoia-sop\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libnettle\",\n]\n"
  },
  {
    "path": "recipes/wip/security/sqv/recipe.toml",
    "content": "#TODO make libnettle work\n[source]\ngit = \"https://gitlab.com/sequoia-pgp/sequoia-sqv\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libnettle\",\n]\n"
  },
  {
    "path": "recipes/wip/security/sss-cli/recipe.toml",
    "content": "#TODO source code error (after cargo update)\n[source]\ngit = \"https://github.com/dsprenkels/sss-cli\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/stegano/recipe.toml",
    "content": "#TODO require a command to move the binary\n[source]\ngit = \"https://github.com/steganogram/stegano-rs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages stegano-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/security/sudo-rs/recipe.toml",
    "content": "#TODO libc crate error\n#TODO requires Linux PAM\n[source]\ngit = \"https://github.com/memorysafety/sudo-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/tyr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.com/cyberactivity/tyr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/vagga/recipe.toml",
    "content": "#TODO libc and nix crate errors (after cargo update)\n[source]\ngit = \"https://github.com/tailhook/vagga\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/veldora/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/tamton-aquib/veldora\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/veracrypt/recipe.toml",
    "content": "#TODO missing script for GNU Make, see https://www.veracrypt.fr/en/CompilingGuidelineLinux.html#CompileVeraCrypt\n[source]\ntar = \"https://launchpad.net/veracrypt/trunk/1.26.7/+download/VeraCrypt_1.26.7_Source.tar.bz2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libfuse3\",\n    \"libpcsclite\",\n    \"wxwidgets-gtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/security/weggli/recipe.toml",
    "content": "#TODO source code error\n[source]\ngit = \"https://github.com/weggli-rs/weggli\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/whyno/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gnu.foo/projects/whyno\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/security/yara-x/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/VirusTotal/yara-x\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages yara-x-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/services/ala-lape/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://git.madhouse-project.org/algernon/ala-lape\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/services/busd/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jackpot51/busd\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/services/coppwr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/dimtpap/coppwr\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"pipewire\",\n]\n"
  },
  {
    "path": "recipes/wip/services/dbus/recipe.toml",
    "content": "[source]\ntar = \"https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz\"\nblake3 = \"b1d1f22858a8f04665e5dca29d194f892620f00fd3e3f4e89dd208e78868436e\"\npatches = [\n    \"redox.patch\",\n]\n\n[build]\ndependencies = [\n    \"expat\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"x11proto\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    #TODO: why does this require Linux?\n    \"-Depoll=enabled\",\n    \"-Dx11_autolaunch=enabled\",\n    \"-Dverbose_mode=true\",\n]\n"
  },
  {
    "path": "recipes/wip/services/dbus/redox.patch",
    "content": "diff -ruwN source-old/dbus/dbus-pollable-set-epoll.c source/dbus/dbus-pollable-set-epoll.c\n--- source-old/dbus/dbus-pollable-set-epoll.c\t2025-02-27 09:29:06.000000000 -0700\n+++ source/dbus/dbus-pollable-set-epoll.c\t2025-11-14 17:50:42.043671507 -0700\n@@ -30,7 +30,7 @@\n #include <dbus/dbus-internals.h>\n #include <dbus/dbus-sysdeps.h>\n \n-#ifndef __linux__\n+#if !defined(__linux__) && !defined(__redox__)\n # error This file is for Linux epoll(4)\n #endif\n \ndiff -ruwN source-old/dbus/dbus-spawn-unix.c source/dbus/dbus-spawn-unix.c\n--- source-old/dbus/dbus-spawn-unix.c\t2025-02-27 09:29:06.000000000 -0700\n+++ source/dbus/dbus-spawn-unix.c\t2025-11-15 07:42:03.360862350 -0700\n@@ -1326,7 +1326,7 @@\n   if (!make_pipe (child_err_report_pipe, error))\n     goto cleanup_and_fail;\n \n-  if (!_dbus_socketpair (&babysitter_pipe[0], &babysitter_pipe[1], TRUE, error))\n+  if (!_dbus_socketpair (&babysitter_pipe[0], &babysitter_pipe[1], FALSE, error))\n     goto cleanup_and_fail;\n \n   /* Setting up the babysitter is only useful in the parent,\n"
  },
  {
    "path": "recipes/wip/services/elogind/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/elogind/elogind\"\nrev = \"V255.22\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dmode=release\",\n    \"-Dtranslations=false\",\n    \"-Dtests=false\",\n]\ndependencies = [\n    \"libeudev\",\n    \"libcap\",\n]\n"
  },
  {
    "path": "recipes/wip/services/eudev/recipe.toml",
    "content": "#TODO compilation error: POSIX header not found\n[source]\ntar = \"https://github.com/eudev-project/eudev/releases/download/v3.2.14/eudev-3.2.14.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/services/grub/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://ftp.gnu.org/gnu/grub/grub-2.12.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/services/hickory-dns/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/hickory-dns/hickory-dns\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nbinary=hickory-dns\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --bin \"${binary}\" \\\n            --release\n            --all-features\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${binary}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${binary}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/services/jack/recipe.toml",
    "content": "#TODO missing cross-compilation script for waf\n#TODO determine minimum dependencies\n[source]\ngit = \"https://github.com/jackaudio/jack2\"\nrev = \"v1.9.22\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/services/lemurs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/coastalwhite/lemurs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\nmkdir -pv \"${COOKBOOK_STAGE}/etc/lemurs\"\nmkdir -pv \"${COOKBOOK_STAGE}/etc/rustysd/system\"\nmkdir -pv \"${COOKBOOK_STAGE}/etc/pam.d\"\ncp -rv \"${COOKBOOK_SOURCE}\"/extra/{config.toml,xsetup.sh} \"${COOKBOOK_STAGE}/etc/lemurs\"\ncp -rv \"${COOKBOOK_SOURCE}\"/extra/lemurs.service \"${COOKBOOK_STAGE}/etc/rustysd/system\"\ncp -rv \"${COOKBOOK_SOURCE}\"/extra/lemurs.pam \"${COOKBOOK_STAGE}/etc/pam.d/lemurs\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/services/limine/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/limine-bootloader/limine#building-the-bootloader\n[source]\ntar = \"https://github.com/limine-bootloader/limine/releases/download/v7.2.0/limine-7.2.0.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/services/ntpd-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO configure the service: https://docs.ntpd-rs.pendulum-project.org/guide/installation/#running-as-a-system-service\n[source]\ngit = \"https://github.com/pendulum-project/ntpd-rs\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages ntpd\nmkdir -pv \"${COOKBOOK_STAGE}/etc/ntpd-rs\"\ncp -rv \"${COOKBOOK_SOURCE}\"/docs/examples/conf/ntp.toml.default \"${COOKBOOK_STAGE}/etc/ntpd-rs/ntp.toml\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/services/pipewire/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/INSTALL.md\n[source]\ngit = \"https://gitlab.freedesktop.org/pipewire/pipewire\"\nbranch = \"1.4\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=disabled\",\n    \"-Dpipewire-jack=disabled\",\n    \"-Dpipewire-v4l2=disabled\",\n    \"-Dspa-plugins=disabled\",\n    \"-Ddbus=disabled\",\n    \"-Dflatpak=disabled\",\n]\ndependencies = [\n    \"libpulse\",\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/services/qpwgraph/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n# build instructions: https://gitlab.freedesktop.org/rncbc/qpwgraph#building\n[source]\ngit = \"https://gitlab.freedesktop.org/rncbc/qpwgraph\"\nrev = \"v0.9.8\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DCONFIG_ALSA_MIDI=0\",\n    \"-DCONFIG_SYSTEM_TRAY=0\",\n]\n#dependencies = [\n#    \"qt6-base\",\n#    \"pipewire\",\n#]\n"
  },
  {
    "path": "recipes/wip/services/runst/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/orhun/runst\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"glib\",\n    \"pango\",\n]\n"
  },
  {
    "path": "recipes/wip/services/seatd/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jackpot51/seatd\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dman-pages=disabled\",\n]\n"
  },
  {
    "path": "recipes/wip/services/wireplumber/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n[source]\ngit = \"https://gitlab.freedesktop.org/pipewire/wireplumber\"\nrev = \"0.5.13\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=false\",\n    \"-Ddbus-tests=false\",\n]\n"
  },
  {
    "path": "recipes/wip/shells/brush/recipe.toml",
    "content": "#TODO redox is not supported by the procfs crate\n[source]\ngit = \"https://github.com/reubeno/brush\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages brush-shell\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/shells/cicada/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/mitnk/cicada/blob/master/docs/install.md#option-c-via-source\n[source]\ngit = \"https://github.com/mitnk/cicada\"\nrev = \"710988133335582d43c74e04d0d7f95c034e2c21\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/shells/dune/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/adam-mcdaniel/dune\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/shells/fish-shell/recipe.toml",
    "content": "#TODO: Install share/completion files\n[source]\ngit = \"https://github.com/fish-shell/fish-shell\"\nrev = \"54e8ad7e90a8213c01ba58de0640223bee6846d6\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\"gettext\", \"ncurses\", \"pcre\"]\nscript = \"\"\"\nDYNAMIC_INIT\n\n# The only default enabled feature is building the man pages.\n# However, that requires sphinx so it can just be enabled later.\ncookbook_cargo --no-default-features\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/shells/fish-shell/redox.patch",
    "content": "diff '--color=auto' -ruwN source/Cargo.toml source-new/Cargo.toml\n--- source/Cargo.toml\t2025-09-11 01:59:14.785564526 -0400\n+++ source-new/Cargo.toml\t2025-09-11 01:59:45.885553436 -0400\n@@ -35,12 +35,12 @@\n \n bitflags = \"2.5.0\"\n errno = \"0.3.0\"\n-libc = \"0.2\"\n+libc = { git = \"https://github.com/rust-lang/libc\", rev = \"b31ee9b22f99354f2ca00c68d038d6f377c8b8a4\", features = [\"extra_traits\"] }\n # lru pulls in hashbrown by default, which uses a faster (though less DoS resistant) hashing algo.\n # disabling default features uses the stdlib instead, but it doubles the time to rewrite the history\n # files as of 22 April 2024.\n lru = \"0.13.0\"\n-nix = { version = \"0.30.1\", default-features = false, features = [\n+nix = { git = \"https://github.com/joshuamegnauth54/nix\", branch = \"redox-fish-no-merge\", default-features = false, features = [\n     \"event\",\n     \"inotify\",\n     \"resource\",\ndiff '--color=auto' -ruwN source/src/exec.rs source-new/src/exec.rs\n--- source/src/exec.rs\t2025-09-11 01:59:14.596625190 -0400\n+++ source-new/src/exec.rs\t2025-09-11 02:00:00.315286369 -0400\n@@ -33,7 +33,6 @@\n use crate::nix::{getpid, isatty};\n use crate::null_terminated_array::OwningNullTerminatedArray;\n use crate::parser::{Block, BlockId, BlockType, EvalRes, Parser};\n-#[cfg(FISH_USE_POSIX_SPAWN)]\n use crate::proc::Pid;\n use crate::proc::{\n     hup_jobs, is_interactive_session, jobs_requiring_warning_on_exit, no_exec,\n@@ -390,7 +389,7 @@\n ) -> ! {\n     // This function never returns, so we take certain liberties with constness.\n \n-    unsafe { libc::execve(actual_cmd.as_ptr(), argv.get(), envv.get()) };\n+    unsafe { libc::execve(actual_cmd.as_ptr(), argv.get().cast(), envv.get().cast()) };\n     let err = errno();\n \n     // The shebang wasn't introduced until UNIX Seventh Edition, so if\n@@ -413,7 +412,11 @@\n             // not what we would pass as argv0.\n             argv2[1] = actual_cmd.as_ptr();\n             unsafe {\n-                libc::execve(_PATH_BSHELL.load(Ordering::Relaxed), &argv2[0], envv.get());\n+                libc::execve(\n+                    _PATH_BSHELL.load(Ordering::Relaxed),\n+                    argv2.as_ptr().cast(),\n+                    envv.get().cast(),\n+                );\n             }\n         }\n     }\ndiff '--color=auto' -ruwN source/src/fork_exec/postfork.rs source-new/src/fork_exec/postfork.rs\n--- source/src/fork_exec/postfork.rs\t2025-09-11 01:59:14.828576001 -0400\n+++ source-new/src/fork_exec/postfork.rs\t2025-09-11 02:00:00.319001235 -0400\n@@ -339,7 +339,9 @@\n                             \"', which is not an executable command.\"\n                         );\n                     }\n-                } else if md.unwrap().mode() & u32::from(libc::S_IFMT) == u32::from(libc::S_IFDIR) {\n+                } else if md.unwrap().mode() & u32::try_from(libc::S_IFMT).unwrap()\n+                    == u32::try_from(libc::S_IFDIR).unwrap()\n+                {\n                     FLOG_SAFE!(\n                         exec,\n                         \"Failed to execute process '\",\ndiff '--color=auto' -ruwN source/src/input_common.rs source-new/src/input_common.rs\n--- source/src/input_common.rs\t2025-09-11 01:59:14.828576001 -0400\n+++ source-new/src/input_common.rs\t2025-09-11 02:00:00.316042380 -0400\n@@ -589,7 +589,9 @@\n     // pselect expects timeouts in nanoseconds.\n     const NSEC_PER_MSEC: u64 = 1000 * 1000;\n     const NSEC_PER_SEC: u64 = NSEC_PER_MSEC * 1000;\n+    #[cfg(not(target_os = \"redox\"))]\n     let wait_nsec: u64 = (timeout.as_millis() as u64) * NSEC_PER_MSEC;\n+    #[cfg(not(target_os = \"redox\"))]\n     let timeout = libc::timespec {\n         tv_sec: (wait_nsec / NSEC_PER_SEC).try_into().unwrap(),\n         tv_nsec: (wait_nsec % NSEC_PER_SEC).try_into().unwrap(),\n@@ -605,6 +607,7 @@\n         libc::FD_SET(in_fd, &mut fdset);\n     }\n \n+    #[cfg(not(target_os = \"redox\"))]\n     let res = unsafe {\n         libc::pselect(\n             in_fd + 1,\n@@ -616,6 +619,31 @@\n         )\n     };\n \n+    #[cfg(target_os = \"redox\")]\n+    let res = unsafe {\n+        //HACK: pselect does this atomically\n+        let mut saved = MaybeUninit::uninit();\n+        let mut saved = {\n+            libc::sigfillset(saved.as_mut_ptr());\n+            saved.assume_init()\n+        };\n+        libc::sigprocmask(libc::SIG_SETMASK, &sigs, &mut saved);\n+        let mut timeout = libc::timeval {\n+            tv_sec: timeout.as_secs() as _,\n+            tv_usec: timeout.subsec_micros() as _,\n+        };\n+        let res = libc::select(\n+            in_fd + 1,\n+            &mut fdset,\n+            ptr::null_mut(),\n+            ptr::null_mut(),\n+            &raw mut timeout,\n+        );\n+        libc::sigprocmask(libc::SIG_SETMASK, &saved, ptr::null_mut());\n+\n+        res\n+    };\n+\n     // Prevent signal starvation on WSL causing the `torn_escapes.py` test to fail\n     if is_windows_subsystem_for_linux(WSL::V1) {\n         // Merely querying the current thread's sigmask is sufficient to deliver a pending signal\ndiff '--color=auto' -ruwN source/src/libc.c source-new/src/libc.c\n--- source/src/libc.c\t2025-09-11 01:59:14.599514890 -0400\n+++ source-new/src/libc.c\t2025-09-11 02:00:00.304589636 -0400\n@@ -4,7 +4,7 @@\n #include <stdint.h>\n #include <stdio.h>\n #include <stdlib.h>     // MB_CUR_MAX\n-#include <sys/mount.h>  // MNT_LOCAL\n+/* #include <sys/mount.h>  // MNT_LOCAL */\n #include <sys/resource.h>\n #include <sys/statvfs.h>  // ST_LOCAL\n #include <unistd.h>       // _CS_PATH, _PC_CASE_SENSITIVE\ndiff '--color=auto' -ruwN source/src/path.rs source-new/src/path.rs\n--- source/src/path.rs\t2025-09-11 01:59:14.600515157 -0400\n+++ source-new/src/path.rs\t2025-09-11 02:00:00.317047039 -0400\n@@ -738,7 +738,9 @@\n             crate::libc::ST_LOCAL(),\n             &narrow,\n         );\n-        #[cfg(not(target_os = \"netbsd\"))]\n+        #[cfg(target_os = \"redox\")]\n+        let remoteness = DirRemoteness::unknown;\n+        #[cfg(not(target_os = \"redox\"))]\n         let remoteness = remoteness_via_statfs(\n             libc::statfs,\n             |stat: &libc::statfs| stat.f_flags,\n"
  },
  {
    "path": "recipes/wip/shells/nsh/recipe.toml",
    "content": "#TODO update mio to 0.8\n[source]\ngit = \"https://github.com/nuta/nsh\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/shells/pure/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/sindresorhus/pure\"\nrev = \"87e6f5dd4c793f6d980532205aaefe196780606f\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/home/user/.zsh/pure\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}\"/home/user/.zsh/pure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/shells/relish/recipe.toml",
    "content": "#TODO program source code error\n[source]\ngit = \"https://gitlab.com/whom/relish\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/shells/sheldon/recipe.toml",
    "content": "#TODO libssh2-sys crate error\n[source]\ngit = \"https://github.com/rossmacarthur/sheldon\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/shells/zsh/01_redox.patch",
    "content": "diff --color -ruwN source/configure.ac source-new/configure.ac\r\n--- source/configure.ac\t2022-05-15 01:59:21.000000000 +0700\r\n+++ source-new/configure.ac\t2025-08-06 02:08:48.797381523 +0700\r\n@@ -1311,7 +1311,7 @@\r\n \t       setuid seteuid setreuid setresuid setsid \\\r\n \t       setgid setegid setregid setresgid \\\r\n \t       memcpy memmove strstr strerror strtoul \\\r\n-\t       getrlimit getrusage \\\r\n+\t       getrusage \\\r\n \t       setlocale \\\r\n \t       isblank iswblank \\\r\n \t       uname \\\r\ndiff --color -ruwN source/Src/builtin.c source-new/Src/builtin.c\r\n--- source/Src/builtin.c\t2022-05-15 01:59:21.000000000 +0700\r\n+++ source-new/Src/builtin.c\t2025-08-06 02:41:57.266846385 +0700\r\n@@ -7160,16 +7160,7 @@\r\n     long clktck = get_clktck();\r\n \r\n     /* get time accounting information */\r\n-    if (times(&buf) == -1)\r\n-\treturn 1;\r\n-    pttime(buf.tms_utime);\t/* user time */\r\n-    putchar(' ');\r\n-    pttime(buf.tms_stime);\t/* system time */\r\n-    putchar('\\n');\r\n-    pttime(buf.tms_cutime);\t/* user time, children */\r\n-    putchar(' ');\r\n-    pttime(buf.tms_cstime);\t/* system time, children */\r\n-    putchar('\\n');\r\n+\t// Somehow times() is not linking correctly\r\n     return 0;\r\n }\r\n \r\ndiff --color -ruwN source/Src/Builtins/rlimits.c source-new/Src/Builtins/rlimits.c\r\n--- source/Src/Builtins/rlimits.c\t2022-05-15 01:59:21.000000000 +0700\r\n+++ source-new/Src/Builtins/rlimits.c\t2025-08-06 02:24:09.457135439 +0700\r\n@@ -892,7 +892,7 @@\r\n int\r\n boot_(UNUSED(Module m))\r\n {\r\n-    set_resinfo();\r\n+//  set_resinfo();\r\n     return 0;\r\n }\r\n \r\n@@ -900,7 +900,7 @@\r\n int\r\n cleanup_(Module m)\r\n {\r\n-    free_resinfo();\r\n+//  free_resinfo();\r\n     return setfeatureenables(m, &module_features, NULL);\r\n }\r\n \r\n"
  },
  {
    "path": "recipes/wip/shells/zsh/recipe.toml",
    "content": "#TODO: spammy getrusage() warning, or need times() support\r\n[source]\r\ntar = \"https://github.com/zsh-users/zsh/archive/refs/tags/zsh-5.9.tar.gz\"\r\nblake3 = \"a15b94fae03e87aba6fc6a27df3c98e610b85b0c7c0fc90248f07fdcb8816860\"\r\npatches = [\r\n    \"01_redox.patch\"\r\n]\r\nscript = \"\"\"\r\nDYNAMIC_INIT\r\nautotools_recursive_regenerate\r\n\"\"\"\r\n\r\n[build]\r\ntemplate = \"custom\"\r\ndependencies = [\r\n    \"ncursesw\",\r\n]\r\nscript = \"\"\"\r\nDYNAMIC_INIT\r\n\r\n\"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\"\r\n\"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\r\n\"${COOKBOOK_MAKE}\" install.bin install.modules install.fns DESTDIR=\"${COOKBOOK_STAGE}\"\r\n\"\"\"\r\n"
  },
  {
    "path": "recipes/wip/sim/coulomb/recipe.toml",
    "content": "#TODO missing script for gradlew\n#TODO determine the dependencies\n[source]\ngit = \"https://github.com/hamza-algohary/Coulomb\"\nrev = \"6617d4817dd153ae5e5645d427cdb746c146ccee\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/sim/trmt/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/cenonym/trmt\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/asak/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/chaosprint/asak\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/aubio/recipe.toml",
    "content": "#TODO missing script for the waf build system, see https://aubio.org/installation\n[source]\ntar = \"https://aubio.org/pub/aubio-0.4.7.tar.bz2\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/sound/audacity/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n# build instructions: https://github.com/audacity/audacity/blob/master/BUILDING.md\n[source]\ntar = \"https://github.com/audacity/audacity/releases/download/Audacity-3.7.7/audacity-sources-3.7.7.tar.gz\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-Daudacity_conan_enabled=Off\",\n    \"-Daudacity_has_tests=Off\",\n    \"-Daudacity_has_updates_check=Off\",\n    \"-Daudacity_has_vst3=Off\",\n    \"-Daudacity_has_crashreports=Off\",\n]\n#dependencies = [\n#    \"libuuid\",\n#]\n"
  },
  {
    "path": "recipes/wip/sound/audeye/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/maxmarsc/audeye\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libsndfile\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/auditorium/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nate-craft/auditorium\"\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\n    \"mpv\",\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/chiptrack/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jturcotte/chiptrack\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/daw/ardour/recipe.toml",
    "content": "#TODO missing script for waf: https://ardour.org/building_linux.html\n#TODO discover minimum dependencies from waf log\n[source]\ngit = \"https://git.ardour.org/ardour/ardour\"\nrev = \"9.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/sound/daw/lmms/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n# build instructions: https://github.com/LMMS/lmms/wiki/Compiling#build-environment\n[source]\ngit = \"https://github.com/LMMS/lmms\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DWANT_ALSA=OFF\",\n    \"-DWANT_OSS=OFF\",\n    \"-DWANT_CALF=OFF\",\n    \"-DWANT_CAPS=OFF\",\n    \"-DWANT_CARLA=OFF\",\n    \"-DWANT_CMT=OFF\",\n    \"-DWANT_JACK=OFF\",\n    \"-DWANT_LV2=OFF\",\n    \"-DWANT_SUIL=OFF\",\n    \"-DWANT_PULSEAUDIO=OFF\",\n    \"-DWANT_PORTAUDIO=OFF\",\n    \"-DWANT_SNDIO=OFF\",\n    \"-DWANT_SOUNDIO=OFF\",\n    \"-DWANT_SF2=OFF\",\n    \"-DWANT_GIG=OFF\",\n    \"-DWANT_SID=OFF\",\n    \"-DWANT_STK=OFF\",\n    \"-DWANT_SWH=OFF\",\n    \"-DWANT_TAP=OFF\",\n    \"-DWANT_VST=OFF\",\n]\n#dependencies = [\n#    \"qt5-base\",\n#    \"libsamplerate\",\n#    \"libvorbis\",\n#    \"libogg\",\n#    \"sdl2\",\n#    \"fftw\",\n#    \"libstk\",\n#    \"fltk\",\n#]\n"
  },
  {
    "path": "recipes/wip/sound/daw/tek/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/unspeaker/tek\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/easy-effects/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# dependencies: https://github.com/wwmm/easyeffects#effects-available\n# build instructions: https://github.com/wwmm/easyeffects/wiki/Installation-from-Source\n[source]\ngit = \"https://github.com/wwmm/easyeffects\"\nrev = \"v8.1.2\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n#dependencies = [\n#    \"libsamplerate\",\n#    \"libsndfile\",\n#    \"fftw\",\n#    \"speexdsp\",\n#    \"nohnmann-json\",\n#    \"tbb\",\n#]\n"
  },
  {
    "path": "recipes/wip/sound/freac/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions - https://github.com/enzo1982/freac#compiling\n[source]\ntar = \"https://github.com/enzo1982/freac/releases/download/v1.1.7/freac-1.1.7.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"boca\",\n    \"libsmooth\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/fretboard/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bragefuglseth/fretboard\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/jukebox-cli/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/FedeCarollo/jukebox-cli\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/lang/chuck/recipe.toml",
    "content": "#TODO missing script for gnu make: https://github.com/ccrma/chuck#linux\n[source]\ntar = \"https://chuck.cs.princeton.edu/release/files/chuck-1.5.1.3.tgz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libpulse\",\n    \"libsndfile\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/lang/glicol/recipe.toml",
    "content": "#TODO failed to find output device\n[source]\ngit = \"https://github.com/glicol/glicol-cli\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/glicol\ncp -rv \"${COOKBOOK_SOURCE}\"/*.glicol \"${COOKBOOK_STAGE}\"/usr/share/glicol\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sound/libpulse/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/PulseAudioFromGit/\n[source]\ntar = \"https://freedesktop.org/software/pulseaudio/releases/pulseaudio-17.0.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Ddaemon=false\",\n    \"-Ddoxygen=disabled\",\n    \"-Dman=false\",\n    \"-Dtests=disabled\",\n    \"-Drunning-from-build-tree=false\",\n]\ndependencies = [\n    \"libsndfile\",\n    \"libatomic-ops\",\n    \"speexdsp\",\n    \"libtool\",\n    \"json-c\",\n    \"gettext\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/lookas/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rccyx/lookas\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/miniaudicle/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/ccrma/miniAudicle#linux\n[source]\ngit = \"https://github.com/ccrma/miniAudicle\"\nrev = \"3ef25e881cec9ee823d9cf93346c2d6feb089007\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"pulseaudio\",\n    \"libsndfile\",\n    \"qt6-base\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/mixxx/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from cmake log\n# build instructions: https://github.com/mixxxdj/mixxx/wiki/Compiling%20on%20Linux\n[source]\ngit = \"https://github.com/mixxxdj/mixxx\"\nbranch = \"2.5\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n#dependencies = [\n#    \"fftw\",\n#    \"libflac\",\n#    \"mesa\",\n#    \"libhidapi\",\n#    \"libmad\",\n#    \"libopus\",\n#    \"libopusfile\",\n#    \"protobuf\",\n#    \"qt6-base\",\n#    \"qt6-svg\",\n#    \"qt6-declarative\",\n#    \"qt6-3d\",\n#    \"librubberband\",\n#    \"libsndfile\",\n#    \"sqlite3\",\n#    \"openssl3\",\n#    \"portaudio\",\n#]\n"
  },
  {
    "path": "recipes/wip/sound/mousai/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/SeaDve/Mousai\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"gstreamer\",\n    \"libsoup\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/music/metronome/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/World/metronome\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/music/mpd/recipe.toml",
    "content": "#TODO determine minimum dependencies from meson log\n# build instructions: https://mpd.readthedocs.io/en/stable/user.html#compiling-from-source\n[source]\ntar = \"https://www.musicpd.org/download/mpd/0.24/mpd-0.24.6.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Ddocumentation=disabled\",\n    \"-Dhtml_manual=false\",\n    \"-Dmanpages=false\",\n    \"-Dlibfuzzer=false\",\n]"
  },
  {
    "path": "recipes/wip/sound/music/neothesia/recipe.toml",
    "content": "#TODO midir crate error\n[source]\ngit = \"https://github.com/PolyMeilex/Neothesia\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages neothesia\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sound/music/tempo/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tobagin/tempo\"\nrev = \"v1.5.1\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n    \"glib\",\n    \"json-glib\",\n    \"libgee\",\n    \"gstreamer\",\n]\ndev-dependencies = [\"host:blueprint\"]\n"
  },
  {
    "path": "recipes/wip/sound/odin2/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/TheWaveWarden/odin2#all-platforms\n[source]\ngit = \"https://github.com/TheWaveWarden/odin2\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"mesa\",\n    \"curl\",\n    \"webkitgtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/pcmg/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/JohnDowson/pcmg\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages pcmg\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sound/piano-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ritiek/piano-rs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/piano-rs\ncp -rv \"${COOKBOOK_SOURCE}\"/assets \"${COOKBOOK_STAGE}\"/usr/share/piano-rs\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sound/players/euphonica/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/htkhiem/euphonica#meson\n[source]\ngit = \"https://github.com/htkhiem/euphonica\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n    \"sqlite3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\n\"\"\"\n[package]\ndependencies = [\"mpd\"]\n"
  },
  {
    "path": "recipes/wip/sound/players/ncspot/recipe.toml",
    "content": "#TODO ncurses crate error\n[source]\ngit = \"https://github.com/hrkfdn/ncspot\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n    \"ncurses\",\n]\nscript = \"\"\"\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\ncookbook_cargo --features rodio_backend,pancurses_backend\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sound/players/rmpc/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mierak/rmpc\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/rustyvibes/recipe.toml",
    "content": "#TODO rdev crate error\n[source]\ngit = \"https://github.com/KunalBagaria/rustyvibes\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/ruxguitar/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/agourlay/ruxguitar\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/scope-tui/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/alemidev/scope-tui\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/shezem-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Kither12/shezem-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/sndio/recipe.toml",
    "content": "#TODO configuration problem\n[source]\ntar = \"https://sndio.org/sndio-1.9.0.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/sound/sonobus/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/sonosaurus/sonobus/blob/main/linux/BUILDING.md\n[source]\ngit = \"https://github.com/sonosaurus/sonobus\"\nrev = \"1.7.2\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\n#dependencies = [\n#    \"libopus\",\n#    \"freetype2\",\n#    \"curl\",\n#    \"libx11\",\n#    \"libxinerama\",\n#    \"libxrandr\",\n#    \"libxext\",\n#    \"libxcursor\",\n#]\n"
  },
  {
    "path": "recipes/wip/sound/sonusmix/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://codeberg.org/sonusmix/sonusmix#building-from-source\n[source]\ngit = \"https://codeberg.org/sonusmix/sonusmix\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk4\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/{applications,icons}/\"\ncp -v \"${COOKBOOK_SOURCE}/assets/org.sonusmix.Sonusmix.desktop\" \"${COOKBOOK_STAGE}/usr/share/applications/\"\ncp -v \"${COOKBOOK_SOURCE}/assets/sonusmix.svg\" \"${COOKBOOK_STAGE}/usr/share/icons/\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sound/soundboard/recipe.toml",
    "content": "#TODO can't find the glib dependency (after cargo update)\n#TODO update the ring crate version\n[source]\ngit = \"https://github.com/gamebooster/soundboard\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"glib\",\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo --features full\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sound/soundscope/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bananaofhappiness/soundscope\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/soundux/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Soundux/Soundux\"\nrev = \"0.2.7\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"pipewire\",\n    \"libpulse\",\n    \"webkitgtk4\",\n    \"openssl3\",\n    \"libx11\",\n    \"libxi\",\n    \"libappindicator\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/speech-dispatcher/recipe.toml",
    "content": "#TODO make all dependencies work\n[source]\ntar = \"https://github.com/brailcom/speechd/releases/download/0.11.5/speech-dispatcher-0.11.5.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"glib\",\n    \"libsndfile\",\n    \"libdotconf\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/swyh-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/dheijl/swyh-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/tori/recipe.toml",
    "content": "#TODO make dependencies work\n[source]\ngit = \"https://github.com/LeoRiether/tori\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"mpv\",\n    \"cava\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/tuisic/recipe.toml",
    "content": "#TODO rustc-serialize crate error\n[source]\ngit = \"https://github.com/saubuny/tuisic\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sound/viewer/cava/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/karlstav/cava\"\nrev = \"0.10.7\"\nshallow_clone = true\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"ncursesw\",\n    \"fftw\",\n    \"iniparser\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/viewer/cavasik/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/TheWisker/Cavasik\"\nrev = \"v3.2.0\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\n[package]\ndependencies = [\n    \"cava\",\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/sound/whis/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/frankdierolf/whis\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libvulkan\",\n    \"vulkan-headers\",\n    \"shaderc\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages whis-cli\n\"\"\"\n[package]\ndependencies = [\"vulkan-tools\"]\n"
  },
  {
    "path": "recipes/wip/sound/wiremix/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tsowell/wiremix\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"pipewire\",\n]\n"
  },
  {
    "path": "recipes/wip/storage/bmap-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/collabora/bmap-rs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages bmap-rs\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/storage/ezio/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tjjh89017/ezio\"\nrev = \"v2.0.21\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"boost\",\n    \"libtorrent\",\n    \"protobuf\",\n    \"libspdlog\",\n    \"grpc\",\n]\n"
  },
  {
    "path": "recipes/wip/storage/kiorg/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/houqp/kiorg\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/storage/stor-age/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/idiv-biodiversity/stor-age\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/storage/wiper/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ikebastuz/wiper\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sys-info/bb/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/epilys/bb\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sys-info/btop/recipe.toml",
    "content": "#TODO missing gnu make script, see https://github.com/aristocratos/btop#compilation-linux\n[source]\ngit = \"https://github.com/aristocratos/btop\"\nrev = \"fd2a2acdad6fbaad76846cb5e802cf2ae022d670\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/sys-info/cpu-x/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/wiki/manual-build#build-and-install-cpu-x\n[source]\ngit = \"https://github.com/TheTumultuousUnicornOfDarkness/CPU-X\"\nrev = \"41f5d1ac3b13e60aa30212f2b9f38de646fd2b07\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    #\"gtk3mm\",\n    \"ncurses\",\n    #\"glfw3\",\n    #\"libvulkan\",\n    \"libstatgrab\",\n    \"libcpuid\",\n    \"pciutils\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\nCOOKBOOK_CMAKE_FLAGS+=(\n    \"-DWITH_GTK=0\",\n    \"-DWITH_LIBGLFW=0\",\n    \"-DWITH_VULKAN=0\",\n)\ncookbook_cmake\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sys-info/cyme/recipe.toml",
    "content": "#TODO port to Redox\n[source]\ngit = \"https://github.com/tuna-f1sh/cyme\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sys-info/ffetch/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/0l3d/ffetch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sys-info/freshfetch/recipe.toml",
    "content": "#TODO mlua crate error\n[source]\ngit = \"https://github.com/K4rakara/freshfetch\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages freshfetch\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sys-info/macchina/recipe.toml",
    "content": "#TODO if-addrs crate error\n[source]\ngit = \"https://github.com/Macchina-CLI/macchina\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sys-info/mission-center/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.com/mission-center-devs/mission-center#building---native\n#TODO patch to disable libgbm\n[source]\ngit = \"https://gitlab.com/mission-center-devs/mission-center\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n    \"eudev\",\n    \"libdrm\",\n    \"dbus\",\n]\n"
  },
  {
    "path": "recipes/wip/sys-info/neofetch/recipe.toml",
    "content": "#TODO Add Redox OS on the Bash script\n[source]\ngit = \"https://github.com/dylanaraps/neofetch\"\nrev = \"60d07dee6b76769d8c487a40639fb7b5a1a7bc85\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp \"${COOKBOOK_SOURCE}\"/neofetch \"${COOKBOOK_STAGE}\"/usr/bin/neofetch\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/neofetch\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/sys-info/pciutils/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://git.kernel.org/pub/scm/utils/pciutils/pciutils.git/tree/README#n52\n[source]\ntar = \"https://mirrors.edge.kernel.org/pub/software/utils/pciutils/pciutils-3.9.0.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/sys-info/pfetch-rs/recipe.toml",
    "content": "#TODO if-addrs crate error\n[source]\ngit = \"https://github.com/Gobidev/pfetch-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sys-info/process-viewer/recipe.toml",
    "content": "#TODO make GTK4 work\n[source]\ngit = \"https://github.com/GuillaumeGomez/process-viewer\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk4\",\n]\n"
  },
  {
    "path": "recipes/wip/sys-info/procps-ng/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-4.0.4.tar.xz/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/sys-info/procs/recipe.toml",
    "content": "#TODO async-io and rustix crates error (after cargo update)\n[source]\ngit = \"https://github.com/dalance/procs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sys-info/rfetch/recipe.toml",
    "content": "#TODO nix crate error (after cargo update)\n[source]\ngit = \"https://github.com/kamui-fin/rfetch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sys-info/rsftch/recipe.toml",
    "content": "#TODO source code error\n[source]\ngit = \"https://github.com/charklie/rsftch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/sys-info/usbutils/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://www.kernel.org/pub/linux/utils/usb/usbutils/usbutils-017.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libusb\",\n]\n"
  },
  {
    "path": "recipes/wip/sys-info/zeitfetch/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nidnogg/zeitfetch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/system/pik/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jacek-kurlit/pik\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/system/procman/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jaroslawroszyk/procman\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/system/rustysd/recipe.toml",
    "content": "#TODO: Unable to fork services, page fault on rsdctl\n[source]\ngit = \"https://github.com/willnode/rustysd\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo\n\nmkdir -p ${COOKBOOK_STAGE}/etc/rustysd/system\ncat <<'EOF' > ${COOKBOOK_STAGE}/etc/rustysd/rustysd_config.toml\nunit_dirs = [\n  \"/etc/rustysd/system\",\n  \"/etc/rustysd/user\",\n]\nlogging_dir = \"/var/log/rustysd\"\nlog_to_disk = true\nlog_to_stdout = false\ntarget_unit = \"default.target\"\nnotifications_dir = \"/var/run/rustysd\"\n# selfpath = \"\"\nEOF\n\ncp ${COOKBOOK_SOURCE}/docker_test_units/*.target ${COOKBOOK_STAGE}/etc/rustysd/system/\nln -s rsdctl ${COOKBOOK_STAGE}/usr/bin/systemctl\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/system/topgrade/recipe.toml",
    "content": "#TODO async-io and rustix crates error\n[source]\ngit = \"https://github.com/topgrade-rs/topgrade\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tel/sms-server/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/morgverd/sms-server\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tel/sms-terminal/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/morgverd/sms-terminal\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/agg/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/asciinema/agg\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/alacritty/recipe.toml",
    "content": "#TODO need to patch glutin\n[source]\ngit = \"https://github.com/alacritty/alacritty\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"freetype2\",\n    \"fontconfig\",\n    \"libxcb\",\n]\ncargopath = \"alacritty\"\ncargoflags = [\n    \"--no-default-features\",\n    \"--features x11\",\n]\n"
  },
  {
    "path": "recipes/wip/terminal/ascii-gen/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/thed24/ascii-gen\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/asciiquarium/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/cmatsuoka/asciiquarium\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp \"${COOKBOOK_SOURCE}\"/asciiquarium \"${COOKBOOK_STAGE}\"/usr/bin/asciiquarium\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/asciiquarium\n\"\"\"\n[package]\ndependencies = [\n    \"perl\",\n]\n"
  },
  {
    "path": "recipes/wip/terminal/bobr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/cchexcode/bobr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/boulette/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/pipelight/boulette\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/cbonsai/recipe.toml",
    "content": "#TODO missing script for gnu make: https://gitlab.com/jallbrit/cbonsai#manual\n[source]\ngit = \"https://gitlab.com/jallbrit/cbonsai\"\nrev = \"v1.4.2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncursesw\",\n]\n"
  },
  {
    "path": "recipes/wip/terminal/chafa/recipe.toml",
    "content": "#TODO can't find FreeType dependency\n[source]\ntar = \"https://hpjansson.org/chafa/releases/chafa-1.12.4.tar.xz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"glib\",\n    \"imagemagick\",\n    \"pcre\",\n    \"freetype2\",\n]\n"
  },
  {
    "path": "recipes/wip/terminal/chatd/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/unrenamed/chatd\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/contour-terminal/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions - https://contour-terminal.org/install/#unix-like-systems-linux-freebsd-macos\n#TODO missing dependencies, see https://github.com/contour-terminal/contour/blob/master/scripts/install-deps.sh#L328\n[source]\ngit = \"https://github.com/contour-terminal/contour\"\nrev = \"116f1d16f6dc33ab8b0f6010a44e7b23eadeb8ca\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"fontconfig\",\n    \"freetyoe2\",\n    \"harfbuzz\",\n    \"libssh2\",\n    \"ncurses\",\n    \"qt6-base\",\n    \"qt6-declarative\",\n    \"qt6-multimedia\",\n    \"qt6-tools\",\n    \"libxcb\",\n]\n"
  },
  {
    "path": "recipes/wip/terminal/countryfetch/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nik-rev/countryfetch\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages countryfetch\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/desktop-tui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Julien-cpsn/desktop-tui\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/envx/recioe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mikeleppane/envx\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/fsel/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Mjoyufull/fsel\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/ghostie/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/attriaayush/ghostie\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/leadr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ll-nick/leadr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/lk/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jamescoleuk/lk\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/logria/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ReagentX/Logria\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/loriini/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/kolja/loriini\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/lule/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/warpwm/lule\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/ngrv/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/sorairolake/ngrv\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/otter-launcher/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/kuokuo123/otter-launcher\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo\nmkdir -pv \"${COOKBOOK_STAGE}/usr/share/otter-launcher\"\ncp -rv \"${COOKBOOK_SOURCE}\"/contrib/* \"${COOKBOOK_STAGE}/usr/share/otter-launcher\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/pastel/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/sharkdp/pastel\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/pay-respects/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/iffse/pay-respects\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages pay-respects\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/pipecolor/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/dalance/pipecolor\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/pipes-sh/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/pipeseroni/pipes.sh\"\nrev = \"v1.3.0\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp \"${COOKBOOK_SOURCE}\"/pipes.sh \"${COOKBOOK_STAGE}\"/usr/bin/pipes\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/pipes\n\"\"\"\n[package]\ndependencies = [\n    \"bash\",\n    \"ncurses\",\n]\n"
  },
  {
    "path": "recipes/wip/terminal/pretty/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rhaskia/preTTY\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages prettyterm_gui\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/rioterm/recipe.toml",
    "content": "#TODO Need to make libxkbcommon work\n[source]\ngit = \"https://github.com/raphamorim/rio\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"freetype2\",\n    \"fontconfig\",\n    \"libxkbcommon\",\n]\n"
  },
  {
    "path": "recipes/wip/terminal/rterm/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mechpen/rterm\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/scooter/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/thomasschafer/scooter\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages scooter\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/so/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/samtay/so\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo --no-default-features --features termion-backend\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/starship/recipe.toml",
    "content": "#TODO systemstat crate error\n#TODO nix::unistd::User\n[source]\ngit = \"https://github.com/starship/starship\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/tab-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/austinjones/tab-rs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages tab\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/tarts/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/oiwn/tarts\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/tattoy/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/tattoy-org/tattoy\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages tattoy\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/tere/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mgunyho/tere\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/term39/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/alejandroqh/term39\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/termimage/recipe.toml",
    "content": "#TODO move to the proper category\n[source]\ngit = \"https://github.com/nabijaczleweli/termimage\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/terminal-toys/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Seebass22/terminal-toys\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/terminal-yt/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jooooscha/terminal-yt\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/thokr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jrnxf/thokr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/tmux/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://github.com/tmux/tmux/releases/download/3.4/tmux-3.4.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncurses\",\n    \"libevent\",\n]\nscript = \"\"\"\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/tmuxpanel/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/marlocarlo/Tmux-Plugin-Panel\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\n    \"tmux\",\n    \"git\",\n]\n"
  },
  {
    "path": "recipes/wip/terminal/toyterm/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/algon-320/toyterm\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/tvk/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Arcelyth/TerminalVirtualKeyboard\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/useenv/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/EliahKagan/useenv\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/terminal/wezterm/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://wezterm.org/install/source.html\n# dependencies reference: https://github.com/wez/wezterm/blob/main/get-deps#L149\n[source]\ngit = \"https://github.com/wez/wezterm\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"mesa\",\n    \"fontconfig\",\n    \"openssl3\",\n    \"libxkbcommon\",\n    \"libx11\",\n    \"libxcb\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\npackage=wezterm\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --package \"${package}\" \\\n            --release \\\n            --no-default-features \\\n            --features=vendored-fonts\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${package}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${package}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/terminal/zellij/recipe.toml",
    "content": "#TODO openssl-sys crate error (after cargo update)\n[source]\ngit = \"https://github.com/zellij-org/zellij\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tests/pjdfstest/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/pjd/pjdfstest\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/pjdfstest\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user/pjdfstest\"\n\"\"\"\n[package]\ndependencies = [\"perl5\"]\n"
  },
  {
    "path": "recipes/wip/tests/xfstests/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/kdave/xfstests\"\nrev = \"2cba4b54e6ab21d9324000f3cd009dbe9cad9c19\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/home/user/xfstests\"\ncp -rv \"${COOKBOOK_SOURCE}\"/* \"${COOKBOOK_STAGE}/home/user/xfstests\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/amp/recipe.toml",
    "content": "#TODO require a patch on the mio crate\n[source]\ngit = \"https://github.com/jmacdonald/amp\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/basalt/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/erikjuhani/basalt\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages basalt-tui\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/bat/recipe.toml",
    "content": "#TODO sys-info crate build.rs does not recognize Redox\n[source]\ngit = \"https://github.com/sharkdp/bat\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/blogr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bahdotsh/blogr\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages blogr-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/csview/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/wfxr/csview\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/csvlens/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/YS-L/csvlens\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/dog/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/TrystanScottLambert/dog\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/duat/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/AhoyISki/duat\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/edit/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/microsoft/edit\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/emacs-nox/recipe.toml",
    "content": "#TODO compilation error\n#TODO make dependencies work\n[source]\ntar = \"https://ftp.gnu.org/gnu/emacs/emacs-29.1.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"dbus\",\n    \"libgmp\",\n    \"libgpm\",\n    \"gnutls3\",\n    \"jansson\",\n    \"liblcms\",\n    \"sqlite3\",\n    \"libxml2\",\n    \"zlib\",\n    \"ncurses\",\n]\nscript = \"\"\"\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/emacs-pgtk/recipe.toml",
    "content": "#TODO compilation error\n#TODO make dependencies work\n[source]\ntar = \"https://ftp.gnu.org/gnu/emacs/emacs-29.1.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"dbus\",\n    \"libgmp\",\n    \"libgpm\",\n    \"gnutls3\",\n    \"jansson\",\n    \"liblcms\",\n    \"sqlite3\",\n    \"libxml2\",\n    \"zlib\",\n    \"ncurses\",\n    \"cairo\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"gdk-pixbuf\",\n    \"libgif\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"libjpeg\",\n    \"pango\",\n    \"libpng\",\n    \"librsvg\",\n    \"libtiff\",\n    \"libwebp\",\n    \"libotf\",\n]\nscript = \"\"\"\nexport CPPFLAGS=\"-I${COOKBOOK_SYSROOT}/include/ncurses\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/flowfix/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/warpwm/flowfix\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/fsrx/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jrnxf/fsrx\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/helix-gpui/recipe.toml",
    "content": "#TODO can't find the fontconfig dependency\n[source]\ngit = \"https://github.com/polachok/helix-gpui\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/text/igrep/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/konradsz/igrep\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/jt/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/shashwatah/jot\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/keypunch/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bragefuglseth/keypunch\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/text/ki-editor/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ki-editor/ki-editor\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/kibi/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/ilai-deutel/kibi\"\nrev = \"v0.3.2\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/kibi\ncp -rv \"${COOKBOOK_SOURCE}\"/syntax.d \"${COOKBOOK_STAGE}\"/usr/share/kibi\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/mado/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/akiomik/mado\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/md-tui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/henriklovhaug/md-tui\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/mdcat/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/swsnr/mdcat\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo --features=static\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/nanorust/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Supakornn/nanorust\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/neovide/recipe.toml",
    "content": "#TODO Make neovim and freeglut work\n[source]\ngit = \"https://github.com/neovide/neovide\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"neovim\",\n    \"openssl1\",\n    \"freetype2\",\n    \"expat\",\n    \"bzip2\",\n    \"freeglut\",\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/text/neovim/recipe.toml",
    "content": "#TODO working with workarounds on SIGCHLD\n#TODO no documentation\n[source]\ngit = \"https://github.com/neovim/neovim\"\nrev = \"v0.11.5\"\nshallow_clone = true\npatches = [\n  \"redox.patch\"\n]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libiconv\",\n    \"libuv\",\n    \"luv\",\n    \"lpeg\",\n    \"tree-sitter\",\n    \"gettext\",\n    \"unibilium\",\n    \"utf8proc\",\n]\ndev-dependencies = [\n  \"host:luajit\",\n  \"host:neovim\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\n# the only official way to cross compile in future is via zig\n# https://github.com/neovim/neovim/issues/19579\n# the code path below is very hacky, and our zig support is poor yet\n\nCOOKBOOK_CMAKE_FLAGS+=(-DLUA_GEN_PRG=luajit)\nexport DEPS_BUILD_DIR=$COOKBOOK_SYSROOT/usr\nif [ \"$TARGET\" = \"$COOKBOOK_HOST_TARGET\" ]; then\ncookbook_cmake\n\n# needed to workaround bootstrapping process\ncp ./lib/libnlua0.so ${COOKBOOK_STAGE}/usr/lib/nvim/\npatchelf --replace-needed \\\n  \"${COOKBOOK_SYSROOT}/usr/lib/liblpeg.so\" \\\n  'liblpeg.so.1' ${COOKBOOK_STAGE}/usr/lib/nvim/libnlua0.so\n\nelse\n\n# this is a very ugly workaround\ncookbook_cmake || true\ncp ${COOKBOOK_TOOLCHAIN}/usr/lib/nvim/libnlua0.so ./lib/libnlua0.so\ncookbook_cmake\nfi\n\n# Lpeg is absolute path https://github.com/neovim/neovim/issues/23395\npatchelf --replace-needed \\\n  \"${COOKBOOK_SYSROOT}/usr/lib/liblpeg.so\" \\\n  'liblpeg.so.1' ${COOKBOOK_STAGE}/usr/bin/nvim\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/neovim/redox.patch",
    "content": "diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt\nindex d103b5f4..37d9444e 100644\n--- a/runtime/CMakeLists.txt\n+++ b/runtime/CMakeLists.txt\n@@ -24,37 +24,6 @@ add_custom_command(OUTPUT ${GENERATED_SYN_VIM}\n \n file(GLOB PACKAGES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/runtime/pack/dist/opt/*)\n \n-set(GENERATED_PACKAGE_TAGS)\n-foreach(PACKAGE ${PACKAGES})\n-  get_filename_component(PACKNAME ${PACKAGE} NAME)\n-  file(GLOB \"${PACKNAME}_DOC_FILES\" CONFIGURE_DEPENDS ${PACKAGE}/doc/*.txt)\n-  if(${PACKNAME}_DOC_FILES)\n-    file(MAKE_DIRECTORY ${GENERATED_PACKAGE_DIR}/${PACKNAME})\n-    add_custom_command(OUTPUT \"${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags\"\n-      COMMAND ${CMAKE_COMMAND} -E copy_directory\n-        ${PACKAGE} ${GENERATED_PACKAGE_DIR}/${PACKNAME}\n-      COMMAND $<TARGET_FILE:nvim_bin>\n-        -u NONE -i NONE -e --headless -c \"helptags doc\" -c quit\n-      DEPENDS\n-        nvim_bin\n-        nvim_runtime_deps\n-      WORKING_DIRECTORY \"${GENERATED_PACKAGE_DIR}/${PACKNAME}\"\n-    )\n-\n-    set(\"${PACKNAME}_DOC_NAMES\")\n-    foreach(DF \"${${PACKNAME}_DOC_FILES}\")\n-      get_filename_component(F ${DF} NAME)\n-      list(APPEND \"${PACKNAME}_DOC_NAMES\" ${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/${F})\n-    endforeach()\n-\n-    install_helper(\n-      FILES ${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags \"${${PACKNAME}_DOC_NAMES}\"\n-      DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/pack/dist/opt/${PACKNAME}/doc)\n-\n-    list(APPEND GENERATED_PACKAGE_TAGS \"${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags\")\n-  endif()\n-endforeach()\n-\n set(BUILDDOCFILES)\n foreach(DF ${DOCFILES})\n   get_filename_component(F ${DF} NAME)\n@@ -65,8 +34,6 @@ add_custom_command(OUTPUT ${GENERATED_HELP_TAGS}\n   COMMAND ${CMAKE_COMMAND} -E remove_directory doc\n   COMMAND ${CMAKE_COMMAND} -E copy_directory\n     ${PROJECT_SOURCE_DIR}/runtime/doc doc\n-  COMMAND $<TARGET_FILE:nvim_bin>\n-    -u NONE -i NONE -e --headless -c \"helptags ++t doc\" -c quit\n   DEPENDS\n     nvim_bin\n     nvim_runtime_deps\n@@ -78,7 +45,6 @@ add_custom_target(\n   DEPENDS\n     ${GENERATED_SYN_VIM}\n     ${GENERATED_HELP_TAGS}\n-    ${GENERATED_PACKAGE_TAGS}\n )\n \n # CMake is painful here.  It will create the destination using the user's\n@@ -87,10 +53,6 @@ add_custom_target(\n # seems like the best compromise.  If we create it, then everyone can see it.\n # If it's preexisting, leave it alone.\n \n-install_helper(\n-  FILES ${GENERATED_HELP_TAGS} ${BUILDDOCFILES}\n-  DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/doc)\n-\n install_helper(\n   FILES ${GENERATED_SYN_VIM}\n   DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/syntax/vim)\ndiff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt\nindex 4a8fe4c6..55a9ede1 100644\n--- a/src/nvim/CMakeLists.txt\n+++ b/src/nvim/CMakeLists.txt\n@@ -93,19 +93,6 @@ if(NOT MSVC)\n endif()\n \n # -fstack-protector breaks Mingw-w64 builds\n-if(NOT MINGW)\n-  check_c_compiler_flag(-fstack-protector-strong HAS_FSTACK_PROTECTOR_STRONG_FLAG)\n-  if(HAS_FSTACK_PROTECTOR_STRONG_FLAG)\n-    target_compile_options(main_lib INTERFACE -fstack-protector-strong)\n-    target_link_libraries(main_lib INTERFACE -fstack-protector-strong)\n-  else()\n-    check_c_compiler_flag(-fstack-protector HAS_FSTACK_PROTECTOR_FLAG)\n-    if(HAS_FSTACK_PROTECTOR_FLAG)\n-      target_compile_options(main_lib INTERFACE -fstack-protector --param ssp-buffer-size=4)\n-      target_link_libraries(main_lib INTERFACE -fstack-protector --param ssp-buffer-size=4)\n-    endif()\n-  endif()\n-endif()\n \n # Compiler specific options\n if(MSVC)\n@@ -145,9 +132,6 @@ endif()\n # Platform specific options\n if(UNIX)\n   target_link_libraries(main_lib INTERFACE m)\n-  if (NOT CMAKE_SYSTEM_NAME STREQUAL \"SunOS\")\n-    target_link_libraries(main_lib INTERFACE util)\n-  endif()\n endif()\n \n if(CMAKE_SYSTEM_NAME MATCHES \"Windows\")\ndiff --git a/src/nvim/main.c b/src/nvim/main.c\nindex 5c1e415c..fa6fa859 100644\n--- a/src/nvim/main.c\n+++ b/src/nvim/main.c\n@@ -698,6 +698,12 @@ void getout(int exitval)\n   assert(!ui_client_channel_id);\n   exiting = true;\n \n+  // parent doesn't notice SIGCHILD\n+  pid_t ppid = getppid();\n+  if (ppid > 1) {\n+      kill(ppid, SIGKILL); \n+  }\n+\n   // make sure startuptimes have been flushed\n   time_finish();\n \ndiff --git a/src/nvim/os/os_defs.h b/src/nvim/os/os_defs.h\nindex db575e00..b42cee2a 100644\n--- a/src/nvim/os/os_defs.h\n+++ b/src/nvim/os/os_defs.h\n@@ -28,6 +28,8 @@\n \n #if !defined(NAME_MAX) && defined(_XOPEN_NAME_MAX)\n # define NAME_MAX _XOPEN_NAME_MAX\n+#elif !defined(NAME_MAX)\n+# define NAME_MAX 255\n #endif\n \n #define BASENAMELEN (NAME_MAX - 5)\ndiff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c\nindex 7dff8a1b..ebc61542 100644\n--- a/src/nvim/os/shell.c\n+++ b/src/nvim/os/shell.c\n@@ -880,7 +880,16 @@ static int do_os_system(char **argv, const char *input, size_t len, char **outpu\n   MultiQueue *events = multiqueue_new_child(main_loop.events);\n   proc->events = events;\n   proc->argv = argv;\n+#ifdef __redox__\n+  msg_puts(\"Shell execution is disabled until https://gitlab.redox-os.org/redox-os/redox/-/issues/1762 closed and this workaround removed\\n\");\n+  loop_poll_events(&main_loop, 0);\n+  multiqueue_free(events);\n+  return -1;\n+  int status = -1;\n+#else\n   int status = proc_spawn(proc, has_input, true, true);\n+#endif\n+\n   if (status) {\n     loop_poll_events(&main_loop, 0);\n     // Failed, probably 'shell' is not executable.\n"
  },
  {
    "path": "recipes/wip/text/octotype/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/mahlquistj/octotype\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/quicknotes/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ollien/quicknotes\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/read-it-later/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/World/read-it-later\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libadwaita\",\n    \"glib\",\n    \"gdk-pixbuf\",\n]\n"
  },
  {
    "path": "recipes/wip/text/repgrep/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/acheronfail/repgrep\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/revi/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/revi-editor/revi\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/rhyolite/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO resource packaging: https://github.com/lockedmutex/rhyolite/blob/master/Cargo.toml#L43\n[source]\ngit = \"https://github.com/lockedmutex/rhyolite\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"freetype2\",\n    \"fontconfig\",\n]\nscript = \"\"\"\ncookbook_cargo --profile release\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/ripgrep-all/recipe.toml",
    "content": "#TODO tokio-tar crate error\n[source]\ngit = \"https://github.com/phiresky/ripgrep-all\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/ripwc/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/LuminousToaster/ripwc\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/rnote/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/flxzt/rnote/blob/main/BUILDING.md#build-with-meson\n[source]\ngit = \"https://github.com/flxzt/rnote\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"glib\",\n    \"libadwaita\",\n    \"libalsa\",\n    \"libpoppler\",\n    \"appstream\",\n]\n"
  },
  {
    "path": "recipes/wip/text/rucola/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Linus-Mussmaecher/rucola\"\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\n    \"nerd-fonts\",\n]\n"
  },
  {
    "path": "recipes/wip/text/sd/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/chmln/sd\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/sed-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/pegasusheavy/sed-rs\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/serpl/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/yassinebridi/serpl\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/svgbob/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ivanceras/svgbob\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages svgbob_cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/syncat/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/foxfriends/syncat\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages syncat\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/t/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/alecthomas/t\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/treemd/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Epistates/treemd\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/tylax/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/scipenai/tylax\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/typesetter/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO discover minimum dependencies from meson log\n[source]\ngit = \"https://codeberg.org/haydn/typesetter\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/text/yes-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/jedisct1/yes-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/text/zed/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO maybe missing dependencies, see https://github.com/zed-industries/zed/blob/main/script/linux#L15\n#TODO build the gui (\"zed\" package) once we have gpu drivers to render vulkan at decent fps\n# build instructions - https://zed.dev/docs/development/linux\n[source]\ngit = \"https://github.com/zed-industries/zed\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"fontconfig\",\n    \"libxkbcommon\",\n    \"openssl1\",\n    \"zstd\",\n    \"libgit2\",\n    \"sqlite3\",\n]\nscript = \"\"\"\ncookbook_cargo_packages cli\nmv \"${COOKBOOK_STAGE}/usr/bin/cli\" \"${COOKBOOK_STAGE}/usr/bin/zed-cli\"\n#mv \"${COOKBOOK_STAGE}/usr/bin/zed\" \"${COOKBOOK_STAGE}/usr/bin/zed-editor\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/text/zee/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/zee-editor/zee\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages zee\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/time/dispute/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Vinegret43/dispute\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/time/litime/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ikornaselur/litime\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/time/rsclock/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/valebes/rsClock\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/time/timer-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/pando85/timer\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages timer_core\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/time/tomotroid/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/vadoola/Tomotroid\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/time/trackie/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/beatbrot/trackie\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/time/worktime-tui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Kamyil/work-tuimer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/time/zman/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/azzamsa/zman\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/aeruginous/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/kevinmatthes/aeruginous-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/ani-cli/recipe.toml",
    "content": "#TODO move to the \"tools\" category\n[source]\ngit = \"https://github.com/pystardust/ani-cli\"\nrev = \"4a77bca5d95ae755ab5ac129c2db2025feab217b\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp \"${COOKBOOK_SOURCE}\"/ani-cli \"${COOKBOOK_STAGE}\"/usr/bin/ani-cli\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/ani-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/ani-skip/recipe.toml",
    "content": "#TODO move to the \"tools\" category\n[source]\ngit = \"https://github.com/synacktraa/ani-skip\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\nmkdir -pv \"${COOKBOOK_STAGE}\"/home/user/.config/mpv/scripts\ncp \"${COOKBOOK_SOURCE}\"/ani-skip \"${COOKBOOK_STAGE}\"/usr/bin/ani-skip\ncp \"${COOKBOOK_SOURCE}\"/skip.lua \"${COOKBOOK_STAGE}\"/home/user/.config/mpv/scripts\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/ani-skip\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/arrow-tools/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/domoritz/arrow-tools\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages csv2arrow csv2parquet json2arrow json2parquet\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/artem/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/FineFindus/artem\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\nexport OPENSSL_STATIC=\"true\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/ast-grep/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/ast-grep/ast-grep\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages ast-grep\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/astc-encoder/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/ARM-software/astc-encoder/blob/main/Docs/Building.md#macos-and-linux-using-make\n[source]\ngit = \"https://github.com/ARM-software/astc-encoder\"\nrev = \"aeece2f609db959d1c5e43e4f00bd177ea130575\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/tools/astyle/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://astyle.sourceforge.net/install.html\n[source]\ntar = \"https://sourceforge.net/projects/astyle/files/astyle/astyle%203.4/astyle-3.4.10.tar.bz2/download\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/tools/atm-cli/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/allthemusicllc/atm-cli\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/atuin/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/atuinsh/atuin\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages atuin\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/backhand/recipe.toml",
    "content": "#TODO missing script to properly move the binary\n[source]\ngit = \"https://github.com/wcampbell0x2a/backhand\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages backhand\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/bacup/recipe.toml",
    "content": "#TODO tokio-tar crate error\n#TODO create a service\n[source]\ngit = \"https://github.com/galeone/bacup\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/bartib/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/nikolassv/bartib\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/battop/recipe.toml",
    "content": "#TODO atty crate error (after cargo update)\n[source]\ngit = \"https://github.com/svartalf/rust-battop\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/bdt/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/datafusion-contrib/bdt\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/binserve/recipe.toml",
    "content": "#TODO compiled but not tested (after a patch on the ring crate)\n[source]\ngit = \"https://github.com/mufeedvh/binserve\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/birdy/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/kakoc/birdy\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/blockish-caca/recipe.toml",
    "content": "#TODO make libcaca work\n[source]\ngit = \"https://github.com/yazgoo/blockish-caca\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libcaca\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/broot/recipe.toml",
    "content": "#TODO nix crate compilation error\n[source]\ngit = \"https://github.com/Canop/broot\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/busybox/recipe.toml",
    "content": "#TODO missing script for GNU Make, see https://www.busybox.net/FAQ.html#configure\n#TODO cross-compilation - https://www.busybox.net/FAQ.html#build\n[source]\ntar = \"https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/bvr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Avarel/bvr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/byteblitz/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/noahra/byteblitz\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/caesium/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Lymphatus/caesium-clt\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/caligula/recipe.toml",
    "content": "#TODO process_path crate error\n[source]\ngit = \"https://github.com/ifd3f/caligula\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/carbonyl/recipe.toml",
    "content": "#TODO make nss work\n#TODO require Chromium building\n[source]\ngit = \"https://github.com/fathyb/carbonyl\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"nss\",\n    \"fontconfig\",\n    \"expat\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/cb/recipe.toml",
    "content": "#TODO discover how to cross-compile: https://github.com/yaa110/cb#build-manually\n[source]\ngit = \"https://github.com/yaa110/cb\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/cfait/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/trougnouf/cfait\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/checkpwn/recipe.toml",
    "content": "#TODO compiled but not tested (after patched ring crate)\n[source]\ngit = \"https://github.com/brycx/checkpwn\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/choose/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/theryangeary/choose\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/chromazone/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/matze/chromazone\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/clipcat/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/xrelkd/clipcat\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages clipcatd clipcatctl clipcat-menu\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/clipshare-desktop/recipe.toml",
    "content": "#TODO make the xdotool dependency work\n[source]\ngit = \"https://github.com/RastislavKish/clipshare\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"xdotool\",\n]\nscript = \"\"\"\ncookbook_cargo_packages desktop_client\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/clipshare-server/recipe.toml",
    "content": "#TODO probably wrong script, see https://github.com/RastislavKish/clipshare#building\n[source]\ngit = \"https://github.com/RastislavKish/clipshare\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"xdotool\",\n]\nscript = \"\"\"\ncookbook_cargo_packages server\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/clog-cli/recipe.toml",
    "content": "#TODO rustc-serialize crate error (after cargo update)\n[source]\ngit = \"https://github.com/clog-tool/clog-cli\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/conceal/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/TD-Sky/conceal\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/conserve/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/sourcefrog/conserve\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/counts/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/nnethercote/counts\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/cpuminer-opt/recipe.toml",
    "content": "#TODO maybe wrong template, see https://github.com/JayDDee/cpuminer-opt/wiki/Compiling-from-source\n#TODO fix jansson dependency\n[source]\ngit = \"https://github.com/JayDDee/cpuminer-opt\"\nrev = \"9d3a46c3551655f862db74a195e769fe86266903\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"curl\",\n    \"jansson\",\n    \"libgmp\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/crunchy-cli/recipe.toml",
    "content": "#TODO fs2 crate error\n[source]\ngit = \"https://github.com/crunchy-labs/crunchy-cli\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/cube-timer/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/paarthmadan/cube\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/cute/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/PThorpe92/CuTE\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/czkawka/recipe.toml",
    "content": "#TODO Compiled but not tested\n[source]\ngit = \"https://github.com/qarmin/czkawka\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages czkawka_cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/daktilo/recipe.toml",
    "content": "#TODO rdev crate error\n[source]\ngit = \"https://github.com/orhun/daktilo\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dead-ringer/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ztroop/dead-ringer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/delta/recipe.toml",
    "content": "#TODO make the \"less\" dependency work\n[source]\ngit = \"https://github.com/dandavison/delta\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"less\",\n]\nscript = \"\"\"\ncookbook_cargo_packages git-delta\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/desed/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/SoptikHa2/desed\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dfm/recipe.toml",
    "content": "#TODO port to redox\n[source]\ngit = \"https://github.com/chasinglogic/dfm\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/diffr/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/mookid/diffr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/diffutils-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/uutils/diffutils\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/diffy/recipe.toml",
    "content": "#TODO add a command to properly move the executable\n#TODO compiled but not tested\n[source]\ngit = \"https://github.com/bmwill/diffy\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages diffy\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/dim/recipe.toml",
    "content": "#TODO missing script for building, see https://github.com/Dusk-Labs/dim#running-from-source\n#TODO probably missing dependencies\n[source]\ngit = \"https://github.com/Dusk-Labs/dim\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sqlite3\",\n    \"openssl1\",\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/dirscan/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/orf/dirscan\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/diskonaut/recipe.toml",
    "content": "#TODO outdated redox_syscall crate (after cargo update)\n[source]\ngit = \"https://github.com/imsnif/diskonaut\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dispatch/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/brianyu28/dispatch\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/dog-dns/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/ogham/dog\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\nexport OPENSSL_STATIC=\"true\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/dotr/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/dpc/dotr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dotter/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/SuperCuber/dotter\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dply/recipe.toml",
    "content": "#TODO jemalloc-sys crate error\n[source]\ngit = \"https://github.com/vincev/dply-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dprint/recipe.toml",
    "content": "#TODO region crate error\n[source]\ngit = \"https://github.com/dprint/dprint\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages dprint\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/dra-cla/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/CoolnsX/dra-cla\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp \"${COOKBOOK_SOURCE}\"/dra-cla \"${COOKBOOK_STAGE}\"/usr/bin/dra-cla\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/dra-cla\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/dua/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Byron/dua-cli\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dui/recipe.toml",
    "content": "#TODO Compiled but not tested\n[source]\ngit = \"https://gitlab.com/GregOwen/dui\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dura/recipe.toml",
    "content": "#TODO make libgit2 dependency work\n[source]\ngit = \"https://github.com/tkellogg/dura\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libgit2\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/dust/recipe.toml",
    "content": "#TODO working but don't draw the size bars\n[source]\ngit = \"https://github.com/bootandy/dust\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dutree/recipe.toml",
    "content": "#TODO program source code error (after cargo update)\n[source]\ngit = \"https://github.com/nachoparker/dutree\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/dysk/recipe.toml",
    "content": "#TODO nix crate error\n[source]\ngit = \"https://github.com/Canop/dysk\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/emplace/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/tversteeg/emplace\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/enchant/recipe.toml",
    "content": "#TODO can't find glib\n[source]\ntar = \"https://github.com/AbiWord/enchant/releases/download/v2.6.3/enchant-2.6.3.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"glib\",\n    \"pcre\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/envio/recipe.toml",
    "content": "#TODO require rustc 1.75 or newer\n[source]\ngit = \"https://github.com/envio-cli/envio\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/epub2txt/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/quininer/epub2txt\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/erdtree/recipe.toml",
    "content": "#TODO program source code error\n[source]\ngit = \"https://github.com/solidiquis/erdtree\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/espanso/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://espanso.org/docs/install/linux/#x11-compile\n[source]\ngit = \"https://github.com/espanso/espanso\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libxkbcommon\",\n    \"dbus\",\n    \"wxwidgets-gtk3\",\n    \"openssl3\",\n    \"libx11\",\n    \"libxtst\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\npackage=espanso\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --package \"${package}\" \\\n            --release \\\n            --no-default-features \\\n            --features=vendored-tls,modulo\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${package}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${package}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/eureka/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/simeg/eureka\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/eva/recipe.toml",
    "content": "#TODO rustyline crate error\n[source]\ngit = \"https://github.com/nerdypepper/eva\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/exa/recipe.toml",
    "content": "#TODO outdated redox_syscall crate (after cargo update)\n[source]\ngit = \"https://github.com/ogham/exa\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/exhaust/recipe.toml",
    "content": "#TODO outdated redox_syscall crate\n[source]\ngit = \"https://github.com/heyrict/exhaust\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/exuberant-ctags/recipe.toml",
    "content": "#TODO compilation error - permission denied\n[source]\ntar = \"https://sourceforge.net/projects/ctags/files/ctags/5.8/ctags-5.8.tar.gz/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/tools/eza/recipe.toml",
    "content": "#TODO outdated redox_syscall crate\n[source]\ngit = \"https://github.com/eza-community/eza\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/fclones/recipe.toml",
    "content": "#TODO file-owner crate error\n[source]\ngit = \"https://github.com/pkolaczk/fclones\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages fclones\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/felix/recipe.toml",
    "content": "#TODO replace the terminal prompt with nothing on execution\n[source]\ngit = \"https://github.com/kyoheiu/felix\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/fennec/recipe.toml",
    "content": "#TODO update ring version (after cargo update)\n[source]\ngit = \"https://github.com/AbdulRhmanAlfaifi/Fennec\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/ffizer/recipe.toml",
    "content": "#TODO libssh2-sys crate error\n[source]\ngit = \"https://github.com/ffizer/ffizer\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo --features cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/findutils-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/uutils/findutils\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/flameshot/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from cmake log\n# build instructions: https://flameshot.org/docs/installation/source-code/#compilation\n[source]\ngit = \"https://github.com/flameshot-org/flameshot\"\nbranch = \"v13.3.0\"\nshallow_clone = true\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DDISABLE_UPDATE_CHECKER=ON\",\n    \"-DBUILD_STATIC_LIBS=OFF\",\n]\n#dependencies = [\n#    \"qt5-base\",\n#    \"qt5-tools\",\n#    \"qt5-svg\",\n#]\n"
  },
  {
    "path": "recipes/wip/tools/flowtime/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/Diego-Ivan/Flowtime#building-from-source\n[source]\ngit = \"https://github.com/Diego-Ivan/Flowtime\"\nrev = \"2cb1160f7f61ec0a6add292deca38a3150336f03\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"libxml2\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/fselect/recipe.toml",
    "content": "#TODO make the mimalloc dependency work\n[source]\ngit = \"https://github.com/jhspetersson/fselect\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"mimalloc\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/fuc/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/SUPERCILEX/fuc\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages cpz rmz\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/fuga/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/liebe-magi/fuga\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages fuga\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/funzzy/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/cristianoliveira/funzzy\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/fzf-make/recipe.toml",
    "content": "#TODO ahash and ioctl-rs crates error\n[source]\ngit = \"https://github.com/kyu08/fzf-make\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/gengo/recipe.toml",
    "content": "#TODO missing script to properly move the binary\n[source]\ngit = \"https://github.com/spenserblack/gengo\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages gengo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/germ/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/volks73/germ\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/gifski/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ImageOptim/gifski\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/gnu-radio/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://wiki.gnuradio.org/index.php?title=LinuxInstall#For_GNU_Radio_3.10,_3.9,_and_Main_Branch\n# probably missing dependencies, see https://wiki.gnuradio.org/index.php?title=UbuntuInstall#Install_Dependencies\n[source]\ngit = \"https://github.com/gnuradio/gnuradio\"\nrev = \"bd928539d9eaa73736f8381cd2e60953a0eb8cb8\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"volk\",\n    \"boost\",\n    \"libgmp\",\n    \"fftw\",\n    \"sdl1\",\n    \"qt5-base\",\n    \"libusb\",\n    \"libevdev\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/gnuplot/recipe.toml",
    "content": "#TODO determine dependencies\n[source]\ntar = \"https://sourceforge.net/projects/gnuplot/files/gnuplot/5.4.10/gnuplot-5.4.10.tar.gz/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/tools/goldboot/recipe.toml",
    "content": "#TODO use a data type that don't download the private git submodules\n[source]\ngit = \"https://github.com/fossable/goldboot\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages goldboot\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/goxel/recipe.toml",
    "content": "#TODO missing script for the SCons, see https://github.com/guillaumechereau/goxel#linuxbsd\n[source]\ngit = \"https://github.com/guillaumechereau/goxel\"\nrev = \"4cdf7bc49cbfd87e60692f49483ea60271729845\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk3\",\n    \"glfw3\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/gpg-tui/recipe.toml",
    "content": "#TODO make dependencies work\n[source]\ngit = \"https://github.com/orhun/gpg-tui\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gnupg\",\n    \"gpgme\",\n    \"libgpg-error\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/gphoto2/recipe.toml",
    "content": "#TODO make libgphoto2 work\n[source]\ntar = \"https://sourceforge.net/projects/gphoto/files/gphoto/2.5.28/gphoto2-2.5.28.tar.xz/download\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libgphoto2\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/gping/recipe.toml",
    "content": "#TODO program source code error\n[source]\ngit = \"https://github.com/orf/gping\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages gping\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/gptman/recipe.toml",
    "content": "#TODO outdated redox_syscall crate\n[source]\ngit = \"https://github.com/rust-disk-partition-management/gptman\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo --features cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/gptube-cli/recipe.toml",
    "content": "#TODO Seems to search for yt-dlp, see https://github.com/ZmoleCristian/gptube-cli/blob/main/Makefile\n[source]\ngit = \"https://github.com/ZmoleCristian/gptube-cli\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/grex/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/pemistahl/grex\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/groff/recipe.toml",
    "content": "#TODO compilation error - port fseterr.c\n[source]\ntar = \"https://ftp.gnu.org/gnu/groff/groff-1.23.0.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/tools/guix/recipe.toml",
    "content": "#TODO fix libgcrypt\n#TODO maybe missing dependencies, see https://guix.gnu.org/manual/en/html_node/Requirements.html\n[source]\ntar = \"https://ftpmirror.gnu.org/gnu/guix/guix-1.4.0.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"libgcrypt\",\n    \"sqlite3\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/halp/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/orhun/halp\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/hawkeye/recipe.toml",
    "content": "#TODO compiled but not tested\n#TODO add a command to properly move the executable\n[source]\ngit = \"https://github.com/korandoru/hawkeye\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages hawkeye hawkeye-fmt\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/haylxon/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/pwnwriter/haylxon\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/himalaya/recipe.toml",
    "content": "#TODO xdg-home crate error (after a patch on ring)\n[source]\ngit = \"https://github.com/soywod/himalaya\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/hired/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/sidju/hired\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/hoard/recipe.toml",
    "content": "#TODO aws-lc-sys crate error\n[source]\ngit = \"https://github.com/Hyde46/hoard\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/horsetab/recipe.toml",
    "content": "#TODO rdev crate error\n[source]\ngit = \"https://github.com/ChrisVilches/horsetab\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/humphrey/recipe.toml",
    "content": "#TODO Bash can't detect the \"--all-features\" flag on the script\n[source]\ngit = \"https://github.com/w-henderson/Humphrey\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nbinary=humphrey\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --bin \"${binary}\" \\\n            --release\n            --all-features\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${binary}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${binary}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/hwatch/recipe.toml",
    "content": "#TODO async-io crate error (after cargo update)\n[source]\ngit = \"https://github.com/blacknon/hwatch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/imager/recipe.toml",
    "content": "#TODO webp-dev crate error\n[source]\ngit = \"https://github.com/imager-io/imager\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"xz\",\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages imager\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/inlyne/recipe.toml",
    "content": "#TODO ucred::get_peer_cred\n#TODO nix::sys::socket\n#TODO cmsg_space!\n[source]\ngit = \"https://github.com/trimental/inlyne\"\n[build]\ntemplate = \"cargo\""
  },
  {
    "path": "recipes/wip/tools/innernet-cli/recipe.toml",
    "content": "#TODO shared crate error\n[source]\ngit = \"https://github.com/tonarino/innernet\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages client\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/innernet-server/recipe.toml",
    "content": "#TODO shared crate error\n[source]\ngit = \"https://github.com/tonarino/innernet\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sqlite3\",\n]\nscript = \"\"\"\ncookbook_cargo_packages server\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/intelli-shell/recipe.toml",
    "content": "#TODO OpenSSL error\n[source]\ngit = \"https://github.com/lasantosr/intelli-shell\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\nexport OPENSSL_STATIC=\"true\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/interaction-calculus/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/VictorTaelin/Interaction-Calculus\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/intermodal/recipe.toml",
    "content": "#TODO termios crate error\n[source]\ngit = \"https://github.com/casey/intermodal\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo\nmv \"${COOKBOOK_STAGE}/usr/bin/imdl\" \"${COOKBOOK_STAGE}/usr/bin/intermodal\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/itstool/recipe.toml",
    "content": "#TODO compiling, not tested\n[source]\ntar = \"http://files.itstool.org/itstool/itstool-2.0.7.tar.bz2\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/tools/jirust/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/moali87/jirust\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/jless/recipe.toml",
    "content": "#TODO outdated redox_syscall crate (after cargo update)\n[source]\ngit = \"https://github.com/PaulJuliusMartinez/jless\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/joshuto/recipe.toml",
    "content": "#TODO open and trash crates error\n[source]\ngit = \"https://github.com/kamiyaa/joshuto\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/jql/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/yamafaktory/jql\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages jql\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/kami/recipe.toml",
    "content": "#TODO termsize crate error (after cargo update)\n#TODO require bat and mpv at runtime\n[source]\ngit = \"https://github.com/mrfluffy-dev/kami\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/kanata/recipe.toml",
    "content": "#TODO kanata-parser crate error\n[source]\ngit = \"https://github.com/jtroo/kanata\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/kbt/recipe.toml",
    "content": "#TODO outdated redox_syscall crate (after cargo update)\n[source]\ngit = \"https://github.com/bloznelis/kbt\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/kodi/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/xbmc/xbmc/blob/master/docs/README.Linux.md#4-build-kodi\n# maybe missing dependencies, see https://archlinux.org/packages/extra/x86_64/kodi/\n[source]\ngit = \"https://github.com/xbmc/xbmc\"\nrev = \"5f418d0b133535c6675154688ac7144e34f4d436\"\n[build]\ntemplate = \"cmake\"\ncmakeflags = [\n    \"-DCORE_PLATFORM_NAME=wayland\",\n    \"-DAPP_RENDER_SYSTEM=gl\",\n]\ndependencies = [\n    \"libass\",\n    \"libbluray\",\n    \"mesa\",\n    \"bzip2\",\n    \"curl\",\n    \"dbus\",\n    \"libflac\",\n    \"fontconfig\",\n    \"libfmt\",\n    \"freetype2\",\n    \"fribidi\",\n    \"libgcrypt\",\n    \"libgif\",\n    \"glew\",\n    \"gnutls3\",\n    \"mesa-glu\",\n    \"libgpg-error\",\n    \"libjpeg\",\n    \"libogg\",\n    \"pcre\",\n    \"libpng\",\n    \"openssl1\",\n    \"libtiff\",\n    \"sqlite3\",\n    \"libevdev\",\n    \"libunistring\",\n    \"libva\",\n    \"libvorbis\",\n    \"libxkbcommon\",\n    \"libuuid\",\n    \"libxslt\",\n    \"pipewire\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/lapce/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/lapce/lapce\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/lazy-etherscan/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/woxjro/lazy-etherscan\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/lcs-image-diff/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/bokuweb/lcs-image-diff-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/lddtree-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/messense/lddtree-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/legdur/recipe.toml",
    "content": "#TODO the repository can't be cloned because it's using the Mercurial now? what doesn't makes sense\n#TODO camino crate error\n[source]\ngit = \"https://hg.sr.ht/~cyplo/legdur\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/lemmeknow/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/swanandx/lemmeknow\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/less/recipe.toml",
    "content": "#TODO waiting termcap fix\n[source]\ntar = \"https://www.greenwoodsoftware.com/less/less-633.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"termcap\",\n    \"libvterm\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/lines-rs/recipe.toml",
    "content": "#TODO jemalloc-sys crate error\n[source]\ngit = \"https://github.com/ryanfowler/lines\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/lineselect/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/urbanogilson/lineselect\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/logss/recipe.toml",
    "content": "#TODO broken and don't exit\n[source]\ngit = \"https://github.com/todoesverso/logss\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/lowcharts/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/juan-leon/lowcharts\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/lucid/recipe.toml",
    "content": "#TODO nix crate error\n[source]\ngit = \"https://github.com/sharkdp/lucid\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/mandy/recipe.toml",
    "content": "#TODO libssh2-sys crate error\n[source]\ngit = \"https://github.com/angeldollface/mandy\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages mandy-bin\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/mangohud/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/flightlessmango/MangoHud#installation---build-from-source\n[source]\ntar = \"https://github.com/flightlessmango/MangoHud/releases/download/v0.8.1/MangoHud-v0.8.1-Source.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dwith_xnvctrl=disabled\",\n    \"-Dwith_dbus=disabled\",\n]\ndependencies = [\n    \"mesa-x11\",\n    \"libx11\",\n    #\"libxkbcommon\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/mask/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/jacobdeichert/mask\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages mask\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/matui/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/pkulak/matui\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/maze-tui/recipe.toml",
    "content": "#TODO go to the \"maze_progs\" folder and build \"run_tui\" and \"run_maze\"\n[source]\ngit = \"https://github.com/agl-alexglopez/maze-tui\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/mcfly/recipe.toml",
    "content": "#TODO program source code error\n[source]\ngit = \"https://github.com/cantino/mcfly\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/menyoki/recipe.toml",
    "content": "#TODO not compiled or tested\n# if the x11 backend don't work read this: https://github.com/orhun/menyoki/blob/master/IMPLEMENTATION.md#implementing-for-other-platforms\n[source]\ngit = \"https://github.com/orhun/menyoki\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/mhv/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/jgardona/mhv\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/minmon/recipe.toml",
    "content": "#TODO port to redox\n[source]\ngit = \"https://github.com/flo-at/minmon\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/mkisofs-rs/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/marysaka/mkisofs-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/mprocs/recipe.toml",
    "content": "#TODO termios crates error (after cargo update)\n[source]\ngit = \"https://github.com/pvolok/mprocs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages mprocs\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/navi/recipe.toml",
    "content": "#TODO fs_at and libc crate errors (after cargo update)\n[source]\ngit = \"https://github.com/denisidoro/navi\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/nickel/recipe.toml",
    "content": "#TODO rustyline crate error\n[source]\ngit = \"https://github.com/tweag/nickel\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages nickel-lang-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/nix/recipe.toml",
    "content": "#TODO make dependencies work\n[source]\ngit = \"https://github.com/NixOS/nix\"\nrev = \"50f8f1c8bc019a4c0fd098b9ac674b94cfc6af0d\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libbrotili\",\n    \"openssl1\",\n    \"curl\",\n    \"sqlite3\",\n    \"libeditline\",\n    \"boost\",\n    \"libsodium\",\n    \"libcpuid\",\n]\nscript = \"\"\"\nautoreconf -vfi\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-tests\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/nomad/recipe.toml",
    "content": "#TODO sys-info crate error\n#TODO require Nerd Fonts\n[source]\ngit = \"https://github.com/JosephLai241/nomad\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/nomino/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/yaa110/nomino\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/notnow/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/d-e-s-o/notnow\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/objdiff/recipe.toml",
    "content": "#TODO can't find the fontconfig dependency\n[source]\ngit = \"https://github.com/encounter/objdiff\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n    \"fontconfig\",\n]\nscript = \"\"\"\ncookbook_cargo_packages objdiff-gui objdiff-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/odilia/recipe.toml",
    "content": "#TODO xdg-home crate error (after cargo update)\n[source]\ngit = \"https://github.com/odilia-app/odilia\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages odilia\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/omega/recipe.toml",
    "content": "#TODO missing headers\n[source]\ngit = \"https://github.com/nwrenger/omega\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/oranda/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/axodotdev/oranda\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/orchaldir-texture-generator/recipe.toml",
    "content": "#TODO Compiled but not tested\n[source]\ngit = \"https://github.com/Orchaldir/texture_generator\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages texture_generator\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/pdbview/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/landaire/pdbview\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/pdu/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/KSXGitHub/parallel-disk-usage\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/pipr/recipe.toml",
    "content": "#TODO update mio to 0.8 (after cargo update)\n[source]\ngit = \"https://github.com/Elkowar/pipr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/pixcil/recipe.toml",
    "content": "#TODO compiled but not tested\n#TODO missing script to properly move the binary\n#TODO require WebAssembly\n[source]\ngit = \"https://github.com/sile/pixcil\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages pixcil\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/pixelsort/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Void-ux/pixelsort\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/planify/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine minimum dependencies from meson log\n[source]\ngit = \"https://github.com/alainm23/planify\"\nrev = \"v4.17.0\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dwebkit=false\",\n    \"-Dportal=false\",\n    \"-Devolution=false\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/pomky/recipe.toml",
    "content": "#TODO waiting gdk-pixbuf conversion to TOML\n[source]\ngit = \"https://github.com/developomp/pomky\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"glib\",\n    \"pcre\",\n    \"gdk-pixbuf\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/porsmo/recipe.toml",
    "content": "#TODO xdg-home crate error\n[source]\ngit = \"https://github.com/ColorCookie-dev/porsmo\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/posixutils-rs/recipe.toml",
    "content": "#TODO require a customized Cargo script\n[source]\ngit = \"https://github.com/rustcoreutils/posixutils-rs\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/potrace/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ntar = \"https://potrace.sourceforge.net/download/1.16/potrace-1.16.tar.gz\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/presenterm/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/mfontanini/presenterm\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/pueue/recipe.toml",
    "content": "#TODO pueue_lib crate error (after cargo update and a patch on ring)\n[source]\ngit = \"https://github.com/Nukesor/pueue\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages pueue\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/qv/recipe.toml",
    "content": "#TODO deltalake crate error (after a patch on ring)\n[source]\ngit = \"https://github.com/timvw/qv\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/rana/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/grunch/rana\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/rargs/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/lotabout/rargs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/rclone/recipe.toml",
    "content": "#TODO missing script for Go, see https://rclone.org/install/#source\n[source]\ntar = \"https://github.com/rclone/rclone/releases/download/v1.64.2/rclone-v1.64.2.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/restic/recipe.toml",
    "content": "#TODO missing script for Go, see https://restic.readthedocs.io/en/stable/020_installation.html#from-source\n#TODO maybe needs to be patched\n[source]\ntar = \"https://github.com/restic/restic/releases/download/v0.16.2/restic-0.16.2.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/rfz/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/MangoTzara/rfz\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/rip/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/nivekuil/rip\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/ripasso/recipe.toml",
    "content": "#TODO make libgpg-error dependency work\n[source]\ngit = \"https://github.com/cortex/ripasso\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n    \"libgpg-error\",\n]\nscript = \"\"\"\ncookbook_cargo_packages ripasso-cursive\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/ripsecrets/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/sirwart/ripsecrets\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/rix/recipe.toml",
    "content": "#TODO compilation error\n[source]\ngit = \"https://github.com/urbas/rix\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/rnr/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/ismaelgv/rnr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/rq/recipe.toml",
    "content": "#TODO record-query crate error (after cargo update)\n[source]\ngit = \"https://github.com/dflemstr/rq\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/ruke/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/kauefraga/ruke\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/run/recipe.toml",
    "content": "#TODO fix the script\n[source]\ngit = \"https://github.com/LyonSyonII/run\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncd \"${COOKBOOK_SOURCE}\"/cli\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/ruplacer/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/your-tools/ruplacer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/rusty/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/zahidkhawaja/rusty\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/rusty-krab-manager/recipe.toml",
    "content": "#TODO xdg-home and nix crates error (after cargo update)\n[source]\ngit = \"https://github.com/aryakaul/rusty-krab-manager\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/rusync/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/your-tools/rusync\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/sad/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ms-jpq/sad\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/sam/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n#TODO add a command to properly move the executable\n[source]\ngit = \"https://github.com/r-zenine/sam\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages sam-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/scribus/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://wiki.scribus.net/canvas/Official:Compile_with_CMake\n[source]\ntar = \"https://sourceforge.net/projects/scribus/files/scribus/1.6.4/scribus-1.6.4.tar.xz/download\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"qt4\",\n    \"cairo\",\n    \"freetype2\",\n    \"libxml2\",\n    \"liblcms\",\n    \"libtiff\",\n    \"libjpeg\",\n    \"fontconfig\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/scrying/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/nccgroup/scrying\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/shd/recipe.toml",
    "content": "#TODO make the smartmontools dependency work\n[source]\ngit = \"https://github.com/alttch/shd\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"smartmontools\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/shellfirm/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/kaplanelad/shellfirm\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages shellfirm\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/shokunin/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/sebastienrousseau/shokunin\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/sig/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ynqa/sig\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/sigi/recipe.toml",
    "content": "#TODO rustyline crate error\n[source]\ngit = \"https://github.com/sigi-cli/sigi\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/simplemoji/recipe.toml",
    "content": "#TODO require the Noto Color Emoji font, see https://fonts.google.com/noto/specimen/Noto+Color+Emoji\n[source]\ngit = \"https://github.com/SergioRibera/Simplemoji\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/skim/recipe.toml",
    "content": "#TODO tuikit crate error (after cargo update)\n[source]\ngit = \"https://github.com/lotabout/skim\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/skyspell/recipe.toml",
    "content": "#TODO missing an enchant backend and dictionary, see https://github.com/your-tools/skyspell#installation\n[source]\ngit = \"https://github.com/your-tools/skyspell\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"sqlite3\",\n    \"enchant\",\n]\nscript = \"\"\"\ncookbook_cargo_packages skyspell\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/smartmontools/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://sourceforge.net/projects/smartmontools/files/smartmontools/7.3/smartmontools-7.3.tar.gz/download\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/tools/snappy-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/BurntSushi/rust-snappy\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages szip\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/spacer/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/samwho/spacer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/spidey/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/kdwk/Spidey\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/sprinkles/recipe.toml",
    "content": "#TODO Compiled but not tested\n[source]\ngit = \"https://github.com/KhalilOuali/sprinkles\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/succeed2ban-tui/recipe.toml",
    "content": "#TODO libsystemd crate error (needs porting)\n[source]\ngit = \"https://github.com/J-Bockhofer/succeed2ban-tui\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/sued/recipe.toml",
    "content": "#TODO not compiled or tested\n# customization: https://codeberg.org/AeriaVelocity/sued#configuration\n[source]\ngit = \"https://codeberg.org/AeriaVelocity/sued\"\n[build]\ntemplate = \"cargo\"\ncargoflags = [\"--features=repl,startup,history\"]\n"
  },
  {
    "path": "recipes/wip/tools/svg2pdf/recipe.toml",
    "content": "#TODO compiled but not tested\n#TODO missing script to properly move the binary\n[source]\ngit = \"https://github.com/typst/svg2pdf\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages svg2pdf-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/swc/recipe.toml",
    "content": "#TODO compiled but not tested\n#TODO missing script to properly move the binary\n[source]\ngit = \"https://github.com/swc-project/swc\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages swc_cli_impl\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/t-rec/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/sassman/t-rec-rs\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"imagemagick\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/tailspin/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/bensadeh/tailspin\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/tarlz/recipe.toml",
    "content": "#TODO missing header files\n[source]\ntar = \"https://download.savannah.gnu.org/releases/lzip/tarlz/tarlz-0.25.tar.lz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"lzlib\",\n]\nscript = \"\"\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/task-maker-rs/recipe.toml",
    "content": "#TODO tabox crate error\n[source]\ngit = \"https://github.com/edomora97/task-maker-rust\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/taskserver/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://taskwarrior.org/download/#quick-setup\n[source]\ntar = \"https://github.com/GothenburgBitFactory/taskserver/releases/download/v1.1.0/taskd-1.1.0.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/tools/taskwarrior/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://taskwarrior.org/download/#quick-setup\n[source]\ntar = \"https://github.com/GothenburgBitFactory/taskwarrior/releases/download/v2.6.2/task-2.6.2.tar.gz\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/tools/taskwarrior-tui/recipe.toml",
    "content": "#TODO rustyline crate error (after cargo update)\n[source]\ngit = \"https://github.com/kdheepak/taskwarrior-tui\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/tauno-monitor/recipe.toml",
    "content": "#TODO not compiled or tested\n# lacking build instructions\n[source]\ngit = \"https://github.com/taunoe/tauno-monitor\"\nrev = \"fecab98710bf6918141f34709f4ee1a055413056\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/tools/tealdeer/recipe.toml",
    "content": "#TODO program source code error (after cargo update)\n[source]\ngit = \"https://github.com/dbrgn/tealdeer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/teip/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/greymd/teip\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/thwack/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/yykamei/thwack\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/tin-summer/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/vmchale/tin-summer\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/tinywasm/recipe.toml",
    "content": "#TODO configuration error\n[source]\ngit = \"https://github.com/explodingcamera/tinywasm\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages tinywasm-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/tl-rs/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/NewDawn0/tl\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/tock/recipe.toml",
    "content": "#TODO working but don't exit\n[source]\ngit = \"https://github.com/nwtnni/tock\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/toipe/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/Samyak2/toipe\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/torrust-tracker/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/torrust/torrust-tracker\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/toybox/recipe.toml",
    "content": "#TODO missing script for GNU Make, see https://www.landley.net/toybox/code.html#building\n[source]\ntar = \"https://www.landley.net/toybox/downloads/toybox-0.8.9.tar.gz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/tp-note/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.com/getreu/tp-note\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\npackage=tpnote\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --package \"${package}\" \\\n            --release \\\n            --no-default-features \\\n            --features=lang-detection,renderer\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${package}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${package}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/tq/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/cryptaliagy/tq-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/treq/recipe.toml",
    "content": "#TODO openssl error (after cargo update)\n[source]\ngit = \"https://github.com/talis-fb/TReq\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/tsuchita/recipe.toml",
    "content": "#TODO update mio to 0.8 (after cargo update)\n[source]\ngit = \"https://github.com/kamiyaa/tsuchita\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/tts-tui/recipe.toml",
    "content": "#TODO make speech-dispatcher work\n[source]\ngit = \"https://github.com/lesleyrs/tts-tui\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"speech-dispatcher\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/ttyper/recipe.toml",
    "content": "#TODO replace the prompt with nothing on execution\n[source]\ngit = \"https://github.com/max-niederman/ttyper\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/tui-journal/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/AmmarAbouZor/tui-journal\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl3\",\n    \"sqlite3\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo\n\"\"\""
  },
  {
    "path": "recipes/wip/tools/tvix/recipe.toml",
    "content": "#TODO tvix-castore crate error (after cargo update)\n[source]\ngit = \"https://github.com/tvlfyi/tvix\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages tvix-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/typst/recipe.toml",
    "content": "#TODO compiled but not tested\n#TODO missing script to properly move the binary\n[source]\ngit = \"https://github.com/typst/typst\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages typst\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/upx/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/upx/upx/blob/devel/README.SRC\n[source]\ntar = \"https://github.com/upx/upx/releases/download/v4.2.1/upx-4.2.1-src.tar.xz\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/util-linux/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.39/util-linux-2.39.tar.xz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/tools/vector/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://vector.dev/docs/setup/installation/manual/from-source/\n[source]\ngit = \"https://github.com/vectordotdev/vector\"\nrev = \"86f1c22d7f00d7d80210a2704ea9f5061f74ee55\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/ventoy/recipe.toml",
    "content": "#TODO missing script for cross-compilation, see https://github.com/ventoy/Ventoy/blob/master/DOC/BuildVentoyFromSource.txt\n#TODO missing dependencies, try to figure out what it needs at build-time and runtime\n[source]\ngit = \"https://github.com/ventoy/Ventoy\"\nrev = \"3f65f0ef03e4aebcd14f233ca808a4f894657802\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/vincenzo/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/gabrieldemian/vincenzo\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages vcz\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/watchexec/recipe.toml",
    "content": "#TODO xdg-home and nix crates error\n[source]\ngit = \"https://github.com/watchexec/watchexec\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages watchexec-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/watchmen/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/ahriroot/watchmen\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages watchmen watchmend\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/wayback-rs/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/Neolex-Security/WaybackRust\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/wayshot/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://git.sr.ht/~shinyzenith/wayshot#compiling\n[source]\ngit = \"https://git.sr.ht/~shinyzenith/wayshot\"\nrev = \"d3cdd329fe8263d5eca2ff62635fcb6b6ae57645\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/wethr/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/risoflora/wethr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/weylus/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/H-M-H/Weylus#building\n[source]\ngit = \"https://github.com/H-M-H/Weylus\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"pango\",\n    \"gstreamer\",\n    \"dbus\",\n    \"libx11\",\n    \"libxext\",\n    \"libxft\",\n    \"libxinerama\",\n    \"libxcursor\",\n    \"libxfixes\",\n    \"libxtst\",\n    \"libxrandr\",\n    \"libxcomposite\",\n    \"libxv\",\n    \"libxi\",\n    \"libxrender\",\n    \"libdrm\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages weylus\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/wick/recipe.toml",
    "content": "#TODO Missing script for \"just\", see https://github.com/candlecorp/wick#install-from-source\n[source]\ngit = \"https://github.com/candlecorp/wick\"\nrev = \"7d498210c0cb729ee9b96d6fb226e0db3a514cba\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/tools/wpaperd/recipe.toml",
    "content": "#TODO make libxkbcommon work\n[source]\ngit = \"https://github.com/danyspin97/wpaperd\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libxkbcommon\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/xcp/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/tarka/xcp\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/xdg-utils/recipe.toml",
    "content": "#TODO compilation error\n[source]\ntar = \"https://portland.freedesktop.org/download/xdg-utils-1.1.3.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/tools/xdotool/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/jordansissel/xdotool/#building--compiling\n[source]\ngit = \"https://github.com/jordansissel/xdotool\"\nrev = \"eb489de1b4fb3fd0cd935d68ae16ecd4c653ac7d\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libx11\",\n    \"libxi\",\n    \"libxinerama\",\n    \"libxkbcommon\",\n    \"libxtst\",\n]\n"
  },
  {
    "path": "recipes/wip/tools/xdvdfs/recipe.toml",
    "content": "#TODO require a command to move the executable to a proper folder\n[source]\ngit = \"https://github.com/antangelo/xdvdfs\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages xdvdfs-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/xh/recipe.toml",
    "content": "#TODO network-interface crate error (after cargo update)\n[source]\ngit = \"https://github.com/ducaale/xh\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/xiu/recipe.toml",
    "content": "#TODO webrtc-util crate error (after cargo update)\n[source]\ngit = \"https://github.com/harlanc/xiu\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\nexport OPENSSL_STATIC=\"true\"\ncookbook_cargo_packages xiu\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tools/xorriso/recipe.toml",
    "content": "#TODO can't recognize the redox target\n[source]\ntar = \"https://www.gnu.org/software/xorriso/xorriso-1.5.6.pl02.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/tools/xsv/recipe.toml",
    "content": "#TODO update the redox_syscall version on the dependency tree\n[source]\ngit = \"https://github.com/BurntSushi/xsv\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tools/zet/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/yarrow/zet\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/finch/recipe.toml",
    "content": "#TODO missing dependencies\n[source]\ntar = \"https://sourceforge.net/projects/pidgin/files/Pidgin/2.14.12/pidgin-2.14.12.tar.bz2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncurses\",\n]\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-gtkui\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tui/gitu/recipe.toml",
    "content": "#TODO update the redox_syscall crate version\n[source]\ngit = \"https://github.com/altsem/gitu\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/gitui/recipe.toml",
    "content": "#TODO: Page fault\n[source]\ngit = \"https://github.com/extrawurst/gitui\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport OPENSSL_NO_VENDOR=1\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tui/gyr/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://git.sr.ht/~f9/gyr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/heh/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ndd7xv/heh\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/heretek/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/wcampbell0x2a/heretek\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/lazyjj/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Cretezy/lazyjj\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/manga-tui/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/josueBarretogit/manga-tui\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"dbus\",\n]\n"
  },
  {
    "path": "recipes/wip/tui/nnn/recipe.toml",
    "content": "#TODO write a script for cross-compilation\n# how to static link the libraries: https://github.com/jarun/nnn/wiki/Developer-guides#static-compilation\n[source]\ntar = \"https://github.com/jarun/nnn/releases/download/v5.0/nnn-v5.0.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ncursesw\",\n    \"readline\",\n]\n"
  },
  {
    "path": "recipes/wip/tui/nyaa-rs/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Beastwick18/nyaa\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/oatmeal/recipe.toml",
    "content": "#TODO openssl-sys crate error\n[source]\ngit = \"https://github.com/dustinblackman/oatmeal\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/otree/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/fioncat/otree\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/projectable/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/dzfrias/projectable\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/radicle-tui/recipe.toml",
    "content": "#TODO update the redox_syscall crate version\n[source]\ngit = \"https://seed.radicle.xyz/z39mP9rQAaGmERfUMPULfPUi473tY.git\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/regname/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/linkdd/regname\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/russ/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/ckampfe/russ\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/rust-kanban/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/yashs662/rust_kanban\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tui/rust-traverse/recipe.toml",
    "content": "#TODO trash crate error\n[source]\ngit = \"https://github.com/dmcg310/Rust-Traverse\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/syndicationd/recipe.toml",
    "content": "#TODO compiled but not tested\n#TODO add a command to properly move the executable\n[source]\ngit = \"https://github.com/ymgyt/syndicationd\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages synd-term\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tui/tenere/recipe.toml",
    "content": "#TODO sys-info crate error\n[source]\ngit = \"https://github.com/pythops/tenere\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/terminusdm/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/sumoduduk/terminusdm\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tui/termlaunch/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/amaterasu-uwu-xd/termlaunch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/termscp/recipe.toml",
    "content": "#TODO make dbus work\n[source]\ngit = \"https://github.com/veeso/termscp\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"dbus\",\n]\nscript = \"\"\"\ncookbook_cargo --no-default-features\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/tui/thesaurust/recipe.toml",
    "content": "#TODO openssl error\n[source]\ngit = \"https://github.com/QuietPigeon2001/thesaurust\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tui/tooters/recipe.toml",
    "content": "#TODO port the webbrowser crate\n[source]\ngit = \"https://github.com/joshka/tooters\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tui/tui-slides/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/Chleba/tui-slides\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/twitch-tui/recipe.toml",
    "content": "#TODO rustyline crate error\n[source]\ngit = \"https://github.com/Xithrius/twitch-tui\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/tui/xplr/recipe.toml",
    "content": "#TODO tuikit crate error\n[source]\ngit = \"https://github.com/sayanarijit/xplr\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/tui/zenith/recipe.toml",
    "content": "#TODO async-io and rustix crate errors (after cargo update)\n[source]\ngit = \"https://github.com/bvaisvil/zenith\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/vice/01_redox.patch",
    "content": "diff -rupNw source-original/configure source/configure\n--- source-original/configure\t2018-12-19 22:25:02.000000000 +0100\n+++ source/configure\t2019-02-12 17:09:41.954190921 +0100\n@@ -10320,54 +10320,6 @@ done\n test -n \"$DOS2UNIX\" || DOS2UNIX=\"dos2unix\"\n \n \n-for ac_prog in xa xa65\n-do\n-  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\n-set dummy $ac_prog; ac_word=$2\n-{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n-$as_echo_n \"checking for $ac_word... \" >&6; }\n-if ${ac_cv_prog_XA+:} false; then :\n-  $as_echo_n \"(cached) \" >&6\n-else\n-  if test -n \"$XA\"; then\n-  ac_cv_prog_XA=\"$XA\" # Let the user override the test.\n-else\n-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\n-for as_dir in $PATH\n-do\n-  IFS=$as_save_IFS\n-  test -z \"$as_dir\" && as_dir=.\n-    for ac_exec_ext in '' $ac_executable_extensions; do\n-  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n-    ac_cv_prog_XA=\"$ac_prog\"\n-    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n-    break 2\n-  fi\n-done\n-  done\n-IFS=$as_save_IFS\n-\n-fi\n-fi\n-XA=$ac_cv_prog_XA\n-if test -n \"$XA\"; then\n-  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $XA\" >&5\n-$as_echo \"$XA\" >&6; }\n-else\n-  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n-$as_echo \"no\" >&6; }\n-fi\n-\n-\n-  test -n \"$XA\" && break\n-done\n-test -n \"$XA\" || XA=\"no\"\n-\n-\n-if test x\"$XA\" = \"xno\"; then\n-  as_fn_error $? \"xa is missing\" \"$LINENO\" 5\n-fi\n-\n if test x\"$SVN\" != \"x\"; then\n   svnrevision=`$SVN 2>dummy.tmp info $srcdir | grep Revision | cut -d \" \" -f 2`\n   rm dummy.tmp\n@@ -15132,6 +15084,9 @@ fi\n done\n \n \n+UNIX_NETWORK_FUNCS_PRESENT=no\n+\n+\n     if test x\"$UNIX_NETWORK_FUNCS_PRESENT\" = \"xyes\"; then\n \n $as_echo \"#define HAVE_NETWORK /**/\" >>confdefs.h\ndiff -rupNw source-original/src/arch/sdl/rs232dev.c source/src/arch/sdl/rs232dev.c\n--- source-original/src/arch/sdl/rs232dev.c\t2018-08-13 20:18:45.000000000 +0200\n+++ source/src/arch/sdl/rs232dev.c\t2019-02-11 10:16:12.989841923 +0100\n@@ -27,7 +27,7 @@\n #include \"vice.h\"\n \n #ifdef UNIX_COMPILE\n-#include \"rs232dev-unix.c\"\n+//#include \"rs232dev-unix.c\"\n #endif\n \n #ifdef WIN32_COMPILE\ndiff -rupNw source-original/src/opencbm.h source/src/opencbm.h\n--- source-original/src/opencbm.h\t2018-08-22 21:01:32.000000000 +0200\n+++ source/src/opencbm.h\t2019-02-11 09:28:21.775162862 +0100\n@@ -117,6 +117,10 @@ typedef unsigned char __u_char;\n typedef unsigned char __u_char;\n #endif\n \n+#ifdef __redox__\n+typedef unsigned char __u_char;\n+#endif\n+\n #endif\n \n /* specifiers for the IEC bus lines */\ndiff -rupNw source-original/src/sound.c source/src/sound.c\n--- source-original/src/sound.c\t2018-12-17 19:44:43.000000000 +0100\n+++ source/src/sound.c\t2019-02-12 08:57:18.934381713 +0100\n@@ -1001,6 +1001,9 @@ int sound_open(void)\n             break;\n     }\n \n+    speed = 44100;\n+    channels = 2;\n+\n     /* find pdev */\n     for (i = 0; (pdev = sound_devices[i]); i++) {\n         if (!playname || (pdev->name && !strcasecmp(playname, pdev->name))) {\n"
  },
  {
    "path": "recipes/wip/vice/recipe.sh",
    "content": "VERSION=3.3\nTAR=https://sourceforge.net/projects/vice-emu/files/releases/vice-$VERSION.tar.gz/download\nTAR_SHA256=1a55b38cc988165b077808c07c52a779d181270b28c14b5c9abf4e569137431d\nBUILD_DEPENDS=(sdl1 liborbital)\n\nfunction recipe_version {\n    echo \"$VERSION\"\n    skip=1\n}\n\nfunction recipe_build {\n    sysroot=\"$(realpath ../sysroot)\"\n    wget -O config.sub \"https://gitlab.redox-os.org/redox-os/gnu-config/-/raw/master/config.sub?inline=false\"\n\n    export sdl_config=\"$sysroot/bin/sdl-config\"\n    export CFLAGS=\"-I$sysroot/include -I$sysroot/include/SDL\"\n    export CXXFLAGS=\"$CFLAGS\"\n    export LDFLAGS=\"-L$sysroot/lib -static\"\n\n    ./configure \\\n        --build=${BUILD} \\\n        --host=${HOST} \\\n        --prefix='' \\\n        --enable-sdlui \\\n        --disable-sdlui2 \\\n        --disable-rs232 \\\n        --disable-realdevice \\\n        --disable-midi\n    \"$REDOX_MAKE\" -j\"$COOKBOOK_MAKE_JOBS\"\n    skip=1\n}\n\nfunction recipe_clean {\n    \"$REDOX_MAKE\" clean\n    skip=1\n}\n\nfunction recipe_stage {\n    dest=\"$(realpath $1)\"\n    \"$REDOX_MAKE\" DESTDIR=\"$dest\" install\n    skip=1\n}\n"
  },
  {
    "path": "recipes/wip/video/camera/cosmic-ext-camera/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/cosmic-utils/camera\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/video/camera/tuicam/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/hlsxx/tuicam\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"opencv4\",\n]\n"
  },
  {
    "path": "recipes/wip/video/camera/webcamoid/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/webcamoid/webcamoid/wiki/Raw-build-and-install\n[source]\ngit = \"https://github.com/webcamoid/webcamoid\"\nrev = \"171b91e378c9bfbd4c425415322971e4e8872108\"\n[build]\ntemplate = \"cmake\"\ndependencies = [\n    \"qt5-base\",\n    \"qt5-declarative\",\n    \"qt5-quickcontrols2\",\n    \"qt5-svg\",\n]\n"
  },
  {
    "path": "recipes/wip/video/converters/handbrake-cli/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions - https://handbrake.fr/docs/en/1.7.0/developer/build-linux.html\n# dependencies - https://handbrake.fr/docs/en/1.7.0/developer/install-dependencies-ubuntu.html\n[source]\ntar = \"https://handbrake.fr/rotation.php?file=HandBrake-1.8.1-source.tar.bz2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libflac\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"harfbuzz\",\n    \"jansson\",\n    \"lame\",\n    \"libass\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libogg\",\n    \"libsamplerate\",\n    \"libtheora\",\n    \"libvorbis\",\n    \"libvpx\",\n    \"x264\",\n    \"libxml2\",\n    \"xz\",\n    \"libopus\",\n    \"speex\",\n]\nscript = \"\"\"\nCOOKBOOK_CONFIGURE_FLAGS+=(\n    --disable-gtk\n)\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/video/converters/trv/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/transformrs/trv\"\n[build]\ntemplate = \"cargo\"\n[package]\ndependencies = [\n    \"ffmpeg6\",\n    \"typst\",\n]\n"
  },
  {
    "path": "recipes/wip/video/editors/anime-effects/recipe.toml",
    "content": "#TODO missing script for QMake, see https://github.com/AnimeEffectsDevs/AnimeEffects#clone--building\n[source]\ngit = \"https://github.com/AnimeEffectsDevs/AnimeEffects\"\nrev = \"6080497684809aa5c73bf015fec36e88443f6d11\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ffmpeg6\",\n    \"mesa\",\n    \"qt5-base\",\n    \"glib\",\n]\n"
  },
  {
    "path": "recipes/wip/video/editors/blind/recipe.toml",
    "content": "#TODO missing script for gnu make\n#TODO verify if ffmpeg and imagemagick are needed at compile-time or run-time\n[source]\ntar = \"https://dl.suckless.org/tools/blind-1.1.tar.gz\"\n[build]\ntemplate = \"custom\"\n[package]\ndependencies = [\n    \"ffmpeg6\",\n    \"imagemagick\",\n]\n"
  },
  {
    "path": "recipes/wip/video/editors/openshot/recipe.toml",
    "content": "#TODO not compiled or tested\n# launch instructions: https://github.com/OpenShot/openshot-qt#launch\n[source]\ngit = \"https://github.com/OpenShot/openshot-qt\"\nrev = \"v3.3.0\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}/usr/bin/openshot-qt\"\ncp -rv \"${COOKBOOK_SOURCE}\"/src/* \"${COOKBOOK_STAGE}/usr/bin/openshot-qt\"\necho \"#!/usr/bin/env sh \\n python3 /usr/bin/openshot-qt/src/launch.py\" > \"${COOKBOOK_STAGE}\"/usr/bin/openshot\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/openshot\n\"\"\"\n[package]\ndependencies = [\n    \"libopenshot\",\n    \"libopenshot-audio\",\n]\n"
  },
  {
    "path": "recipes/wip/video/editors/video-trimmer/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://gitlab.gnome.org/YaLTeR/video-trimmer\"\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"gtk4\",\n    \"ffmpeg6\",\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/video/other/alass/recipe.toml",
    "content": "#TODO linker error (after cargo update)\n[source]\ngit = \"https://github.com/kaegi/alass\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages alass-cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/video/other/av1an/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/master-of-zen/Av1an\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"ffmpeg6\",\n]\nscript = \"\"\"\ncookbook_cargo_packages av1an\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/video/other/avp/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/rust-av/avp\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"sdl2\",\n]\n"
  },
  {
    "path": "recipes/wip/video/other/detect-scene-change/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/soruly/detect-scene-change\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/video/other/dovi-tool/recipe.toml",
    "content": "#TODO yeslogic-fontconfig-sys crate error\n[source]\ngit = \"https://github.com/quietvoid/dovi_tool\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/video/other/gnome-video-effects/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://download.gnome.org/sources/gnome-video-effects/0.6/gnome-video-effects-0.6.0.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/video/other/gopro-assembler/recipe.toml",
    "content": "#TODO camino crate error\n[source]\ngit = \"https://github.com/alichtman/gopro-chaptered-video-assembler\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/video/other/gyroflow/recipe.toml",
    "content": "#TODO maybe missing dependencies, see https://github.com/gyroflow/gyroflow/blob/master/_scripts/linux.just\n[source]\ngit = \"https://github.com/gyroflow/gyroflow\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"fontconfig\",\n    \"freetype2\",\n    \"ffmpeg6\",\n    \"qt6-base\",\n]\n"
  },
  {
    "path": "recipes/wip/video/other/imdb-rename/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/BurntSushi/imdb-rename\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/video/other/jerry/recipe.toml",
    "content": "#TODO fix fzf dependency\n[source]\ngit = \"https://github.com/justchokingaround/jerry\"\nshallow_clone = true\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp \"${COOKBOOK_SOURCE}\"/jerry.sh \"${COOKBOOK_STAGE}\"/usr/bin/jerry\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/jerry\n\"\"\"\n[package]\ndependencies = [\n    \"gnu-grep\",\n    \"sed\",\n    \"curl\",\n    #\"fzf\",\n    \"mpv\",\n]\n"
  },
  {
    "path": "recipes/wip/video/other/lecturecut/recipe.toml",
    "content": "#TODO update the redox_syscall crate version (after cargo update)\n[source]\ngit = \"https://github.com/LectureCut/CLI\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/video/other/lobster/recipe.toml",
    "content": "#TODO promote\n[source]\ngit = \"https://github.com/justchokingaround/lobster\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\ncp \"${COOKBOOK_SOURCE}\"/lobster.sh \"${COOKBOOK_STAGE}\"/usr/bin/lobster\nchmod a+x \"${COOKBOOK_STAGE}\"/usr/bin/lobster\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/video/other/pipeline/recipe.toml",
    "content": "#TODO make gtk4 work\n[source]\ntar = \"https://gitlab.com/schmiddi-on-mobile/pipeline/-/package_files/114831818/download\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk4\",\n    \"glib\",\n    \"libadwaita\",\n    \"gdk-pixbuf\",\n]\nscript = \"\"\"\ncookbook_cargo\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/glib-2.0/schemas\ncp -rv \"${COOKBOOK_SOURCE}\"/data/de.schmidhuberj.tubefeeder.gschema.xml \"${COOKBOOK_STAGE}\"/usr/share/glib-2.0/schemas\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/video/other/smoothie-rs/recipe.toml",
    "content": "#TODO rfd crate error\n[source]\ngit = \"https://github.com/couleur-tweak-tips/smoothie-rs\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/video/other/streamlib/recipe.toml",
    "content": "#TODO shared_child crate error (after cargo update)\n[source]\ngit = \"https://github.com/streamlib/streamlib\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/video/other/sub-batch/recipe.toml",
    "content": "#TODO interprocess crate error\n[source]\ngit = \"https://github.com/kl/sub-batch\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/video/other/teres/recipe.toml",
    "content": "#TODO missing dependencies, see https://github.com/animafps/teres/blob/main/CONTRIBUTING.md\n[source]\ngit = \"https://github.com/animafps/teres\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/video/other/timelens/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/timelens/timelens\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"gstreamer\",\n]\n"
  },
  {
    "path": "recipes/wip/video/other/trimmeroni/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://codeberg.org/outfrost/trimmeroni\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/video/other/vapoursynth/recipe.toml",
    "content": "#TODO maybe wrong script, see https://vapoursynth.com/doc/installation.html#linux-and-os-x-compilation\n[source]\ngit = \"https://github.com/vapoursynth/vapoursynth\"\nrev = \"3157049549a0940359b37004aeeeebd8f1db665e\"\nscript = \"./autogen.sh\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/video/other/video4discord/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Seebass22/video4discord\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages video4discord\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/video/other/vidmerger/recipe.toml",
    "content": "#TODO Not compiled or tested\n[source]\ngit = \"https://github.com/tgotwig/vidmerger\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"ffmpeg6\",\n]\n"
  },
  {
    "path": "recipes/wip/video/other/yt-chanvids/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/daniel-araujo/yt-chanvids\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/vm/cloud-hypervisor/recipe.toml",
    "content": "#TODO port to redox\n# required host dependencies - https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/building.md#install-prerequisites\n[source]\ngit = \"https://github.com/cloud-hypervisor/cloud-hypervisor\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/vm/crosvm/recipe.toml",
    "content": "#TODO port to redox\n#TODO maybe missing dependencies\n#TODO required host dependencies - https://github.com/google/crosvm/blob/main/tools/install-deps\n# feature flags - https://crosvm.dev/doc/crosvm/#feature-flags\n# how to use - https://crosvm.dev/book/running_crosvm/example_usage.html\n# examples - https://github.com/google/crosvm/tree/main/tools/examples\n[source]\ngit = \"https://chromium.googlesource.com/crosvm/crosvm\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"ffmpeg6\",\n    \"libcap\",\n    \"dbus\",\n    \"libepoxy\",\n    \"glib\",\n    \"libslirp\",\n]\n"
  },
  {
    "path": "recipes/wip/vm/firecracker/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/firecracker-microvm/firecracker\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages firecracker\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/vm/libguestfs/recipe.toml",
    "content": "#TODO determine the dependencies, read https://libguestfs.org/guestfs-building.1.html\n[source]\ntar = \"https://download.libguestfs.org/1.52-stable/libguestfs-1.52.1.tar.gz\"\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/vm/libvirt/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://libvirt.org/compiling.html#configuring-the-project\n[source]\ntar = \"https://download.libvirt.org/libvirt-10.7.0.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/vm/qemu/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/qemu.git\"\nshallow_clone = true\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"curl\",\n    \"gettext\",\n    \"glib\",\n    \"libffi\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"liborbital\",\n    \"libpng\",\n    \"libstdcxx\",\n    \"mesa\",\n    \"nghttp2\",\n    \"openssl1\",\n    \"pcre2\",\n    \"pixman\",\n    \"sdl2\",\n    \"sdl2-image\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --host=\"${TARGET}\"\n    --prefix=\"/usr\"\n    --cross-prefix=\"${TARGET}\"\n    --disable-coroutine-pool\n    --disable-dbus-display\n    --disable-tpm\n)\ncase \"${TARGET}\" in\n    aarch64-unknown-redox)\n        COOKBOOK_CONFIGURE_FLAGS+=(--target-list=aarch64-softmmu)\n        ;;\n    i586-unknown-redox | i686-unknown-redox)\n        COOKBOOK_CONFIGURE_FLAGS+=(--target-list=i386-softmmu)\n        ;;\n    x86_64-unknown-redox)\n        COOKBOOK_CONFIGURE_FLAGS+=(--target-list=x86_64-softmmu)\n        ;;\n    *)\n        echo \"unsupported target ${TARGET}\"\n        exit 1\n        ;;\nesac\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/vm/v86/recipe.toml",
    "content": "#TODO missing script for \"make\", see https://github.com/copy/v86#how-to-build-run-and-embed\n[source]\ngit = \"https://github.com/copy/v86\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/vm/virtualbox/recipe.toml",
    "content": "#TODO missing script for kbuild\n#TODO missing dependencies\n# build instructions:\n# https://www.virtualbox.org/wiki/Build_instructions\n# https://www.virtualbox.org/wiki/Linux%20build%20instructions\n# how to port - https://www.virtualbox.org/wiki/Porting_VirtualBox\n[source]\ntar = \"https://download.virtualbox.org/virtualbox/7.0.20/VirtualBox-7.0.20.tar.bz2\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libcap\",\n    \"curl\",\n    \"libopus\",\n    \"pulseaudio\",\n    \"qt5-3d\",\n    \"qt5-x11extras\",\n    \"qt5-tools\",\n    \"sdl1\",\n    \"sdl2-ttf\",\n    \"openssl1\",\n    \"libvpx\",\n    \"libxml2\",\n    \"libxslt\",\n    \"zlib\",\n    \"mesa\",\n]\n"
  },
  {
    "path": "recipes/wip/wayland/anvil/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\nsame_as = \"../smallvil\"\n\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libffi\",\n    \"libwayland\",\n    \"libxkbcommon\",\n]\ncargopackages = [\n    \"anvil\"\n]\n"
  },
  {
    "path": "recipes/wip/wayland/cosmic-app-library/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/cosmic-app-library\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gettext\",\n    \"libwayland\",\n    \"libxkbcommon\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport GETTEXT_DIR=\"${COOKBOOK_SYSROOT}/usr\"\ncookbook_cargo --no-default-features\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/cosmic-comp/recipe.toml",
    "content": "#TODO: performance issues, no keyboard input\n[source]\ngit = \"https://github.com/jackpot51/cosmic-comp\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libffi\",\n    #TODO: requires evdev and some udev implementation: \"libinput\",\n    \"libwayland\",\n    \"libxkbcommon\",\n    \"mesa\",\n    \"pixman\",\n    \"seatd\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo --no-default-features --config 'profile.release.lto = \"thin\"'\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/cosmic-panel/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/cosmic-panel\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gettext\",\n    #\"libffi\",\n    #TODO: requires evdev and some udev implementation: \"libinput\",\n    \"libwayland\",\n    \"libxkbcommon\",\n    #\"mesa\",\n    #\"pixman\",\n    #\"seatd\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport GETTEXT_DIR=\"${COOKBOOK_SYSROOT}/usr\"\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/cosmic-panel-bin\"\ncookbook_cargo --no-default-features\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/fht-compositor/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO enable the \"opt\" profile once wayland and eudev is working\n[source]\ngit = \"https://github.com/nferhat/fht-compositor\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libwayland\",\n    \"libxkbcommon\",\n    \"mesa\",\n]\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/wayland-sessions\ncp -rv \"${COOKBOOK_SOURCE}\"/res/fht-compositor.desktop \"${COOKBOOK_STAGE}\"/usr/share/wayland-sessions\npackage=fht-compositor\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --package \"${package}\" \\\n            --release\n            --winit-backend\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${package}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${package}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/hyprland/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://wiki.hyprland.org/Getting-Started/Installation/#cmake-recommended\n[source]\ngit = \"https://github.com/hyprwm/Hyprland\"\nrev = \"ed936430216e7aa5f6f53d22eff713f8e9ed69ac\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libinput\",\n    \"libxkbcommon\",\n    \"libxcb\",\n    \"pango\",\n    \"cairo\",\n    \"pixman\",\n    \"libwayland\",\n    \"seatd\",\n    \"libxrender\",\n    \"libx11\",\n    \"libxcomposite\",\n    \"libxfixes\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cmake\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/wayland-sessions\ncp -rv \"${COOKBOOK_SOURCE}\"/example/hyprland.desktop \"${COOKBOOK_STAGE}\"/usr/share/wayland-sessions\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/iced-wayland/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/iced.git\"\nbranch = \"redox-wayland\"\n\n[build]\ndependencies = [\n    \"libwayland\",\n    \"libxkbcommon\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages sctk_lazy\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/libcosmic-wayland/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/libcosmic.git\"\nbranch = \"redox-wayland\"\n\n[build]\ndependencies = [\n    \"libwayland\",\n    \"libxkbcommon\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_cargo_packages application\nmv \"${COOKBOOK_STAGE}/usr/bin/application\" \"${COOKBOOK_STAGE}/usr/bin/libcosmic-wayland_application\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/libwayland/recipe.toml",
    "content": "#TODO: Requires sys/signalfd.h SFD_CLOEXEC, sys/timerfd.h TFD_CLOEXEC\n#TODO: F_DUPFD_CLOEXEC, MSG_CMSG_CLOEXEC, MSG_NOSIGNAL TFD_TIMER_ABSTIME\n[source]\ntar = \"https://gitlab.freedesktop.org/wayland/wayland/-/releases/1.24.0/downloads/wayland-1.24.0.tar.xz\"\npatches = [\n    #FIXME: This patch is just a shim. Remove this patch\n    \"redox.patch\"\n]\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"libffi\",\n    \"expat\",\n    \"libxml2\",\n]\nmesonflags = [\n    \"-Ddocumentation=false\",\n    \"-Dtests=false\",\n    \"-Ddtd_validation=false\",\n]\n"
  },
  {
    "path": "recipes/wip/wayland/libwayland/redox.patch",
    "content": "diff -ruwN source-old/meson.build source/meson.build\n--- source-old/meson.build\t2025-07-06 06:11:26.000000000 -0600\n+++ source/meson.build\t2025-11-13 12:08:42.512612558 -0700\n@@ -80,8 +80,6 @@\n \tffi_dep = dependency('libffi')\n \n \tdecls = [\n-\t\t{ 'header': 'sys/signalfd.h', 'symbol': 'SFD_CLOEXEC' },\n-\t\t{ 'header': 'sys/timerfd.h', 'symbol': 'TFD_CLOEXEC' },\n \t\t{ 'header': 'time.h', 'symbol': 'CLOCK_MONOTONIC' },\n \t]\n \ndiff -ruwN source-old/src/connection.c source/src/connection.c\n--- source-old/src/connection.c\t2025-07-06 06:11:26.000000000 -0600\n+++ source/src/connection.c\t2025-11-13 12:08:42.512796844 -0700\n@@ -490,7 +490,7 @@\n \n \t\tdo {\n \t\t\tlen = sendmsg(connection->fd, &msg,\n-\t\t\t\t      MSG_NOSIGNAL | MSG_DONTWAIT);\n+\t\t\t\t      MSG_DONTWAIT);\n \t\t} while (len == -1 && errno == EINTR);\n \n \t\tif (len == -1)\n@@ -1506,8 +1506,10 @@\n \tchar *buffer;\n \tsize_t buffer_length;\n \n+#if !defined(__redox__)\n \tf = open_memstream(&buffer, &buffer_length);\n \tif (f == NULL)\n+#endif\n \t\treturn;\n \n \tclock_gettime(CLOCK_REALTIME, &tp);\ndiff -ruwN source-old/src/event-loop.c source/src/event-loop.c\n--- source-old/src/event-loop.c\t2025-07-06 06:11:26.000000000 -0600\n+++ source/src/event-loop.c\t2025-11-13 12:08:42.513005175 -0700\n@@ -35,8 +35,8 @@\n #include <sys/socket.h>\n #include <sys/un.h>\n #include <sys/epoll.h>\n-#include <sys/signalfd.h>\n-#include <sys/timerfd.h>\n+// #include <sys/signalfd.h>\n+// #include <sys/timerfd.h>\n #include <unistd.h>\n #include \"timespec-util.h\"\n #include \"wayland-util.h\"\n@@ -259,24 +259,13 @@\n \n static int\n set_timer(int timerfd, struct timespec deadline) {\n-\tstruct itimerspec its;\n-\n-\tits.it_interval.tv_sec = 0;\n-\tits.it_interval.tv_nsec = 0;\n-\tits.it_value = deadline;\n-\treturn timerfd_settime(timerfd, TFD_TIMER_ABSTIME, &its, NULL);\n+\treturn 0;\n }\n \n static int\n clear_timer(int timerfd)\n {\n-\tstruct itimerspec its;\n-\n-\tits.it_interval.tv_sec = 0;\n-\tits.it_interval.tv_nsec = 0;\n-\tits.it_value.tv_sec = 0;\n-\tits.it_value.tv_nsec = 0;\n-\treturn timerfd_settime(timerfd, 0, &its, NULL);\n+\treturn 0;\n }\n \n static void\n@@ -307,7 +296,7 @@\n wl_timer_heap_ensure_timerfd(struct wl_timer_heap *timers)\n {\n \tstruct epoll_event ep;\n-\tint timer_fd;\n+\tint timer_fd = 0;\n \n \tif (timers->base.fd != -1)\n \t\treturn 0;\n@@ -316,17 +305,6 @@\n \tep.events = EPOLLIN;\n \tep.data.ptr = timers;\n \n-\ttimer_fd = timerfd_create(CLOCK_MONOTONIC,\n-\t\t\t\t  TFD_CLOEXEC | TFD_NONBLOCK);\n-\tif (timer_fd < 0)\n-\t\treturn -1;\n-\n-\tif (epoll_ctl(timers->base.loop->epoll_fd,\n-\t\t      EPOLL_CTL_ADD, timer_fd, &ep) < 0) {\n-\t\tclose(timer_fd);\n-\t\treturn -1;\n-\t}\n-\n \ttimers->base.fd = timer_fd;\n \treturn 0;\n }\n@@ -677,11 +655,12 @@\n {\n \tstruct wl_event_source_signal *signal_source =\n \t\t(struct wl_event_source_signal *) source;\n-\tstruct signalfd_siginfo signal_info;\n+\t/*struct signalfd_siginfo signal_info;\n \tint len;\n \n \tlen = read(source->fd, &signal_info, sizeof signal_info);\n \tif (!(len == -1 && errno == EAGAIN) && len != sizeof signal_info)\n+\t*/\n \t\t/* Is there anything we can do here?  Will this ever happen? */\n \t\twl_log(\"signalfd read error: %s\\n\", strerror(errno));\n \n@@ -730,7 +709,7 @@\n \n \tsigemptyset(&mask);\n \tsigaddset(&mask, signal_number);\n-\tsource->base.fd = signalfd(-1, &mask, SFD_CLOEXEC | SFD_NONBLOCK);\n+\t// source->base.fd = signalfd(-1, &mask, SFD_CLOEXEC | SFD_NONBLOCK);\n \tsigprocmask(SIG_BLOCK, &mask, NULL);\n \n \tsource->func = func;\ndiff -ruwN source-old/src/meson.build source/src/meson.build\n--- source-old/src/meson.build\t2025-07-06 06:11:26.000000000 -0600\n+++ source/src/meson.build\t2025-11-13 12:08:42.513181686 -0700\n@@ -81,8 +81,7 @@\n endif\n \n if meson.is_cross_build() or not get_option('scanner')\n-\tscanner_dep = dependency('wayland-scanner', native: true, version: meson.project_version())\n-\twayland_scanner_for_build = find_program(scanner_dep.get_variable(pkgconfig: 'wayland_scanner'))\n+\twayland_scanner_for_build = find_program('wayland-scanner', native: true)\n else\n \twayland_scanner_for_build = wayland_scanner\n endif\ndiff -ruwN source-old/src/wayland-os.c source/src/wayland-os.c\n--- source-old/src/wayland-os.c\t2025-07-06 06:11:26.000000000 -0600\n+++ source/src/wayland-os.c\t2025-11-13 12:08:42.513310047 -0700\n@@ -134,11 +134,13 @@\n {\n \tint newfd;\n \n+#if defined(F_DUPFD_CLOEXEC)\n \tnewfd = wl_fcntl(fd, F_DUPFD_CLOEXEC, minfd);\n \tif (newfd >= 0)\n \t\treturn newfd;\n \tif (errno != EINVAL)\n \t\treturn -1;\n+#endif\n \n \tnewfd = wl_fcntl(fd, F_DUPFD, minfd);\n \treturn set_cloexec_or_close(newfd);\n@@ -189,7 +191,7 @@\n #else\n \tssize_t len;\n \n-\tlen = wl_recvmsg(sockfd, msg, flags | MSG_CMSG_CLOEXEC);\n+\tlen = wl_recvmsg(sockfd, msg, flags);\n \tif (len >= 0)\n \t\treturn len;\n \tif (errno != EINVAL)\ndiff -ruwN source-old/src/wayland-server.c source/src/wayland-server.c\n--- source-old/src/wayland-server.c\t2025-07-06 06:11:26.000000000 -0600\n+++ source/src/wayland-server.c\t2025-11-13 12:08:42.513500955 -0700\n@@ -39,7 +39,7 @@\n #include <dlfcn.h>\n #include <sys/time.h>\n #include <fcntl.h>\n-#include <sys/eventfd.h>\n+// #include <sys/eventfd.h>\n #include <sys/file.h>\n #include <sys/stat.h>\n \n@@ -1206,9 +1206,9 @@\n \t\treturn NULL;\n \t}\n \n-\tdisplay->terminate_efd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);\n-\tif (display->terminate_efd < 0)\n-\t\tgoto err_eventfd;\n+\t// display->terminate_efd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);\n+\t// if (display->terminate_efd < 0)\n+\t// \tgoto err_eventfd;\n \n \tdisplay->term_source = wl_event_loop_add_fd(display->loop,\n \t\t\t\t\t\t    display->terminate_efd,\n"
  },
  {
    "path": "recipes/wip/wayland/niri/recipe.toml",
    "content": "#TODO Port Smithay\n#TODO probably wrong script for configuration, see https://github.com/YaLTeR/niri#installation\n[source]\ngit = \"https://github.com/YaLTeR/niri\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libwayland\",\n]\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/bin\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/wayland-sessions\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/xdg-desktop-portal\ncp -rv \"${COOKBOOK_SOURCE}\"/resources/niri-session \"${COOKBOOK_STAGE}\"/usr/bin\ncp -rv \"${COOKBOOK_SOURCE}\"/resources/niri.desktop \"${COOKBOOK_STAGE}\"/usr/share/wayland-sessions\ncp -rv \"${COOKBOOK_SOURCE}\"/resources/niri-portals.conf \"${COOKBOOK_STAGE}\"/usr/share/xdg-desktop-portal\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/pinnacle/recipe.toml",
    "content": "#TODO make all dependencies work\n[source]\ngit = \"https://github.com/pinnacle-comp/pinnacle\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libwayland\",\n    \"libxkbcommon\",\n    \"libinput\",\n    \"libeudev\",\n    \"seatd\",\n]\nscript = \"\"\"\ncookbook_cargo_packages pinnacle\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/smallvil/recipe.toml",
    "content": "#TODO make libwayland work\n[source]\ngit = \"https://github.com/jackpot51/smithay\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"libffi\",\n    \"libwayland\",\n    \"libxkbcommon\",\n]\ncargopackages = [\n    \"smallvil\"\n]\n"
  },
  {
    "path": "recipes/wip/wayland/softbuffer-wayland/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/softbuffer.git\"\nbranch = \"redox-wayland\"\n\n[build]\ndependencies = [\n    \"libwayland\"\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport RUSTFLAGS=\"${RUSTFLAGS} -lffi\"\ncookbook_cargo_examples animation rectangle winit\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/sway/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/swaywm/sway#compiling-from-source\n[source]\ntar = \"https://github.com/swaywm/sway/releases/download/1.9/sway-1.9.tar.gz\"\nblake3 = \"6ae892f82daedef76d26e32c64ebd09cc454ae71f416d2179a512f7764138268\"\n\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"glib\",\n    \"harfbuzz\",\n    \"json-c\",\n    \"libdrm\",\n    \"libffi\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libwayland\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxft\",\n    \"libxkbcommon\",\n    \"libxrender\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"wayland-protocols\",\n    \"wlroots\",\n    \"x11proto\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/wayland/wayland-protocols/recipe.toml",
    "content": "[source]\ntar = \"https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/1.32/downloads/wayland-protocols-1.32.tar.xz\"\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dtests=false\"\n]\n"
  },
  {
    "path": "recipes/wip/wayland/wayland-rs/recipe.toml",
    "content": "#TODO make libwayland work\n[source]\ngit = \"https://github.com/jackpot51/wayland-rs\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libffi\",\n    \"libwayland\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport RUSTFLAGS=\"${RUSTFLAGS} -lffi\"\ncookbook_cargo_examples list_globals_no_dispatch list_globals simple_window\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/wayland-utils/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.freedesktop.org/wayland/wayland-utils#building\n[source]\ntar = \"https://gitlab.freedesktop.org/wayland/wayland-utils/-/releases/1.2.0/downloads/wayland-utils-1.2.0.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/wayland/waylandpp/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/NilsBrause/waylandpp#building\n[source]\ngit = \"https://github.com/NilsBrause/waylandpp\"\n[build]\ntemplate = \"cmake\"\n"
  },
  {
    "path": "recipes/wip/wayland/winit-wayland/recipe.toml",
    "content": "[source]\ngit = \"https://github.com/jackpot51/winit.git\"\nbranch = \"redox-wayland\"\n\n[build]\ndependencies = [\n    \"libwayland\"\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport RUSTFLAGS=\"${RUSTFLAGS} -lffi\"\ncookbook_cargo_examples child_window control_flow pump_events window\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/wayland/wlroots/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://gitlab.freedesktop.org/wlroots/wlroots#building\n[source]\ntar = \"https://gitlab.freedesktop.org/wlroots/wlroots/-/releases/0.17.0/downloads/wlroots-0.17.0.tar.gz\"\nblake3 = \"f119e53d1f1dd5c8d4c348b0ebc2a780cf4174d158995356a087b26c3bc7d222\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"cairo\",\n    \"expat\",\n    \"freetype2\",\n    \"fontconfig\",\n    \"libdrm\",\n    \"libffi\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libwayland\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxkbcommon\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pixman\",\n    \"wayland-protocols\",\n    \"x11proto\",\n    \"zlib\",\n]"
  },
  {
    "path": "recipes/wip/wayland/wlroots/redox.patch",
    "content": "diff -ruwN source-old/protocol/meson.build source/protocol/meson.build\n--- source-old/protocol/meson.build\t2023-11-21 09:06:13.000000000 -0700\n+++ source/protocol/meson.build\t2025-10-30 17:22:43.903323248 -0600\n@@ -5,9 +5,8 @@\n )\n wl_protocol_dir = wayland_protos.get_variable('pkgdatadir')\n \n-wayland_scanner_dep = dependency('wayland-scanner', native: true)\n wayland_scanner = find_program(\n-\twayland_scanner_dep.get_variable('wayland_scanner'),\n+\t'wayland-scanner',\n \tnative: true,\n )\n \ndiff -ruwN source-old/render/dmabuf.c source/render/dmabuf.c\n--- source-old/render/dmabuf.c\t2023-11-21 09:06:13.000000000 -0700\n+++ source/render/dmabuf.c\t2025-10-30 17:33:46.223683923 -0600\n@@ -5,6 +5,11 @@\n #include <wlr/util/log.h>\n #include \"render/dmabuf.h\"\n \n+#if defined(__redox__)\n+//TODO: F_DUPFD_CLOEXEC needed for atomic close on exec\n+#define F_DUPFD_CLOEXEC F_DUPFD\n+#endif\n+\n void wlr_dmabuf_attributes_finish(struct wlr_dmabuf_attributes *attribs) {\n \tfor (int i = 0; i < attribs->n_planes; ++i) {\n \t\tclose(attribs->fd[i]);\n"
  },
  {
    "path": "recipes/wip/wayland/xwayland/recipe.toml",
    "content": "#TODO wayland-client, fix linux/input, wayland-scanner shim\n[source]\ntar = \"https://www.x.org/releases/individual/xserver/xwayland-24.1.8.tar.xz\"\npatches = [\n    \"redox.patch\"\n]\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"libpthread-stubs\",\n    \"libepoxy\",\n    \"libxkbfile\",\n    \"libxfont2\",\n    \"libffi\",\n    \"libpng\",\n    \"pixman\",\n    \"x11proto\",\n    \"xtrans\",\n    \"libxau\",\n    \"libx11\",\n    \"libxcb\",\n    \"openssl1\",\n    \"freetype2\", \n    \"libwayland\",\n    \"libfontenc\", \n    \"wayland-protocols\",\n    \"zlib\",\n    \"libxcvt\",\n    \"libxdmcp\",\n    \"libxshmfence\",\n]\nmesonflags = [\n    \"-Ddrm=false\",\n    \"-Dglamor=false\",\n    \"-Dglx=false\",\n    \"-Dsecure-rpc=false\",\n    \"-Dmitshm=false\",\n]\n"
  },
  {
    "path": "recipes/wip/wayland/xwayland/redox.patch",
    "content": "diff -ruwN source/hw/xwayland/meson.build source-new/hw/xwayland/meson.build\n--- source/hw/xwayland/meson.build\t2024-01-16 16:38:49.000000000 +0700\n+++ source-new/hw/xwayland/meson.build\t2025-10-01 07:51:14.456575515 +0700\n@@ -30,8 +30,7 @@\n     '../../mi/miinitext.h',\n ]\n \n-scanner_dep = dependency('wayland-scanner', native: true)\n-scanner = find_program(scanner_dep.get_pkgconfig_variable('wayland_scanner'))\n+scanner =  find_program('wayland-scanner', native: true)\n \n protocols_dep = dependency('wayland-protocols', version: wayland_protocols_req)\n protodir = protocols_dep.get_pkgconfig_variable('pkgdatadir')\n@@ -55,11 +54,7 @@\n     arguments : ['client-header', '@INPUT@', '@OUTPUT@']\n )\n \n-if scanner_dep.version().version_compare('>= 1.14.91')\n     scanner_argument = 'private-code'\n-else\n-    scanner_argument = 'code'\n-endif\n \n code = generator(scanner,\n     output : '@BASENAME@-protocol.c',\ndiff -ruwN source/hw/xwayland/xwayland-glamor.h source-new/hw/xwayland/xwayland-glamor.h\n--- source/hw/xwayland/xwayland-glamor.h\t2024-01-16 16:38:49.000000000 +0700\n+++ source-new/hw/xwayland/xwayland-glamor.h\t2025-10-01 08:01:01.409102814 +0700\n@@ -31,7 +31,7 @@\n #include <sys/types.h>\n \n #include <wayland-client.h>\n-#include <xf86drm.h>\n+// #include <xf86drm.h>\n \n #include \"xwayland-types.h\"\n \n@@ -103,7 +103,7 @@\n     /* Called to get the DRM device of the primary GPU that this backend\n      * is set up on.\n      */\n-    drmDevice *(*get_main_device)(struct xwl_screen *xwl_screen);\n+    // drmDevice *(*get_main_device)(struct xwl_screen *xwl_screen);\n \n     /* Direct hook to create the backing pixmap for a window */\n     PixmapPtr (*create_pixmap_for_window)(struct xwl_window *xwl_window);\ndiff -ruwN source/hw/xwayland/xwayland-input.c source-new/hw/xwayland/xwayland-input.c\n--- source/hw/xwayland/xwayland-input.c\t2024-01-16 16:38:49.000000000 +0700\n+++ source-new/hw/xwayland/xwayland-input.c\t2025-10-01 08:02:59.681082380 +0700\n@@ -26,7 +26,7 @@\n \n #include <xwayland-config.h>\n \n-#include <linux/input.h>\n+// #include <linux/input.h>\n #include <sys/mman.h>\n \n #include <inputstr.h>\n@@ -758,6 +758,7 @@\n     xwl_seat->xwl_screen->serial = serial;\n \n     switch (button) {\n+/*\n     case BTN_LEFT:\n         index = 1;\n         break;\n@@ -768,10 +769,9 @@\n         index = 3;\n         break;\n     default:\n-        /* Skip indexes 4-7: they are used for vertical and horizontal scroll.\n-           The rest of the buttons go in order: BTN_SIDE becomes 8, etc. */\n         index = 8 + button - BTN_SIDE;\n         break;\n+*/\n     }\n \n     valuator_mask_zero(&mask);\n@@ -1057,7 +1057,7 @@\n \n     state_rec = xwl_seat->keyboard->key->xkbInfo->state;\n     xkb_state = (XkbStateFieldFromRec(&state_rec) & 0xff);\n-\n+    /*\n     if (((key == KEY_LEFTSHIFT || key == KEY_RIGHTSHIFT) && (xkb_state & ControlMask)) ||\n         ((key == KEY_LEFTCTRL || key == KEY_RIGHTCTRL) && (xkb_state & ShiftMask))) {\n \n@@ -1072,6 +1072,7 @@\n         if (xwl_window)\n             xwl_window_rootful_update_title(xwl_window);\n     }\n+    */\n }\n \n static void\ndiff -ruwN source/hw/xwayland/xwayland-window.c source-new/hw/xwayland/xwayland-window.c\n--- source/hw/xwayland/xwayland-window.c\t2024-01-16 16:38:49.000000000 +0700\n+++ source-new/hw/xwayland/xwayland-window.c\t2025-10-01 08:00:07.858324820 +0700\n@@ -1102,7 +1102,7 @@\n     for (int j = 0; j < dev_formats->num_formats; j++)\n         free(dev_formats->formats[j].modifiers);\n     free(dev_formats->formats);\n-    drmFreeDevice(&dev_formats->drm_dev);\n+    // drmFreeDevice(&dev_formats->drm_dev);\n }\n \n void\ndiff -ruwN source/hw/xwayland/xwayland-window.h source-new/hw/xwayland/xwayland-window.h\n--- source/hw/xwayland/xwayland-window.h\t2024-01-16 16:38:49.000000000 +0700\n+++ source-new/hw/xwayland/xwayland-window.h\t2025-10-01 08:00:40.464798537 +0700\n@@ -38,7 +38,7 @@\n #include <propertyst.h>\n #include <validate.h>\n #include <wayland-util.h>\n-#include <xf86drm.h>\n+// #include <xf86drm.h>\n \n #include \"xwayland-types.h\"\n \n@@ -55,7 +55,7 @@\n };\n \n struct xwl_device_formats {\n-    drmDevice *drm_dev;\n+    // drmDevice *drm_dev;\n     int supports_scanout;\n     uint32_t num_formats;\n     struct xwl_format *formats;\n@@ -75,7 +75,7 @@\n struct xwl_dmabuf_feedback {\n     struct zwp_linux_dmabuf_feedback_v1 *dmabuf_feedback;\n     struct xwl_format_table format_table;\n-    drmDevice *main_dev;\n+    // drmDevice *main_dev;\n     /*\n      * This will be filled in during wl events and copied to\n      * dev_formats on dmabuf_feedback.tranche_done\ndiff -ruwN source/os/access.c source-new/os/access.c\n--- source/os/access.c\t2024-01-16 16:38:49.000000000 +0700\n+++ source-new/os/access.c\t2025-10-01 07:22:43.931644468 +0700\n@@ -446,7 +446,7 @@\n     int family;\n     register HOST *host;\n \n-#ifndef WIN32\n+#if !defined(WIN32) && !defined(__redox__)\n     struct utsname name;\n #else\n     struct {\n@@ -477,7 +477,7 @@\n      * uname() lets me access to the whole string (it smashes release, you\n      * see), whereas gethostname() kindly truncates it for me.\n      */\n-#ifndef WIN32\n+#if !defined(WIN32) && !defined(__redox__)\n     uname(&name);\n #else\n     gethostname(name.nodename, sizeof(name.nodename));\n"
  },
  {
    "path": "recipes/wip/web/basilisk/recipe.toml",
    "content": "#TODO determine build instructions: https://repo.palemoon.org/Basilisk-Dev/Basilisk/src/branch/master/build-scripts/linux/build_basilisk_subscripts/run_inside_docker.sh\n# dependencies: https://basilisk-browser.org/requirements.html\n[source]\ntar = \"https://dl.basilisk-browser.org/basilisk-2025.10.10-source.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk3\",\n    \"glib\",\n    \"pango\",\n    \"dbus\",\n    \"libalsa\",\n    \"libxt\",\n    \"openssl3\",\n    \"sqlite3\",\n    \"libpulse\",\n]\n"
  },
  {
    "path": "recipes/wip/web/chromium/recipe.toml",
    "content": "#TODO missing script for building: https://chromium.googlesource.com/chromium/src/+/main/docs/linux/build_instructions.md\n#TODO determine minimum dependencies\n# dependencies reference:\n# https://chromium.googlesource.com/chromium/src/+/main/build/install-build-deps.py#214\n# https://chromium.googlesource.com/chromium/src/+/main/build/install-build-deps.py#355\n[source]\ntar = \"https://commondatastorage.googleapis.com/chromium-browser-official/chromium-119.0.6045.123.tar.xz\"\n[build]\ntemplate = \"custom\"\n# dependencies = [\n#     \"gtk3\",\n#     \"nss\",\n#     \"nspr\",\n#     \"xdg-utils\",\n#     \"libgcrypt\",\n#     \"dbus\",\n#     \"libva\",\n#     \"libffi\",\n#     \"fontconfig\",\n#     \"libjpeg\",\n#     \"libflac\",\n#     \"libxml2\",\n#     \"ffmpeg6\",\n#     \"libwebp\",\n#     \"opus\",\n#     \"harfbuzz\",\n#     \"libpng\",\n#     \"freetype2\",\n#     \"bzip2\",\n#     \"expat\",\n#     \"glib\",\n#     \"cairo\",\n#     \"atk\",\n#     \"libcap\",\n#     \"pango\",\n#     \"java21\",\n#     \"libpulse\",\n#     \"libx11\",\n#     \"libxtst\",\n#     \"libxkbcommon\",\n# ]\nscript = \"\"\"\nDYNAMIC_INIT\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/web/dillo/recipe.toml",
    "content": "#TODO not compiled or tested\n# build instructions: https://github.com/dillo-browser/dillo/blob/master/doc/install.md\n[source]\ntar = \"https://github.com/dillo-browser/dillo/releases/download/v3.2.0/dillo-3.2.0.tar.bz2\"\n[build]\ntemplate = \"configure\"\ndependencies = [\n    \"fltk13\",\n    \"openssl3\",\n    \"zlib\",\n    \"libpng\",\n    \"libjpeg\",\n    \"libwebp\",\n    \"libbrotli\",\n]\n"
  },
  {
    "path": "recipes/wip/web/dirble/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/Isona/dirble\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"openssl1\",\n]\n"
  },
  {
    "path": "recipes/wip/web/dodeca/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/bearcove/dodeca\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\ncookbook_cargo_packages dodeca\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/web/elinks/recipe.toml",
    "content": "#TODO not compiled or tested\n#TODO determine dependencies\n# build instructions: https://github.com/rkd77/elinks/blob/master/INSTALL\n[source]\ntar = \"https://github.com/rkd77/elinks/releases/download/v0.18.0/elinks-0.18.0.tar.xz\"\n[build]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/web/faircamp/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://codeberg.org/simonrepp/faircamp\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/web/firefox-esr/mozconfig",
    "content": "mk_add_options MOZ_OBJDIR=COOKBOOK_BUILD\nac_add_options --target=TARGET\nac_add_options --disable-debug\nac_add_options --disable-tests\nac_add_options --disable-audio-backends\nac_add_options --disable-crashreporter\nac_add_options --disable-updater\nac_add_options --disable-dbus\nac_add_options --disable-gecko-profiler\nac_add_options --disable-profiling\nac_add_options --disable-dmd # dark matter detector\nac_add_options --without-wasm-sandboxed-libraries # need clang wasi\n\n# TODO: cairo-gtk3-x11-wayland or separate cairo-gtk3-wayland-only\nac_add_options --enable-default-toolkit=cairo-gtk3-x11-only\nac_add_options --enable-bootstrap=-clang # only use our clang\nac_add_options --enable-optimize\nac_add_options --with-system-nspr\nac_add_options --with-gl-provider=EGL\n\nexport MOZ_REQUIRE_SIGNING=\nexport MOZ_TELEMETRY_REPORTING=\nexport CC=\"TARGET_CC\"\nexport CXX=\"TARGET_CXX\"\n"
  },
  {
    "path": "recipes/wip/web/firefox-esr/recipe.toml",
    "content": "#TODO patches for quinn-udp crate, switch into git fork\n# mach: https://firefox-source-docs.mozilla.org/setup/linux_build.html\n# dependencies: https://packages.gentoo.org/packages/www-client/firefox/dependencies\n# feature flags: https://wiki.gentoo.org/wiki/Firefox#USE_flags\n[source]\ntar = \"https://ftp.mozilla.org/pub/firefox/releases/140.7.0esr/source/firefox-140.7.0esr.source.tar.xz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    # \"fontconfig\",\n    # \"atk\",\n    # \"cairo\",\n    \"dbus\",\n    # \"libffi\",\n    # \"freetype2\",\n    # \"gdk-pixbuf\",\n    # \"glib\",\n    \"gtk3\",\n    \"pango\",\n    \"libxkbcommon-x11\",\n    \"libice\",\n    \"mesa-x11\",\n    \"x11proto-kb\",\n    \"xcb-proto\",\n    \"xextproto\",\n    \"nspr\",\n    \"libxrandr\",\n    \"libsm\",\n# TODO: Should separate clang library and runtime \n    \"clang21\"\n    # \"sqlite3\",\n    # \"nss-nspr\",\n    # \"startup-notification\",\n    # \"zlib\",\n    # \"ffmpeg6\",\n    # \"expat\",\n    # \"libepoxy\",\n    # \"pipewire\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\ncat ${COOKBOOK_RECIPE}/mozconfig > mozconfig\nsed -i \"s|COOKBOOK_BUILD|${COOKBOOK_BUILD}|g\" mozconfig\nsed -i \"s|TARGET_CC|${CC}|g\" mozconfig\nsed -i \"s|TARGET_CXX|${CXX}|g\" mozconfig\nsed -i \"s|TARGET|${TARGET}|g\" mozconfig\nexport MOZCONFIG=\"${COOKBOOK_BUILD}/mozconfig\"\nexport PYTHONDONTWRITEBYTECODE=1\nunset CC_WRAPPER\nif [[ -z \"$CI\" ]]; then export MACH_NO_TERMINAL_FOOTER=1; fi;\n\n# clang-sys specifics\nPREFIX_INCLUDE=\"$COOKBOOK_HOST_SYSROOT/$TARGET/include\"\nexport CLANGFLAGS=\"-I $PREFIX_INCLUDE/c++/13.2.0 -I $PREFIX_INCLUDE/c++/13.2.0/$TARGET -I $PREFIX_INCLUDE/c++/13.2.0/backward\"\nexport CLANGFLAGS=\"$CLANGFLAGS -I $PREFIX_INCLUDE -I $COOKBOOK_SYSROOT/lib/clang/21/include -D__redox__\"\nexport BINDGEN_EXTRA_CLANG_ARGS_x86_64_unknown_redox=\"-target x86_64-unknown-redox -nostdinc $CLANGFLAGS\"\nexport LLVM_CONFIG_PATH=\"$COOKBOOK_TOOLCHAIN/bin/llvm-config\"\n\n# Don't poison the stage1 compiler (host -> host)\nunset AR AS CC CXX LD LDFLAGS NM OBJCOPY OBJDUMP RANLIB READELF RUSTFLAGS STRIP\n\n(cd ${COOKBOOK_SOURCE} && ./mach build)\nrsync -a ./dist ${COOKBOOK_STAGE}\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/web/firefox-esr/redox.patch",
    "content": "diff --color -ruwN source/build/moz.configure/init.configure source-new/build/moz.configure/init.configure\n--- source/build/moz.configure/init.configure\t2026-01-07 04:09:42.000000000 +0700\n+++ source-new/build/moz.configure/init.configure\t2026-01-27 12:48:28.508789372 +0700\n@@ -511,6 +511,8 @@\n         canonical_os = canonical_kernel = \"NetBSD\"\n     elif os.startswith(\"openbsd\"):\n         canonical_os = canonical_kernel = \"OpenBSD\"\n+    elif os.startswith(\"redox\"):\n+        canonical_os = canonical_kernel = \"Redox\"\n     elif os.startswith(\"solaris\"):\n         canonical_os = canonical_kernel = \"SunOS\"\n     elif os.startswith(\"wasi\") and allow_wasi:\n@@ -934,6 +936,14 @@\n \n set_define(\"XP_FREEBSD\", target_is_freebsd)\n \n+@depends(target)\n+def target_is_redox(target):\n+    if target.kernel == \"Redox\":\n+        return True\n+\n+\n+set_define(\"XP_REDOX\", target_is_redox)\n+\n \n @depends(target)\n def target_is_solaris(target):\ndiff --color -ruwN source/mozglue/misc/PlatformMutex.h source-new/mozglue/misc/PlatformMutex.h\n--- source/mozglue/misc/PlatformMutex.h\t2026-01-07 04:09:50.000000000 +0700\n+++ source-new/mozglue/misc/PlatformMutex.h\t2026-01-27 13:12:16.262181670 +0700\n@@ -48,7 +48,7 @@\n \n   PlatformData* platformData();\n \n-#if !defined(XP_WIN) && !defined(__wasi__)\n+#if !defined(XP_WIN) && !defined(__wasi__) && !defined(__redox__)\n   void* platformData_[sizeof(pthread_mutex_t) / sizeof(void*)];\n   static_assert(sizeof(pthread_mutex_t) / sizeof(void*) != 0 &&\n                     sizeof(pthread_mutex_t) % sizeof(void*) == 0,\ndiff --color -ruwN source/python/mozbuild/mozbuild/configure/constants.py source-new/python/mozbuild/mozbuild/configure/constants.py\n--- source/python/mozbuild/mozbuild/configure/constants.py\t2026-01-07 04:09:50.000000000 +0700\n+++ source-new/python/mozbuild/mozbuild/configure/constants.py\t2026-01-27 09:16:48.349211711 +0700\n@@ -40,6 +40,7 @@\n         \"NetBSD\",\n         \"OpenBSD\",\n         \"OSX\",\n+        \"Redox\",\n         \"SunOS\",\n         \"WINNT\",\n         \"WASI\",\n@@ -55,6 +56,7 @@\n         \"Linux\",\n         \"NetBSD\",\n         \"OpenBSD\",\n+        \"Redox\",\n         \"SunOS\",\n         \"WINNT\",\n         \"WASI\",\n@@ -146,6 +148,7 @@\n     \"Linux\": \"__linux__\",\n     \"NetBSD\": \"__NetBSD__\",\n     \"OpenBSD\": \"__OpenBSD__\",\n+    \"Redox\": \"__redox__\",\n     \"SunOS\": \"__sun__\",\n     \"WINNT\": \"_WIN32 || __CYGWIN__\",\n     \"WASI\": \"__wasi__\",\ndiff --color -ruwN source/xpcom/build/BinaryPath.h source-new/xpcom/build/BinaryPath.h\n--- source/xpcom/build/BinaryPath.h\t2026-01-07 04:09:59.000000000 +0700\n+++ source-new/xpcom/build/BinaryPath.h\t2026-01-27 12:51:20.922621049 +0700\n@@ -133,11 +133,15 @@\n     return rv;\n   }\n \n-#elif defined(ANDROID)\n+#elif defined(ANDROID) || defined(XP_REDOX)\n   static nsresult Get(char aResult[MAXPATHLEN]) {\n     // On Android, we use the MOZ_ANDROID_LIBDIR variable that is set by the\n     // Java bootstrap code.\n+#if defined(XP_REDOX)\n+    const char* libDir = getenv(\"MOZ_REDOX_LIBDIR\");\n+#else\n     const char* libDir = getenv(\"MOZ_ANDROID_LIBDIR\");\n+#endif\n     if (!libDir) {\n       return NS_ERROR_FAILURE;\n     }\ndiff --color -ruwN source/Cargo.lock source-new/Cargo.lock\n--- source/Cargo.lock\t2026-01-07 04:09:41.000000000 +0700\n+++ source-new/Cargo.lock\t2026-01-27 19:15:51.024103229 +0700\n@@ -3724,6 +3724,16 @@\n checksum = \"348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb\"\n \n [[package]]\n+name = \"libredox\"\n+version = \"0.1.12\"\n+source = \"registry+https://github.com/rust-lang/crates.io-index\"\n+checksum = \"3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616\"\n+dependencies = [\n+ \"bitflags 2.9.0\",\n+ \"libc\",\n+]\n+\n+[[package]]\n name = \"libsqlite3-sys\"\n version = \"0.31.0\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n@@ -5586,11 +5596,23 @@\n \n [[package]]\n name = \"redox_syscall\"\n-version = \"0.5.999\"\n+version = \"0.5.18\"\n+source = \"registry+https://github.com/rust-lang/crates.io-index\"\n+checksum = \"ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d\"\n+dependencies = [\n+ \"bitflags 2.9.0\",\n+]\n \n [[package]]\n name = \"redox_users\"\n-version = \"0.4.999\"\n+version = \"0.4.6\"\n+source = \"registry+https://github.com/rust-lang/crates.io-index\"\n+checksum = \"ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43\"\n+dependencies = [\n+ \"getrandom 0.2.999\",\n+ \"libredox\",\n+ \"thiserror 1.999.999\",\n+]\n \n [[package]]\n name = \"regex\"\ndiff --color -ruwN source/Cargo.toml source-new/Cargo.toml\n--- source/Cargo.toml\t2026-01-07 04:09:40.000000000 +0700\n+++ source-new/Cargo.toml\t2026-01-27 19:14:06.467281854 +0700\n@@ -134,12 +134,6 @@\n # Patch r-efi to an empty crate\n r-efi = { path = \"build/rust/r-efi\" }\n \n-# Patch redox_users to an empty crate\n-redox_users = { path = \"build/rust/redox_users\" }\n-\n-# Patch redox_syscall to an empty crate\n-redox_syscall = { path = \"build/rust/redox_syscall\" }\n-\n # Patch hermit-abi to an empty crate\n hermit-abi = { path = \"build/rust/hermit-abi\" }\n \ndiff --color -ruwN source/ipc/chromium/src/base/platform_thread.h source-new/ipc/chromium/src/base/platform_thread.h\n--- source/ipc/chromium/src/base/platform_thread.h\t2026-01-07 04:09:45.000000000 +0700\n+++ source-new/ipc/chromium/src/base/platform_thread.h\t2026-01-27 18:12:57.887138642 +0700\n@@ -24,7 +24,7 @@\n #else\n #  include <pthread.h>\n typedef pthread_t PlatformThreadHandle;\n-#  if defined(XP_LINUX) || defined(XP_OPENBSD) || defined(XP_SOLARIS) || \\\n+#  if defined(XP_LINUX) || defined(XP_OPENBSD) || defined(XP_REDOX) || defined(XP_SOLARIS) || \\\n       defined(__GLIBC__)\n #    include <unistd.h>\n typedef pid_t PlatformThreadId;\ndiff --color -ruwN source/mozglue/misc/TimeStamp_posix.cpp source-new/mozglue/misc/TimeStamp_posix.cpp\n--- source/mozglue/misc/TimeStamp_posix.cpp\t2026-01-07 04:09:50.000000000 +0700\n+++ source-new/mozglue/misc/TimeStamp_posix.cpp\t2026-01-27 17:59:05.200260121 +0700\n@@ -13,7 +13,10 @@\n // obtained with this API; see TimeDuration::Resolution;\n //\n \n+\n+#if !defined(__redox__)\n #include <sys/syscall.h>\n+#endif\n #include <time.h>\n #include <unistd.h>\n #include <string.h>\ndiff --color -ruwN source/supply-chain/audits.toml source-new/supply-chain/audits.toml\n--- source/supply-chain/audits.toml\t2026-01-07 04:09:51.000000000 +0700\n+++ source-new/supply-chain/audits.toml\t2026-01-27 19:29:15.927403772 +0700\n@@ -3235,6 +3235,11 @@\n version = \"0.2.6\"\n notes = \"This crate uses unsafe block, but this doesn't have network and file access. I audited code.\"\n \n+[[audits.libredox]]\n+who = \"Wildan M <willnode@wellosoft.net>\"\n+criteria = \"safe-to-deploy\"\n+version = \"0.1.12\"\n+\n [[audits.libsqlite3-sys]]\n who = \"Ben Dean-Kawamura <bdk@mozilla.com>\"\n criteria = \"safe-to-deploy\"\n@@ -4560,10 +4565,20 @@\n delta = \"1.10.1 -> 1.10.2\"\n \n [[audits.redox_syscall]]\n+who = \"Wildan M <willnode@wellosoft.net>\"\n+criteria = \"safe-to-deploy\"\n+version = \"0.5.18\"\n+\n+[[audits.redox_syscall]]\n who = \"Mike Hommey <mh+mozilla@glandium.org>\"\n criteria = \"safe-to-deploy\"\n delta = \"0.2.13 -> 0.2.16\"\n \n+[[audits.redox_users]]\n+who = \"Wildan M <willnode@wellosoft.net>\"\n+criteria = \"safe-to-deploy\"\n+version = \"0.4.6\"\n+\n [[audits.regex]]\n who = \"Mike Hommey <mh+mozilla@glandium.org>\"\n criteria = \"safe-to-deploy\"\n@@ -4676,7 +4691,7 @@\n the `regex` developers in the same repository.\n \n This crate is explicitly designed for FFI use, and should not be used directly\n-by Rust code. The exported `extern \\\"C\\\"` functions are not marked as `unsafe`,\n+by Rust code. The exported `extern \"C\"` functions are not marked as `unsafe`,\n meaning that it is technically incorrect to use them from within Rust code,\n however they are reasonable to use from C code.\n \n@@ -6463,7 +6478,7 @@\n who = \"Makoto Kato <m_kato@ga2.so-net.ne.jp>\"\n criteria = \"safe-to-deploy\"\n version = \"0.1.2\"\n-notes = \"This crate is zero-copy version of \\\"From\\\". This has no unsafe code and uses no ambient capabilities.\"\n+notes = 'This crate is zero-copy version of \"From\". This has no unsafe code and uses no ambient capabilities.'\n \n [[audits.zerofrom]]\n who = \"Makoto Kato <m_kato@ga2.so-net.ne.jp>\"\ndiff --color -ruwN source/supply-chain/imports.lock source-new/supply-chain/imports.lock\n--- source/supply-chain/imports.lock\t2026-01-07 04:09:52.000000000 +0700\n+++ source-new/supply-chain/imports.lock\t2026-01-27 19:29:15.929403788 +0700\n@@ -1592,7 +1592,7 @@\n criteria = \"safe-to-deploy\"\n version = \"1.6.0\"\n notes = \"\"\"\n-Grepped for \\\"unsafe\\\", \\\"crypt\\\", \\\"cipher\\\", \\\"fs\\\", \\\"net\\\" - there were no\n+Grepped for \"unsafe\", \"crypt\", \"cipher\", \"fs\", \"net\" - there were no\n hits except for 8 occurrences of `unsafe`.  Additional `unsafe` review comments\n can be found in https://crrev.com/c/5445719.\n \"\"\"\n@@ -1902,7 +1902,7 @@\n * Using `unsafe` in a string:\n \n     ```\n-    src/constfn.rs:            \\\"unsafe\\\" => Qualifiers::Unsafe,\n+    src/constfn.rs:            \"unsafe\" => Qualifiers::Unsafe,\n     ```\n \n * Using `std::fs` in `build/build.rs` to write `${OUT_DIR}/version.expr`\n@@ -2104,6 +2104,7 @@\n user-id = 213776 # divviup-github-automation\n start = \"2020-09-28\"\n end = \"2026-01-07\"\n+renew = false\n \n [[audits.isrg.audits.base64]]\n who = \"Tim Geoghegan <timg@letsencrypt.org>\"\ndiff --color -ruwN source/build/rust/redox_syscall/Cargo.toml source-new/build/rust/redox_syscall/Cargo.toml\n--- source/build/rust/redox_syscall/Cargo.toml\t2026-01-07 04:09:41.000000000 +0700\n+++ source-new/build/rust/redox_syscall/Cargo.toml\t1970-01-01 07:00:00.000000000 +0700\n@@ -1,8 +0,0 @@\n-[package]\n-name = \"redox_syscall\"\n-version = \"0.5.999\"\n-edition = \"2018\"\n-license = \"MPL-2.0\"\n-\n-[lib]\n-path = \"lib.rs\"\ndiff --color -ruwN source/build/rust/redox_syscall/lib.rs source-new/build/rust/redox_syscall/lib.rs\n--- source/build/rust/redox_syscall/lib.rs\t2026-01-07 04:09:41.000000000 +0700\n+++ source-new/build/rust/redox_syscall/lib.rs\t1970-01-01 07:00:00.000000000 +0700\n@@ -1,3 +0,0 @@\n-/* This Source Code Form is subject to the terms of the Mozilla Public\n- * License, v. 2.0. If a copy of the MPL was not distributed with this\n- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\ndiff --color -ruwN source/build/rust/redox_users/Cargo.toml source-new/build/rust/redox_users/Cargo.toml\n--- source/build/rust/redox_users/Cargo.toml\t2026-01-07 04:09:41.000000000 +0700\n+++ source-new/build/rust/redox_users/Cargo.toml\t1970-01-01 07:00:00.000000000 +0700\n@@ -1,8 +0,0 @@\n-[package]\n-name = \"redox_users\"\n-version = \"0.4.999\"\n-edition = \"2018\"\n-license = \"MPL-2.0\"\n-\n-[lib]\n-path = \"lib.rs\"\ndiff --color -ruwN source/build/rust/redox_users/lib.rs source-new/build/rust/redox_users/lib.rs\n--- source/build/rust/redox_users/lib.rs\t2026-01-07 04:09:41.000000000 +0700\n+++ source-new/build/rust/redox_users/lib.rs\t1970-01-01 07:00:00.000000000 +0700\n@@ -1,3 +0,0 @@\n-/* This Source Code Form is subject to the terms of the Mozilla Public\n- * License, v. 2.0. If a copy of the MPL was not distributed with this\n- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n"
  },
  {
    "path": "recipes/wip/web/gosub/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/gosub-browser/gosub-engine\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nbinary=renderer\n\"${COOKBOOK_CARGO}\" build \\\n            --manifest-path \"${COOKBOOK_SOURCE}/Cargo.toml\" \\\n            --bin \"${binary}\" \\\n            --release\n        mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n        cp -v \\\n            \"target/${TARGET}/release/${binary}\" \\\n            \"${COOKBOOK_STAGE}/usr/bin/${binary}\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/web/librewolf/mozconfig",
    "content": "ac_add_options --disable-tests\nac_add_options --target=\"{TARGET}\"\nac_add_options --enable-bootstrap\n"
  },
  {
    "path": "recipes/wip/web/librewolf/recipe.toml",
    "content": "#TODO missing script for mach: https://codeberg.org/librewolf/source#librewolf-build-instructions\n# dependencies: https://packages.gentoo.org/packages/www-client/firefox/dependencies\n# feature flags: https://wiki.gentoo.org/wiki/Firefox#USE_flags\n[source]\ntar = \"https://gitlab.com/api/v4/projects/32320088/packages/generic/librewolf-source/144.0.2-1/librewolf-144.0.2-1.source.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"fontconfig\",\n    \"atk\",\n    \"cairo\",\n    \"dbus\",\n    \"libffi\",\n    \"freetype2\",\n    \"gdk-pixbuf\",\n    \"glib\",\n    \"gtk3\",\n    \"pango\",\n    \"sqlite3\",\n    \"nss-nspr\",\n    \"startup-notification\",\n    \"zlib\",\n    \"ffmpeg6\",\n    \"expat\",\n    \"libepoxy\",\n    \"pipewire\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport MOZCONFIG=\"${COOKBOOK_RECIPE}/mozconfig\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/web/marmite/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rochacbruno/marmite\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/web/monolith/recipe.toml",
    "content": "#TODO compiled but not tested (after cargo update)\n[source]\ngit = \"https://github.com/Y2Z/monolith\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\nexport OPENSSL_DIR=\"${COOKBOOK_SYSROOT}\"\nexport OPENSSL_STATIC=\"true\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/web/pale-moon/.mozconfig",
    "content": "# Clear this if not a 64bit build\n_BUILD_64=1\n\n# Set GTK Version to 2 or 3\n_GTK_VERSION=3\n\n# Standard build options for Pale Moon\nac_add_options --enable-application=palemoon\nac_add_options --enable-optimize=\"-O2 -w\"\nac_add_options --enable-default-toolkit=cairo-gtk$_GTK_VERSION\nac_add_options --enable-jemalloc\nac_add_options --enable-strip\nac_add_options --enable-devtools\nac_add_options --enable-av1\nac_add_options --enable-jxl\nac_add_options --disable-webrtc\nac_add_options --disable-gamepad\nac_add_options --disable-tests\nac_add_options --disable-debug\nac_add_options --disable-necko-wifi\nac_add_options --disable-updater\nac_add_options --with-pthreads\n\n# Please see https://www.palemoon.org/redist.shtml for restrictions when using the official branding.\nac_add_options --enable-official-branding\nexport MOZILLA_OFFICIAL=1\n\n# Processor architecture specific build options\nif [ -n \"$_BUILD_64\" ]; then\n  ac_add_options --x-libraries=/usr/lib64\nelse\n  ac_add_options --x-libraries=/usr/lib\nfi\n\nexport MOZ_PKG_SPECIAL=gtk$_GTK_VERSION"
  },
  {
    "path": "recipes/wip/web/pale-moon/recipe.toml",
    "content": "#TODO missing script for mach: https://developer.palemoon.org/build/linux/\n[source]\ntar = \"https://repo.palemoon.org/MoonchildProductions/Pale-Moon/archive/33.9.1_Release.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk3\",\n    \"glib\",\n    \"pango\",\n    \"dbus\",\n    \"mesa\",\n    \"libxt\",\n    \"openssl1\",\n    \"sqlite3\",\n    \"libpulse\",\n    \"libalsa\",\n    \"libx11\",\n]\n"
  },
  {
    "path": "recipes/wip/web/rustyink/recipe.toml",
    "content": "#TODO ahash crate error\n[source]\ngit = \"https://github.com/arjunkomath/rustyink\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/web/servo/.servobuild",
    "content": "# Copy this file to .servobuild in the Servo root directory\n\n# Paths starting with \"./\" are relative to the repo root\n\n# Tool options\n[tools]\n\n[build]\n\n# Set \"mode = dev\" or use `mach build --dev` to build the project with warning.\n# or Set \"mode = release\" or use `mach build --release` for optimized build.\n# Use `mode = <profile>` or `mach build --profile=<profile>` to build the given\n# profile. Check the `Cargo.toml` manifest for a complete list of custom profiles.\n# Defaults to prompting before building\n#mode = \"dev\"\n\n\n# Set \"android = true\" or use `mach build --android` to build the Android app.\nandroid = false\n\n# Enable `debug_assert!` macros in release mode\ndebug-assertions = true\n\n# Set \"debug-mozjs\" or use `mach build --debug-mozjs` to build a debug spidermonkey.\ndebug-mozjs = false\n\n# When a GL error occurs as a result of a WebGL operation, print the stack trace for the content\n# JS and native Rust code that triggered the failed operation. Warning: very slow.\nwebgl-backtrace = false\n\n# When a DOM exception is reported, print the stack trace for the content JS and native Rust code\n# that triggered it.\ndom-backtrace = false\n\n# Pick a media stack based on the target. Other values are \"gstreamer\" and \"dummy\"\nmedia-stack = \"dummy\"\n\n# Set to the path to your ccache binary to enable caching of compiler outputs\n#ccache = \"/usr/local/bin/ccache\"\n\n# Any optional flags that will be added to $RUSTFLAGS\n#rustflags = \"\"\n\n# Enable or disable rustc’s incremental compilation\n# Cargo’s default is to enable it in debug mode but not in release mode.\n# Leaving this key unspecified makes mach keep Cargo’s default.\n# It can be set to true or false in order to always enable or always disable\n# incremental compilation.\n#incremental = false\n#incremental = true\n\n# Android information\n[android]\n# Defaults to the value of $ANDROID_SDK_ROOT, $ANDROID_NDK_ROOT respectively\n#sdk = \"/opt/android-sdk\"\n#ndk = \"/opt/android-ndk\"\n\n# OpenHarmony\n[ohos]\n# Defaults to the value of $OHOS_SDK_NATIVE\n#ndk = \"/path/to/ohos-sdk/<host-os>/native\"\n"
  },
  {
    "path": "recipes/wip/web/servo/recipe.toml",
    "content": "[source]\ngit = \"https://gitlab.redox-os.org/redox-os/servo.git\"\nbranch = \"redox\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"libpng\",\n    \"mesa\",\n    \"zlib\",\n]\ndev-dependencies = [\n    \"llvm21.dev\",\n    \"host:libarchive\",  # workaround for cmake error\n]\nscript = \"\"\"\nDYNAMIC_INIT\n\ncp -v \"${COOKBOOK_RECIPE}/.servobuild\" \"${COOKBOOK_SOURCE}/.servobuild\"\n\n# jemalloc specific configuration\nexport JEMALLOC_SYS_WITH_LG_PAGE=16\nexport TARGET_CC=\"$CC\"\nexport TARGET_CXX=\"$CXX\"\nexport TARGET_AR=\"$AR\"\n\n# pkg-config crate can only recognize one path to pkgconfig\nexport PKG_CONFIG_PATH_x86_64_unknown_redox=\"${COOKBOOK_SYSROOT}/lib/pkgconfig\"\nexport PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_redox=\"${COOKBOOK_SYSROOT}/lib/pkgconfig\"\n# rsync -a -v ${COOKBOOK_SYSROOT}/usr/share/pkgconfig/*.pc ${COOKBOOK_SYSROOT}/lib/pkgconfig/\n\n#TODO: mozjs-sys and mozangle uses clang, it won't know our prefix C libraries, so here's the workaround\nPREFIX_INCLUDE=\"$COOKBOOK_HOST_SYSROOT/$TARGET/include\"\nexport CLANGFLAGS=\"-I $PREFIX_INCLUDE/c++/13.2.0 -I $PREFIX_INCLUDE/c++/13.2.0/$TARGET -I $PREFIX_INCLUDE/c++/13.2.0/backward -I $PREFIX_INCLUDE\"\n\n#Mozjs specifics\nunset CC_WRAPPER\nexport CARGO_MAKEFLAGS=\"-j $COOKBOOK_MAKE_JOBS\" CCACHE=\"sccache\"\n\nCOOKBOOK_CARGO_PATH=\"ports/servoshell\" cookbook_cargo\n\n# resources packaging\nmkdir -p ${COOKBOOK_STAGE}/usr/lib/servo/bin\nmv ${COOKBOOK_STAGE}/usr/bin/servo ${COOKBOOK_STAGE}/usr/lib/servo/bin/\nln -s ../lib/servo/bin/servo ${COOKBOOK_STAGE}/usr/bin/servo\nrsync -a -v ${COOKBOOK_SOURCE}/resources ${COOKBOOK_STAGE}/usr/lib/servo/\n\"\"\"\n\n[package]\ndependencies = [\n    \"mesa\"\n]\n"
  },
  {
    "path": "recipes/wip/web/share-preview/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/rafaelmardojai/share-preview\"\nshallow_clone = true\n[build]\ntemplate = \"meson\"\ndependencies = [\n    \"glib\",\n    \"gtk4\",\n    \"libadwaita\",\n]\n"
  },
  {
    "path": "recipes/wip/web/sitesmith/recipe.toml",
    "content": "#TODO compiled but not tested\n[source]\ngit = \"https://github.com/BradenEverson/sitesmith\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/web/spider/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/spider-rs/spider\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"openssl1\",\n]\nscript = \"\"\"\ncookbook_cargo_packages spider_cli\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/web/sukr/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/nrdxp/sukr\"\nshallow_clone = true\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/web/surf/recipe.toml",
    "content": "#TODO missing script for gnu make\n# build instructions: https://git.suckless.org/surf/file/README.html\n[source]\ntar = \"https://dl.suckless.org/surf/surf-2.1.tar.gz\"\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"webkitgtk3\",\n]\n"
  },
  {
    "path": "recipes/wip/web/teacat/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/Ultrasquid9/TeaCat\"\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nmkdir -pv \"${COOKBOOK_STAGE}\"/usr/share/teacat\ncp -rv \"${COOKBOOK_SOURCE}\"/test.tcat \"${COOKBOOK_STAGE}\"/usr/share/teacat\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/web/tola-ssg/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/kawayww/tola-ssg\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/web/verso/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ngit = \"https://github.com/versotile-org/verso\"\n[build]\ntemplate = \"cargo\"\ndependencies = [\n    \"freetype2\",\n    \"gettext\",\n    \"glib\",\n    \"gstreamer\",\n    \"harfbuzz\",\n    \"libffi\",\n    \"libiconv\",\n    \"libpng\",\n    \"openssl1\",\n    \"pcre\",\n    \"zlib\",\n]\n"
  },
  {
    "path": "recipes/wip/web/vidium/recipe.toml",
    "content": "#TODO cookbook_cargo function error\n[source]\ngit = \"https://github.com/s-panferov/vidium\"\n[build]\ntemplate = \"cargo\"\n"
  },
  {
    "path": "recipes/wip/web/webkitgtk3/recipe.toml",
    "content": "#TODO runtime hangs\n[source]\ntar = \"https://webkitgtk.org/releases/webkitgtk-2.49.1.tar.xz\"\nblake3 = \"7f04acb2f909ad334fc623afb297ebca1d5a5005bda1682946fb37e044e45ecb\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"gtk3\",\n    \"libatomic\",\n    \"libgcrypt\",\n    \"libsoup\",\n    \"libtasn1\",\n    \"libwebp\",\n    \"sqlite3\",\n]\ndev-dependencies = [\n    \"host:gperf\"\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport WEBKIT_USE_SCCACHE=1\nexport PYTHONDONTWRITEBYTECODE=1\n#TODO: enable more features\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DENABLE_ASSERTS=ON\n    -DENABLE_GAMEPAD=OFF\n    -DENABLE_INTROSPECTION=OFF\n    -DENABLE_MEDIA_STREAM=OFF\n    -DENABLE_JOURNALD_LOG=OFF\n    -DENABLE_RELEASE_LOG=ON\n    -DENABLE_SPEECH_SYNTHESIS=OFF\n    -DENABLE_SPELLCHECK=OFF\n    -DENABLE_WEB_AUDIO=OFF\n    -DENABLE_WEB_CODECS=OFF\n    -DENABLE_VIDEO=OFF\n    -DPORT=GTK\n    -DUNIX=1\n    -DUSE_AVIF=OFF\n    -DUSE_GSTREAMER_GL=OFF\n    -DUSE_GTK4=OFF\n    -DUSE_JPEGXL=OFF\n    -DUSE_LCMS=OFF\n    -DUSE_LIBBACKTRACE=OFF\n    -DUSE_LIBDRM=OFF\n    -DUSE_LIBHYPHEN=OFF\n    -DUSE_LIBSECRET=OFF\n    -DUSE_SKIA=OFF\n    -DUSE_SYSPROF_CAPTURE=OFF\n    -DUSE_SYSTEM_MALLOC=ON\n    -DUSE_SYSTEM_SYSPROF_CAPTURE=OFF\n    -DUSE_WOFF2=OFF\n    #TODO: remove these when runtime hangs solved\n    -DENABLE_JIT=OFF\n    -DENABLE_DFG_JIT=OFF\n    -DENABLE_FTL_JIT=OFF\n    -DENABLE_OPENGL=OFF\n    -DENABLE_WEBGL=OFF\n    -DENABLE_XSLT=OFF\n    -DENABLE_GEOLOCATION=OFF\n    -DENABLE_WEBDRIVER=OFF\n    -DENABLE_BUBBLEWRAP_SANDBOX=OFF\n    -DUSE_LCMS=OFF\n)\n\ncookbook_cmake\n\npatchelf --replace-needed \"${COOKBOOK_SYSROOT}/usr/lib/libsqlite3.so\" \"libsqlite3.so\" \"${COOKBOOK_STAGE}/usr/lib/libwebkit2gtk-4.1.so\"\npatchelf --replace-needed \"${COOKBOOK_SYSROOT}/usr/lib/libsqlite3.so\" \"libsqlite3.so\" \"${COOKBOOK_STAGE}/usr/libexec/webkit2gtk-4.1/MiniBrowser\"\nmkdir -p \"${COOKBOOK_STAGE}/usr/bin\"\nln -sr \"${COOKBOOK_STAGE}/usr/libexec/webkit2gtk-4.1/MiniBrowser\" \"${COOKBOOK_STAGE}/usr/bin/MiniBrowser\"\n\"\"\"\n\n[package]\ndependencies = [\"glib-networking\"]\n"
  },
  {
    "path": "recipes/wip/web/webkitgtk3/redox.patch",
    "content": "diff -ruwN source/Source/bmalloc/bmalloc/BPlatform.h source-new/Source/bmalloc/bmalloc/BPlatform.h\n--- source/Source/bmalloc/bmalloc/BPlatform.h\t2025-03-28 13:18:28.347204000 +0700\n+++ source-new/Source/bmalloc/bmalloc/BPlatform.h\t2025-10-07 20:55:41.123161164 +0700\n@@ -40,7 +40,7 @@\n #define BOS_DARWIN 1\n #endif\n \n-#if defined(__unix) || defined(__unix__)\n+#if defined(__unix) || defined(__unix__) || defined(__redox__)\n #define BOS_UNIX 1\n #endif\n \n@@ -339,7 +339,7 @@\n \n /* BENABLE(LIBPAS) is enabling libpas build. But this does not mean we use libpas for bmalloc replacement. */\n #if !defined(BENABLE_LIBPAS)\n-#if BCPU(ADDRESS64) && (BOS(DARWIN) || (BOS(LINUX) && (BCPU(X86_64) || BCPU(ARM64))) || BPLATFORM(PLAYSTATION))\n+#if BCPU(ADDRESS64) && (BOS(DARWIN) || (BOS(LINUX) && (BCPU(X86_64) || BCPU(ARM64))) || BPLATFORM(PLAYSTATION)) || defined(__redox__)\n #define BENABLE_LIBPAS 1\n #ifndef PAS_BMALLOC\n #define PAS_BMALLOC 1\ndiff -ruwN source/Source/bmalloc/libpas/src/libpas/pas_committed_pages_vector.c source-new/Source/bmalloc/libpas/src/libpas/pas_committed_pages_vector.c\n--- source/Source/bmalloc/libpas/src/libpas/pas_committed_pages_vector.c\t2023-09-18 14:56:46.731077000 +0700\n+++ source-new/Source/bmalloc/libpas/src/libpas/pas_committed_pages_vector.c\t2025-10-07 22:23:20.298893452 +0700\n@@ -57,6 +57,8 @@\n \n #if PAS_OS(LINUX)\n     PAS_SYSCALL(mincore(object, size, (unsigned char*)vector->raw_data));\n+#elif PAS_OS(REDOX)\n+    // no op\n #else\n     PAS_SYSCALL(mincore(object, size, vector->raw_data));\n #endif\ndiff -ruwN source/Source/bmalloc/libpas/src/libpas/pas_committed_pages_vector.h source-new/Source/bmalloc/libpas/src/libpas/pas_committed_pages_vector.h\n--- source/Source/bmalloc/libpas/src/libpas/pas_committed_pages_vector.h\t2023-09-18 14:56:46.731077000 +0700\n+++ source-new/Source/bmalloc/libpas/src/libpas/pas_committed_pages_vector.h\t2025-10-07 22:23:29.232045934 +0700\n@@ -56,6 +56,8 @@\n     PAS_ASSERT(page_index < vector->size);\n #if PAS_OS(LINUX)\n     return vector->raw_data[page_index];\n+#elif PAS_OS(REDOX)\n+    return true; // redox don't have swap yet\n #else\n     return vector->raw_data[page_index] & (MINCORE_REFERENCED |\n                                            MINCORE_REFERENCED_OTHER |\ndiff -ruwN source/Source/bmalloc/libpas/src/libpas/pas_monotonic_time.c source-new/Source/bmalloc/libpas/src/libpas/pas_monotonic_time.c\n--- source/Source/bmalloc/libpas/src/libpas/pas_monotonic_time.c\t2023-09-18 14:56:46.743076800 +0700\n+++ source-new/Source/bmalloc/libpas/src/libpas/pas_monotonic_time.c\t2025-10-07 22:23:50.202403881 +0700\n@@ -89,6 +89,15 @@\n     return ts.tv_sec * 1000u * 1000u * 1000u + ts.tv_nsec;\n }\n \n+\n+#elif PAS_OS(REDOX)\n+\n+uint64_t pas_get_current_monotonic_time_nanoseconds(void)\n+{\n+    struct timespec ts;\n+    clock_gettime(CLOCK_MONOTONIC, &ts);\n+    return (uint64_t)ts.tv_sec * 1000000000 + (uint64_t)ts.tv_nsec;\n+}\n #endif\n \n #endif /* LIBPAS_ENABLED */\ndiff -ruwN source/Source/bmalloc/libpas/src/libpas/pas_page_malloc.c source-new/Source/bmalloc/libpas/src/libpas/pas_page_malloc.c\n--- source/Source/bmalloc/libpas/src/libpas/pas_page_malloc.c\t2024-12-20 17:10:23.123508500 +0700\n+++ source-new/Source/bmalloc/libpas/src/libpas/pas_page_malloc.c\t2025-10-07 22:26:27.358086406 +0700\n@@ -228,6 +228,8 @@\n     PAS_SYSCALL(madvise(ptr, size, MADV_DODUMP));\n #elif PAS_PLATFORM(PLAYSTATION)\n     // We don't need to call madvise to map page.\n+#elif PAS_OS(REDOX)\n+    // madvise not implemented\n #elif PAS_OS(FREEBSD)\n     PAS_SYSCALL(madvise(ptr, size, MADV_NORMAL));\n #endif\n@@ -276,6 +278,8 @@\n #elif PAS_OS(LINUX)\n     PAS_SYSCALL(madvise(ptr, size, MADV_DONTNEED));\n     PAS_SYSCALL(madvise(ptr, size, MADV_DONTDUMP));\n+#elif PAS_OS(REDOX)\n+    // madvise not implemented\n #else\n     PAS_SYSCALL(madvise(ptr, size, MADV_DONTNEED));\n #endif\ndiff -ruwN source/Source/bmalloc/libpas/src/libpas/pas_platform.h source-new/Source/bmalloc/libpas/src/libpas/pas_platform.h\n--- source/Source/bmalloc/libpas/src/libpas/pas_platform.h\t2024-11-07 21:16:41.458338300 +0700\n+++ source-new/Source/bmalloc/libpas/src/libpas/pas_platform.h\t2025-10-07 22:22:50.849390772 +0700\n@@ -132,6 +132,10 @@\n #define PAS_OS_LINUX 1\n #endif\n \n+#ifdef __redox__\n+#define PAS_OS_REDOX 1\n+#endif\n+\n #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)\n #define PAS_OS_FREEBSD 1\n #endif\ndiff -ruwN source/Source/bmalloc/libpas/src/libpas/pas_probabilistic_guard_malloc_allocator.c source-new/Source/bmalloc/libpas/src/libpas/pas_probabilistic_guard_malloc_allocator.c\n--- source/Source/bmalloc/libpas/src/libpas/pas_probabilistic_guard_malloc_allocator.c\t2025-03-27 13:32:32.679094000 +0700\n+++ source-new/Source/bmalloc/libpas/src/libpas/pas_probabilistic_guard_malloc_allocator.c\t2025-10-07 22:27:40.764339395 +0700\n@@ -165,16 +165,6 @@\n     mprotect_res = mprotect((void*)upper_guard, upper_guard_size, PROT_NONE);\n     PAS_ASSERT(!mprotect_res);\n \n-    /*\n-     * ensure physical addresses are released\n-     * TODO: investigate using MADV_FREE_REUSABLE instead\n-     */\n-    int madvise_res = madvise((void*)upper_guard, upper_guard_size, MADV_FREE);\n-    PAS_ASSERT(!madvise_res);\n-\n-    madvise_res = madvise((void*)lower_guard, lower_guard_size, MADV_FREE);\n-    PAS_ASSERT(!madvise_res);\n-\n     PAS_PROFILE(PGM_ALLOCATE, heap_config, key);\n \n     /* create struct to hold hash map value */\n@@ -231,13 +221,6 @@\n     int mprotect_res = mprotect((void*)value->start_of_data_pages, value->size_of_data_pages, PROT_NONE);\n     PAS_ASSERT(!mprotect_res);\n \n-    /*\n-     * ensure physical addresses are released\n-     * TODO: investigate using MADV_FREE_REUSABLE instead\n-     */\n-    int madvise_res = madvise((void*)value->start_of_data_pages, value->size_of_data_pages, MADV_FREE);\n-    PAS_ASSERT(!madvise_res);\n-\n     free_wasted_mem  += value->mem_to_waste;\n     free_virtual_mem += value->size_of_allocated_pages;\n \ndiff -ruwN source/Source/JavaScriptCore/heap/BlockDirectory.cpp source-new/Source/JavaScriptCore/heap/BlockDirectory.cpp\n--- source/Source/JavaScriptCore/heap/BlockDirectory.cpp\t2025-03-21 00:07:59.015023500 +0700\n+++ source-new/Source/JavaScriptCore/heap/BlockDirectory.cpp\t2025-09-09 09:08:03.419985553 +0700\n@@ -68,7 +68,7 @@\n     // FIXME: We should figure out a solution for Windows and PlayStation.\n     // QNX doesn't have mincore(), though the information can be had. But since all mapped\n     // pages are resident, does it matter?\n-#if OS(UNIX) && !PLATFORM(PLAYSTATION) && !OS(QNX) && !OS(HAIKU)\n+#if OS(UNIX) && !PLATFORM(PLAYSTATION) && !OS(QNX) && !OS(HAIKU) && !defined(__redox__)\n     size_t pageSize = WTF::pageSize();\n     ASSERT(!(MarkedBlock::blockSize % pageSize));\n     auto numberOfPagesInMarkedBlock = MarkedBlock::blockSize / pageSize;\ndiff -ruwN source/Source/JavaScriptCore/jsc.cpp source-new/Source/JavaScriptCore/jsc.cpp\n--- source/Source/JavaScriptCore/jsc.cpp\t2025-03-21 18:07:10.820055200 +0700\n+++ source-new/Source/JavaScriptCore/jsc.cpp\t2025-09-09 09:08:03.446985840 +0700\n@@ -208,6 +208,8 @@\n         for (;;) {\n #if OS(WINDOWS)\n             Sleep(1000);\n+#elif defined(__redox__)\n+            //TODO\n #else\n             pause();\n #endif\ndiff -ruwN source/Source/JavaScriptCore/runtime/JSCBytecodeCacheVersion.cpp source-new/Source/JavaScriptCore/runtime/JSCBytecodeCacheVersion.cpp\n--- source/Source/JavaScriptCore/runtime/JSCBytecodeCacheVersion.cpp\t2025-03-21 00:07:59.015023500 +0700\n+++ source-new/Source/JavaScriptCore/runtime/JSCBytecodeCacheVersion.cpp\t2025-09-09 09:08:03.446985840 +0700\n@@ -37,7 +37,7 @@\n #include <mach-o/dyld.h>\n #include <uuid/uuid.h>\n #include <wtf/spi/darwin/dyldSPI.h>\n-#else\n+#elif !defined(__redox__)\n #include <link.h>\n #endif\n #endif\n@@ -66,7 +66,7 @@\n         }\n         cacheVersion.construct(0);\n         dataLogLnIf(JSCBytecodeCacheVersionInternal::verbose, \"Failed to get UUID for JavaScriptCore framework\");\n-#elif OS(UNIX) && !PLATFORM(PLAYSTATION) && !OS(HAIKU)\n+#elif OS(UNIX) && !PLATFORM(PLAYSTATION) && !OS(HAIKU) && !defined(__redox__)\n         auto result = ([&] -> std::optional<uint32_t> {\n             Dl_info info { };\n             if (!dladdr(jsFunctionAddr, &info))\ndiff -ruwN source/Source/JavaScriptCore/runtime/MachineContext.h source-new/Source/JavaScriptCore/runtime/MachineContext.h\n--- source/Source/JavaScriptCore/runtime/MachineContext.h\t2025-03-21 00:07:59.015023500 +0700\n+++ source-new/Source/JavaScriptCore/runtime/MachineContext.h\t2025-09-09 09:08:03.473986127 +0700\n@@ -158,7 +158,7 @@\n {\n #if OS(DARWIN)\n     return stackPointerImpl(machineContext->__ss);\n-#elif OS(HAIKU)\n+#elif OS(HAIKU) || defined(__redox__)\n #if CPU(X86_64)\n     return reinterpret_cast<void*&>(machineContext.rsp);\n #else\n@@ -287,7 +287,7 @@\n {\n #if OS(DARWIN)\n     return framePointerImpl(machineContext->__ss);\n-#elif OS(HAIKU)\n+#elif OS(HAIKU) || defined(__redox__)\n #if CPU(X86_64)\n     return reinterpret_cast<void*&>(machineContext.rbp);\n #else\n@@ -455,7 +455,7 @@\n {\n #if OS(DARWIN)\n     return instructionPointerImpl(machineContext->__ss);\n-#elif OS(HAIKU)\n+#elif OS(HAIKU) || defined(__redox__)\n #if CPU(X86_64)\n     return reinterpret_cast<void*&>((uintptr_t&) machineContext.rip);\n #else\n@@ -649,7 +649,7 @@\n {\n #if OS(DARWIN)\n     return argumentPointer<1>(machineContext->__ss);\n-#elif OS(HAIKU)\n+#elif OS(HAIKU) || defined(__redox__)\n #if CPU(X86_64)\n     return reinterpret_cast<void*&>((uintptr_t&) machineContext.rsi);\n #else\n@@ -760,6 +760,13 @@\n #error Unknown Architecture\n #endif\n \n+#elif defined(__redox__)\n+#if CPU(X86_64)\n+    return reinterpret_cast<void*>((uintptr_t) machineContext.rbx);\n+#else\n+#error Unknown Architecture\n+#endif\n+\n #else\n #error Need a way to get the frame pointer for another thread on this platform\n #endif\n@@ -834,7 +841,7 @@\n     // LLInt uses regT4 as PC.\n #if OS(DARWIN)\n     return llintInstructionPointer(machineContext->__ss);\n-#elif OS(HAIKU)\n+#elif OS(HAIKU) || defined(__redox__)\n #if CPU(X86_64)\n     return reinterpret_cast<void*&>((uintptr_t&) machineContext.r8);\n #else\ndiff -ruwN source/Source/ThirdParty/ANGLE/GLESv2.cmake source-new/Source/ThirdParty/ANGLE/GLESv2.cmake\n--- source/Source/ThirdParty/ANGLE/GLESv2.cmake\t2025-02-17 19:59:58.567796700 +0700\n+++ source-new/Source/ThirdParty/ANGLE/GLESv2.cmake\t2025-09-09 09:08:03.495986361 +0700\n@@ -120,7 +120,7 @@\n \n if(is_linux OR is_chromeos OR is_android OR is_fuchsia)\n     list(APPEND libangle_common_sources\n-        \"src/common/system_utils_linux.cpp\"\n+        #\"src/common/system_utils_linux.cpp\"\n         \"src/common/system_utils_posix.cpp\"\n     )\n endif()\ndiff -ruwN source/Source/ThirdParty/ANGLE/PlatformGTK.cmake source-new/Source/ThirdParty/ANGLE/PlatformGTK.cmake\n--- source/Source/ThirdParty/ANGLE/PlatformGTK.cmake\t2023-10-21 14:33:32.730009300 +0700\n+++ source-new/Source/ThirdParty/ANGLE/PlatformGTK.cmake\t2025-09-09 09:08:03.500986415 +0700\n@@ -1,4 +1,4 @@\n-list(APPEND ANGLE_DEFINITIONS ANGLE_PLATFORM_LINUX EGL_NO_PLATFORM_SPECIFIC_TYPES USE_SYSTEM_EGL)\n+list(APPEND ANGLE_DEFINITIONS ANGLE_PLATFORM_POSIX EGL_NO_PLATFORM_SPECIFIC_TYPES USE_SYSTEM_EGL)\n include(linux.cmake)\n \n if (USE_OPENGL)\ndiff -ruwN source/Source/ThirdParty/ANGLE/src/common/log_utils.h source-new/Source/ThirdParty/ANGLE/src/common/log_utils.h\n--- source/Source/ThirdParty/ANGLE/src/common/log_utils.h\t2025-02-17 19:59:58.571796700 +0700\n+++ source-new/Source/ThirdParty/ANGLE/src/common/log_utils.h\t2025-09-09 09:08:03.501986425 +0700\n@@ -136,10 +136,12 @@\n         return FmtHexAutoSized(os, fmt.mValue, fmt.mPrefix, \"0x\", '0');\n     }\n \n+#if !defined(__redox__)\n     friend std::wostream &operator<<(std::wostream &wos, const FmtHexHelper &fmt)\n     {\n         return FmtHexAutoSized(wos, fmt.mValue, fmt.mPrefix, L\"0x\", L'0');\n     }\n+#endif\n };\n \n }  // namespace priv\ndiff -ruwN source/Source/ThirdParty/ANGLE/src/common/platform.h source-new/Source/ThirdParty/ANGLE/src/common/platform.h\n--- source/Source/ThirdParty/ANGLE/src/common/platform.h\t2024-09-03 13:28:47.067031900 +0700\n+++ source-new/Source/ThirdParty/ANGLE/src/common/platform.h\t2025-09-09 09:08:03.518986606 +0700\n@@ -28,7 +28,7 @@\n #    define ANGLE_PLATFORM_POSIX 1\n #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) ||              \\\n     defined(__DragonFly__) || defined(__sun) || defined(__GLIBC__) || defined(__GNU__) || \\\n-    defined(__QNX__) || defined(__Fuchsia__) || defined(__HAIKU__)\n+    defined(__QNX__) || defined(__Fuchsia__) || defined(__HAIKU__) || defined(__redox__)\n #    define ANGLE_PLATFORM_POSIX 1\n #else\n #    error Unsupported platform.\ndiff -ruwN source/Source/ThirdParty/ANGLE/src/common/system_utils.h source-new/Source/ThirdParty/ANGLE/src/common/system_utils.h\n--- source/Source/ThirdParty/ANGLE/src/common/system_utils.h\t2024-05-30 18:59:22.953676200 +0700\n+++ source-new/Source/ThirdParty/ANGLE/src/common/system_utils.h\t2025-09-09 09:08:03.536986798 +0700\n@@ -256,7 +256,9 @@\n }\n #endif\n \n-void SetCurrentThreadName(const char *name);\n+#if !defined(__redox__)\n+void SetCurrentThreadName(const char *name)\n+#endif\n }  // namespace angle\n \n #endif  // COMMON_SYSTEM_UTILS_H_\ndiff -ruwN source/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp source-new/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp\n--- source/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp\t2024-05-30 18:59:22.953676200 +0700\n+++ source-new/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp\t2025-09-09 09:08:03.539986830 +0700\n@@ -33,6 +33,11 @@\n #    include <sys/resource.h>\n #endif\n \n+#if defined(__redox__)\n+#define SEGV_MAPERR 1\n+#define SEGV_ACCERR 2\n+#endif\n+\n namespace angle\n {\n \ndiff -ruwN source/Source/ThirdParty/ANGLE/src/common/WorkerThread.cpp source-new/Source/ThirdParty/ANGLE/src/common/WorkerThread.cpp\n--- source/Source/ThirdParty/ANGLE/src/common/WorkerThread.cpp\t2024-06-25 15:04:37.142420000 +0700\n+++ source-new/Source/ThirdParty/ANGLE/src/common/WorkerThread.cpp\t2025-09-09 09:08:03.557987021 +0700\n@@ -165,7 +165,9 @@\n \n void AsyncWorkerPool::threadLoop()\n {\n+#if !defined(__redox__)\n     angle::SetCurrentThreadName(\"ANGLE-Worker\");\n+#endif\n \n     while (true)\n     {\ndiff -ruwN source/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp source-new/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp\n--- source/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp\t2025-02-05 16:14:42.678567400 +0700\n+++ source-new/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp\t2025-09-09 09:08:03.577987234 +0700\n@@ -58,7 +58,7 @@\n #        include \"libANGLE/renderer/gl/wgl/DisplayWGL.h\"\n #    elif ANGLE_ENABLE_CGL\n #        include \"libANGLE/renderer/gl/cgl/DisplayCGL.h\"\n-#    elif defined(ANGLE_PLATFORM_LINUX)\n+#    elif defined(ANGLE_PLATFORM_LINUX) || defined(__redox__)\n #        include \"libANGLE/renderer/gl/egl/DisplayEGL.h\"\n #        if defined(ANGLE_USE_X11)\n #            include \"libANGLE/renderer/gl/glx/DisplayGLX_api.h\"\n@@ -422,7 +422,7 @@\n             impl = new rx::DisplayCGL(state);\n             break;\n \n-#    elif defined(ANGLE_PLATFORM_LINUX)\n+#    elif defined(ANGLE_PLATFORM_LINUX) || defined(__redox__)\n #        if defined(ANGLE_USE_GBM)\n             if (platformType == 0)\n             {\ndiff -ruwN source/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp source-new/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp\n--- source/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp\t2025-02-17 19:59:58.575796600 +0700\n+++ source-new/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp\t2025-09-09 09:08:03.578987245 +0700\n@@ -142,7 +142,9 @@\n \n angle::Result DispatchWorkThread::finishLoop()\n {\n+#if !defined(__redox__)\n     angle::SetCurrentThreadName(\"ANGLE-CL-CQD\");\n+#endif\n \n     while (true)\n     {\ndiff -ruwN source/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandQueue.cpp source-new/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandQueue.cpp\n--- source/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandQueue.cpp\t2025-02-05 16:14:42.690567300 +0700\n+++ source-new/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandQueue.cpp\t2025-09-09 09:08:03.578987245 +0700\n@@ -378,7 +378,9 @@\n \n void CleanUpThread::processTasks()\n {\n+#if !defined(__redox__)\n     angle::SetCurrentThreadName(\"ANGLE-GC\");\n+#endif\n \n     while (true)\n     {\ndiff -ruwN source/Source/ThirdParty/ANGLE/src/libGLESv2.gni source-new/Source/ThirdParty/ANGLE/src/libGLESv2.gni\n--- source/Source/ThirdParty/ANGLE/src/libGLESv2.gni\t2025-02-17 19:59:58.587796200 +0700\n+++ source-new/Source/ThirdParty/ANGLE/src/libGLESv2.gni\t2025-09-09 09:08:03.578987245 +0700\n@@ -115,7 +115,7 @@\n \n if (is_linux || is_chromeos || is_android || is_fuchsia) {\n   libangle_common_sources += [\n-    \"src/common/system_utils_linux.cpp\",\n+    #\"src/common/system_utils_linux.cpp\",\n     \"src/common/system_utils_posix.cpp\",\n   ]\n }\ndiff -ruwN source/Source/ThirdParty/skia/src/gpu/ganesh/GrAutoLocaleSetter.h source-new/Source/ThirdParty/skia/src/gpu/ganesh/GrAutoLocaleSetter.h\n--- source/Source/ThirdParty/skia/src/gpu/ganesh/GrAutoLocaleSetter.h\t2024-08-14 15:56:17.506453500 +0700\n+++ source-new/Source/ThirdParty/skia/src/gpu/ganesh/GrAutoLocaleSetter.h\t2025-09-09 09:08:03.579987255 +0700\n@@ -27,7 +27,7 @@\n #define HAVE_XLOCALE 0\n #endif\n \n-#if defined(SK_BUILD_FOR_ANDROID) || defined(__UCLIBC__) || defined(_NEWLIB_VERSION)\n+#if defined(SK_BUILD_FOR_ANDROID) || defined(__UCLIBC__) || defined(_NEWLIB_VERSION) || defined(__redox__)\n #define HAVE_LOCALE_T 0\n #else\n #define HAVE_LOCALE_T 1\ndiff -ruwN source/Source/ThirdParty/skia/src/ports/SkMemory_malloc.cpp source-new/Source/ThirdParty/skia/src/ports/SkMemory_malloc.cpp\n--- source/Source/ThirdParty/skia/src/ports/SkMemory_malloc.cpp\t2024-05-30 18:59:23.965655000 +0700\n+++ source-new/Source/ThirdParty/skia/src/ports/SkMemory_malloc.cpp\t2025-09-09 09:08:03.579987255 +0700\n@@ -126,7 +126,7 @@\n     #elif defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 17\n         completeSize = malloc_usable_size(addr);\n         SkASSERT(completeSize >= size);\n-    #elif defined(SK_BUILD_FOR_UNIX)\n+    #elif defined(SK_BUILD_FOR_UNIX) && !defined(__redox__)\n         completeSize = malloc_usable_size(addr);\n         SkASSERT(completeSize >= size);\n     #elif defined(SK_BUILD_FOR_WIN)\ndiff -ruwN source/Source/WebCore/page/Page.cpp source-new/Source/WebCore/page/Page.cpp\n--- source/Source/WebCore/page/Page.cpp\t2025-04-01 14:53:09.527295000 +0700\n+++ source-new/Source/WebCore/page/Page.cpp\t2025-09-09 09:08:03.580987266 +0700\n@@ -536,8 +536,10 @@\n     if (RefPtr scrollingCoordinator = m_scrollingCoordinator)\n         scrollingCoordinator->pageDestroyed();\n \n+#if ENABLE(RESOURCE_USAGE)\n     if (RefPtr resourceUsageOverlay = m_resourceUsageOverlay)\n         resourceUsageOverlay->detachFromPage();\n+#endif\n \n     checkedBackForward()->close();\n     if (!isUtilityPage())\n@@ -2981,9 +2983,11 @@\n         return;\n \n     m_shouldSuppressHDR = shouldSuppressHDR;\n+    #if ENABLE(VIDEO)\n     forEachDocument([](auto& document) {\n         document.shouldSuppressHDRDidChange();\n     });\n+    #endif\n }\n \n #if ENABLE(MEDIA_STREAM)\ndiff -ruwN source/Source/WebCore/PlatformGTK.cmake source-new/Source/WebCore/PlatformGTK.cmake\n--- source/Source/WebCore/PlatformGTK.cmake\t2024-12-16 16:07:48.162613200 +0700\n+++ source-new/Source/WebCore/PlatformGTK.cmake\t2025-09-09 09:08:03.580987266 +0700\n@@ -75,21 +75,18 @@\n )\n \n list(APPEND WebCore_LIBRARIES\n-    ${ENCHANT_LIBRARIES}\n     ${GLIB_GIO_LIBRARIES}\n     ${GLIB_GMODULE_LIBRARIES}\n     ${GLIB_GOBJECT_LIBRARIES}\n     ${GLIB_LIBRARIES}\n     ${LIBSECRET_LIBRARIES}\n     ${LIBTASN1_LIBRARIES}\n-    ${HYPHEN_LIBRARIES}\n     ${UPOWERGLIB_LIBRARIES}\n     ${X11_X11_LIB}\n     GTK::GTK\n )\n \n list(APPEND WebCore_SYSTEM_INCLUDE_DIRECTORIES\n-    ${ENCHANT_INCLUDE_DIRS}\n     ${GIO_UNIX_INCLUDE_DIRS}\n     ${GLIB_INCLUDE_DIRS}\n     ${LIBSECRET_INCLUDE_DIRS}\ndiff -ruwN source/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp source-new/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp\n--- source/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp\t2025-03-31 16:35:43.461813700 +0700\n+++ source-new/Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp\t2025-09-09 09:08:03.591987383 +0700\n@@ -48,13 +48,13 @@\n #include <wtf/glib/GUniquePtr.h>\n #endif\n \n-#if OS(DARWIN)\n+#if OS(DARWIN) || defined(__redox__)\n #define MSG_NOSIGNAL 0\n #endif\n \n // Although it's available on Darwin, SOCK_SEQPACKET seems to work differently\n // than in traditional Unix so fallback to STREAM on that platform.\n-#if defined(SOCK_SEQPACKET) && !OS(DARWIN)\n+#if defined(SOCK_SEQPACKET) && !OS(DARWIN) && !defined(__redox__)\n #define SOCKET_TYPE SOCK_SEQPACKET\n #else\n #if USE(GLIB)\ndiff -ruwN source/Source/WebKit/PlatformGTK.cmake source-new/Source/WebKit/PlatformGTK.cmake\n--- source/Source/WebKit/PlatformGTK.cmake\t2025-03-05 17:09:47.273706000 +0700\n+++ source-new/Source/WebKit/PlatformGTK.cmake\t2025-09-09 09:08:03.644987947 +0700\n@@ -313,7 +313,6 @@\n )\n \n list(APPEND WebKit_SYSTEM_INCLUDE_DIRECTORIES\n-    ${ENCHANT_INCLUDE_DIRS}\n     ${GIO_UNIX_INCLUDE_DIRS}\n     ${GLIB_INCLUDE_DIRS}\n     ${GSTREAMER_INCLUDE_DIRS}\ndiff -ruwN source/Source/WTF/wtf/glib/FileSystemGlib.cpp source-new/Source/WTF/wtf/glib/FileSystemGlib.cpp\n--- source/Source/WTF/wtf/glib/FileSystemGlib.cpp\t2024-12-16 16:07:48.134613800 +0700\n+++ source-new/Source/WTF/wtf/glib/FileSystemGlib.cpp\t2025-09-09 09:08:03.644987947 +0700\n@@ -70,7 +70,7 @@\n     return CString({ readLinkBuffer, static_cast<size_t>(result) });\n WTF_ALLOW_UNSAFE_BUFFER_USAGE_END\n }\n-#elif OS(HURD)\n+#elif OS(HURD) || defined(__redox__)\n CString currentExecutablePath()\n {\n     return { };\ndiff -ruwN source/Source/WTF/wtf/InlineASM.h source-new/Source/WTF/wtf/InlineASM.h\n--- source/Source/WTF/wtf/InlineASM.h\t2024-09-23 17:54:44.750106000 +0700\n+++ source-new/Source/WTF/wtf/InlineASM.h\t2025-09-09 09:08:03.667988192 +0700\n@@ -89,7 +89,8 @@\n     || OS(HURD)                \\\n     || OS(NETBSD)              \\\n     || OS(QNX)                 \\\n-    || OS(WINDOWS)\n+    || OS(WINDOWS)             \\\n+    || defined(__redox__)\n     // GNU as-compatible syntax.\n #define LOCAL_LABEL_STRING(name) \".L\" #name\n #endif\ndiff -ruwN source/Source/WTF/wtf/PlatformEnable.h source-new/Source/WTF/wtf/PlatformEnable.h\n--- source/Source/WTF/wtf/PlatformEnable.h\t2025-03-18 15:33:00.063181400 +0700\n+++ source-new/Source/WTF/wtf/PlatformEnable.h\t2026-03-16 10:49:25.498709796 +0700\n@@ -698,7 +698,7 @@\n #if !defined(ENABLE_DFG_JIT) && ENABLE(JIT)\n \n /* Enable the DFG JIT on X86 and X86_64. */\n-#if CPU(X86_64) && (OS(DARWIN) || OS(LINUX) || OS(FREEBSD) || OS(HAIKU) || OS(HURD) || OS(WINDOWS))\n+#if CPU(X86_64) && (OS(DARWIN) || OS(LINUX) || OS(FREEBSD) || OS(HAIKU) || OS(HURD) || OS(WINDOWS) || defined(__redox__))\n #define ENABLE_DFG_JIT 1\n #endif\n \ndiff -ruwN source/Source/WTF/wtf/PlatformHave.h source-new/Source/WTF/wtf/PlatformHave.h\n--- source/Source/WTF/wtf/PlatformHave.h\t2025-04-02 19:09:45.800669000 +0700\n+++ source-new/Source/WTF/wtf/PlatformHave.h\t2025-09-09 09:08:03.707988617 +0700\n@@ -231,7 +231,7 @@\n #define HAVE_MACH_MEMORY_ENTRY 1\n #endif\n \n-#if OS(DARWIN) || OS(FUCHSIA) || ((OS(FREEBSD) || OS(HAIKU) || OS(NETBSD) || OS(OPENBSD) || OS(LINUX) || OS(HURD) || OS(QNX)) && (CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(RISCV64)))\n+#if OS(DARWIN) || OS(FUCHSIA) || ((OS(FREEBSD) || OS(HAIKU) || OS(NETBSD) || OS(OPENBSD) || OS(LINUX) || OS(HURD) || OS(QNX) || defined(__redox__)) && (CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(RISCV64)))\n #define HAVE_MACHINE_CONTEXT 1\n #endif\n \ndiff -ruwN source/Source/WTF/wtf/PlatformOS.h source-new/Source/WTF/wtf/PlatformOS.h\n--- source/Source/WTF/wtf/PlatformOS.h\t2025-04-03 12:49:09.282701700 +0700\n+++ source-new/Source/WTF/wtf/PlatformOS.h\t2025-09-09 09:08:03.709988639 +0700\n@@ -143,7 +143,8 @@\n     || OS(OPENBSD)          \\\n     || defined(unix)        \\\n     || defined(__unix)      \\\n-    || defined(__unix__)\n+    || defined(__unix__)    \\\n+    || defined(__redox__)\n #define WTF_OS_UNIX 1\n #endif\n \ndiff -ruwN source/Source/WTF/wtf/PlatformRegisters.h source-new/Source/WTF/wtf/PlatformRegisters.h\n--- source/Source/WTF/wtf/PlatformRegisters.h\t2024-11-20 20:56:01.847236400 +0700\n+++ source-new/Source/WTF/wtf/PlatformRegisters.h\t2025-09-09 09:08:03.723988787 +0700\n@@ -39,6 +39,8 @@\n typedef ucontext_t mcontext_t;\n #elif OS(QNX)\n #include <ucontext.h>\n+#elif defined(__redox__)\n+#include <signal.h>\n #else\n #include <sys/ucontext.h>\n #endif\ndiff -ruwN source/Source/WTF/wtf/posix/CPUTimePOSIX.cpp source-new/Source/WTF/wtf/posix/CPUTimePOSIX.cpp\n--- source/Source/WTF/wtf/posix/CPUTimePOSIX.cpp\t2023-09-18 14:56:45.363115500 +0700\n+++ source-new/Source/WTF/wtf/posix/CPUTimePOSIX.cpp\t2025-09-09 09:08:03.727988830 +0700\n@@ -47,10 +47,14 @@\n \n Seconds CPUTime::forCurrentThread()\n {\n+#if defined(__redox__)\n+    return Seconds(0);\n+#else\n     struct timespec ts { };\n     int ret = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);\n     RELEASE_ASSERT(!ret);\n     return Seconds(ts.tv_sec) + Seconds::fromNanoseconds(ts.tv_nsec);\n+#endif\n }\n \n }\ndiff -ruwN source/Source/WTF/wtf/posix/FileHandlePOSIX.cpp source-new/Source/WTF/wtf/posix/FileHandlePOSIX.cpp\n--- source/Source/WTF/wtf/posix/FileHandlePOSIX.cpp\t2025-03-21 18:07:10.828055100 +0700\n+++ source-new/Source/WTF/wtf/posix/FileHandlePOSIX.cpp\t2025-09-09 09:08:03.757989149 +0700\n@@ -39,6 +39,10 @@\n #include <wtf/MallocSpan.h>\n #include <wtf/MappedFileData.h>\n \n+#if defined(__redox__)\n+#define MAP_FILE 0\n+#endif\n+\n namespace WTF::FileSystemImpl {\n \n std::optional<uint64_t> FileHandle::read(std::span<uint8_t> data)\ndiff -ruwN source/Source/WTF/wtf/posix/ThreadingPOSIX.cpp source-new/Source/WTF/wtf/posix/ThreadingPOSIX.cpp\n--- source/Source/WTF/wtf/posix/ThreadingPOSIX.cpp\t2025-03-05 17:09:47.149706400 +0700\n+++ source-new/Source/WTF/wtf/posix/ThreadingPOSIX.cpp\t2025-09-09 09:08:03.762989203 +0700\n@@ -356,7 +356,7 @@\n \n void Thread::changePriority(int delta)\n {\n-#if HAVE(PTHREAD_SETSCHEDPARAM)\n+#if HAVE(PTHREAD_SETSCHEDPARAM) && !defined(__redox__)\n     Locker locker { m_mutex };\n \n     int policy;\n"
  },
  {
    "path": "recipes/wip/web/webkitgtk4/recipe.toml",
    "content": "#TODO not compiled or tested\n[source]\ntar = \"https://webkitgtk.org/releases/webkitgtk-2.49.1.tar.xz\"\nblake3 = \"7f04acb2f909ad334fc623afb297ebca1d5a5005bda1682946fb37e044e45ecb\"\n#patches = [\"redox.patch\"]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    #TODO \"gstreamer\",\n    \"gtk4\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libatomic\",\n    \"libffi\",\n    \"libgcrypt\",\n    \"libgpg-error\",\n    \"libiconv\",\n    \"libicu\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpsl\",\n    \"libpthread-stubs\",\n    \"libsoup\",\n    \"libtasn1\",\n    \"libwebp\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxi\",\n    \"libxml2\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxslt\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"nghttp2\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"sqlite3\",\n    \"x11proto\",\n    \"xextproto\",\n    \"xz\",\n    \"zlib\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\nexport WEBKIT_USE_SCCACHE=1\nexport PYTHONDONTWRITEBYTECODE=1\n#TODO: enable more features\nCOOKBOOK_CMAKE_FLAGS+=(\n    -DENABLE_ASSERTS=ON\n    -DENABLE_GAMEPAD=OFF\n    -DENABLE_INTROSPECTION=OFF\n    -DENABLE_MEDIA_STREAM=OFF\n    -DENABLE_JOURNALD_LOG=OFF\n    -DENABLE_RELEASE_LOG=ON\n    -DENABLE_SPEECH_SYNTHESIS=OFF\n    -DENABLE_SPELLCHECK=OFF\n    -DENABLE_WEB_AUDIO=OFF\n    -DENABLE_WEB_CODECS=OFF\n    -DENABLE_VIDEO=OFF\n    -DPORT=GTK\n    -DUNIX=1\n    -DUSE_AVIF=OFF\n    -DUSE_GSTREAMER_GL=OFF\n    -DUSE_GTK4=ON\n    -DUSE_JPEGXL=OFF\n    -DUSE_LCMS=OFF\n    -DUSE_LIBBACKTRACE=OFF\n    -DUSE_LIBDRM=OFF\n    -DUSE_LIBHYPHEN=OFF\n    -DUSE_LIBSECRET=OFF\n    -DUSE_SKIA=OFF\n    -DUSE_SYSPROF_CAPTURE=OFF\n    -DUSE_SYSTEM_MALLOC=OFF\n    -DUSE_SYSTEM_SYSPROF_CAPTURE=OFF\n    -DUSE_WOFF2=OFF\n)\n\ncookbook_cmake\n\npatchelf --replace-needed \"${COOKBOOK_SYSROOT}/usr/lib/libsqlite3.so\" \"libsqlite3.so\" \"${COOKBOOK_STAGE}/usr/lib/libwebkit2gtk-4.1.so\"\npatchelf --replace-needed \"${COOKBOOK_SYSROOT}/usr/lib/libsqlite3.so\" \"libsqlite3.so\" \"${COOKBOOK_STAGE}/usr/libexec/webkit2gtk-4.1/MiniBrowser\"\nmkdir -p \"${COOKBOOK_STAGE}/usr/bin\"\nln -sr \"${COOKBOOK_STAGE}/usr/libexec/webkit2gtk-4.1/MiniBrowser\" \"${COOKBOOK_STAGE}/usr/bin/MiniBrowser\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/web/zen-browser/recipe.toml",
    "content": "#TODO missing script for npm\n# build instructions - https://docs.zen-browser.app/building\n#TODO analyze the dependencies\n[source]\ngit = \"https://github.com/zen-browser/desktop\"\nbranch = \"stable\"\n[build]\ntemplate = \"custom\"\n"
  },
  {
    "path": "recipes/wip/x11/drm-info/recipe.toml",
    "content": "[source]\ntar = \"https://gitlab.freedesktop.org/emersion/drm_info/-/archive/v2.9.0/drm_info-v2.9.0.tar.gz\"\nblake3 = \"48ff592b206a85c1d946abfe2f8a4e7ef40f9f1ee7d3d5ee454a33390f86d8cb\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"json-c\",\n    \"libdrm\",\n]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/x11/drm-info/redox.patch",
    "content": "diff -ruwN source-old/meson.build source/meson.build\n--- source-old/meson.build\t2025-11-16 10:35:59.000000000 -0700\n+++ source/meson.build\t2025-12-11 15:29:28.845861423 -0700\n@@ -68,7 +68,7 @@\n elif libdrm.type_name() == 'internal'\n   fourcc_h = meson.current_source_dir() / 'subprojects/libdrm/include/drm/drm_fourcc.h'\n else\n-  fourcc_h = libdrm.get_variable(pkgconfig: 'pc_sysrootdir') + libdrm.get_variable(pkgconfig: 'includedir') / 'libdrm/drm_fourcc.h'\n+  fourcc_h = libdrm.get_variable(pkgconfig: 'includedir') / 'libdrm/drm_fourcc.h'\n endif\n \n # The DRM_BUS_FAUX bus and its information is included in libdrm v2.4.127\n"
  },
  {
    "path": "recipes/wip/x11/feh/recipe.toml",
    "content": "[source]\ntar = \"https://feh.finalrewind.org/feh-3.11.2.tar.bz2\"\nblake3 = \"b9d704e0b37d99068cbc76d2b73c3b6ef673612060d7cfef0f5a3e8886255276\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"freetype2\",\n    \"imlib2\",\n    \"libpng\",\n    \"libxau\",\n    \"libxcb\",\n    \"libx11\",\n    \"libxext\",\n    \"libxinerama\",\n    \"libxt\",\n    \"x11proto\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -a --delete \"${COOKBOOK_SOURCE}/\" ./\nexport LDLIBS=\"$(\"${PKG_CONFIG}\" --libs freetype2 imlib2 libpng x11)\"\nexport PREFIX=\"/usr\"\n\"${COOKBOOK_MAKE}\" curl=0 verscmp=0\ninstall -Dm0755 src/feh \"${COOKBOOK_STAGE}/usr/bin/feh\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/font-util/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/font/font-util-1.4.1.tar.xz\"\nblake3 = \"b430a69efcba19f59d95bcb967aab1d5838b38f2bc94cbc58f6867eeeba21a3e\"\n\n[build]\ntemplate = \"configure\""
  },
  {
    "path": "recipes/wip/x11/i3/i3/recipe.toml",
    "content": "#TODO: GLOB_TILDE and wordexp.h\n[source]\ntar = \"https://i3wm.org/downloads/i3-4.24.tar.xz\"\nblake3 = \"3b54ed52759339e545a7a5f602946abc0164c37eb801e79c0cb40f93dbae53d2\"\n\n[build]\ndependencies = [\n    \"cairo\",\n    \"libev\",\n    \"libxkbcommon-x11\",\n    \"pango\",\n    \"pcre2\",\n    \"startup-notification\",\n    \"xcb-util-cursor\",\n    \"xcb-util-keysyms\",\n    \"xcb-util-wm\",\n    \"xcb-util-xrm\",\n    \"yajl\",\n]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/x11/iso-codes/recipe.toml",
    "content": "#TODO: move to appropriate category\n[source]\ntar = \"https://salsa.debian.org/iso-codes-team/iso-codes/-/archive/v4.19.0/iso-codes-v4.19.0.tar.gz\"\nblake3 = \"153cc1748c96c4c6e8a00566aa7d0a573ec45f84c9155afd162cfc7a0cd6314b\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/x11/jwm/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/joewing/jwm/releases/download/v2.4.6/jwm-2.4.6.tar.xz\"\nblake3 = \"08d69eee4584ba9346d4f326581e8538247a37d6fe11dd8604de7a8a7adbdd51\"\n\n[build]\ndependencies = [\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gettext\",\n    \"glib\",\n    \"harfbuzz\",\n    \"libffi\",\n    \"libice\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    #TODO for SVG support: \"librsvg\",\n    \"libsm\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxft\",\n    \"libxmu\",\n    \"libxpm\",\n    \"libxrender\",\n    \"libxt\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"x11proto\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport LIBS=\"-liconv -lintl\"\nrsync -a --delete \"${COOKBOOK_SOURCE}/\" ./\nCOOKBOOK_CONFIGURE=\"./configure\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/keybinder3/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/kupferlauncher/keybinder/releases/download/keybinder-3.0-v0.3.2/keybinder-3.0-0.3.2.tar.gz\"\nblake3 = \"04b010524abf7af8a6bdfdbeff393c0feecf2bdcc1fd642e75113137ccb62aed\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libiconv\",\n    \"libicu\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxft\",\n    \"libxi\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"x11proto\",\n    \"xcb-proto\",\n    \"xextproto\",\n    \"xtrans\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/leftwm/recipe.toml",
    "content": "#TODO: needs mkfifo in nix crate\n[source]\ngit = \"https://github.com/leftwm/leftwm\"\n\n[build]\ndependencies = []\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nCOOKBOOK_SOURCE=\"${COOKBOOK_SOURCE}/leftwm\"\ncookbook_cargo\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libdrm/recipe.toml",
    "content": "[source]\ntar = \"https://gitlab.freedesktop.org/mesa/libdrm/-/archive/libdrm-2.4.125/libdrm-libdrm-2.4.125.tar.gz\"\nblake3 = \"33e6448252639f4ff8a8cd30129b335c5d85356c1c93f8d77a79221003b14f66\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Damdgpu=disabled\",\n    \"-Dintel=disabled\",\n    \"-Dnouveau=disabled\",\n    \"-Dradeon=disabled\",\n    \"-Dvmwgfx=disabled\",\n]"
  },
  {
    "path": "recipes/wip/x11/libdrm/redox.patch",
    "content": "diff -ruwN source-old/include/drm/drm.h source/include/drm/drm.h\n--- source-old/include/drm/drm.h\t2025-06-08 06:27:53.000000000 -0600\n+++ source/include/drm/drm.h\t2025-10-30 17:17:33.654234959 -0600\n@@ -44,7 +44,11 @@\n #else /* One of the BSDs */\n \n #include <stdint.h>\n+#if defined(__redox__)\n+#include <sys/ioctl.h>\n+#else\n #include <sys/ioccom.h>\n+#endif\n #include <sys/types.h>\n typedef int8_t   __s8;\n typedef uint8_t  __u8;\ndiff -ruwN source-old/xf86drm.c source/xf86drm.c\n--- source-old/xf86drm.c\t2025-06-08 06:27:53.000000000 -0600\n+++ source/xf86drm.c\t2025-10-30 17:18:58.374958567 -0600\n@@ -57,6 +57,19 @@\n #ifdef MAJOR_IN_SYSMACROS\n #include <sys/sysmacros.h>\n #endif\n+#if defined(__redox__)\n+// From musl sys/sysmacros.h\n+#define major(x) \\\n+\t((unsigned)( (((x)>>31>>1) & 0xfffff000) | (((x)>>8) & 0x00000fff) ))\n+#define minor(x) \\\n+\t((unsigned)( (((x)>>12) & 0xffffff00) | ((x) & 0x000000ff) ))\n+\n+#define makedev(x,y) ( \\\n+        (((x)&0xfffff000ULL) << 32) | \\\n+\t(((x)&0x00000fffULL) << 8) | \\\n+        (((y)&0xffffff00ULL) << 12) | \\\n+\t(((y)&0x000000ffULL)) )\n+#endif\n #if HAVE_SYS_SYSCTL_H\n #include <sys/sysctl.h>\n #endif\n@@ -304,9 +317,14 @@\n     char *modifier_name = NULL;\n     bool result = false;\n \n+#if defined(__redox__)\n+    fprintf(stderr, \"open_memstream not available on Redox\\n\");\n+    return NULL;\n+#else\n     fp = open_memstream(&modifier_name, &size);\n     if (!fp)\n         return NULL;\n+#endif\n \n     switch (type) {\n     case DRM_FORMAT_MOD_ARM_TYPE_AFBC:\n@@ -409,9 +427,14 @@\n     char *mod_amd = NULL;\n     size_t size = 0;\n \n+#if defined(__redox__)\n+    fprintf(stderr, \"open_memstream not available on Redox\\n\");\n+    return NULL;\n+#else\n     fp = open_memstream(&mod_amd, &size);\n     if (!fp)\n         return NULL;\n+#endif\n \n     switch (tile_version) {\n     case AMD_FMT_MOD_TILE_VER_GFX9:\ndiff -ruwN source-old/xf86drm.h source/xf86drm.h\n--- source-old/xf86drm.h\t2025-06-08 06:27:53.000000000 -0600\n+++ source/xf86drm.h\t2025-10-30 17:17:33.655115281 -0600\n@@ -47,7 +47,7 @@\n #define DRM_MAX_MINOR   64 /* deprecated */\n #endif\n \n-#if defined(__linux__)\n+#if defined(__linux__) || defined(__redox__)\n \n #define DRM_IOCTL_NR(n)\t\t_IOC_NR(n)\n #define DRM_IOC_VOID\t\t_IOC_NONE\n"
  },
  {
    "path": "recipes/wip/x11/libfontenc/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libfontenc-1.1.8.tar.xz\"\nblake3 = \"6ab127a335f7cb4892566e59448d91e9ec43ac522f31f97a3c94350f0a3ecaf4\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"x11proto\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libglvnd/recipe.toml",
    "content": "[source]\n# meson support not in latest release\ngit = \"https://github.com/NVIDIA/libglvnd.git\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"x11proto\",\n]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/x11/libice/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libICE-1.1.2.tar.xz\"\nblake3 = \"3d1d41041e0a58799a5e9965fd258a4f6875143102644fbbc71061eb4c652577\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"x11proto\",\n    \"xtrans\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libsm/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libSM-1.2.6.tar.xz\"\nblake3 = \"fccedc1f9781bab20b0084557464099a7b793cd704d4bb702f200def4c96dcd8\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libice\",\n    \"x11proto\",\n    \"xtrans\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libx11/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libX11-1.8.12.tar.xz\"\nblake3 = \"5bf1c64733322b6a90d9bce8d2bd2d8117a4950955caa00d0cd7974d42571d1e\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libxau\",\n    \"libxcb\",\n    \"x11proto\",\n    \"xtrans\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --enable-malloc0returnsnull\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxau/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXau-1.0.12.tar.xz\"\nblake3 = \"674bc71a888eec20f0e29989e4669df90309d4baacad058107cdf89d23803bcc\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxaw/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXaw-1.0.16.tar.xz\"\nblake3 = \"f2a3b4955508dc7a576ad473119562b724f7936d312c85c79cb32f614c60f0c5\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libice\",\n    \"libpthread-stubs\",\n    \"libsm\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxmu\",\n    \"libxpm\",\n    \"libxt\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxcb/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/xcb/libxcb-1.17.0.tar.xz\"\nblake3 = \"3dce3b8adc257177dfec9b6b6cf55eeac13921520dd6c372fd8f9d867600337b\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libxau\",\n    \"x11proto\",\n    \"xcb-proto\",\n]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--disable-devel-docs\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/libxcomposite/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXcomposite-0.4.6.tar.xz\"\nblake3 = \"7e02026864066869aefc1d688415b1e8c6ab0b639556f93b6f5e86063aa1bbac\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libx11\",\n    \"libxfixes\",\n    \"x11proto\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxcvt/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libxcvt-0.1.3.tar.xz\"\nblake3 = \"a6c8f264a70a742d2634f53d19489b984c28df11cb5653042e8921f7596534bb\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxdamage/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXdamage-1.1.6.tar.xz\"\nblake3 = \"d3d75f2656027288f87b9ddda8bf019862c63c6e4aeadd92f45870df6c2a7ce9\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libx11\",\n    \"libxfixes\",\n    \"x11proto\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxdmcp/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXdmcp-1.1.5.tar.xz\"\nblake3 = \"d93c5ceb04019228ee6f034c4d10826025a7ae756d7b2f884fc2f768577173ba\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"x11proto\"\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxext/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXext-1.3.6.tar.xz\"\nblake3 = \"4c24887ba3913728f3c0be945006f6babbc2c44c8118d4b1ca5366294e3f4406\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"x11proto\",\n    \"xextproto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --enable-malloc0returnsnull\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxfixes/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXfixes-6.0.1.tar.xz\"\nblake3 = \"ccbae58717aa81f1ef52a2e6cbb7c57553a98b93f5a7a6f8a78e793a3a0c7f78\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"x11proto\",\n    \"xextproto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxfont2/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXfont2-2.0.7.tar.xz\"\nblake3 = \"9b4951683df21108e45fda23dbd25dcb47b67a3a0e224a36374fbc2d0f489cac\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"freetype2\",\n    \"libfontenc\",\n    \"libpng\",\n    \"x11proto\",\n    \"xtrans\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxfont2/redox.patch",
    "content": "--- libXfont2-2.0.7/Makefile.am\t2024-08-01 17:38:40.000000000 -0600\n+++ source/Makefile.am\t2025-05-02 10:49:08.392987853 -0600\n@@ -159,14 +159,14 @@\n EXTRA_DIST = src/builtins/buildfont README.md\n \n # Test utilities\n-EXTRA_DIST += test/utils/README\n-\n-TEST_UTIL_SRCS = test/utils/font-test-utils.c test/utils/font-test-utils.h\n-\n-noinst_PROGRAMS = lsfontdir\n-\n-lsfontdir_SOURCES = test/utils/lsfontdir.c $(TEST_UTIL_SRCS)\n-lsfontdir_LDADD = libXfont2.la $(LTLIBOBJS)\n+#EXTRA_DIST += test/utils/README\n+#\n+#TEST_UTIL_SRCS = test/utils/font-test-utils.c test/utils/font-test-utils.h\n+#\n+#noinst_PROGRAMS = lsfontdir\n+#\n+#lsfontdir_SOURCES = test/utils/lsfontdir.c $(TEST_UTIL_SRCS)\n+#lsfontdir_LDADD = libXfont2.la $(LTLIBOBJS)\n \n \n MAINTAINERCLEANFILES = ChangeLog INSTALL\n"
  },
  {
    "path": "recipes/wip/x11/libxft/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXft-2.3.9.tar.xz\"\nblake3 = \"db5b642f7d5f1184d0975db36ae9f9fbd0a0c538a2288930fc034376374e83dc\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxrender\",\n    \"x11proto\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxi/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXi-1.8.2.tar.xz\"\nblake3 = \"8f0acdd884dc928c6c8bc4b6bca1f4c67c726fdb03e30910c09bdb41fd841d3e\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"x11proto\",\n    \"xextproto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --enable-malloc0returnsnull\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxinerama/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXinerama-1.1.5.tar.xz\"\nblake3 = \"58b4020c8a8fb62707f5073f967bf8abbc8dc7cff35c5750fabe097f46a924b4\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --enable-malloc0returnsnull\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxkbcommon-x11/recipe.toml",
    "content": "# TODO: Conflict with libxkbcommon-x11\n# TODO: Keyboard not working, see patches\n[source]\ntar = \"https://xkbcommon.org/download/libxkbcommon-1.7.0.tar.xz\"\nblake3 = \"5001ca0b8562feeef2010bf16c05657e3875fda3ed5fdedbf48b9135e5cdfcbc\"\npatches = [ \"redox.patch\" ]\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"libxml2\",\n    \"xz\",\n    \"zlib\",\n    \"libpthread-stubs\",\n    \"libxau\",\n    \"x11proto\",\n    \"xcb-proto\",\n    \"libxcb\",\n]\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Denable-wayland=false \\\n    -Denable-x11=true\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxkbcommon-x11/redox.patch",
    "content": "diff --color -ruwN source/meson.build source-new/meson.build\n--- source/meson.build\t2024-03-24 04:23:43.000000000 +0700\n+++ source-new/meson.build\t2025-10-29 10:55:30.355297899 +0700\n@@ -637,8 +637,6 @@\n     libxkbcommon_x11_test_internal = static_library(\n         'xkbcommon-x11-internal',\n         libxkbcommon_x11_sources,\n-        'test/xvfb-wrapper.c',\n-        'test/xvfb-wrapper.h',\n         include_directories: include_directories('src', 'include'),\n         link_with: libxkbcommon_test_internal,\n         dependencies: [\n@@ -768,20 +766,6 @@\n         dependencies: test_dep),\n     env: test_env,\n )\n-if get_option('enable-x11')\n-    test(\n-        'x11',\n-        executable('test-x11', 'test/x11.c', dependencies: x11_test_dep),\n-        env: test_env,\n-        is_parallel : false,\n-    )\n-    test(\n-        'x11comp',\n-        executable('test-x11comp', 'test/x11comp.c', dependencies: x11_test_dep),\n-        env: test_env,\n-        is_parallel : false,\n-    )\n-endif\n if get_option('enable-xkbregistry')\n     test(\n         'registry',\ndiff --color -ruwN source/src/x11/util.c source-new/src/x11/util.c\n--- source/src/x11/util.c\t2024-03-24 04:23:43.000000000 +0700\n+++ source-new/src/x11/util.c\t2025-10-29 15:03:58.879274347 +0700\n@@ -39,7 +39,7 @@\n     uint16_t server_major, server_minor;\n \n     if (flags & ~(XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS)) {\n-        /* log_err_func(ctx, \"unrecognized flags: %#x\\n\", flags); */\n+        printf(\"unrecognized flags: %#x\\n\", flags);\n         return 0;\n     }\n \n@@ -47,12 +47,12 @@\n         const xcb_query_extension_reply_t *reply =\n             xcb_get_extension_data(conn, &xcb_xkb_id);\n         if (!reply) {\n-            /* log_err_func(ctx, \"failed to query for XKB extension\\n\"); */\n+            printf(\"failed to query for XKB extension\\n\");\n             return 0;\n         }\n \n         if (!reply->present) {\n-            /* log_err_func(ctx, \"failed to start using XKB extension: not available in server\\n\"); */\n+            printf(\"failed to start using XKB extension: not available in server\\n\");\n             return 0;\n         }\n \n@@ -68,20 +68,21 @@\n             xcb_xkb_use_extension_reply(conn, cookie, &error);\n \n         if (!reply) {\n-            /* log_err_func(ctx, */\n-            /*              \"failed to start using XKB extension: error code %d\\n\", */\n-            /*              error ? error->error_code : -1); */\n+             printf(\n+                          \"failed to start using XKB extension: error code %d\\n\", \n+                          error ? error->error_code : -1); \n             free(error);\n             return 0;\n         }\n \n-        if (!reply->supported) {\n-            /* log_err_func(ctx, */\n-            /*              \"failed to start using XKB extension: server doesn't support version %d.%d\\n\", */\n-            /*              major_xkb_version, minor_xkb_version); */\n-            free(reply);\n-            return 0;\n-        }\n+        // FIXME: Figure out why winit/servo throwing this\n+        // if (!reply->supported) {\n+        //      printf(\n+        //                   \"failed to start using XKB extension: server doesn't support version %d.%d\\n\",\n+        //                   major_xkb_version, minor_xkb_version);\n+        //     free(reply);\n+        //     return 0;\n+        // }\n \n         server_major = reply->serverMajor;\n         server_minor = reply->serverMinor;\n"
  },
  {
    "path": "recipes/wip/x11/libxkbfile/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libxkbfile-1.1.3.tar.xz\"\nblake3 = \"9566ee417df1127f21dd0e1fbcfcc14dacb366c07a1ec2de51f89af12535c06d\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies =[\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"x11proto\",\n    \"x11proto-kb\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxklavier/recipe.toml",
    "content": "[source]\ntar = \"https://download.gnome.org/sources/libxklavier/5.3/libxklavier-5.3.tar.xz\"\nblake3 = \"4811b8e069faef364b0cdd230dd7e42bc4afc279cb15282b68c11e89518c8930\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"glib\",\n    \"iso-codes\",\n    \"libx11\",\n    \"libxi\",\n    \"libxkbfile\",\n    \"libxml2\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxmu/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXmu-1.2.1.tar.xz\"\nblake3 = \"466f7ab160c4e9f04866e9c895dbecb6a76ed1817ae16721d404c556d88f047e\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libice\",\n    \"libpthread-stubs\",\n    \"libsm\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxt\",\n    \"x11proto\",\n    \"x11proto-kb\",\n    \"xextproto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxpm/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXpm-3.5.17.tar.xz\"\nblake3 = \"0cc9bbdc6d9c9d6ce100249b7bb68bff4550de43ee31d815fd9b21c8d178cd9e\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxrandr/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXrandr-1.5.4.tar.xz\"\nblake3 = \"c107a47d9c4329996d74d7a1ab8d254a2cf3aecea1575d7e146da9a06b762081\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxrender\",\n    \"x11proto\",\n    \"xextproto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --enable-malloc0returnsnull\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxrender/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXrender-0.9.12.tar.xz\"\nblake3 = \"900b431ad77835029a88fd0d874bbd0d748ff150b9e0c3841b3ce7a346cf396a\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --enable-malloc0returnsnull\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxres/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXres-1.2.3.tar.xz\"\nblake3 = \"ed6e65e554fb812ddbec0667d749cb6c0488a964d7b12a7c4c2cadac1287088f\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libx11\",\n    \"libxext\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --enable-malloc0returnsnull\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxscrnsaver/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXScrnSaver-1.2.5.tar.xz\"\nblake3 = \"1efbadb14238f8679abb5e56bc99765b96565ee992bbab86cee88248c57f6240\"\n\n[build]\ndependencies = [\n    \"libx11\",\n    \"libxext\",\n]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/x11/libxshmfence/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libxshmfence-1.3.tar.gz\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxt/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXt-1.3.1.tar.xz\"\nblake3 = \"fbf21683ce3e6d104529289254977bb08b355ecf7a36c763e8369acf85f15f24\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libice\",\n    \"libpthread-stubs\",\n    \"libsm\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"x11proto\",\n    \"x11proto-kb\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --enable-malloc0returnsnull\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/libxxf86vm/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/libXxf86vm-1.1.6.tar.xz\"\nblake3 = \"cd99c05a03e81f8579a56272debd554b2a44c2ac8211f0170a39be86e03221bb\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --enable-malloc0returnsnull\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/lxde/libfm-extra/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/lxde/libfm/archive/refs/tags/1.4.0.tar.gz\"\nblake3 = \"b43b4a87b199fb0c6df08f09c7b12e4a545963fc0f4ffac48f8db2a425e47351\"\nscript = \"\"\"\nDYNAMIC_INIT\nmkdir -p m4\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"gettext\",\n    \"libffi\",\n    \"glib\",\n    \"pcre2\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --with-extra-only\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/lxde/libfm-gtk3/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/lxde/libfm/archive/refs/tags/1.4.0.tar.gz\"\nblake3 = \"b43b4a87b199fb0c6df08f09c7b12e4a545963fc0f4ffac48f8db2a425e47351\"\nscript = \"\"\"\nDYNAMIC_INIT\nmkdir -p m4\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libfm-extra\",\n    \"libiconv\",\n    \"libicu\",\n    \"libjpeg\",\n    \"libmenu-cache\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxft\",\n    \"libxi\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"x11proto\",\n    \"xcb-proto\",\n    \"xextproto\",\n    \"xtrans\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\nCOOKBOOK_CONFIGURE=\"./configure\"\ncookbook_configure --disable-old-actions --disable-silent-rules --with-gtk=3\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/lxde/libmenu-cache/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/lxde/menu-cache/archive/refs/tags/1.1.1.tar.gz\"\nblake3 = \"6490180be8851c23beec69a507f7285b94491c0b7ef955f7bc217095efb091ae\"\nscript = \"\"\"\nDYNAMIC_INIT\nmkdir -p m4\nautotools_recursive_regenerate\nsed -i 's|#include <sys/fcntl.h>|#include <fcntl.h>|g' libmenu-cache/menu-cache.c\nsed -i 's|#include <sys/fcntl.h>|#include <fcntl.h>|g' menu-cache-daemon/menu-cached.c\n\"\"\"\n\n[build]\ndependencies = [\n    \"gettext\",\n    \"glib\",\n    \"libffi\",\n    \"libfm-extra\",\n    \"libiconv\",\n    \"pcre2\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/lxde/lxpanel/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/lxde/lxpanel/archive/refs/tags/0.11.1.tar.gz\"\nblake3 = \"5f94d410403499485d3abb6885407d6006e5029da538a1b882c670904ac616a5\"\nscript = \"\"\"\nDYNAMIC_INIT\nmkdir -p m4\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"keybinder3\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libfm-gtk3\",\n    \"libiconv\",\n    \"libicu\",\n    \"libjpeg\",\n    \"libmenu-cache\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libwnck3\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxft\",\n    \"libxi\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"x11proto\",\n    \"xcb-proto\",\n    \"xextproto\",\n    \"xtrans\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nrsync -av --delete \"${COOKBOOK_SOURCE}/\" ./\nCOOKBOOK_CONFIGURE=\"./configure\"\ncookbook_configure --enable-gtk3 --with-plugins=all,-cpu,-netstat,-netstatus,-weather\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mate/caja/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/caja/releases/download/v1.26.4/caja-1.26.4.tar.xz\"\nblake3 = \"a70f5ce8dcb038d78346b385b2abd4d29a3e13c99b368a617c38107a9e725617\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libice\",\n    \"libmate-desktop-2\",\n    \"libnotify\",\n    \"libsm\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n# TODO: conflict with shared-mime-info\nrm -f ${COOKBOOK_STAGE}/usr/share/mime/mime.cache\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mate/dbus-glib/recipe.toml",
    "content": "[source]\ntar = \"https://dbus.freedesktop.org/releases/dbus-glib/dbus-glib-0.114.tar.gz\"\nblake3 = \"a632fb16525a201dd159b9538c6009ec717403d580a3741cbf96fd6f9af2828b\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"dbus\",\n    \"expat\",\n    \"glib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --with-dbus-binding-tool=\"$(which dbus-binding-tool)\"\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mate/libmate-desktop-2/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/mate-desktop/releases/download/v1.28.2/mate-desktop-1.28.2.tar.xz\"\nblake3 = \"b5897e91e0ad542dc3331209bb260124c8e14d654fcdb2d9a738e9fc23d4d3fa\"\n\n[build]\ndependencies = [\n    \"dconf\",\n    \"iso-codes\",\n    \"gtk3\",\n]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/x11/mate/libmate-menu/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/mate-menus/archive/refs/tags/v1.28.0.tar.gz\"\nblake3 = \"90b5540ec82bd9a6188d9eaf36bf1f489258aed4d35de53f3958346f892c0d7c\"\n\n[build]\ndependencies = [\n    \"glib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/mate/libmatekbd/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/libmatekbd/releases/download/v1.28.0/libmatekbd-1.28.0.tar.xz\"\nblake3 = \"d5dcf7a47522cc586b6c47e9bd731bbd6db43fcb6797b33b52c03e816d9caedd\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"gtk3\",\n    \"libxklavier\",\n]\ndev-dependencies = [\n    \"host:libxml2\"\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mate/libmateweather/recipe.toml",
    "content": "# Uses custom rev for libsoup3 support, next release should include it\n[source]\ntar = \"https://github.com/mate-desktop/libmateweather/archive/c1c54a15545f13f3dabd2bcd303533d818905c7b.tar.gz\"\nblake3 = \"78c3873937bb90141386d31b6c6d3e585f9f2bde6069933abffdbd9a9161707a\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"gtk3\",\n    \"libsoup\",\n]\ndev-dependencies = [\n    \"host:libxml2\"\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mate/marco/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/marco/releases/download/v1.29.1/marco-1.29.1.tar.xz\"\nblake3 = \"609db8d6da0ceffb67fd79a2d017be301f5cdbe441301ca5469530cdca4a7cf5\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"gtk3\",\n    \"libcanberra\",\n    \"libice\",\n    \"libmate-desktop-2\",\n    \"libsm\",\n    \"libxcomposite\",\n    \"libxcursor\",\n    \"libxdamage\",\n    \"libxinerama\",\n    \"libxres\",\n]\ntemplate = \"meson\"\n\n[package]\ndependencies = [\n    \"librsvg\",\n    \"mate-settings-daemon\",\n    \"zenity\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/mate/marco/redox.patch",
    "content": "diff -ruwN source-old/meson.build source/meson.build\n--- source-old/meson.build\t2025-09-22 16:03:46.000000000 -0600\n+++ source/meson.build\t2025-11-14 19:09:08.402564648 -0700\n@@ -294,7 +294,7 @@\n endif\n \n gdk_pixbuf_csource = find_program('gdk-pixbuf-csource')\n-zenity = find_program('zenity')\n+#Added to package depends: zenity = find_program('zenity')\n \n libxext = cc.find_library('Xext', required: false)\n if build_xsync\n"
  },
  {
    "path": "recipes/wip/x11/mate/mate-control-center/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/mate-control-center/archive/refs/tags/v1.28.1.tar.gz\"\nblake3 = \"78ef68e12d0f5d68f62953999e55061a0ef911eceecd2dc66b9242f6b84c143b\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"libmate-desktop-2\",\n    \"libmate-menu\",\n    \"libmatekbd\",\n    \"libxscrnsaver\",\n    \"marco\",\n]\ndev-dependencies = [\n    \"host:itstool\"\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dlibappindicator=no\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/mate/mate-control-center/redox.patch",
    "content": "diff -ruwN source-old/capplets/display/meson.build source/capplets/display/meson.build\n--- source-old/capplets/display/meson.build\t2024-05-22 13:44:05.000000000 -0600\n+++ source/capplets/display/meson.build\t2025-11-15 08:43:15.498757975 -0700\n@@ -49,12 +49,13 @@\n   install_dir: mcc_desktopdir\n )\n \n-policy = 'org.mate.randr.policy'\n-\n-i18n.merge_file(\n-  input: policy + '.in',\n-  output: policy,\n-  po_dir: po_dir,\n-  install: true,\n-  install_dir: mcc_policydir,\n-)\n+#TODO: fails to merge\n+#policy = 'org.mate.randr.policy'\n+#\n+#i18n.merge_file(\n+#  input: policy + '.in',\n+#  output: policy,\n+#  po_dir: po_dir,\n+#  install: true,\n+#  install_dir: mcc_policydir,\n+#)\ndiff -ruwN source-old/capplets/meson.build source/capplets/meson.build\n--- source-old/capplets/meson.build\t2024-05-22 13:44:05.000000000 -0600\n+++ source/capplets/meson.build\t2025-11-15 08:20:38.584035658 -0700\n@@ -8,6 +8,6 @@\n subdir('keyboard')\n subdir('mouse')\n subdir('network')\n-subdir('system-info')\n-subdir('time-admin')\n+#subdir('system-info')\n+#subdir('time-admin')\n subdir('windows')\ndiff -ruwN source-old/meson.build source/meson.build\n--- source-old/meson.build\t2024-05-22 13:44:05.000000000 -0600\n+++ source/meson.build\t2025-11-15 08:42:11.646734896 -0700\n@@ -75,9 +75,9 @@\n xcursor_dep = dependency('xcursor')\n dconf_dep = dependency('dconf', version: '>= 0.13.4')\n fontconfig_dep = dependency('fontconfig')\n-gtop_dep = dependency('libgtop-2.0')\n-udisks2_dep = dependency('udisks2')\n-polkit_dep = dependency('polkit-gobject-1')\n+#gtop_dep = dependency('libgtop-2.0')\n+#udisks2_dep = dependency('udisks2')\n+#polkit_dep = dependency('polkit-gobject-1')\n matekbd_dep = dependency('libmatekbd', version: '>=1.17.0')\n matekbdui_dep = dependency('libmatekbdui', version: '>=1.17.0')\n xklavier_dep = dependency('libxklavier', version: '>= 5.2')\n@@ -120,10 +120,10 @@\n   endif\n else\n   appindicator = false\n-  ayatana = true\n+  ayatana = false\n endif\n appindicator_dep = dependency('appindicator3-0.1', version: '>= 0.0.13', required: appindicator)\n-ayatana_dep = dependency('ayatana-appindicator3-0.1', version: '>= 0.0.13', required: ayatana)\n+#ayatana_dep = dependency('ayatana-appindicator3-0.1', version: '>= 0.0.13', required: ayatana)\n config_h.set('HAVE_UBUNTU_APPINDICATOR', appindicator)\n gnome = import('gnome')\n i18n = import('i18n')\n@@ -155,7 +155,7 @@\n subdir('help')\n subdir('font-viewer')\n subdir('capplets')\n-subdir('typing-break')\n+#subdir('typing-break')\n subdir('shell')\n \n gnome.post_install(\n"
  },
  {
    "path": "recipes/wip/x11/mate/mate-icon-theme/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/mate-icon-theme/releases/download/v1.28.0/mate-icon-theme-1.28.0.tar.xz\"\nblake3 = \"7269335000874df593ac06d991f4f19cdda984cd2199166987acb3f3cbd474bc\"\n\n[build]\ntemplate = \"configure\"\nconfigureflags = [\n    \"--disable-icon-mapping\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/mate/mate-panel/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/mate-panel/releases/download/v1.28.6/mate-panel-1.28.6.tar.xz\"\nblake3 = \"6411fa4da26be0032226395d50855bb6b1223f5b795f5e08f3999e9de92f2acd\"\nscript = \"\"\"\nDYNAMIC_INIT\n#TODO autotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"gtk3\",\n    \"libice\",\n    \"libmate-desktop-2\",\n    \"libmate-menu\",\n    \"libmateweather\",\n    \"libsm\",\n    \"libwnck3\",\n]\ndev-dependencies = [\n    \"host:itstool\",\n    \"host:libxml2\"\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mate/mate-session-manager/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/mate-session-manager/releases/download/v1.28.0/mate-session-manager-1.28.0.tar.xz\"\nblake3 = \"c76fd3064f4697180006cc2562a0ac55ddfa40b4029047f58c8dcc790606a9a6\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"dbus-glib\",\n    \"gtk3\",\n    \"libsm\",\n    \"libxcomposite\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mate/mate-settings-daemon/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/mate-settings-daemon/releases/download/v1.28.0/mate-settings-daemon-1.28.0.tar.xz\"\nblake3 = \"396389887d2e79d22e8be28f51df8e6e807ffabb676fbd23888278cf39a65f3d\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"dconf\",\n    \"gtk3\",\n    \"libcanberra\",\n    \"libmate-desktop-2\",\n    \"libmatekbd\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --disable-rfkill\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mate/mate-terminal/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/mate-desktop/mate-terminal/releases/download/v1.28.1/mate-terminal-1.28.1.tar.xz\"\nblake3 = \"5214a81a69cc18202fad9214e2dff671baf34a132a39c932214b234db113e16c\"\n\n[build]\ndependencies = [\n    \"dconf\",\n    \"gtk3\",\n    \"libstdcxx\",\n    \"vte\",\n]\ndev-dependencies = [\n    \"host:itstool\",\n]\ntemplate = \"meson\"\n"
  },
  {
    "path": "recipes/wip/x11/mesa-demos-x11/recipe.toml",
    "content": "[source]\ntar = \"https://archive.mesa3d.org/demos/mesa-demos-9.0.0.tar.xz\"\nblake3 = \"eef628aebdaa65d3bb1078bb6d6bdd7685c41fb67674e7f7b0e1e15f10433240\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"mesa-glu-x11\",\n]\ndev-dependencies = [\n    \"libstdcxx\",\n]\n\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n#TODO: implement sincos for es2gears\ncookbook_meson -Dgles2=disabled\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mesa-demos-x11/redox.patch",
    "content": "diff -ruwN mesa-demos-9.0.0/meson.build source/meson.build\n--- mesa-demos-9.0.0/meson.build\t2023-03-22 06:13:43.000000000 -0600\n+++ source/meson.build\t2025-05-06 15:58:57.523274337 -0600\n@@ -99,7 +99,7 @@\n endif\n \n dep_glx = dependency('glx', required: false, disabler : true)\n-if not dep_glx.found() and host_machine.system() == 'darwin'\n+if not dep_glx.found()\n   # xquartz doesn't have a glx.pc, but it does have the header. And all the\n   # symbols reside in libGL, so let's just use that.\n   if cc.check_header('GL/glx.h', dependencies: dep_x11)\n"
  },
  {
    "path": "recipes/wip/x11/mesa-glu-x11/recipe.toml",
    "content": "[source]\ntar = \"https://archive.mesa3d.org/glu/glu-9.0.3.tar.xz\"\nblake3 = \"beed1665ed983540e7502289ec50c7e66d840820af3e9ef21c9c4a7e9686ab9f\"\n\n[build]\ndependencies = [\n    \"mesa-x11\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson -Dgl_provider=gl\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/mesa-x11/recipe.toml",
    "content": "[source]\nsame_as = \"../../../libs/mesa\"\n\n[build]\ntemplate = \"custom\"\ndependencies = [\n    \"expat\",\n    \"libdrm\",\n    \"libx11\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxrandr\",\n    \"libxshmfence\",\n    \"libxxf86vm\",\n    \"llvm21\",\n    \"zlib\",\n]\ndev-dependencies = [\n    \"llvm21.dev\",\n]\n\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Ddri-drivers-path=/usr/lib/dri \\\n    -Degl=enabled \\\n    -Dglx=dri \\\n    -Dllvm=enabled \\\n    -Dplatforms=x11 \\\n    -Dshader-cache=disabled\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/openbox/recipe.toml",
    "content": "#TODO: launches but has segfaults at runtime\n[source]\ntar = \"https://openbox.org/dist/openbox/openbox-3.6.1.tar.xz\"\nblake3 = \"6bf434e52e04a9cfcd67c11cb9105b93fe2055dca49f1bed2c105fd117e88ef4\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gettext\",\n    \"glib\",\n    \"harfbuzz\",\n    \"libffi\",\n    \"libiconv\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxft\",\n    \"libxml2\",\n    \"libxrender\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"x11proto\",\n    \"xz\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/startup-notification/recipe.toml",
    "content": "[source]\ntar = \"http://www.freedesktop.org/software/startup-notification/releases/startup-notification-0.12.tar.gz\"\nblake3 = \"134131fdd210d2eaef76eda9826b4a832807aac231dba334f157751ed1d6da36\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libice\",\n    \"libx11\",\n    \"xcb-util\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure lf_cv_sane_realloc=yes\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/twm/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/app/twm-1.0.13.tar.xz\"\nblake3 = \"50acf2123537a739dcaff50e1ae9b38d7e117a2d07cd3a6b550dcafdc52ff9fc\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libice\",\n    \"libpthread-stubs\",\n    \"libsm\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxmu\",\n    \"libxt\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport LIBS=\"-lxcb -lXau\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/x11proto/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/proto/xorgproto-2024.1.tar.xz\"\nblake3 = \"fad667bb04e16dca5e816969f2641bb075929cd73564114cc1aabd87d1975dd3\"\npatches = [\"redox.patch\"]\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/x11/x11proto/redox.patch",
    "content": "diff -ruwN xorgproto-2023.2/include/X11/Xos_r.h source/include/X11/Xos_r.h\n--- xorgproto-2023.2/include/X11/Xos_r.h\t2023-06-16 01:32:38.000000000 -0600\n+++ source/include/X11/Xos_r.h\t2025-05-02 10:10:07.250524701 -0600\n@@ -318,7 +318,7 @@\n   (_Xos_processUnlock), \\\n   (p).pwp )\n \n-#elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(__APPLE__)\n+#elif !defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(__APPLE__) && !defined(__redox__)\n # define X_NEEDS_PWPARAMS\n typedef struct {\n   struct passwd pws;\n"
  },
  {
    "path": "recipes/wip/x11/x11proto-kb/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/proto/kbproto-1.0.7.tar.bz2\"\nblake3 = \"2fba8d4a298bd6504c237afccc2059a3b9db6363f203824aebf2c0a167197625\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/x11/xcb-proto/recipe.toml",
    "content": "[source]\ntar = \"https://xorg.freedesktop.org/archive/individual/proto/xcb-proto-1.17.0.tar.xz\"\nblake3 = \"68187400fded667f60b4b020d0fc37fa489ae0de33169fe7b07fcbaf88e7a3f9\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "recipes/wip/x11/xcb-util/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/xcb-util-0.4.1.tar.xz\"\nblake3 = \"ebc940220db0ca39a690a47b565ce73ab536c1fbfdebf008fa0edf0ced862aca\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libxcb\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\""
  },
  {
    "path": "recipes/wip/x11/xcb-util-cursor/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/xcb-util-cursor-0.1.6.tar.xz\"\nblake3 = \"af6e7e99779682450e4cb3aa7225f5724845b1672c0380c65ca03b58dfb2d5d8\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"xcb-util-image\",\n    \"xcb-util-renderutil\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xcb-util-image/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/xcb-util-image-0.4.1.tar.xz\"\nblake3 = \"c8a0652f7c215bd312d9f238aed2ba6a122f087b623dafbbac4456f5351df603\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"xcb-util\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xcb-util-keysyms/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/xcb-util-keysyms-0.4.1.tar.xz\"\nblake3 = \"c599df56c79a9f9dcf12b083e343f321cad6af654b83e2976b5a26bc890b5774\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libxcb\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xcb-util-renderutil/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/xcb-util-renderutil-0.3.10.tar.xz\"\nblake3 = \"085c94d08bd8181512d4ce93cf0e5bcd48cd8ed983bbb7a7bcb3a3c2312a08ea\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libxcb\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure --disable-selective-werror\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xcb-util-wm/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/lib/xcb-util-wm-0.4.2.tar.xz\"\nblake3 = \"4cf6b0e204e12eb6b824c939404fc5ad63d61cb94679e8adf5670207802bc738\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libxcb\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xcb-util-xrm/recipe.toml",
    "content": "[source]\ntar = \"https://github.com/Airblader/xcb-util-xrm/releases/download/v1.3/xcb-util-xrm-1.3.tar.bz2\"\nblake3 = \"21cd9a005dde4982a452df156a16f4a61bd5299fb1a24dda2c9e8169e0654f38\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libx11\",\n    \"xcb-util\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xev/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/app/xev-1.2.6.tar.xz\"\nblake3 = \"883347a6db32fb4cf6bc97906ca1dacf1c67b7b84bd2abef9c6c5fc20abea647\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n#TODO: why are LIBS not automatic?\nexport LIBS=\"-lXrender -lXext -lX11 -lxcb -lXau\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xextproto/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/proto/xextproto-7.3.0.tar.bz2\"\nblake3 = \"08cdd8b3838da9c99176778c925327aa35661d41d0e4d7458a378f14a42172c0\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xeyes/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/app/xeyes-1.3.0.tar.xz\"\nblake3 = \"33d7ce4847c73e6ebea0cc595b04de80482a657132d0f2235548328ede88b673\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libice\",\n    \"libpthread-stubs\",\n    \"libsm\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxi\",\n    \"libxmu\",\n    \"libxrender\",\n    \"libxt\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n#TODO: why are LIBS not automatic?\nexport LIBS=\"-lXext -lXmu -lXt -lSM -lICE -lX11 -lxcb -lXau\"\ncookbook_configure --without-present\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xfce4/garcon/recipe.toml",
    "content": "[source]\ntar = \"https://archive.xfce.org/src/xfce/garcon/4.21/garcon-4.21.0.tar.xz\"\nblake3 = \"d0eb19cfcf718f3cf4a5fc89304b52b97aa35cb64222f7bc746924544e9fc7b8\"\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfce4ui\",\n    \"libxfce4util\",\n    \"libxfixes\",\n    \"libxft\",\n    \"libxi\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"x11proto\",\n    \"xfconf\",\n    \"zlib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/xfce4/libxfce4ui/recipe.toml",
    "content": "[source]\ntar = \"https://archive.xfce.org/src/xfce/libxfce4ui/4.21/libxfce4ui-4.21.2.tar.xz\"\nblake3 = \"027adb15e74b6df534bc526ec0e1056fede33cf2e69ce802391fb1f714350015\"\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfce4util\",\n    \"libxfixes\",\n    \"libxft\",\n    \"libxi\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"x11proto\",\n    \"xfconf\",\n    \"zlib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/xfce4/libxfce4util/recipe.toml",
    "content": "[source]\ntar = \"https://archive.xfce.org/src/xfce/libxfce4util/4.20/libxfce4util-4.20.1.tar.bz2\"\nblake3 = \"d64d8c016e48fb21b4c76914b75e256670c5fe2bff4c3b54f76e56cf1a50cb8a\"\n\n[build]\ndependencies = [\n    \"gettext\",\n    \"glib\",\n    \"libffi\",\n    \"libiconv\",\n    \"pcre2\",\n    \"zlib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/xfce4/libxfce4windowing/recipe.toml",
    "content": "[source]\ntar = \"https://archive.xfce.org/src/xfce/libxfce4windowing/4.20/libxfce4windowing-4.20.4.tar.bz2\"\nblake3 = \"396cbd13d547e6e109e348dd207747714dc4827b744fe729b1697c9dd1a55c3f\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libwnck3\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfce4util\",\n    \"libxfixes\",\n    \"libxft\",\n    \"libxi\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"x11proto\",\n    \"xfconf\",\n    \"zlib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n    \"-Dwayland=disabled\",\n    \"-Dx11=enabled\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/xfce4/libxfce4windowing/redox.patch",
    "content": "diff -ruwN source-old/libxfce4windowing/xfw-monitor-x11.c source/libxfce4windowing/xfw-monitor-x11.c\n--- source-old/libxfce4windowing/xfw-monitor-x11.c\t2025-08-14 01:01:54.000000000 -0600\n+++ source/libxfce4windowing/xfw-monitor-x11.c\t2025-10-30 15:06:17.333924750 -0600\n@@ -28,7 +28,9 @@\n #include <X11/extensions/randr.h>\n #include <X11/extensions/render.h>\n #include <gdk/gdkx.h>\n+#if !defined(__redox__)\n #include <libdisplay-info/info.h>\n+#endif\n #include <stdlib.h>\n \n #include \"xfw-monitor-private.h\"\n@@ -429,6 +431,7 @@\n                              &edid_data);\n \n         if (gdk_x11_display_error_trap_pop(display) == 0 && edid_data != NULL && nbytes > 0) {\n+#if !defined(__redox__)\n             struct di_info *edid_info = di_info_parse_edid(edid_data, nbytes);\n             if (edid_info != NULL) {\n                 char *make = di_info_get_make(edid_info);\n@@ -451,6 +454,7 @@\n \n                 di_info_destroy(edid_info);\n             }\n+#endif\n         }\n         if (edid_data != NULL) {\n             XFree(edid_data);\ndiff -ruwN source-old/meson.build source/meson.build\n--- source-old/meson.build\t2025-08-14 01:05:11.000000000 -0600\n+++ source/meson.build\t2025-10-30 15:05:30.092853306 -0600\n@@ -44,7 +44,7 @@\n \n # Feature: 'x11'\n x11_deps = []\n-x11_deps += dependency('libdisplay-info', version: dependency_versions['display-info'], required: get_option('x11'))\n+#x11_deps += dependency('libdisplay-info', version: dependency_versions['display-info'], required: get_option('x11'))\n x11_deps += dependency('x11', version: dependency_versions['libx11'], required: get_option('x11'))\n x11_deps += dependency('gdk-x11-3.0', version: dependency_versions['gtk'], required: get_option('x11'))\n x11_deps += dependency('libwnck-3.0', version: dependency_versions['wnck'], required: get_option('x11'))\n"
  },
  {
    "path": "recipes/wip/x11/xfce4/xfce4-panel/recipe.toml",
    "content": "[source]\ntar = \"https://archive.xfce.org/src/xfce/xfce4-panel/4.21/xfce4-panel-4.21.0.tar.xz\"\nblake3 = \"59a8f55ba237a56ccd16869a28426fa3890c292164a4502dd07ddba45e0268ed\"\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"garcon\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libwnck3\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfce4ui\",\n    \"libxfce4util\",\n    \"libxfce4windowing\",\n    \"libxfixes\",\n    \"libxft\",\n    \"libxi\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"x11proto\",\n    \"xfconf\",\n    \"zlib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/xfce4/xfconf/recipe.toml",
    "content": "[source]\ntar = \"https://archive.xfce.org/src/xfce/xfconf/4.21/xfconf-4.21.0.tar.xz\"\nblake3 = \"588bc6768775221a50d8cdd8480854a360b1343193115b639daf225aa34b97d7\"\n\n[build]\ndependencies = [\n    \"gettext\",\n    \"glib\",\n    \"libffi\",\n    \"libiconv\",\n    \"libxfce4util\",\n    \"pcre2\",\n    \"zlib\",\n]\ntemplate = \"meson\"\nmesonflags = [\n    \"-Dintrospection=false\",\n]\n"
  },
  {
    "path": "recipes/wip/x11/xfce4/xfwm4/recipe.toml",
    "content": "[source]\ntar = \"https://archive.xfce.org/src/xfce/xfwm4/4.20/xfwm4-4.20.0.tar.bz2\"\nblake3 = \"1c48e0fd80ef674a1d6cd8b3ab2452e87ab1597693f99c3217d271070b5ba8c2\"\n\n[build]\ndependencies = [\n    \"atk\",\n    \"cairo\",\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"fribidi\",\n    \"gdk-pixbuf\",\n    \"gettext\",\n    \"glib\",\n    \"gtk3\",\n    \"harfbuzz\",\n    \"libepoxy\",\n    \"libffi\",\n    \"libice\",\n    \"libiconv\",\n    \"libjpeg\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libwnck3\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxfce4ui\",\n    \"libxfce4util\",\n    \"libxfixes\",\n    \"libxft\",\n    \"libxi\",\n    \"libxinerama\",\n    \"libxrandr\",\n    \"libxrender\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"pango\",\n    \"pcre2\",\n    \"pixman\",\n    \"shared-mime-info\",\n    \"x11proto\",\n    \"xfconf\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport LIBS=\"$(\"${PKG_CONFIG}\" --libs libxfce4util-1.0 x11)\"\ncookbook_configure --disable-silent-rules\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xinit/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/app/xinit-1.4.4.tar.xz\"\nblake3 = \"fe988bbff7c4a950256540ad8a469fed1cdbe11439ba738b9714ee2de16f2a6c\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport LIBS=\"-lxcb -lXau\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xkbcomp/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/app/xkbcomp-1.4.7.tar.xz\"\nblake3 = \"e6420ef168976726f8aa8cb362bc70dfe2bd810f2b33e5f71547ec182ed301ea\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libpthread-stubs\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxkbfile\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport LIBS=\"-lxcb -lXau\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xkbutils/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/app/xkbutils-1.0.6.tar.xz\"\nblake3 = \"f19c157f5eaad7c91ee101952e55b9fd991b060892ecb3e6d9a7b46fa1dbe587\"\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"libice\",\n    \"libpthread-stubs\",\n    \"libsm\",\n    \"libx11\",\n    \"libxau\",\n    \"libxaw\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxmu\",\n    \"libxpm\",\n    \"libxt\",\n    \"x11proto\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\n#TODO: why are LIBS not automatic?\nexport LIBS=\"-lXaw7 -lXext -lXmu -lXpm -lXt -lSM -lICE -lX11 -lxcb -lXau\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xkeyboard-config/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/data/xkeyboard-config/xkeyboard-config-2.44.tar.xz\"\nblake3 = \"6156aefb0608af6b7ae2c2ef444838b72524d1e4244cb26ee253669ecede3a5a\"\n\n[build]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xserver-xorg/recipe.toml",
    "content": "[source]\ntar = \"https://www.x.org/releases/individual/xserver/xorg-server-21.1.16.tar.xz\"\nblake3 = \"b47c68a0a8bc5b69143d95440fbf75c17245ba8bc2c28a8d9619d8c6890dca58\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"font-util\",\n    \"freetype2\",\n    \"libfontenc\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    #TODO: used for secure-rpc, needs syslog: \"libtirpc\",\n    \"libx11\",\n    \"libxau\",\n    \"libxcb\",\n    \"libxcvt\",\n    \"libxdmcp\",\n    \"libxext\",\n    \"libxfixes\",\n    \"libxfont2\",\n    \"libxkbfile\",\n    \"libxxf86vm\",\n    \"mesa-x11\",\n    \"openssl3\",\n    \"pixman\",\n    \"x11proto\",\n    \"xtrans\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\ncookbook_meson \\\n    -Ddri1=false \\\n    -Dglamor=false \\\n    -Dint10=false \\\n    -Dpciaccess=false \\\n    -Dsecure-rpc=false \\\n    -Dudev=false \\\n    -Dudev_kms=false \\\n    -Dvgahw=false \\\n    -Dxres=false \\\n    -Dxvfb=false\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xserver-xorg/redox.patch",
    "content": "diff -ruwN source-old/hw/xfree86/common/xf86Xinput.c source/hw/xfree86/common/xf86Xinput.c\n--- source-old/hw/xfree86/common/xf86Xinput.c\t2025-02-25 11:56:05.000000000 -0700\n+++ source/hw/xfree86/common/xf86Xinput.c\t2025-11-07 14:37:53.041095608 -0700\n@@ -860,8 +860,10 @@\n     if (stat(path, &st) == -1)\n         return;\n \n+    /*TODO\n     *maj = major(st.st_rdev);\n     *min = minor(st.st_rdev);\n+    */\n }\n \n static inline InputDriverPtr\ndiff -ruwN source-old/hw/xfree86/drivers/modesetting/meson.build source/hw/xfree86/drivers/modesetting/meson.build\n--- source-old/hw/xfree86/drivers/modesetting/meson.build\t2025-02-25 11:56:05.000000000 -0700\n+++ source/hw/xfree86/drivers/modesetting/meson.build\t2025-11-07 14:37:53.041947517 -0700\n@@ -42,7 +42,7 @@\n     configuration: manpage_config,\n ))\n \n-test('modesetting symbol test',\n-    xorg_symbol_test,\n-    args: symbol_test_args,\n-)\n+# test('modesetting symbol test',\n+#     xorg_symbol_test,\n+#     args: symbol_test_args,\n+# )\ndiff -ruwN source-old/hw/xfree86/loader/meson.build source/hw/xfree86/loader/meson.build\n--- source-old/hw/xfree86/loader/meson.build\t2025-02-25 11:56:05.000000000 -0700\n+++ source/hw/xfree86/loader/meson.build\t2025-11-07 14:37:53.042100945 -0700\n@@ -10,7 +10,7 @@\n     c_args: xorg_c_args,\n )\n \n-xorg_symbol_test = executable('xorg_symbol_test',\n-    'symbol-test.c',\n-    dependencies: dl_dep,\n-)\n+# xorg_symbol_test = executable('xorg_symbol_test',\n+#     'symbol-test.c',\n+#     dependencies: dl_dep,\n+# )\ndiff -ruwN source-old/hw/xfree86/meson.build source/hw/xfree86/meson.build\n--- source-old/hw/xfree86/meson.build\t2025-02-25 11:56:05.000000000 -0700\n+++ source/hw/xfree86/meson.build\t2025-11-07 14:37:53.042256958 -0700\n@@ -171,13 +171,13 @@\n     )\n endif\n \n-executable('gtf',\n-    'utils/gtf/gtf.c',\n-    include_directories: [inc, xorg_inc],\n-    dependencies: xorg_deps,\n-    c_args: xorg_c_args,\n-    install: true,\n-)\n+# executable('gtf',\n+#     'utils/gtf/gtf.c',\n+#     include_directories: [inc, xorg_inc],\n+#     dependencies: xorg_deps,\n+#     c_args: xorg_c_args,\n+#     install: true,\n+# )\n \n # For symbol presence testing only\n xorgserver_lib = shared_library(\ndiff -ruwN source-old/hw/xfree86/os-support/shared/sigio.c source/hw/xfree86/os-support/shared/sigio.c\n--- source-old/hw/xfree86/os-support/shared/sigio.c\t2025-02-25 11:56:05.000000000 -0700\n+++ source/hw/xfree86/os-support/shared/sigio.c\t2025-11-07 14:37:53.042429782 -0700\n@@ -196,11 +196,12 @@\n                         fd, strerror(errno));\n             }\n             else {\n+                /*TODO\n                 if (fcntl(fd, F_SETOWN, getpid()) == -1) {\n                     xf86Msg(X_WARNING, \"fcntl(%d, F_SETOWN): %s\\n\",\n                             fd, strerror(errno));\n                 }\n-                else {\n+                else*/{\n                     installed = TRUE;\n                 }\n             }\ndiff -ruwN source-old/hw/xfree86/os-support/xf86_OSlib.h source/hw/xfree86/os-support/xf86_OSlib.h\n--- source-old/hw/xfree86/os-support/xf86_OSlib.h\t2025-02-25 11:56:05.000000000 -0700\n+++ source/hw/xfree86/os-support/xf86_OSlib.h\t2025-11-07 14:37:53.042605933 -0700\n@@ -176,7 +176,7 @@\n /**************************************************************************/\n /* Linux or Glibc-based system                                            */\n /**************************************************************************/\n-#if defined(__linux__) || defined(__GLIBC__) || defined(__CYGWIN__)\n+#if defined(__linux__) || defined(__GLIBC__) || defined(__CYGWIN__) || defined(__redox__)\n #include <sys/ioctl.h>\n #include <signal.h>\n #include <stdlib.h>\ndiff -ruwN source-old/include/dix.h source/include/dix.h\n--- source-old/include/dix.h\t2025-02-25 11:56:05.000000000 -0700\n+++ source/include/dix.h\t2025-11-07 14:37:53.042862204 -0700\n@@ -55,6 +55,7 @@\n #include \"geext.h\"\n #include \"events.h\"\n #include <X11/extensions/XI.h>\n+#include <stdio.h>\n \n #define EARLIER -1\n #define SAMETIME 0\n@@ -69,14 +70,28 @@\n \n #define REQUEST_SIZE_MATCH(req)                                         \\\n     do {                                                                \\\n-        if ((sizeof(req) >> 2) != client->req_len)                      \\\n+        if ((sizeof(req) >> 2) != client->req_len) { \\\n+            fprintf(stderr, \\\n+                    \"REQUEST_SIZE_MATCH failed in %s:%d: \" \\\n+                    \"Expected len %lu, got %d\\n\", \\\n+                    __FILE__, __LINE__, \\\n+                    (unsigned long)(sizeof(req) >> 2), \\\n+                    client->req_len); \\\n             return(BadLength);                                          \\\n+        } \\\n     } while (0)\n \n #define REQUEST_AT_LEAST_SIZE(req)                                      \\\n     do {                                                                \\\n-        if ((sizeof(req) >> 2) > client->req_len)                       \\\n+        if ((sizeof(req) >> 2) > client->req_len) { \\\n+            fprintf(stderr, \\\n+                    \"REQUEST_AT_LEAST_SIZE failed in %s:%d: \" \\\n+                    \"Expected len %lu, got %d\\n\", \\\n+                    __FILE__, __LINE__, \\\n+                    (unsigned long)(sizeof(req) >> 2), \\\n+                    client->req_len); \\\n             return(BadLength);                                          \\\n+        } \\\n     } while (0)\n \n #define REQUEST_AT_LEAST_EXTRA_SIZE(req, extra)                         \\\ndiff -ruwN source-old/include/meson.build source/include/meson.build\n--- source-old/include/meson.build\t2025-02-25 11:56:05.000000000 -0700\n+++ source/include/meson.build\t2025-11-07 14:37:53.043095171 -0700\n@@ -162,7 +162,7 @@\n conf_data.set('HAVE_PORT_CREATE', cc.has_function('port_create') ? '1' : false)\n conf_data.set('HAVE_REALLOCARRAY', cc.has_function('reallocarray', dependencies: libbsd_dep) ? '1' : false)\n conf_data.set('HAVE_SETEUID', cc.has_function('seteuid') ? '1' : false)\n-conf_data.set('HAVE_SETITIMER', cc.has_function('setitimer') ? '1' : false)\n+conf_data.set('HAVE_SETITIMER', false)\n conf_data.set('HAVE_SHMCTL64', cc.has_function('shmctl64') ? '1' : false)\n conf_data.set('HAVE_SIGACTION', cc.has_function('sigaction') ? '1' : false)\n conf_data.set('HAVE_SIGPROCMASK', cc.has_function('sigprocmask') ? '1' : false)\n@@ -190,14 +190,14 @@\n conf_data.set('LISTEN_LOCAL', get_option('listen_local'))\n \n if cc.has_header_symbol('sys/socket.h', 'SCM_RIGHTS')\n-  conf_data.set('XTRANS_SEND_FDS', '1')\n+  #TODO conf_data.set('XTRANS_SEND_FDS', '1')\n endif\n \n-if conf_data.get('HAVE_GETPEEREID').to_int() == 0 and conf_data.get('HAVE_GETPEERUCRED').to_int() == 0\n-    if not cc.has_header_symbol('sys/socket.h', 'SO_PEERCRED')\n+#if conf_data.get('HAVE_GETPEEREID').to_int() == 0 and conf_data.get('HAVE_GETPEERUCRED').to_int() == 0\n+    #if not cc.has_header_symbol('sys/socket.h', 'SO_PEERCRED')\n         conf_data.set('NO_LOCAL_CLIENT_CRED', 1)\n-    endif\n-endif\n+    #endif\n+#endif\n \n conf_data.set('TCPCONN', '1')\n conf_data.set('UNIXCONN', host_machine.system() != 'windows' ? '1' : false)\n@@ -212,7 +212,7 @@\n conf_data.set('DRI2', build_dri2 ? '1' : false)\n conf_data.set('DRI3', build_dri3 ? '1' : false)\n if build_glx\n-    conf_data.set_quoted('DRI_DRIVER_PATH', dri_dep.get_pkgconfig_variable('dridriverdir'))\n+    conf_data.set_quoted('DRI_DRIVER_PATH', '/usr/lib/dri') \n endif\n conf_data.set('HAS_SHM', build_mitshm ? '1' : false)\n conf_data.set('MITSHM', build_mitshm ? '1' : false)\ndiff -ruwN source-old/meson.build source/meson.build\n--- source-old/meson.build\t2025-11-07 14:39:22.420574991 -0700\n+++ source/meson.build\t2025-11-07 14:37:53.043279226 -0700\n@@ -439,7 +439,7 @@\n     error('DRI requested, but LIBDRM not found')\n endif\n \n-build_modesetting = libdrm_dep.found() and dri2proto_dep.found()\n+build_modesetting = false #TODO: libdrm_dep.found() and dri2proto_dep.found()\n \n build_vgahw = false\n if get_option('vgahw') == 'auto'\n@@ -753,7 +753,7 @@\n subdir('hw')\n \n if host_machine.system() != 'windows'\n-    subdir('test')\n+  #subdir('test')\n endif\n \n install_man(configure_file(\ndiff -ruwN source-old/os/access.c source/os/access.c\n--- source-old/os/access.c\t2025-02-25 11:56:05.000000000 -0700\n+++ source/os/access.c\t2025-11-07 14:37:53.043632189 -0700\n@@ -120,7 +120,7 @@\n #include <sys/un.h>\n #endif\n \n-#if defined(SVR4) ||  (defined(SYSV) && defined(__i386__)) || defined(__GNU__)\n+#if defined(SVR4) ||  (defined(SYSV) && defined(__i386__)) || defined(__GNU__) || defined(__redox__)\n #include <sys/utsname.h>\n #endif\n #if defined(SYSV) &&  defined(__i386__)\ndiff -ruwN source-old/Xext/bigreq.c source/Xext/bigreq.c\n--- source-old/Xext/bigreq.c\t2025-02-25 11:56:05.000000000 -0700\n+++ source/Xext/bigreq.c\t2025-11-07 14:37:53.043862040 -0700\n@@ -51,7 +51,8 @@\n     }\n     if (stuff->brReqType != X_BigReqEnable)\n         return BadRequest;\n-    REQUEST_SIZE_MATCH(xBigReqEnableReq);\n+    // libxkbcommon sends incorrect size\n+    REQUEST_AT_LEAST_SIZE(xBigReqEnableReq);\n     client->big_requests = TRUE;\n     rep = (xBigReqEnableReply) {\n         .type = X_Reply,\n"
  },
  {
    "path": "recipes/wip/x11/xserver-xorg-video-orbital/recipe.toml",
    "content": "# x11 video driver for running inside of orbital\n[source]\ntar = \"https://www.x.org/releases/individual/driver/xf86-video-dummy-0.4.1.tar.xz\"\nblake3 = \"9b49296f62bf4d22345d87fc01f2a5571f941457c19d21c8800f8f6d2e64ae67\"\npatches = [\"redox.patch\"]\nscript = \"\"\"\nautotools_recursive_regenerate\n\"\"\"\n\n[build]\ndependencies = [\n    \"liborbital\",\n    \"pixman\",\n    \"x11proto\",\n    \"xserver-xorg\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport LIBS=\"-lorbital\"\ncookbook_configure\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xserver-xorg-video-orbital/redox.patch",
    "content": "diff -ruwN source-old/src/dummy_driver.c source/src/dummy_driver.c\n--- source-old/src/dummy_driver.c\t2023-05-07 14:27:44.000000000 -0600\n+++ source/src/dummy_driver.c\t2025-10-29 11:13:11.863430241 -0600\n@@ -39,6 +39,7 @@\n /* These need to be checked */\n #include <X11/X.h>\n #include <X11/Xproto.h>\n+#include <X11/keysym.h>\n #include \"scrnintstr.h\"\n #include \"servermd.h\"\n \n@@ -51,6 +52,7 @@\n static Bool     DUMMYEnterVT(VT_FUNC_ARGS_DECL);\n static void     DUMMYLeaveVT(VT_FUNC_ARGS_DECL);\n static Bool     DUMMYCloseScreen(CLOSE_SCREEN_ARGS_DECL);\n+static void     DUMMYBlockHandler(ScreenPtr pScreen, void *timeout);\n static Bool     DUMMYCreateWindow(WindowPtr pWin);\n static void     DUMMYFreeScreen(FREE_SCREEN_ARGS_DECL);\n static ModeStatus DUMMYValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode,\n@@ -768,6 +770,97 @@\n \n static ScrnInfoPtr DUMMYScrn; /* static-globalize it */\n \n+static void DUMMYOrbitalEvent(int fd, int ready, void *data) {\n+    DUMMYPtr dPtr = (DUMMYPtr)data;\n+    if (!dPtr->orb_window) {\n+        return;\n+    }\n+\n+    void *event_iter = orb_window_events(dPtr->orb_window);\n+    if (!event_iter) {\n+        return;\n+    }\n+\n+    bool running = true;\n+    while (running) {\n+        OrbEventOption event = orb_events_next(event_iter);\n+        if (event.tag == OrbEventOption_None) {\n+            break;\n+        }\n+        //TODO: handle more events\n+        switch (event.tag) {\n+            case OrbEventOption_Key:\n+                if (inputInfo.keyboard) {\n+                    if (event.key.scancode > 0) {\n+                        //TODO: more advanced key mapping?\n+                        xf86PostKeyEvent(inputInfo.keyboard, event.key.scancode + 8, event.key.pressed);\n+                    }\n+                }\n+                break;\n+            case OrbEventOption_Mouse:\n+                if (inputInfo.pointer) {\n+                    xf86PostMotionEvent(inputInfo.pointer, 1, 0, 2, event.mouse.x, event.mouse.y);\n+                }\n+                break;\n+            case OrbEventOption_MouseRelative:\n+                if (inputInfo.pointer) {\n+                    if (event.mouse_relative.dx || event.mouse_relative.dy) {\n+                        xf86PostMotionEvent(inputInfo.pointer, 0, 0, 2, event.mouse_relative.dx, event.mouse_relative.dy);\n+                    }\n+                }\n+                break;\n+            case OrbEventOption_Button:\n+                if (inputInfo.pointer) {\n+                    xf86PostButtonEvent(inputInfo.pointer, 0, 1, event.button.left, 0, 0);\n+                    xf86PostButtonEvent(inputInfo.pointer, 0, 2, event.button.middle, 0, 0);\n+                    xf86PostButtonEvent(inputInfo.pointer, 0, 3, event.button.right, 0, 0);\n+                }\n+                break;\n+            case OrbEventOption_None:\n+                running = false;\n+                break;\n+            default:\n+                //printf(\"unknown orbital event %d: %d, %d\\n\", event.unknown.code, event.unknown.a, event.unknown.b);\n+                break;\n+        }\n+    }\n+\n+    orb_events_destroy(event_iter);\n+}\n+\n+static Bool\n+CreateScreenResources(ScreenPtr pScreen)\n+{\n+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);\n+    DUMMYPtr dPtr = DUMMYPTR(pScrn);\n+    PixmapPtr rootPixmap;\n+    Bool ret;\n+\n+    pScreen->CreateScreenResources = dPtr->CreateScreenResources;\n+    ret = pScreen->CreateScreenResources(pScreen);\n+    pScreen->CreateScreenResources = CreateScreenResources;\n+\n+    if (!ret) {\n+        return FALSE;\n+    }\n+\n+    rootPixmap = pScreen->GetScreenPixmap(pScreen);\n+\n+    dPtr->damage = DamageCreate(NULL, NULL, DamageReportNone, TRUE,\n+                                pScreen, rootPixmap);\n+    if (dPtr->damage) {\n+        DamageRegister(&rootPixmap->drawable, dPtr->damage);\n+        xf86DrvMsg(pScrn->scrnIndex, X_INFO, \"Damage tracking initialized\\n\");\n+    }\n+    else {\n+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \"Failed to create screen damage record\\n\");\n+        return FALSE;\n+    }\n+\n+    return TRUE;\n+}\n+\n+\n /* Mandatory */\n static Bool\n DUMMYScreenInit(SCREEN_INIT_ARGS_DECL)\n@@ -776,7 +869,6 @@\n     DUMMYPtr dPtr;\n     int ret;\n     VisualPtr visual;\n-    void *pixels;\n \n     /*\n      * we need to get the ScrnInfoRec for this screen, so let's allocate\n@@ -786,9 +878,22 @@\n     dPtr = DUMMYPTR(pScrn);\n     DUMMYScrn = pScrn;\n \n+    if (pScrn->bitsPerPixel != 32) {\n+        printf(\"unsupported BPP %d\\n\", pScrn->bitsPerPixel);\n+        return FALSE;\n+    }\n \n-    if (!(pixels = malloc(pScrn->videoRam * 1024)))\n+    printf(\n+        \"orb_window_new %d, %d\\n\",\n+        pScrn->virtualX, pScrn->virtualY\n+    );\n+    dPtr->orb_window = orb_window_new_flags(-1, -1, pScrn->virtualX, pScrn->virtualY, \"X11\", ORB_WINDOW_ASYNC | ORB_WINDOW_BORDERLESS);\n+    if (!dPtr->orb_window) {\n+        printf(\"failed to open orbital window\\n\");\n \treturn FALSE;\n+    }\n+\n+    SetNotifyFd(orb_window_fd(dPtr->orb_window), DUMMYOrbitalEvent, X_NOTIFY_READ, dPtr);\n \n     /*\n      * Reset visual list.\n@@ -800,12 +905,10 @@\n     if (!miSetVisualTypes(pScrn->depth,\n                           miGetDefaultVisualMask(pScrn->depth),\n                           pScrn->rgbBits, pScrn->defaultVisual)) {\n-        free(pixels);\n         return FALSE;\n     }\n \n     if (!miSetPixmapDepths ()) {\n-        free(pixels);\n         return FALSE;\n     }\n \n@@ -813,7 +916,7 @@\n      * Call the framebuffer layer's ScreenInit function, and fill in other\n      * pScreen fields.\n      */\n-    ret = fbScreenInit(pScreen, pixels,\n+    ret = fbScreenInit(pScreen, orb_window_data(dPtr->orb_window),\n \t\t\t    pScrn->virtualX, pScrn->virtualY,\n \t\t\t    pScrn->xDpi, pScrn->yDpi,\n \t\t\t    pScrn->displayWidth, pScrn->bitsPerPixel);\n@@ -838,6 +941,10 @@\n     /* must be after RGB ordering fixed */\n     fbPictureInit(pScreen, 0, 0);\n \n+    /* Wrap the current CreateScreenResources function */\n+    dPtr->CreateScreenResources = pScreen->CreateScreenResources;\n+    pScreen->CreateScreenResources = CreateScreenResources;\n+\n     xf86SetBlackWhitePixels(pScreen);\n \n     /* initialize XRANDR */\n@@ -943,6 +1050,10 @@\n     dPtr->CloseScreen = pScreen->CloseScreen;\n     pScreen->CloseScreen = DUMMYCloseScreen;\n \n+    /* Wrap the current BlockHandler function */\n+    dPtr->BlockHandler = pScreen->BlockHandler;\n+    pScreen->BlockHandler = DUMMYBlockHandler;\n+\n     /* Wrap the current CreateWindow function */\n     dPtr->CreateWindow = pScreen->CreateWindow;\n     pScreen->CreateWindow = DUMMYCreateWindow;\n@@ -975,11 +1086,26 @@\n     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);\n     DUMMYPtr dPtr = DUMMYPTR(pScrn);\n \n-    free(pScreen->GetScreenPixmap(pScreen)->devPrivate.ptr);\n+    if (dPtr->damage) {\n+        DamageUnregister(dPtr->damage);\n+        DamageDestroy(dPtr->damage);\n+        dPtr->damage = NULL;\n+    }\n+\n+    if (dPtr->orb_window) {\n+        RemoveNotifyFd(orb_window_fd(dPtr->orb_window));\n+\n+        printf(\"orb_window_destroy %p\\n\", dPtr->orb_window);\n+        orb_window_destroy(dPtr->orb_window);\n+        dPtr->orb_window = NULL;\n+    }\n \n     if (dPtr->CursorInfo)\n \txf86DestroyCursorInfoRec(dPtr->CursorInfo);\n \n+    pScreen->CreateScreenResources = dPtr->CreateScreenResources;\n+    pScreen->BlockHandler = dPtr->BlockHandler;\n+\n     pScrn->vtSema = FALSE;\n     pScreen->CloseScreen = dPtr->CloseScreen;\n     return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS);\n@@ -1009,6 +1135,31 @@\n Atom VFB_PROP  = 0;\n #define  VFB_PROP_NAME  \"VFB_IDENT\"\n \n+static void DUMMYBlockHandler(ScreenPtr pScreen, void *timeout) {\n+    DUMMYPtr dPtr = DUMMYPTR(DUMMYScrn);\n+\n+    //printf(\"BlockHandler %p %p\\n\", pScreen, timeout);\n+    pScreen->BlockHandler = dPtr->BlockHandler;\n+    pScreen->BlockHandler(pScreen, timeout);\n+    dPtr->BlockHandler = pScreen->BlockHandler;\n+    pScreen->BlockHandler = DUMMYBlockHandler;\n+\n+    if (dPtr->damage) {\n+        RegionPtr dirty = DamageRegion(dPtr->damage);\n+        if (RegionNil(dirty)) {\n+            // Do not sync if damage empty\n+            return;\n+        }\n+        DamageEmpty(dPtr->damage);\n+    }\n+\n+    if (dPtr->orb_window) {\n+        //TODO: use damage region?\n+        //printf(\"orb_window_sync %p\\n\", dPtr->orb_window);\n+        orb_window_sync(dPtr->orb_window);\n+    }\n+}\n+\n static Bool\n DUMMYCreateWindow(WindowPtr pWin)\n {\ndiff -ruwN source-old/src/dummy.h source/src/dummy.h\n--- source-old/src/dummy.h\t2023-05-07 14:27:44.000000000 -0600\n+++ source/src/dummy.h\t2025-10-29 10:11:23.172517830 -0600\n@@ -4,6 +4,7 @@\n #include \"xf86_OSproc.h\"\n \n #include \"xf86Cursor.h\"\n+#include \"xf86Xinput.h\"\n \n #ifdef XvExtension\n #include \"xf86xv.h\"\n@@ -13,7 +14,9 @@\n \n #include \"compat-api.h\"\n \n-#define DUMMY_MAX_SCREENS 16\n+#include <orbital.h>\n+\n+#define DUMMY_MAX_SCREENS 1\n \n /* Supported chipsets */\n typedef enum {\n@@ -44,6 +47,7 @@\n     OptionInfoPtr Options;\n     Bool swCursor;\n     /* proc pointer */\n+    CreateScreenResourcesProcPtr CreateScreenResources;\n     CloseScreenProcPtr CloseScreen;\n     xf86CursorInfoPtr CursorInfo;\n \n@@ -52,6 +56,7 @@\n     int cursorFG, cursorBG;\n \n     dummy_colors colors[1024];\n+    void        (*BlockHandler)(ScreenPtr, void*) ;     /* wrapped BlockHandler */\n     Bool        (*CreateWindow)(WindowPtr) ;     /* wrapped CreateWindow */\n     Bool prop;\n     /* XRANDR support begin */\n@@ -60,6 +65,9 @@\n     struct _xf86Output *paOutputs[DUMMY_MAX_SCREENS];\n     int connected_outputs;\n     /* XRANDR support end */\n+\n+    DamagePtr damage;\n+    void *orb_window;\n } DUMMYRec, *DUMMYPtr;\n \n /* The privates of the DUMMY driver */\n"
  },
  {
    "path": "recipes/wip/x11/xterm/recipe.toml",
    "content": "[source]\ntar = \"https://invisible-island.net/archives/xterm/xterm-398.tgz\"\nblake3 = \"c42112586b2c231681db9327df9d797953469e3b7cb2abe93b8f3f821597d528\"\npatches = [\"redox.patch\"]\n\n[build]\ndependencies = [\n    \"expat\",\n    \"fontconfig\",\n    \"freetype2\",\n    \"libice\",\n    \"libpng\",\n    \"libpthread-stubs\",\n    \"libsm\",\n    \"libx11\",\n    \"libxau\",\n    \"libxaw\",\n    \"libxcb\",\n    \"libxext\",\n    \"libxft\",\n    \"libxmu\",\n    \"libxpm\",\n    \"libxrender\",\n    \"libxt\",\n    \"ncurses\",\n    \"pcre2\",\n    \"x11proto\",\n    \"zlib\",\n]\ntemplate = \"custom\"\nscript = \"\"\"\nDYNAMIC_INIT\nexport CFLAGS=\"${CFLAGS} -I${COOKBOOK_SYSROOT}/usr/include/freetype2\"\n#TODO: why are LIBS not automatic?\nexport LIBS=\"-lXaw7 -lXmu -lXpm -lXt -lSM -lICE -lXft -lfreetype -lfontconfig -lXrender -lXext -lX11 -lxcb -lXau -lpcre2-8 -lexpat -lpng -lz\"\ncookbook_configure \\\n    --with-pcre2 \\\n    cf_cv_func_setitimer=no\n\"\"\"\n"
  },
  {
    "path": "recipes/wip/x11/xterm/redox.patch",
    "content": "diff -ruwN xterm-398/main.c source/main.c\n--- xterm-398/main.c\t2025-03-08 06:03:19.000000000 -0700\n+++ source/main.c\t2025-05-05 21:25:41.492475745 -0600\n@@ -162,6 +162,10 @@\n #define USE_POSIX_SIGNALS\n #endif\n \n+#ifndef XTABS\n+#define XTABS 0x01800\n+#endif\n+\n #if defined(SYSV) && !defined(SVR4) && !defined(ISC22) && !defined(ISC30)\n /* older SYSV systems cannot ignore SIGHUP.\n    Shell hangs, or you get extra shells, or something like that */\n@@ -185,6 +189,10 @@\n #define WTMP\n #endif\n \n+#ifdef __redox__\n+#define USE_SYSV_PGRP\n+#endif\n+\n #ifdef __SCO__\n #ifndef _SVID3\n #define _SVID3\n@@ -3114,7 +3122,7 @@\n     }\n }\n \n-#if defined(__osf__) || (defined(__linux__) && !defined(USE_USG_PTYS)) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)\n+#if defined(__osf__) || (defined(__linux__) && !defined(USE_USG_PTYS)) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__redox__)\n #define USE_OPENPTY 1\n static int opened_tty = -1;\n #endif\n@@ -4494,7 +4502,7 @@\n \t\t\t/* make /dev/tty work */\n \t\t\tioctl(ttyfd, TIOCSCTTY, 0);\n #endif\n-#ifdef USE_SYSV_PGRP\n+#if defined(USE_SYSV_PGRP) && !defined(__redox__)\n \t\t\t/* We need to make sure that we are actually\n \t\t\t * the process group leader for the pty.  If\n \t\t\t * we are, then we should now be able to open\ndiff -ruwN xterm-398/xterm.h source/xterm.h\n--- xterm-398/xterm.h\t2025-04-08 01:36:09.000000000 -0600\n+++ source/xterm.h\t2025-05-05 21:11:05.413561791 -0600\n@@ -80,7 +80,7 @@\n #define HAVE_PUTENV 1\n #endif\n \n-#if defined(CSRG_BASED) || defined(__GNU__) || defined(__minix)\n+#if defined(CSRG_BASED) || defined(__GNU__) || defined(__minix) || defined(__redox__)\n #define USE_POSIX_TERMIOS 1\n #endif\n \n@@ -208,7 +208,7 @@\n #define HAVE_PTY_H\n #endif\n \n-#if !defined(USG) && !defined(__minix)\n+#if !defined(USG) && !defined(__minix) && !defined(__redox__)\n #define HAVE_SETITIMER 1\n #else\n #define HAVE_SETITIMER 0\ndiff -ruwN xterm-398/xterm_io.h source/xterm_io.h\n--- xterm-398/xterm_io.h\t2024-09-30 02:03:20.000000000 -0600\n+++ source/xterm_io.h\t2025-05-05 21:11:05.413561791 -0600\n@@ -57,7 +57,7 @@\n #define USE_SYSV_TERMIO\n #endif\n \n-#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__INTERIX) || defined(__APPLE__) || defined(__UNIXWARE__) || defined(__hpux)\n+#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__INTERIX) || defined(__APPLE__) || defined(__UNIXWARE__) || defined(__hpux) || defined(__redox__)\n #ifndef USE_POSIX_TERMIOS\n #define USE_POSIX_TERMIOS\n #endif\n"
  },
  {
    "path": "recipes/wip/x11/xtrans/recipe.toml",
    "content": "[source]\ntar = \"https://xorg.freedesktop.org/archive/individual/lib/xtrans-1.6.0.tar.xz\"\nblake3 = \"18e5a2478425ec43370d7719bc4ee4f25d01ad7f580fcc3b5d91effa267cbaaa\"\n\n[build]\ntemplate = \"configure\"\n"
  },
  {
    "path": "redox.ipxe",
    "content": "#!ipxe\n\nkernel bootloader-live.efi\ninitrd http://${next-server}:8080/redox-live.iso\nboot\n"
  },
  {
    "path": "rust-toolchain.toml",
    "content": "[toolchain]\nchannel = \"nightly-2025-10-03\"\ncomponents = [\"rust-src\", \"rustfmt\", \"clippy\"]\nprofile = \"minimal\"\n"
  },
  {
    "path": "scripts/backtrace.sh",
    "content": "#!/usr/bin/env bash\n\n# This script allow the user to copy a Rust backtrace from Redox\n# and retrieve the symbols\n\nusage()\n{\n    echo \"Usage: $0 -r recipe [ -e command_name ] [ -R ] [ -X | -6 | -A ] [[ -b backtracefile ] | [ addr1 ... ]]\"\n    echo\n    echo \"Print the backtrace contained in the backtracefile.\"\n    echo \"Symbols are taken from the executable for the given recipe.\"\n    echo \"If no backtracefile is given, decode the given addresses instead.\"\n    echo \"This command must be run in the 'redox' directory.\"\n    echo\n    echo \"-X for x86_64, -6 for i686, -A for aarch64 (x86_64 is the default).\"\n    echo \"To read from stdin, use '-b -'\"\n    echo \"The name of the executable must match what Cargo believes it to be.\"\n    echo \"If the executalbe is named 'recipe_command', just use 'command' as the name.\"\n    echo \"The debug version of the executable is used if available.\"\n    echo \"The release version is used if no debug version exists.\"\n    echo \"-R to force the use of the 'release' version of the executable.\"\n    echo \"Make sure the executable is the one that produced the backtrace.\"\n    exit 1\n}\n\nARCH=\"x86_64\"\n\nwhile getopts \":b:e:r:hRXA6\" opt\ndo\n    case \"$opt\" in\n        X) ARCH=\"x86_64\";;\n        A) ARCH=\"aarch64\";;\n        6) ARCH=\"i686\";;\n        b) INFILE=\"$OPTARG\";;\n        e) COMMAND=\"$OPTARG\";;\n        i) INST=\"$OPTARG\";;\n        r) RECIPE_NAME=\"$OPTARG\";;\n        R) RELEASE=true;;\n\th) usage;;\n\t\\?) echo \"Unknown option -$OPTARG, try -h for help\"; exit;;\n        :) echo \"-$OPTARG requires a value\"; exit;;\n\tesac\ndone\nshift $((OPTIND -1))\n\nif [ -z \"$RECIPE_NAME\" ]\nthen\n    usage\nfi\n\nif [ -z \"$INFILE\" -a $# = 0 ]\nthen\n    usage\nfi\n\n# if no command name is given, assume it's the same as the recipe name\nRECIPE_DIR=\"$(target/release/find_recipe $RECIPE_NAME)\"\nif [ -z \"$COMMAND\" ]\nthen\n    COMMAND=\"$RECIPE_NAME\"\nfi\n\n# look for the debug version of the command\nEXECUTABLE=\"$RECIPE_DIR\"/target/\"$ARCH\"-unknown-redox/build/target/\"$ARCH\"-unknown-redox/debug/\"$COMMAND\"\n\n# try the release version next\nif [ ! -f \"$EXECUTABLE\" -o ! -z \"$RELEASE\" ]\nthen\n    EXECUTABLE=\"$RECIPE_DIR\"/target/\"$ARCH\"-unknown-redox/build/target/\"$ARCH\"-unknown-redox/release/\"$COMMAND\"\nfi\n\nif [ $# -ne 0 ]\nthen\n    addr2line --demangle=rust --inlines --pretty-print --functions --exe=\"$EXECUTABLE\" $@\nelse\n    sed '/^\\s*$/d; s/^.*0x\\([0-9a-f]*\\).*$/\\1/g' \"$INFILE\" | addr2line --demangle=rust --inlines --pretty-print --functions --exe=\"$EXECUTABLE\"\nfi\n\n"
  },
  {
    "path": "scripts/cargo-update.sh",
    "content": "#!/usr/bin/env bash\n\n# This script runs \"make f.recipe\" and \"cargo update\" in the specified recipe\n\nrecipe_name=\"$1\"\nrecipe_path=$(find recipes -name \"$recipe_name\" -maxdepth 4)\n\nmake f.\"$recipe_name\"\ncd \"$recipe_path\"/source\ncargo update\n"
  },
  {
    "path": "scripts/category.sh",
    "content": "#!/usr/bin/env bash\n\n# This script run the recipe command options on some Cookbook category\n\nif [ -z \"$1\" ] || [ -z \"$2\" ]\nthen\n    echo \"Build or clean all recipe directories in a category\" >&2\n    echo Usage: $0 \"<action>\" \"<recipe-category>\" >&2\n    echo \"<action>\" can be f, r, c, u, p, or combinations that \\\"make\\\" understands >&2\n    echo \"<category>\" can be path of category you want to run e.g. \\\"core\\\", \\\"wip\\\", \\\"wip/dev\\\" >&2\n    exit 1\nfi\n\nmake \"${1#-}\".\"--category-$2\"\n"
  },
  {
    "path": "scripts/changelog.sh",
    "content": "#!/usr/bin/env bash\n\n# This script show the changelog of all Redox components\n\nset -e\n\nLAST_RELEASE_TAG=\"$(git describe --tags --abbrev=0)\"\nLAST_RELEASE_TIMESTAMP=\"$(git log --format=\"%ct\" -1 \"${LAST_RELEASE_TAG}\")\"\necho \"Last release: ${LAST_RELEASE_TAG} at ${LAST_RELEASE_TIMESTAMP}\"\n\nREPOS=(\n    redox=.\n    cookbook=cookbook\n    rust=rust\n)\n\nif [ \"$1\" = \"--summary\" ]\nthen\n    summary=true\nelif [ \"$1\" = \"--mdlinks\" ]\nthen\n    mdlinks=true\nfi\n\nfor package in $(installer/target/release/redox_installer --list-packages -c config/$(uname -m)/desktop.toml)\ndo\n    package_source=\"$(target/release/find_recipe ${package})\"\n    REPOS+=(\"${package}=${package_source}/source\")\ndone\n\n# TODO: resolve dependencies instead of manually adding these initfs packages\nfor package in init logd ramfs randd zerod\ndo\n    package_source=\"$(target/release/find_recipe ${package})\"\n    REPOS+=(\"${package}=${package_source}/source\")\ndone\n\nfor name_repo in \"${REPOS[@]}\"\ndo\n    name=\"$(echo \"${name_repo}\" | cut -d \"=\" -f 1)\"\n    repo=\"$(echo \"${name_repo}\" | cut -d \"=\" -f 2-)\"\n    if [ \"${summary}\" = true ]\n    then\n        echo\n        echo \"### ${name}\"\n        echo\n    elif [ \"${mdlinks}\" = true ]\n    then\n        echo -n \"- [${name}]\"\n    else\n        echo -en \"\\x1B[1m${name}:\\x1B[0m \"\n    fi\n\n    if [ -e \"${repo}/.git\" ]\n    then\n        remote=\"$(git -C \"${repo}\" remote get-url origin)\"\n        website=\"${remote%.*}\"\n        before=\"$(git -C \"${repo}\" log --until=\"${LAST_RELEASE_TIMESTAMP}\" --format=\"%h\" -1)\"\n        after=\"$(git -C \"${repo}\" log --since=\"${LAST_RELEASE_TIMESTAMP}\" --format=\"%h\" -1)\"\n        if [ -z \"${before}\" ]\n        then\n            echo \"New repository at ${website}\"\n        elif [ -z \"${after}\" ]\n        then\n            echo \"No changes\"\n        else\n            if [ \"${summary}\" = true ]\n            then\n                git -C \"${repo}\" log ${before}...${after} --oneline\n            elif [ \"${mdlinks}\" = true ]\n            then\n                echo \"(${website}/-/compare/${before}...${after})\"\n            else\n                echo \"${website}/-/compare/${before}...${after}\"\n            fi\n        fi\n    else\n        echo \"Not a git repository\"\n    fi\ndone\n"
  },
  {
    "path": "scripts/check-ci-config.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nif [ -n \"$1\" ]\nthen\n    ARCH=\"$1\"\nelse\n    ARCH=\"x86_64\"\nfi\n\nmake build/fstools\n\ndeclare -A packages\nfor recipe_dir in $(build/fstools/bin/list_recipes | grep -v '^recipes/wip/')\ndo\n    recipe_name=\"$(basename \"${recipe_dir}\")\"\n    packages[\"${recipe_name}\"]=\"${recipe_dir}\"\ndone\n\nconfig=\"config/${ARCH}/ci.toml\"\nfor package in $(build/fstools/bin/redox_installer --list-packages -c \"${config}\")\ndo\n    packages[\"${package}\"]=\"\"\ndone\n\necho \"Checking for missing packages in ${config}\"\nprintf '%-32s%s\\n' \"PACKAGE\" \"RECIPE\"\nfor package in \"${!packages[@]}\"\ndo\n    recipe_dir=\"${packages[\"${package}\"]}\"\n    if [ -n \"${recipe_dir}\" ]\n    then\n        printf '%-32s%s\\n' \"${package}\" \"${recipe_dir}\"\n    fi\ndone | sort\n"
  },
  {
    "path": "scripts/commit-hash.sh",
    "content": "#!/usr/bin/env bash\n\n# This script shows the current Git commit hash of system recipes at recipes/core\n\nset -e\n\n# Check if recipes/core directory exists\nif [ ! -d \"recipes/core\" ]\nthen\n    echo \"Error: recipes/core directory not found\"\n    exit 1\nfi\n\n# Iterate through all system recipes in recipes/core\nfor recipe_dir in recipes/core/*/\ndo\n    recipe_name=$(basename \"$recipe_dir\")\n    source_dir=\"$recipe_dir/source\"\n    \n    # Check if source directory exists and is a git repository\n    if [ -d \"$source_dir\" ] && [ -d \"$source_dir/.git\" ]\n    then\n        # Get the commit hash\n        commit_hash=$(cd \"$source_dir\" && git rev-parse HEAD)\n        echo \"$recipe_name: $commit_hash\"\n    fi\ndone\n"
  },
  {
    "path": "scripts/dual-boot.sh",
    "content": "#!/usr/bin/env bash\n\n# This script install Redox in the free space of your storage device\n# and add a boot entry (if you are using the systemd-boot boot loader)\n\nset -e\n\nif [ -n \"$1\" ]\nthen\n    DISK=\"$1\"\nelse\n    DISK=/dev/disk/by-partlabel/REDOX_INSTALL\nfi\n\nif [ ! -b \"${DISK}\" ]\nthen\n    echo \"$0: '${DISK}' is not a block device\" >&2\n    exit 1\nfi\n\neval $(make setenv)\n\nIMAGE=\"${BUILD}/filesystem.img\"\nset -x\nrm -f \"${IMAGE}\"\nmake \"${IMAGE}\"\nsudo popsicle \"${IMAGE}\" \"${DISK}\"\nset +x\n\nESP=\"$(bootctl --print-esp-path)\"\nif [ -z \"${ESP}\" ]\nthen\n    echo \"$0: no ESP found\" >&2\n    exit 1\nfi\n\nBOOTLOADER=\"recipes/core/bootloader/target/${ARCH}-unknown-redox/stage/usr/lib/boot/bootloader.efi\"\nset -x\nsudo mkdir -pv \"${ESP}/EFI\" \"${ESP}/loader/entries\"\nsudo cp -v \"${BOOTLOADER}\" \"${ESP}/EFI/redox.efi\"\nsudo tee \"${ESP}/loader/entries/redox.conf\" <<EOF\ntitle Redox OS\nefi /EFI/redox.efi\nEOF\nset +x\n\nsync\n\necho \"Finished installing Redox OS dual boot\"\necho \"\"\necho \"To mount the RedoxFS partition, run:\"\necho \"  ./scripts/mount-redoxfs.sh ${DISK}\"\n"
  },
  {
    "path": "scripts/executables.sh",
    "content": "#!/usr/bin/env bash\n\n# This script print all recipe executable names to find duplicates and verify executable name conflicts\n\nusage() {\n    echo \"List executable names to find duplicates\"\n    echo \"Usage: $0 [-h] [-a] [-arm64 | -i686] [recipes]\"\n    echo \"Default architecture is x86_64, -arm64 is aarch64, -i686 is i686\"\n    echo \"Only duplicates are listed unless -a is specified\"\n    echo \"-h is this message\"\n    exit\n}\n\nrecipes=\"\"\n\ntarget=\"x86_64-unknown-redox\"\nuniq=\"uniq -D --skip-fields=1\"\n\nfor arg in \"${@:1}\"\ndo\n    if [ \"$arg\" == \"-arm64\" ]\n    then\n        target=\"aarch64-unknown-redox\"\n    elif [ \"$arg\" == \"-i686\" ]\n    then\n        target=\"i686-unknown-redox\"\n    elif [ \"$arg\" == \"-a\" ]\n    then\n        uniq=\"cat\"\n    elif [ \"$arg\" == \"-h\" ]\n    then\n    \tusage\n    else\n        recipes+=\" $arg\"\n    fi\ndone\n\nif [ -z \"$recipes\" ]\nthen\n    recipes=\"$(target/release/list_recipes)\"\nfi\n\nfor recipe in $recipes\ndo\n    if [[ \"$recipe\" == *\\/* ]]\n    then\n        recipe_name=\"$(basename $recipe)\"\n        recipe_path=\"recipes/$recipe\"\n    else\n        recipe_name=\"$recipe\"\n        recipe_path=\"$(target/release/find_recipe $recipe_name)\"\n    fi\n    \n    for command in $(find \"$recipe_path/target/$target/stage/usr/bin\" -type f 2> /dev/null) \\\n        $(find \"$recipe_path/target/$target/stage/bin\" -type f 2> /dev/null)\n    do\n        shortname=\"$(basename $command)\"\n    \techo \"$recipe_path $shortname\"\n    done\ndone | sort | $uniq\n"
  },
  {
    "path": "scripts/find-recipe.sh",
    "content": "#!/usr/bin/env bash\n\n# This script show all files installed by a recipe\n\n# Ensure arch and config are set as desired, we use these to find the build dir\nexport ARCH=$(uname -m)\nexport CONFIG_NAME=desktop\n\n# Make sure to unmount the image first\nmake unmount &>/dev/null || true\n\n# Mount the image\nmake mount >/dev/null\n\n# Find all files\nfind \"build/${ARCH}/${CONFIG_NAME}/\" -type f | cut -d / -f5- |\\\nsort |\\\nuniq |\\\nwhile read path\ndo\n    # Skip empty paths\n    if [ -z \"${path}\" ]\n    then\n        continue\n    fi\n\n    # Find all packages providing this file\n    pkgs=\"$(\n        find recipes/*\"/target/${ARCH}-unknown-redox/stage/${path}\" 2>/dev/null |\n        cut -d/ -f3 |\n        tr '\\n' ' ' |\n        sort |\n        uniq\n    )\"\n    if [ -n \"${pkgs}\" ]\n    then\n        echo \"$path: ${pkgs}\"\n    else\n        echo \"$path: no packages, see config/${ARCH}/${CONFIG_NAME}.toml\"\n    fi\ndone\n\n# Make sure to unmount the image\nmake unmount &>/dev/null || true\n"
  },
  {
    "path": "scripts/include-recipes.sh",
    "content": "#!/usr/bin/env bash\n\n# This script create a list with:\n# \"recipe-name = {} #TODO\"\n# For quick testing of WIP recipes\n\n# Given a string, find recipe.toml files containing that string.\n# Create a list that can be copy/pasted into a filesystem config.\n\nif [ -z \"$*\" ]\nthen\n    echo \"Find matching recipes, and format for inclusion in config\"\n    echo \"Usage: $0 \\\"pattern\\\"\"\n    echo \"Must be run from 'redox' directory\"\n    echo \"e.g. $0 \\\"TODO.*error\\\"\"\n    exit 1\nfi\n\ncookbook_recipes=\"recipes\"\nrecipe_paths=$(grep -rl \"$*\" \"$cookbook_recipes\" --include recipe.toml)\n\nfor recipe_path in $recipe_paths\ndo\n    recipe_dir=\"$(dirname $recipe_path)\"\n    recipe_name=\"$(basename $recipe_dir)\"\n    echo \"$recipe_name = {}    # \" $(grep \"$*\" $recipe_path)\ndone"
  },
  {
    "path": "scripts/mount-redoxfs.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nMOUNT_POINT=\"/mnt/redoxfs\"\nDISK_DEVICE=\"\"\n\nshow_help() {\n    echo \"Usage: $0 [options] <device>\"\n    echo \"\"\n    echo \"Mount or unmount a RedoxFS partition\"\n    echo \"\"\n    echo \"Options:\"\n    echo \"  -u, --unmount    Unmount the RedoxFS partition\"\n    echo \"  -m, --mount-point PATH    Custom mount point (default: /mnt/redoxfs)\"\n    echo \"  -h, --help       Show this help\"\n    echo \"\"\n    echo \"Examples:\"\n    echo \"  $0 /dev/sda3                    Mount /dev/sda3\"\n    echo \"  $0 -u                           Unmount from default location\"\n    echo \"  $0 -m /mnt/my-redox /dev/sda3   Mount to custom location\"\n}\n\nunmount_fs() {\n    if mountpoint -q \"$MOUNT_POINT\" 2>/dev/null; then\n        echo \"Unmounting RedoxFS from $MOUNT_POINT...\"\n        fusermount -u \"$MOUNT_POINT\" || fusermount3 -u \"$MOUNT_POINT\"\n        echo \"Successfully unmounted\"\n    else\n        echo \"Nothing mounted at $MOUNT_POINT\"\n    fi\n    exit 0\n}\n\ncheck_dependencies() {\n    # Try to find redoxfs in multiple locations\n    REDOXFS_BIN=\"\"\n    if [ -x \"build/fstools/bin/redoxfs\" ]; then\n        REDOXFS_BIN=\"build/fstools/bin/redoxfs\"\n    elif [ -x \"$(dirname \"$0\")/../build/fstools/bin/redoxfs\" ]; then\n        REDOXFS_BIN=\"$(dirname \"$0\")/../build/fstools/bin/redoxfs\"\n    elif command -v redoxfs &> /dev/null; then\n        REDOXFS_BIN=\"redoxfs\"\n    fi\n\n    if [ -z \"$REDOXFS_BIN\" ]; then\n        echo \"Error: redoxfs command not found\"\n        echo \"Please build it first with: make fstools\"\n        exit 1\n    fi\n\n    if ! ldconfig -p 2>/dev/null | grep -q \"libfuse3\"; then\n        echo \"Error: libfuse 3.x is not installed\"\n        echo \"Please install it:\"\n        if command -v apt-get &> /dev/null; then\n            echo \"  sudo apt-get install fuse3 libfuse3-dev\"\n        elif command -v dnf &> /dev/null; then\n            echo \"  sudo dnf install fuse3-devel\"\n        elif command -v pacman &> /dev/null; then\n            echo \"  sudo pacman -S fuse3\"\n        else\n            echo \"  (check your package manager for fuse3)\"\n        fi\n        exit 1\n    fi\n}\n\nUNMOUNT=false\n\nwhile [[ $# -gt 0 ]]; do\n    case $1 in\n        -u|--unmount)\n            UNMOUNT=true\n            shift\n            ;;\n        -m|--mount-point)\n            MOUNT_POINT=\"$2\"\n            shift 2\n            ;;\n        -h|--help)\n            show_help\n            exit 0\n            ;;\n        *)\n            DISK_DEVICE=\"$1\"\n            shift\n            ;;\n    esac\ndone\n\nif [ \"$UNMOUNT\" = true ]; then\n    unmount_fs\nfi\n\nif [ -z \"$DISK_DEVICE\" ]; then\n    DISK_DEVICE=\"/dev/disk/by-partlabel/REDOX_INSTALL\"\n    if [ ! -b \"$DISK_DEVICE\" ]; then\n        echo \"Error: No device specified and default partition not found\"\n        echo \"\"\n        show_help\n        exit 1\n    fi\nfi\n\nif [ ! -b \"$DISK_DEVICE\" ] && [ ! -f \"$DISK_DEVICE\" ]; then\n    echo \"Error: $DISK_DEVICE is not a block device or file\"\n    exit 1\nfi\n\ncheck_dependencies\n\nmkdir -p \"$MOUNT_POINT\"\n\necho \"Mounting $DISK_DEVICE to $MOUNT_POINT...\"\n\"$REDOXFS_BIN\" \"$DISK_DEVICE\" \"$MOUNT_POINT\"\n\necho \"RedoxFS successfully mounted at $MOUNT_POINT\"\necho \"To unmount, run: $0 -u\"\n\n"
  },
  {
    "path": "scripts/network-boot.sh",
    "content": "#!/usr/bin/env bash\n\n# Your host must use the static IP ${NETWORK}.1 and subnet mask 255.255.255.0\n# 'Rx' in ascii is 82 and 120, adjust to taste\nNETWORK=10.82.120\n\nset -ex\n\ntrap 'kill -HUP 0' EXIT\n\neval $(make setenv)\nmake \"${BUILD}/redox-live.iso\"\n\necho \"Allowing packet forwarding\"\necho 1 | sudo tee /proc/sys/net/ipv4/ip_forward\n\niface=\"$(route | grep '^default ' | grep -o '[^ ]*$' | head -n 1)\"\necho \"Forwarding packets to '$iface'\"\nif ! sudo iptables -t nat -C POSTROUTING -o \"$iface\" -j MASQUERADE\nthen\n    echo \"Forwarding rule does not exist, adding\"\n    sudo iptables -t nat -A POSTROUTING -o \"$iface\" -j MASQUERADE\nelse\n    echo \"Forwarding rule already exists\"\nfi\n\nARGS=(\n    \"--no-daemon\"\n    \"--bind-interfaces\"\n    \"--listen-address=${NETWORK}.1\"\n    \"--port=0\"\n    \"--dhcp-range=${NETWORK}.3,${NETWORK}.254,255.255.255.0,1h\"\n    \"--dhcp-option=6,1.1.1.1,1.0.0.1\"\n    \"--enable-tftp\"\n    \"--tftp-root=$(realpath \"${BUILD}\")\"\n    # BIOS\n    \"--dhcp-match=set:bios,option:client-arch,0\"\n    \"--dhcp-boot=tag:!ipxe,tag:bios,undionly.kpxe\"\n    # EFI x86_64\n    \"--dhcp-match=set:efi-x86_64,option:client-arch,7\"\n    \"--dhcp-match=set:efi-x86_64,option:client-arch,9\"\n    \"--dhcp-boot=tag:!ipxe,tag:efi-x86_64,ipxe-x86_64.efi\"\n    # EFI aarch64\n    \"--dhcp-match=set:efi-aarch64,option:client-arch,11\"\n    \"--dhcp-boot=tag:!ipxe,tag:efi-aarch64,ipxe-aarch64.efi\"\n    # IPXE\n    \"--dhcp-userclass=set:ipxe,iPXE\"\n    \"--dhcp-boot=tag:ipxe,redox.ipxe\"\n)\n\nsudo dnsmasq \"${ARGS[@]}\"&\npython3 -m http.server -b \"${NETWORK}.1\" -d \"${BUILD}\" \"8080\"\n"
  },
  {
    "path": "scripts/pkg-size.sh",
    "content": "#!/usr/bin/env bash\n\n# This script show the package size of the recipes (\"stage.pkgar\" and \"stage.tar.gz\")\n# It must be used by package maintainers to enforce the library linking size policy\n\nif [ $# = 0 ]\nthen\n    find recipes \\( -name stage.pkgar -o -name stage.tar.gz \\) -exec ls -hs {} \\;\n    exit 0\nfi\n\nfor recipe in $@\ndo\n    if [ \"$recipe\" = \"-h\" ] || [ \"$recipe\" = \"--help\" ]\n    then\n        echo \"Usage: $0 [recipe] ...\"\n        echo \"       For the recipe(s), prints the size of 'stage.pkgar' and 'stage.tar.gz'.\"\n        echo \"       If no recipe is given, then all packages are listed.\"\n        exit 0\n    fi\n\n    recipe_paths=$(find recipes -name $recipe)\n    for recipe_path in $recipe_paths\n    do\n        if [ -f \"$recipe_path/recipe.toml\" ] || [ -f \"$recipe_path/recipe.sh\" ]\n        then\n            find \"$recipe_path\" \\( -name stage.pkgar -o -name stage.tar.gz \\) -exec ls -hs {} \\;\n        fi\n    done\ndone"
  },
  {
    "path": "scripts/print-recipe.sh",
    "content": "#!/usr/bin/env bash\n\n# This script print the recipe configuration\n\ncat $(target/release/find_recipe \"$1\")/recipe.*\n"
  },
  {
    "path": "scripts/recipe-match.sh",
    "content": "#!/usr/bin/env bash\n\n# This script print the recipe configuration files with determined text\n\nbat --decorations=always $(rg \"$1\" -li --sort=path recipes)\n"
  },
  {
    "path": "scripts/recipe-path.sh",
    "content": "#!/usr/bin/env bash\n\nFIND_RECIPE=\"find recipes -maxdepth 4 -name\"\n\nfor recipe in $*\ndo\n    ${FIND_RECIPE} \"${recipe}\"\ndone\n"
  },
  {
    "path": "scripts/show-package.sh",
    "content": "#!/usr/bin/env bash\n\n# This script show the contents of the \"stage\" and \"sysroot\" folders in some recipe\n\nif [ -z \"$*\" ]\nthen\n    echo \"Show the contents of the stage and sysroot folders in recipe(s)\"\n    echo \"Usage: $0 recipe1 ...\"\n    echo \"Must be run from the 'redox' directory\"\n    echo \"e.g. $0 kernel\"\n    exit 1\nfi\n\nfind_recipe=\"target/release/find_recipe\"\nif [ ! -x \"$find_recipe\" ]\nthen\n    echo \"$find_recipe not found.\"\n    echo \"Please run 'make fstools' and try again.\"\n    exit 1\nfi\n\nfor recipe in $*\ndo\n    recipe_dir=\"$(\"$find_recipe\" \"$recipe\")\"\n    ls -1 \"$recipe_dir/target\"/*/{stage,sysroot}\ndone\n"
  },
  {
    "path": "scripts/ventoy.sh",
    "content": "#!/usr/bin/env bash\n\n# This script create and copy the Redox bootable image to an Ventoy-formatted device\n\nset -e\n\nARCHS=(\n    i686\n    x86_64\n)\nCONFIGS=(\n    demo\n    desktop\n)\n\nVENTOY=\"/media/${USER}/Ventoy\"\nif [ ! -d \"${VENTOY}\" ]\nthen\n    echo \"Ventoy not mounted\" >&2\n    exit 1\nfi\n\nfor ARCH in \"${ARCHS[@]}\"\ndo\n    for CONFIG_NAME in \"${CONFIGS[@]}\"\n    do\n        IMAGE=\"build/${ARCH}/${CONFIG_NAME}/redox-live.iso\"\n        make ARCH=\"${ARCH}\" CONFIG_NAME=\"${CONFIG_NAME}\" \"${IMAGE}\"\n        cp -v \"${IMAGE}\" \"${VENTOY}/redox-${CONFIG_NAME}-${ARCH}.iso\"\n    done\ndone\n\nsync\n\necho \"Finished copying configs (${CONFIGS[@]}) for archs (${ARCHS[@]})\"\n"
  },
  {
    "path": "src/bin/cookbook_redoxer.rs",
    "content": "use std::env;\n\nfn main() {\n    let mut args: Vec<String> = env::args().collect();\n    // Ensure all flags go to cargo\n    if args.len() >= 2 {\n        args.insert(2, \"--\".to_string());\n        if args[1] == \"write-exec\" {\n            if let Ok(stage_dir) = std::env::var(\"COOKBOOK_STAGE\") {\n                args.insert(2, format!(\"{}/root\", stage_dir));\n                args.insert(2, \"--folder\".to_string());\n                args.insert(2, stage_dir);\n                args.insert(2, \"--root\".to_string());\n            }\n        }\n    }\n    redoxer::main(&args);\n}\n"
  },
  {
    "path": "src/bin/repo.rs",
    "content": "use ansi_to_tui::IntoText;\nuse anyhow::{Context, anyhow, bail};\nuse cookbook::config::{CookConfig, get_config, init_config};\nuse cookbook::cook::cook_build::{build, get_stage_dirs, remove_stage_dir};\nuse cookbook::cook::fetch::{fetch, fetch_offline};\nuse cookbook::cook::fs::{create_target_dir, run_command};\nuse cookbook::cook::ident;\nuse cookbook::cook::package::{package, package_handle_push};\nuse cookbook::cook::pty::{PtyOut, UnixSlavePty, flush_pty, setup_pty};\nuse cookbook::cook::script::KILL_ALL_PID;\nuse cookbook::cook::tree::{self, WalkTreeEntry};\nuse cookbook::log_to_pty;\nuse cookbook::recipe::{CookRecipe, recipes_flatten_package_names, recipes_mark_as_deps};\nuse pkg::{PackageName, PackageState};\nuse ratatui::Terminal;\nuse ratatui::layout::{Constraint, Direction, Layout, Position, Rect};\nuse ratatui::prelude::TermionBackend;\nuse ratatui::style::{Color, Style};\nuse ratatui::text::{Line, Span, Text};\nuse ratatui::widgets::{Block, Borders, Clear, List, ListItem, ListState, Paragraph, Wrap};\nuse redox_installer::PackageConfig;\nuse std::borrow::Cow;\nuse std::collections::{BTreeMap, HashMap, HashSet, VecDeque};\nuse std::io::{Read, Write, stderr, stdin, stdout};\nuse std::path::PathBuf;\nuse std::process::Command;\nuse std::str::FromStr;\nuse std::sync::atomic::{AtomicBool, AtomicU32, Ordering};\nuse std::sync::{Arc, OnceLock, mpsc};\nuse std::time::{Duration, Instant};\nuse std::{cmp, env, fs};\nuse std::{process, thread};\nuse termion::event::{Event, Key, MouseEvent};\nuse termion::input::TermRead;\nuse termion::raw::IntoRawMode;\nuse termion::screen::IntoAlternateScreen;\nuse termion::{color, style};\n\n// A repo manager, to replace repo.sh\n\nconst REPO_HELP_STR: &str = r#\"\n    Usage: repo <command> [flags] <recipe1> <recipe2> ...\n\n    command list:\n        fetch        download recipe sources\n        cook         build recipe packages\n        unfetch      delete recipe sources\n        clean        delete recipe artifacts\n        clean-target delete recipe artifacts for one target\n        push         extract package into sysroot\n        find         find path of recipe packages\n        cook-tree    show tree of recipe build\n        push-tree    show tree of recipe packages\n    \n    common flags:\n        --cookbook=<cookbook_dir>  the \"recipes\" folder, default to $PWD/recipes\n        --repo=<repo_dir>          the \"repo\" folder, default to $PWD/repo\n        --sysroot=<sysroot_dir>    the \"root\" folder used for \"push\" command\n            For Redox, defaults to \"/\", else default to $PWD/sysroot\n        --with-package-deps        include package deps (always implied in push command)\n        --all                      apply to all recipes in <cookbook_dir>\n        --category=<category>      apply to all recipes in <cookbook_dir>/<category>\n        --filesystem=<filesystem>  override recipes config using installer file\n        --repo-binary              override recipes config to use repo_binary\n\n    cook env and their defaults:\n        CI=                          set to any value to disable TUI\n        COOKBOOK_LOGS=               whether to capture build logs (default is !CI)\n        COOKBOOK_OFFLINE=false       prevent internet access if possible\n                                        ignored when command \"fetch\" is used\n        COOKBOOK_NONSTOP=false       keep running even a recipe build failed\n        COOKBOOK_COMPRESSED=false    build packages in compressed format\n        COOKBOOK_VERBOSE=true        print success/error on each recipe\n        COOKBOOK_CLEAN_BUILD=false   remove build directory before building\n        COOKBOOK_CLEAN_TARGET=false  remove target directory after building\n        COOKBOOK_WRITE_FILETREE=false whether to write stage files tree\n        COOKBOOK_MAKE_JOBS=          override build jobs count from nproc\n        COOKBOOK_WEB=false           whether to generate package web files\n\"#;\n\n#[derive(Clone)]\nstruct CliConfig {\n    cookbook_dir: PathBuf,\n    repo_dir: PathBuf,\n    sysroot_dir: PathBuf,\n    logs_dir: Option<PathBuf>,\n    category: Option<PathBuf>,\n    filesystem: Option<redox_installer::Config>,\n    with_package_deps: bool,\n    all: bool,\n    cook: CookConfig,\n}\n\n#[derive(PartialEq)]\nenum CliCommand {\n    Fetch,\n    Cook,\n    CookTree,\n    Unfetch,\n    Clean,\n    CleanTarget,\n    Push,\n    PushTree,\n    Find,\n}\n\nimpl CliCommand {\n    pub fn is_informational(&self) -> bool {\n        *self == CliCommand::PushTree || *self == CliCommand::CookTree || *self == CliCommand::Find\n    }\n    pub fn is_building(&self) -> bool {\n        *self == CliCommand::Fetch || *self == CliCommand::Cook || *self == CliCommand::CookTree\n    }\n    pub fn is_pushing(&self) -> bool {\n        *self == CliCommand::Push || *self == CliCommand::PushTree\n    }\n    pub fn is_cleaning(&self) -> bool {\n        *self == CliCommand::Clean\n            || *self == CliCommand::CleanTarget\n            || *self == CliCommand::Unfetch\n    }\n}\n\nimpl FromStr for CliCommand {\n    type Err = anyhow::Error;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            \"fetch\" => Ok(CliCommand::Fetch),\n            \"cook\" => Ok(CliCommand::Cook),\n            \"unfetch\" => Ok(CliCommand::Unfetch),\n            \"clean\" => Ok(CliCommand::Clean),\n            \"clean-target\" => Ok(CliCommand::CleanTarget),\n            \"push\" => Ok(CliCommand::Push),\n            \"push-tree\" => Ok(CliCommand::PushTree),\n            \"cook-tree\" => Ok(CliCommand::CookTree),\n            \"find\" => Ok(CliCommand::Find),\n            _ => Err(anyhow!(\"Unknown command '{}'\\n{}\\n\", s, REPO_HELP_STR)),\n        }\n    }\n}\n\nimpl ToString for CliCommand {\n    fn to_string(&self) -> String {\n        match self {\n            CliCommand::Fetch => \"fetch\".to_string(),\n            CliCommand::Cook => \"cook\".to_string(),\n            CliCommand::Unfetch => \"unfetch\".to_string(),\n            CliCommand::Clean => \"clean\".to_string(),\n            CliCommand::CleanTarget => \"clean-target\".to_string(),\n            CliCommand::Push => \"push\".to_string(),\n            CliCommand::PushTree => \"push-tree\".to_string(),\n            CliCommand::CookTree => \"cook-tree\".to_string(),\n            CliCommand::Find => \"find\".to_string(),\n        }\n    }\n}\n\nimpl CliConfig {\n    fn new() -> Result<Self, std::io::Error> {\n        let current_dir = env::current_dir()?;\n        Ok(CliConfig {\n            //FIXME: This config is unused as redox-pkg harcoded this to $PWD/recipes\n            cookbook_dir: current_dir.join(\"recipes\"),\n            repo_dir: current_dir.join(\"repo\"),\n            // build dir here is hardcoded in repo_builder as well\n            logs_dir: if get_config().cook.logs {\n                Some(current_dir.join(\"build/logs\"))\n            } else {\n                None\n            },\n            category: None,\n            sysroot_dir: if cfg!(target_os = \"redox\") {\n                PathBuf::from(\"/\")\n            } else {\n                current_dir.join(\"sysroot\")\n            },\n            with_package_deps: false,\n            cook: get_config().cook.clone(),\n            all: false,\n            filesystem: None,\n        })\n    }\n}\n\nfn main() {\n    init_config();\n    if let Err(e) = main_inner() {\n        eprintln!(\"{:?}\", e);\n        process::exit(1);\n    };\n}\n\nfn main_inner() -> anyhow::Result<()> {\n    let args: Vec<String> = env::args().skip(1).collect();\n\n    if args.is_empty() || args.contains(&\"--help\".to_string()) || args.contains(&\"-h\".to_string()) {\n        println!(\"{}\", REPO_HELP_STR);\n        process::exit(1);\n    }\n\n    let (config, command, recipes) = parse_args(args)?;\n    if command.is_building() {\n        ident::init_ident();\n    }\n    if command == CliCommand::Cook && config.cook.tui {\n        if let Some((name, e)) = run_tui_cook(config.clone(), recipes.clone())? {\n            let _ = stderr().write(e.as_bytes());\n            let _ = stderr().write(b\"\\n\\n\");\n            print_failed(&command, &name);\n            return Err(anyhow!(\"Execution has failed\"));\n        } else {\n            print_success(&command, None);\n        }\n        return publish_packages(&recipes, &config.repo_dir);\n    }\n    if command == CliCommand::PushTree {\n        return handle_tree(&recipes, false, &config);\n    }\n    if command == CliCommand::CookTree {\n        return handle_tree(&recipes, true, &config);\n    }\n    if command == CliCommand::Push {\n        return handle_push(&recipes, &config);\n    }\n\n    let verbose = config.cook.verbose;\n    for recipe in &recipes {\n        match repo_inner(&config, &command, recipe) {\n            Ok(cached) => {\n                if !command.is_informational() {\n                    if cached {\n                        print_cached(&command, Some(&recipe.name));\n                    } else {\n                        print_success(&command, Some(&recipe.name));\n                    }\n                }\n            }\n            Err(e) => {\n                if config.cook.nonstop {\n                    if verbose {\n                        eprintln!(\"{:?}\", e);\n                    }\n                    if let Err(e) = handle_nonstop_fail(recipe) {\n                        eprintln!(\"{:?}\", e)\n                    };\n                }\n                print_failed(&command, &recipe.name);\n                if !config.cook.nonstop {\n                    return Err(e);\n                }\n            }\n        }\n    }\n\n    if command == CliCommand::Cook {\n        return publish_packages(&recipes, &config.repo_dir);\n    }\n\n    if verbose && recipes.len() > 1 {\n        println!(\n            \"\\nCommand '{}' completed for {} recipes.\",\n            command.to_string(),\n            recipes.len()\n        );\n    }\n    Ok(())\n}\n\nfn print_failed(command: &CliCommand, recipe: &PackageName) {\n    eprintln!(\n        \"{}{}{} {} - failed {}{}\",\n        style::Bold,\n        color::Fg(color::AnsiValue(196)),\n        command.to_string(),\n        recipe.as_str(),\n        color::Fg(color::Reset),\n        style::Reset,\n    );\n}\n\nfn print_success(command: &CliCommand, recipe: Option<&PackageName>) {\n    if let Some(recipe) = recipe {\n        eprintln!(\n            \"{}{}{} {} - successful{}{}\",\n            style::Bold,\n            color::Fg(color::AnsiValue(46)),\n            command.to_string(),\n            recipe.as_str(),\n            color::Fg(color::Reset),\n            style::Reset,\n        );\n    } else {\n        eprintln!(\n            \"{}{}{} - successful{}{}\",\n            style::Bold,\n            color::Fg(color::AnsiValue(46)),\n            command.to_string(),\n            color::Fg(color::Reset),\n            style::Reset,\n        );\n    }\n}\n\nfn print_cached(command: &CliCommand, recipe: Option<&PackageName>) {\n    if let Some(recipe) = recipe {\n        eprintln!(\n            \"{}{}{} {} - cached{}{}\",\n            style::Bold,\n            color::Fg(color::AnsiValue(45)),\n            command.to_string(),\n            recipe.as_str(),\n            color::Fg(color::Reset),\n            style::Reset,\n        );\n    } else {\n        eprintln!(\n            \"{}{}{} - cached{}{}\",\n            style::Bold,\n            color::Fg(color::AnsiValue(45)),\n            command.to_string(),\n            color::Fg(color::Reset),\n            style::Reset,\n        );\n    }\n}\n\nfn repo_inner(\n    config: &CliConfig,\n    command: &CliCommand,\n    recipe: &CookRecipe,\n) -> Result<bool, anyhow::Error> {\n    Ok(match *command {\n        CliCommand::Fetch | CliCommand::Cook => {\n            let repo_inner_fn = move |logger: &PtyOut| -> Result<bool, anyhow::Error> {\n                let is_cook = *command == CliCommand::Cook;\n                let mut cached = false;\n                let source_dir = handle_fetch(recipe, config, is_cook, logger)?;\n                if is_cook {\n                    cached = handle_cook(recipe, config, source_dir, logger)?;\n                }\n                Ok(cached)\n            };\n            let Some(log_path) = &config.logs_dir else {\n                return repo_inner_fn(&None);\n            };\n\n            let (status_tx, status_rx) = mpsc::channel::<StatusUpdate>();\n            let (mut stdout_writer, mut stderr_writer) = setup_logger(&status_tx, &recipe.name);\n            let mut app = TuiApp::new(vec![recipe.clone()]);\n            app.dump_logs_anyway = config.cook.verbose;\n            let dump_fail_logs = !app.dump_logs_anyway;\n            let th = thread::spawn(move || {\n                while let Ok(update) = status_rx.recv() {\n                    match &update {\n                        StatusUpdate::CookThreadFinished => break,\n                        StatusUpdate::FailCook(r, _) => {\n                            let (logs, line) = app.get_recipe_log(&r.name);\n                            if let Some(logs) = logs {\n                                println!(\"{}\", join_logs(logs, line));\n                            }\n                        }\n                        _ => app.update_status(update),\n                    }\n                }\n            });\n            let mut logger = Some((&mut stdout_writer, &mut stderr_writer));\n            let result = repo_inner_fn(&logger);\n            if let Err(err_ctx) = &result {\n                log_to_pty!(&logger, \"\\n{:?}\", err_ctx)\n            }\n            // successful fetch is not that useful to log\n            if *command == CliCommand::Cook || result.is_err() {\n                flush_pty(&mut logger);\n                let log_path =\n                    log_path.join(format!(\"{}/{}.log\", recipe.target, recipe.name.name()));\n                status_tx\n                    .send(StatusUpdate::FlushLog(recipe.name.clone(), log_path))\n                    .unwrap_or_default();\n                if dump_fail_logs && result.is_err() {\n                    status_tx\n                        .send(StatusUpdate::FailCook(recipe.clone(), \"\".into()))\n                        .unwrap_or_default();\n                }\n            }\n            status_tx\n                .send(StatusUpdate::CookThreadFinished)\n                .unwrap_or_default();\n            let _ = th.join();\n            result?\n        }\n        CliCommand::Unfetch | CliCommand::Clean | CliCommand::CleanTarget => {\n            handle_clean(recipe, config, command)?\n        }\n        CliCommand::Push => unreachable!(),\n        CliCommand::PushTree => unreachable!(),\n        CliCommand::CookTree => unreachable!(),\n        CliCommand::Find => {\n            println!(\"{}\", recipe.dir.display());\n            false\n        }\n    })\n}\n\nfn publish_packages(recipe_names: &Vec<CookRecipe>, repo_path: &PathBuf) -> anyhow::Result<()> {\n    let repo_bin = env::current_exe()?.parent().unwrap().join(\"repo_builder\");\n    let mut command = Command::new(repo_bin);\n    command\n        .arg(repo_path)\n        .args(recipe_names.iter().filter_map(|n| {\n            if !n.is_deps {\n                Some(n.name.as_str())\n            } else {\n                None\n            }\n        }));\n\n    run_command(command, &None).map_err(|e| anyhow!(e))\n}\n\nfn parse_args(args: Vec<String>) -> anyhow::Result<(CliConfig, CliCommand, Vec<CookRecipe>)> {\n    let mut config = CliConfig::new()?;\n    let mut command: Option<String> = None;\n    let mut recipe_names: Vec<PackageName> = Vec::new();\n    let mut override_filesystem_repo_binary = false;\n    for arg in args {\n        if arg.starts_with(\"--\") {\n            if let Some((key, value)) = arg.split_once('=') {\n                match key {\n                    \"--cookbook\" => config.cookbook_dir = PathBuf::from(value),\n                    \"--repo\" => config.repo_dir = PathBuf::from(value),\n                    \"--sysroot\" => config.sysroot_dir = PathBuf::from(value),\n                    \"--category\" => config.category = Some(PathBuf::from(value)),\n                    \"--filesystem\" => {\n                        config.filesystem = Some({\n                            let r = redox_installer::Config::from_file(&PathBuf::from(value));\n                            r.context(\"Unable to read filesystem installer config\")?\n                        })\n                    }\n                    _ => {\n                        eprintln!(\"Error: Unknown flag with value: {}\", arg);\n                        process::exit(1);\n                    }\n                }\n            } else if arg.starts_with(\"--category-\") {\n                // to workaround make command limit we provide this option\n                config.category = Some(PathBuf::from(arg[(\"--category-\").len()..].to_owned()));\n            } else {\n                match arg.as_str() {\n                    \"--repo-binary\" => override_filesystem_repo_binary = true,\n                    \"--with-package-deps\" => config.with_package_deps = true,\n                    \"--all\" => config.all = true,\n                    _ => {\n                        eprintln!(\"Error: Unknown flag: {}\", arg);\n                        process::exit(1);\n                    }\n                }\n            }\n        } else if arg.starts_with('-') {\n            match arg.as_str() {\n                _ => {\n                    eprintln!(\"Error: Unknown flag: {}\", arg);\n                    process::exit(1);\n                }\n            }\n        } else if command.is_none() {\n            // The first non-flag argument is the command\n            command = Some(arg);\n        } else {\n            // Subsequent non-flag arguments are recipe names\n            recipe_names.push(arg.try_into().context(\"Invalid package name\")?);\n        }\n    }\n\n    if let Some(c) = config.category {\n        // need to prefix by cookbook dir\n        config.category = Some(PathBuf::from(\"recipes\").join(c));\n    }\n    if let Some(c) = config.logs_dir.as_mut() {\n        fs::create_dir_all(c.join(redoxer::target())).map_err(|e| anyhow!(e))?;\n        fs::create_dir_all(c.join(redoxer::host_target())).map_err(|e| anyhow!(e))?;\n    }\n\n    let command = command.ok_or(anyhow!(\"Error: No command specified.\"))?;\n    let command: CliCommand = str::parse(&command)?;\n    if command.is_informational() {\n        // avoid extra data that clobber stdout\n        config.cook.verbose = false;\n    }\n\n    let mut preloaded_recipes: BTreeMap<PackageName, CookRecipe> = BTreeMap::new();\n\n    if recipe_names.is_empty() {\n        if config.all || config.category.is_some() {\n            if !recipe_names.is_empty() {\n                bail!(\"Do not specify recipe names when using the --all or --category flag.\");\n            }\n            if config.all && config.category.is_some() {\n                bail!(\"Do not specify both --all and --category flag.\");\n            }\n            if config.all && !command.is_cleaning() {\n                // because read_recipe is false by logic below\n                // some recipes on wip folders are invalid anyway\n                bail!(\n                    \"Refusing to run an unrealistic command to {} all recipes\",\n                    command.to_string()\n                );\n            }\n            let all_recipes_path = match &config.category {\n                None => pkg::recipes::list(\"\"),\n                Some(prefix) => pkg::recipes::list(\"\")\n                    .into_iter()\n                    .filter(|p| p.starts_with(prefix))\n                    .collect(),\n            };\n\n            for path in all_recipes_path {\n                // TODO: Allow selecting recipes from category as host?\n                let recipe = CookRecipe::from_path(&path, !command.is_cleaning(), false)?;\n                let recipe_name = recipe.name.clone();\n                preloaded_recipes.insert(recipe_name.clone(), recipe);\n                recipe_names.push(recipe_name);\n            }\n        } else {\n            if let Some(conf) = config.filesystem.as_ref() {\n                recipe_names = conf\n                    .packages\n                    .keys()\n                    .filter_map(|k| PackageName::new(k.to_string()).ok())\n                    .collect();\n            } else {\n                bail!(\n                    \"Error: No recipe names or filesystem config provided and --all flag was not used.\"\n                );\n            }\n        }\n    }\n\n    if command.is_cleaning() {\n        let recipes = if preloaded_recipes.is_empty() {\n            CookRecipe::from_list(recipe_names)?\n        } else {\n            preloaded_recipes.into_values().collect()\n        };\n\n        return Ok((config, command, recipes));\n    }\n\n    let mut recipes = if let Some(conf) = config.filesystem.as_ref() {\n        let repo_binary = override_filesystem_repo_binary;\n\n        // Expand deps for \"source\" + \"local\" and \"binary\"\n        // This is the complete map from filesystem config\n        let mut source_names: Vec<PackageName> = Vec::new();\n        let mut binary_names: Vec<PackageName> = Vec::new();\n        let mut special_rules: HashMap<PackageName, String> = HashMap::new();\n        let default_rule = if repo_binary { \"binary\" } else { \"source\" };\n        for (recipe_name_str, recipe_config) in conf.packages.iter() {\n            let Ok(recipe_name) = PackageName::new(recipe_name_str) else {\n                continue;\n            };\n            let rule = match recipe_config {\n                PackageConfig::Build(rule) => {\n                    special_rules.insert(recipe_name.clone(), rule.to_string());\n                    rule\n                }\n                _ => default_rule,\n            };\n\n            if rule == \"source\" || rule == \"local\" {\n                source_names.push(recipe_name);\n            } else if rule == \"binary\" {\n                binary_names.push(recipe_name);\n            }\n        }\n        source_names = CookRecipe::get_all_deps_names_recursive(&source_names, true)?;\n        binary_names = CookRecipe::get_all_deps_names_recursive(&binary_names, false)?;\n        let source_names: HashSet<PackageName> = source_names.into_iter().collect();\n        let binary_names: HashSet<PackageName> = binary_names.into_iter().collect();\n\n        // These are list that derived from recipe_names\n        let mut source_recipe_names: Vec<PackageName> = Vec::new();\n        let mut binary_recipe_names: Vec<PackageName> = Vec::new();\n        let mut ignore_recipe_names: Vec<PackageName> = Vec::new();\n        for recipe_name in recipe_names.iter() {\n            if source_names.contains(recipe_name) {\n                source_recipe_names.push(recipe_name.clone());\n            } else if binary_names.contains(recipe_name) {\n                binary_recipe_names.push(recipe_name.clone());\n            } else {\n                if special_rules\n                    .get(recipe_name)\n                    .is_some_and(|s| s == \"ignore\")\n                {\n                    ignore_recipe_names.push(recipe_name.clone());\n                } else if repo_binary {\n                    binary_recipe_names.push(recipe_name.clone());\n                } else {\n                    source_recipe_names.push(recipe_name.clone());\n                }\n            }\n        }\n\n        if config.with_package_deps || command.is_pushing() {\n            source_recipe_names =\n                CookRecipe::get_package_deps_recursive(&source_recipe_names, true)?;\n            binary_recipe_names =\n                CookRecipe::get_package_deps_recursive(&binary_recipe_names, true)?;\n        }\n\n        let mut recipes = if command.is_building() || command.is_pushing() {\n            // Pushing do not need dev deps, so does binary recipes at building\n            let include_dev = command.is_building();\n            if include_dev && default_rule == \"source\" {\n                // let's cover a very specific case, binary -> source -> binary -> dev\n                // in this case, we need to move that \"source\" to \"binary\", because\n                // that would include dev from its binary child, which is unnecessary\n                let mut i = 0;\n                while i < source_recipe_names.len() {\n                    let name = &source_recipe_names[i];\n                    match special_rules.get(name) {\n                        Some(s) if s.as_str() == \"source\" => {\n                            if binary_names.contains(name) {\n                                let bin = source_recipe_names.remove(i);\n                                binary_recipe_names.push(bin);\n                                continue;\n                            }\n                        }\n                        _ => {}\n                    }\n                    i += 1;\n                }\n            }\n            CookRecipe::get_build_deps_recursive(&source_recipe_names, include_dev)?\n        } else {\n            CookRecipe::from_list(source_recipe_names.clone())?\n        };\n\n        let binary_recipes = if command.is_building() || command.is_pushing() {\n            CookRecipe::get_build_deps_recursive(&binary_recipe_names, false)?\n        } else {\n            CookRecipe::from_list(binary_recipe_names.clone())?\n        };\n\n        let ignore_recipes = CookRecipe::from_list(ignore_recipe_names.clone())?;\n\n        recipes.extend(binary_recipes);\n        recipes.extend(ignore_recipes);\n        recipes = recipes_flatten_package_names(recipes);\n\n        for recipe in recipes.iter_mut() {\n            if let Some(special_rule) = special_rules.get(&recipe.name) {\n                recipe.apply_filesystem_config(&special_rule)?;\n                continue;\n            }\n            let rule = match (\n                source_names.contains(&recipe.name),\n                binary_names.contains(&recipe.name),\n            ) {\n                (true, true) => {\n                    // both lists: flip logic\n                    if repo_binary { \"source\" } else { \"binary\" }\n                }\n                (true, false) => \"source\",\n                (false, true) => \"binary\",\n                (false, false) => default_rule,\n            };\n            if recipe.name.is_host() && rule == \"binary\" {\n                // host recipe binaries is currently not supported\n                continue;\n            }\n\n            recipe.apply_filesystem_config(rule)?;\n        }\n\n        recipes\n    } else {\n        if config.with_package_deps || command.is_pushing() {\n            recipe_names = CookRecipe::get_package_deps_recursive(&recipe_names, true)?;\n        }\n        if command.is_building() || command.is_pushing() {\n            let include_dev = command.is_building();\n            CookRecipe::get_build_deps_recursive(&recipe_names, include_dev)?\n        } else {\n            CookRecipe::from_list(recipe_names.clone())?\n        }\n    };\n\n    if !config.with_package_deps || command.is_informational() {\n        // In CliCommand::Cook, is_deps==true will make it skip checking source\n        recipes_mark_as_deps(&recipe_names, &mut recipes);\n    }\n\n    Ok((config, command, recipes))\n}\n\nfn handle_fetch(\n    recipe: &CookRecipe,\n    config: &CliConfig,\n    allow_offline: bool,\n    logger: &PtyOut,\n) -> anyhow::Result<PathBuf> {\n    let source_dir = match config.cook.offline && allow_offline {\n        true => fetch_offline(&recipe, logger),\n        false => fetch(&recipe, !recipe.is_deps, logger),\n    }\n    .map_err(|e| anyhow!(\"failed to fetch: {:?}\", e))?;\n\n    Ok(source_dir)\n}\n\nfn handle_cook(\n    recipe: &CookRecipe,\n    config: &CliConfig,\n    source_dir: PathBuf,\n    logger: &PtyOut,\n) -> anyhow::Result<bool> {\n    let recipe_dir = &recipe.dir;\n    let target_dir = create_target_dir(recipe_dir, recipe.target).map_err(|e| anyhow!(e))?;\n    let build_result = build(\n        recipe_dir,\n        &source_dir,\n        &target_dir,\n        &recipe,\n        &config.cook,\n        logger,\n    )\n    .map_err(|err| anyhow!(\"failed to build: {:?}\", err))?;\n\n    package(&recipe, &build_result, &config.cook, logger)\n        .map_err(|err| anyhow!(\"failed to package: {:?}\", err))?;\n\n    if config.cook.clean_target || config.cook.write_filetree {\n        for stage_dir in &build_result.stage_dirs {\n            if stage_dir.is_dir() {\n                if config.cook.write_filetree {\n                    let mut stage_files_buf = String::new();\n                    tree::walk_file_tree(&stage_dir, \"\", &mut stage_files_buf)\n                        .context(\"failed to walk stage files tree\")?;\n                    fs::write(stage_dir.with_added_extension(\"files\"), stage_files_buf)\n                        .context(\"unable to write stage files\")?;\n                }\n                if config.cook.clean_target {\n                    fs::remove_dir_all(&stage_dir).context(\"failed to remove stage dir\")?;\n                }\n            }\n        }\n    }\n    Ok(build_result.cached)\n}\n\n/// delete stage artifacts upon nonstop failure to let repo_builder know\nfn handle_nonstop_fail(recipe: &CookRecipe) -> anyhow::Result<()> {\n    let target_dir = recipe.target_dir();\n    let stage_dirs = get_stage_dirs(&recipe.recipe.optional_packages, &target_dir);\n    for stage_dir in stage_dirs {\n        remove_stage_dir(&stage_dir)\n            .map_err(|err| anyhow!(\"failed to remove stage dir: {:?}\", err))?;\n    }\n    Ok(())\n}\n\nfn handle_clean(\n    recipe: &CookRecipe,\n    _config: &CliConfig,\n    command: &CliCommand,\n) -> anyhow::Result<bool> {\n    let mut dir = recipe.dir.join(\"target\");\n    let mut cached = true;\n    if matches!(*command, CliCommand::CleanTarget) {\n        dir = dir.join(redoxer::target())\n    }\n    if dir.exists() {\n        fs::remove_dir_all(&dir).context(format!(\"failed to delete {}\", dir.display()))?;\n        cached = false;\n    }\n    let dir = recipe.dir.join(\"source\");\n    if dir.exists() && matches!(*command, CliCommand::Unfetch) {\n        fs::remove_dir_all(&dir).context(format!(\"failed to delete {}\", dir.display()))?;\n        cached = false;\n    }\n    Ok(cached)\n}\n\nstatic PUSH_SYSROOT_DIR: OnceLock<PathBuf> = OnceLock::new();\nfn handle_push(recipes: &Vec<CookRecipe>, config: &CliConfig) -> anyhow::Result<()> {\n    let recipe_map: HashMap<&PackageName, &CookRecipe> =\n        recipes.iter().map(|r| (&r.name, r)).collect();\n    let mut total_size: u64 = 0;\n    let mut total_count: u64 = 0;\n    let mut visited: HashSet<PackageName> = HashSet::new();\n    let num_recipes = recipes.len();\n    PUSH_SYSROOT_DIR.set(config.sysroot_dir.clone()).unwrap();\n    let handle_push_inner = move |package_name: &PackageName,\n                                  _prefix: &str,\n                                  _is_last: bool,\n                                  entry: &WalkTreeEntry|\n          -> anyhow::Result<bool> {\n        let r = match entry {\n            WalkTreeEntry::Built(archive_path, _) => {\n                let install_path = PUSH_SYSROOT_DIR.get().unwrap();\n                let mut state =\n                    PackageState::from_sysroot(install_path).map_err(|e| anyhow!(\"{e:?}\"))?;\n                let r = package_handle_push(&mut state, archive_path, &install_path, false)\n                    .map_err(|e| anyhow!(\"{e:?}\"));\n                if matches!(r, Ok(false)) {\n                    state.to_sysroot(install_path)?;\n                }\n                r\n            }\n            WalkTreeEntry::NotBuilt => Err(anyhow!(\n                \"Package {} has not been built\",\n                package_name.name()\n            )),\n            WalkTreeEntry::Deduped | WalkTreeEntry::Missing => {\n                // does not matter\n                return Ok(false);\n            }\n        };\n        match r {\n            Ok(true) => {\n                print_cached(&CliCommand::Push, Some(package_name));\n                Ok(true)\n            }\n            Ok(false) => {\n                print_success(&CliCommand::Push, Some(package_name));\n                Ok(false)\n            }\n            Err(e) => {\n                print_failed(&CliCommand::Push, package_name);\n                if get_config().cook.nonstop {\n                    Ok(true)\n                } else {\n                    Err(e)\n                }\n            }\n        }\n    };\n    for (i, recipe) in recipes.iter().enumerate() {\n        tree::walk_tree_entry(\n            &recipe.name,\n            &recipe_map,\n            \"\",\n            i == num_recipes - 1,\n            false,\n            &mut visited,\n            &mut total_size,\n            &mut total_count,\n            handle_push_inner,\n        )?;\n    }\n\n    if config.cook.verbose {\n        println!(\"\");\n        println!(\n            \"Pushed {} of {} {}\",\n            tree::format_size(total_size),\n            total_count,\n            if total_count == 1 {\n                \"package\"\n            } else {\n                \"packages\"\n            },\n        );\n    }\n\n    Ok(())\n}\n\nfn handle_tree(\n    recipes: &Vec<CookRecipe>,\n    is_build_tree: bool,\n    _config: &CliConfig,\n) -> anyhow::Result<()> {\n    let recipe_map: HashMap<&PackageName, &CookRecipe> =\n        recipes.iter().map(|r| (&r.name, r)).collect();\n    let mut total_size: u64 = 0;\n    let mut total_count: u64 = 0;\n    let mut visited: HashSet<PackageName> = HashSet::new();\n    let roots: Vec<&CookRecipe> = recipes.iter().filter(|r| !r.is_deps).collect();\n    let num_roots = roots.len();\n    for (i, root) in roots.iter().enumerate() {\n        tree::display_tree_entry(\n            &root.name,\n            &recipe_map,\n            \"\",\n            i == num_roots - 1,\n            is_build_tree,\n            &mut visited,\n            &mut total_size,\n            &mut total_count,\n        )?;\n    }\n\n    println!(\"\");\n    if is_build_tree {\n        println!(\n            \"Build summary: {} need build, {} may rebuild, with total of {} {}\",\n            total_size,\n            roots.len(),\n            visited.len(),\n            if visited.len() == 1 {\n                \"recipe\"\n            } else {\n                \"recipes\"\n            },\n        );\n    } else {\n        println!(\n            \"Estimated image size: {} of {} {}\",\n            tree::format_size(total_size),\n            visited.len(),\n            if visited.len() == 1 {\n                \"package\"\n            } else {\n                \"packages\"\n            },\n        );\n    }\n\n    Ok(())\n}\n\n//\n// ------------- TUI SPECIFIC CODE -------------------\n//\n\n#[derive(Debug, Clone, PartialEq)]\nenum RecipeStatus {\n    Pending,\n    Fetching,\n    Fetched,\n    Cooking,\n    Cached,\n    Done,\n    Failed(String),\n}\n\n#[derive(Debug, Clone, PartialEq)]\nenum StatusUpdate {\n    StartFetch(PackageName),\n    Fetched(CookRecipe),\n    FailFetch(CookRecipe, String),\n    StartCook(PackageName),\n    Cooked(CookRecipe, bool),\n    FailCook(CookRecipe, String),\n    PushLog(PackageName, Vec<u8>),\n    FlushLog(PackageName, PathBuf),\n    FetchThreadFinished,\n    CookThreadFinished,\n}\n\n#[derive(PartialEq)]\nenum JobType {\n    Fetch,\n    Cook,\n}\n\nimpl ToString for JobType {\n    fn to_string(&self) -> String {\n        match self {\n            JobType::Fetch => \"Fetch\",\n            JobType::Cook => \"Cook\",\n        }\n        .to_string()\n    }\n}\n\nstruct TuiApp {\n    recipes: Vec<(CookRecipe, RecipeStatus)>,\n    fetch_queue: VecDeque<CookRecipe>,\n    cook_queue: VecDeque<CookRecipe>,\n    done: Vec<PackageName>,\n    active_fetch: Option<PackageName>,\n    active_cook: Option<PackageName>,\n    logs: HashMap<PackageName, Vec<String>>,\n    log_byte_buffer: HashMap<PackageName, Vec<u8>>,\n    log_scroll: usize,\n    log_view_job: JobType,\n    auto_scroll: bool,\n    fetch_scroll: usize,\n    cook_scroll: usize,\n    cook_auto_scroll: bool,\n    cook_list_state: ListState,\n    fetch_complete: bool,\n    cook_complete: bool,\n    fetch_panel_rect: Option<Rect>,\n    cook_panel_rect: Option<Rect>,\n    log_panel_rect: Option<Rect>,\n    prompt: Option<FailurePrompt>,\n    dump_logs_anyway: bool,\n    dump_logs_on_exit: Option<(PackageName, String)>,\n}\n\nimpl TuiApp {\n    fn new(recipes: Vec<CookRecipe>) -> Self {\n        Self {\n            recipes: recipes\n                .iter()\n                .cloned()\n                .map(|r| (r, RecipeStatus::Pending))\n                .collect(),\n            fetch_queue: recipes.iter().cloned().map(|r| r.clone()).collect(),\n            cook_queue: VecDeque::new(),\n            done: Vec::new(),\n            active_fetch: None,\n            active_cook: None,\n            logs: HashMap::new(),\n            log_byte_buffer: HashMap::new(),\n            log_scroll: 0,\n            auto_scroll: true,\n            log_view_job: JobType::Fetch,\n            fetch_scroll: 0,\n            cook_scroll: 0,\n            cook_auto_scroll: true,\n            cook_list_state: ListState::default(),\n            fetch_complete: false,\n            cook_complete: false,\n            fetch_panel_rect: None,\n            cook_panel_rect: None,\n            log_panel_rect: None,\n            prompt: None,\n            dump_logs_anyway: false,\n            dump_logs_on_exit: None,\n        }\n    }\n\n    pub fn get_active_name(&self) -> Option<PackageName> {\n        if self.log_view_job == JobType::Cook {\n            self.active_cook.clone()\n        } else {\n            self.active_fetch.clone()\n        }\n    }\n\n    pub fn get_active_log(\n        &self,\n    ) -> (\n        Option<PackageName>,\n        Option<&Vec<String>>,\n        Option<Cow<'_, str>>,\n    ) {\n        let active_name = self.get_active_name();\n        let (log_text, log_line) = if let Some(active_name) = active_name.as_ref() {\n            self.get_recipe_log(active_name)\n        } else {\n            (None, None)\n        };\n\n        (active_name, log_text, log_line)\n    }\n\n    pub fn get_recipe_log(\n        &self,\n        recipe_name: &PackageName,\n    ) -> (Option<&Vec<String>>, Option<Cow<'_, str>>) {\n        let log_text = self.logs.get(recipe_name);\n        let log_line = if let Some(b) = self.log_byte_buffer.get(recipe_name) {\n            Some(String::from_utf8_lossy(b))\n        } else {\n            None\n        };\n        (log_text, log_line)\n    }\n\n    pub fn write_log(&self, recipe_name: &PackageName, log_path: &PathBuf) -> anyhow::Result<()> {\n        let (Some(logs), line) = self.get_recipe_log(recipe_name) else {\n            return Ok(());\n        };\n        let str = strip_ansi_escapes::strip_str(join_logs(logs, line));\n        if !str.trim_end().is_empty() {\n            fs::write(log_path, str)?;\n        }\n        return Ok(());\n    }\n\n    // Update the state based on a message from a worker thread\n    fn update_status(&mut self, update: StatusUpdate) {\n        let (name, new_status) = match update {\n            StatusUpdate::StartFetch(name) => {\n                self.active_fetch = Some(name.clone());\n                self.logs.insert(name.clone(), Vec::new());\n                self.log_byte_buffer.insert(name.clone(), Vec::new());\n                self.log_scroll = 0;\n                self.auto_scroll = true;\n                (name.clone(), RecipeStatus::Fetching)\n            }\n            StatusUpdate::Fetched(recipe) => (recipe.name.clone(), RecipeStatus::Fetched),\n            StatusUpdate::FailFetch(recipe, err) => {\n                self.prompt = Some(FailurePrompt::new(recipe.clone(), err.clone()));\n                (recipe.name.clone(), RecipeStatus::Failed(err))\n            }\n            StatusUpdate::StartCook(name) => {\n                self.active_cook = Some(name.clone());\n                self.logs.insert(name.clone(), Vec::new());\n                self.log_byte_buffer.insert(name.clone(), Vec::new());\n                (name.clone(), RecipeStatus::Cooking)\n            }\n            StatusUpdate::PushLog(name, chunk) => {\n                let buffer = self.log_byte_buffer.entry(name.clone()).or_default();\n                buffer.extend_from_slice(&chunk);\n                if self.dump_logs_anyway {\n                    let _ = std::io::stdout().write_all(&chunk);\n                }\n                let log_list = self.logs.entry(name.clone()).or_default();\n                while let Some(newline_pos) = buffer.iter().position(|&b| b == b'\\n') {\n                    let line_bytes = buffer.drain(..=newline_pos).collect::<Vec<u8>>();\n                    let line_str = String::from_utf8_lossy(&line_bytes).into_owned();\n                    let line_str_pos = line_str.trim_end();\n                    let line_str = line_str_pos.rsplit('\\r').next().unwrap_or(&line_str_pos);\n                    log_list.push(line_str.to_owned());\n                }\n                return;\n            }\n            StatusUpdate::FlushLog(name, path) => {\n                // TODO: This blocks the TUI, maybe open separate thread?\n                // FIXME: handle error here?\n                let _ = self.write_log(&name, &path);\n                return;\n            }\n            StatusUpdate::Cooked(recipe, cached) => {\n                if self.active_cook.as_ref() == Some(&recipe.name) {\n                    self.active_cook = None;\n                }\n                self.auto_scroll = true;\n                (\n                    recipe.name.clone(),\n                    if cached {\n                        RecipeStatus::Cached\n                    } else {\n                        RecipeStatus::Done\n                    },\n                )\n            }\n            StatusUpdate::FailCook(recipe, err) => {\n                self.prompt = Some(FailurePrompt::new(recipe.clone(), err.clone()));\n                (recipe.name.clone(), RecipeStatus::Failed(err))\n            }\n            StatusUpdate::FetchThreadFinished => {\n                self.fetch_complete = true;\n                self.log_view_job = JobType::Cook;\n                return;\n            }\n            StatusUpdate::CookThreadFinished => {\n                self.cook_complete = true;\n                return;\n            }\n        };\n\n        if let Some((_, status)) = self.recipes.iter_mut().find(|(r, _)| r.name == name) {\n            *status = new_status;\n        }\n\n        // Re-compute the queues for display\n        self.fetch_queue = self\n            .recipes\n            .iter()\n            .filter(|(_, s)| *s == RecipeStatus::Pending)\n            .map(|(r, _)| r.clone())\n            .collect();\n        self.cook_queue = self\n            .recipes\n            .iter()\n            .filter(|(_, s)| *s == RecipeStatus::Fetched)\n            .map(|(r, _)| r.clone())\n            .collect();\n        self.done = self\n            .recipes\n            .iter()\n            .filter(|(_, s)| *s == RecipeStatus::Done || *s == RecipeStatus::Cached)\n            .map(|(r, _)| r.name.clone())\n            .collect();\n    }\n}\n\nfn run_tui_cook(\n    config: CliConfig,\n    recipes: Vec<CookRecipe>,\n) -> anyhow::Result<Option<(PackageName, String)>> {\n    let (work_tx, work_rx) = mpsc::channel::<(CookRecipe, PathBuf)>();\n    let (status_tx, status_rx) = mpsc::channel::<StatusUpdate>();\n\n    let running = Arc::new(AtomicBool::new(true));\n    let prompting = Arc::new(AtomicU32::new(0));\n    const TICK_RATE: Duration = Duration::from_millis(100);\n\n    // ---- Cooker Thread ----\n    let cooker_config = config.clone();\n    let cooker_status_tx = status_tx.clone();\n    let cooker_prompting = prompting.clone();\n    let cooker_handle = thread::spawn(move || {\n        'done: for (mut recipe, source_dir) in work_rx {\n            let name = recipe.name.clone();\n            let (mut stdout_writer, mut stderr_writer) = setup_logger(&cooker_status_tx, &name);\n            let mut logger = Some((&mut stdout_writer, &mut stderr_writer));\n            'again: loop {\n                cooker_status_tx\n                    .send(StatusUpdate::StartCook(name.clone()))\n                    .unwrap();\n                let _ = recipe.reload_recipe(); // reread recipe.toml in case we're retrying\n                let handler = handle_cook(&recipe, &cooker_config, source_dir.clone(), &logger);\n                if let Some(log_path) = cooker_config.logs_dir.as_ref() {\n                    if let Err(err_ctx) = &handler {\n                        log_to_pty!(&logger, \"\\n{:?}\", err_ctx)\n                    }\n                    flush_pty(&mut logger);\n                    let log_path = log_path.join(format!(\"{}/{}.log\", recipe.target, name.name()));\n                    cooker_status_tx\n                        .send(StatusUpdate::FlushLog(name.clone(), log_path))\n                        .unwrap_or_default();\n                }\n                match handler {\n                    Ok(cached) => {\n                        cooker_status_tx\n                            .send(StatusUpdate::Cooked(recipe, cached))\n                            .unwrap_or_default();\n                        if cooker_config.cook.nonstop\n                            && cooker_prompting.load(Ordering::SeqCst) == 4\n                        {\n                            break 'done;\n                        }\n                        break;\n                    }\n                    Err(e) => {\n                        cooker_status_tx\n                            .send(StatusUpdate::FailCook(recipe.clone(), e.to_string()))\n                            .unwrap_or_default();\n                        if cooker_config.cook.nonstop {\n                            if cooker_prompting.load(Ordering::SeqCst) == 4 {\n                                break 'done;\n                            }\n                            // TODO: where to report error?\n                            let _ = handle_nonstop_fail(&recipe);\n                            break;\n                        }\n                        while cooker_prompting.load(Ordering::SeqCst) != 0 {\n                            thread::sleep(Duration::from_millis(101)); // wait other prompt\n                        }\n                        cooker_prompting.swap(1, Ordering::SeqCst);\n                        'wait: loop {\n                            match cooker_prompting.load(Ordering::SeqCst) {\n                                0 => break 'again,\n                                1 => thread::sleep(Duration::from_millis(101)),\n                                2 => {\n                                    cooker_prompting.swap(0, Ordering::SeqCst);\n                                    break 'wait;\n                                } // retry\n                                3 => {\n                                    cooker_prompting.swap(0, Ordering::SeqCst);\n                                    let _ = handle_nonstop_fail(&recipe);\n                                    break 'again;\n                                } // skip\n                                4 => {\n                                    cooker_prompting.swap(0, Ordering::SeqCst);\n                                    break 'done;\n                                } // done\n                                _ => unreachable!(),\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        cooker_status_tx\n            .send(StatusUpdate::CookThreadFinished)\n            .unwrap_or_default();\n    });\n\n    let mstdin = stdin();\n    let mstdout = stdout()\n        .into_raw_mode()\n        .unwrap()\n        .into_alternate_screen()\n        .unwrap();\n\n    // ----- Input Thread -----\n    let (input_tx, input_rx) = mpsc::channel::<Event>();\n    let _input_handle = thread::spawn(move || {\n        for evt in mstdin.events() {\n            if let Ok(evt) = evt {\n                if input_tx.send(evt).is_err() {\n                    return;\n                }\n            }\n        }\n    });\n\n    // ---- Fetcher Thread ----\n    let fetcher_recipes = recipes.clone();\n    let fetcher_status_tx = status_tx.clone();\n    let fetcher_config = config.clone();\n    let fetcher_prompting = prompting.clone();\n    let fetcher_handle = thread::spawn(move || {\n        'done: for mut recipe in fetcher_recipes {\n            let name = recipe.name.clone();\n            let (mut stdout_writer, mut stderr_writer) = setup_logger(&fetcher_status_tx, &name);\n            let mut logger = Some((&mut stdout_writer, &mut stderr_writer));\n            'again: loop {\n                fetcher_status_tx\n                    .send(StatusUpdate::StartFetch(name.clone()))\n                    .unwrap();\n                let _ = recipe.reload_recipe(); // reread recipe.toml in case we're retrying\n                let handler = handle_fetch(&recipe, &fetcher_config, true, &logger);\n                if let Some(log_path) = fetcher_config.logs_dir.as_ref()\n                    // successful fetch log usually not that helpful\n                    && handler.is_err()\n                {\n                    if let Err(err_ctx) = &handler {\n                        log_to_pty!(&logger, \"\\n{:?}\", err_ctx)\n                    }\n                    flush_pty(&mut logger);\n                    let log_path = log_path.join(format!(\"{}/{}.log\", recipe.target, name.name()));\n                    fetcher_status_tx\n                        .send(StatusUpdate::FlushLog(name.clone(), log_path))\n                        .unwrap_or_default();\n                }\n                match handler {\n                    Ok(source_dir) => {\n                        fetcher_status_tx\n                            .send(StatusUpdate::Fetched(recipe.clone()))\n                            .unwrap();\n                        if work_tx.send((recipe.clone(), source_dir)).is_err() {\n                            // Cooker thread died\n                            break 'done;\n                        }\n                        if fetcher_config.cook.nonstop\n                            && fetcher_prompting.load(Ordering::SeqCst) == 4\n                        {\n                            break 'done;\n                        }\n                        break;\n                    }\n                    Err(e) => {\n                        fetcher_status_tx\n                            .send(StatusUpdate::FailFetch(recipe.clone(), e.to_string()))\n                            .unwrap_or_default();\n                        if fetcher_config.cook.nonstop {\n                            if fetcher_prompting.load(Ordering::SeqCst) == 4 {\n                                break 'done;\n                            }\n                            let _ = handle_nonstop_fail(&recipe);\n                            break;\n                        }\n                        while fetcher_prompting.load(Ordering::SeqCst) != 0 {\n                            thread::sleep(Duration::from_millis(101)); // wait other prompt\n                        }\n                        fetcher_prompting.swap(1, Ordering::SeqCst);\n                        'wait: loop {\n                            match fetcher_prompting.load(Ordering::SeqCst) {\n                                0 => break 'again,\n                                1 => thread::sleep(Duration::from_millis(101)),\n                                2 => {\n                                    fetcher_prompting.swap(0, Ordering::SeqCst);\n                                    break 'wait;\n                                } // retry\n                                3 => {\n                                    fetcher_prompting.swap(0, Ordering::SeqCst);\n                                    let _ = handle_nonstop_fail(&recipe);\n                                    break 'again;\n                                } // skip\n                                4 => {\n                                    fetcher_prompting.swap(0, Ordering::SeqCst);\n                                    break 'done;\n                                } // done\n                                _ => unreachable!(),\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        status_tx\n            .send(StatusUpdate::FetchThreadFinished)\n            .unwrap_or_default();\n    });\n\n    let mut terminal = Terminal::new(TermionBackend::new(stdout()))?;\n    terminal.clear()?;\n\n    let mut app = TuiApp::new(recipes);\n\n    let spinner = ['-', '\\\\', '|', '/'];\n    let mut spinner_i = 0;\n\n    while running.load(Ordering::SeqCst) {\n        let frame_start = Instant::now();\n        terminal.draw(|f| {\n            spinner_i = (spinner_i + 1) % spinner.len();\n            let spin = spinner[spinner_i];\n\n            let mut constraints = Vec::new();\n            if !app.fetch_complete {\n                constraints.push(Constraint::Length(22));\n            }\n            constraints.push(Constraint::Length(22));\n            constraints.push(Constraint::Min(20));\n            let chunks = Layout::default()\n                .direction(Direction::Horizontal)\n                .constraints(constraints)\n                .split(f.area());\n            let panel_height = chunks[0].height.saturating_sub(2) as usize;\n\n            // Left Pane\n            let fetch_items: Vec<ListItem> = app\n                .recipes\n                .iter()\n                .filter(|(_, s)| *s == RecipeStatus::Pending || *s == RecipeStatus::Fetching)\n                .map(|(r, s)| {\n                    let style = if *s == RecipeStatus::Fetching {\n                        Style::default().fg(Color::Yellow)\n                    } else {\n                        Style::default()\n                    };\n                    let icon = match s {\n                        RecipeStatus::Pending => ' ',\n                        RecipeStatus::Fetching => spin,\n                        _ => '?',\n                    };\n\n                    ListItem::new(format!(\"{icon} {}\", r.name)).style(style)\n                })\n                .collect();\n            let fetch_list = List::new(fetch_items).block(\n                Block::default()\n                    .title(\"Fetch Queue [1]\")\n                    .borders(Borders::ALL),\n            );\n            f.render_widget(fetch_list, chunks[0]);\n\n            // Right Pane\n            let cook_items: Vec<ListItem> = app\n                .recipes\n                .iter()\n                .filter(|(_, s)| {\n                    *s == RecipeStatus::Fetched\n                        || *s == RecipeStatus::Cooking\n                        || *s == RecipeStatus::Done\n                        || *s == RecipeStatus::Cached\n                        || matches!(s, RecipeStatus::Failed(_))\n                })\n                .map(|(r, s)| {\n                    let style = match s {\n                        RecipeStatus::Fetched => Style::default(),\n                        RecipeStatus::Cooking => Style::default().fg(Color::Yellow),\n                        RecipeStatus::Done => Style::default().fg(Color::Green),\n                        RecipeStatus::Cached => Style::default().fg(Color::Cyan),\n                        RecipeStatus::Failed(_) => Style::default().fg(Color::Red),\n                        _ => Style::default(),\n                    };\n                    let icon = match s {\n                        RecipeStatus::Fetched => ' ',\n                        RecipeStatus::Cooking => spin,\n                        RecipeStatus::Done => '+',\n                        RecipeStatus::Cached => ' ',\n                        RecipeStatus::Failed(_) => 'X',\n                        _ => '?',\n                    };\n                    ListItem::new(format!(\"{icon} {}\", r.name)).style(style)\n                })\n                .collect();\n            let total_items = cook_items.len();\n            if app.cook_auto_scroll {\n                let cooking_index = app\n                    .recipes\n                    .iter()\n                    .filter(|(_, s)| {\n                        *s == RecipeStatus::Fetched\n                            || *s == RecipeStatus::Cooking\n                            || *s == RecipeStatus::Done\n                            || matches!(s, RecipeStatus::Failed(_))\n                    })\n                    .position(|(_r, s)| *s == RecipeStatus::Cooking);\n\n                if let Some(index) = cooking_index {\n                    app.cook_list_state.select(Some(index));\n                    let index_u16 = index;\n                    let center_offset = panel_height / 2;\n                    let new_offset = index_u16.saturating_sub(center_offset) as usize;\n\n                    *app.cook_list_state.offset_mut() = new_offset;\n                }\n            } else {\n                app.cook_list_state.select(None);\n                if total_items > 0 {\n                    let max_offset = total_items.saturating_sub(panel_height as usize);\n                    if *app.cook_list_state.offset_mut() > max_offset {\n                        *app.cook_list_state.offset_mut() = max_offset;\n                    }\n                } else {\n                    *app.cook_list_state.offset_mut() = 0;\n                }\n            }\n            let cook_items: Vec<ListItem> = cook_items[app.cook_scroll..].into();\n            let cook_chunk = chunks[if app.fetch_complete { 0 } else { 1 }];\n            let cook_list = List::new(cook_items).block(\n                Block::default()\n                    .title(\"Cook Queue [2]\")\n                    .borders(Borders::ALL),\n            );\n            f.render_stateful_widget(cook_list, cook_chunk, &mut app.cook_list_state);\n\n            let (active_name, log_text, log_line) = app.get_active_log();\n            let log_title = if let Some(active_name) = active_name {\n                format!(\n                    \" {} Log: {} \",\n                    app.log_view_job.to_string(),\n                    active_name.as_str()\n                )\n            } else {\n                format!(\" {} Log \", app.log_view_job.to_string())\n            };\n\n            let mut enable_auto_scroll = false;\n            let mut intended_scroll_pos = 0usize;\n\n            let mut log_lines: Vec<Line> = if let Some(log_text) = log_text\n                && !log_text.is_empty()\n            {\n                let total_log_lines = log_text.len() as usize;\n\n                let start = if app.auto_scroll {\n                    if total_log_lines > panel_height {\n                        intended_scroll_pos = total_log_lines - panel_height;\n                        total_log_lines - panel_height\n                    } else {\n                        0\n                    }\n                } else {\n                    if total_log_lines > panel_height {\n                        let limit = 2; // arbitrary number\n                        if app.log_scroll >= total_log_lines - limit {\n                            if app.prompt.is_none() || config.cook.nonstop {\n                                enable_auto_scroll = true;\n                            }\n                            intended_scroll_pos = total_log_lines - limit;\n                            total_log_lines - limit\n                        } else {\n                            app.log_scroll\n                        }\n                    } else {\n                        0\n                    }\n                };\n\n                let end = cmp::min(panel_height + start, total_log_lines - 1);\n\n                log_text[start..end]\n                    .iter()\n                    .map(|s| {\n                        let text_with_colors = s\n                            .into_text()\n                            .unwrap_or_else(|_| Text::raw(\"--unrenderable line--\"));\n                        text_with_colors\n                            .lines\n                            .into_iter()\n                            .next()\n                            .unwrap_or_else(|| Line::raw(\"--unrenderable line--\"))\n                    })\n                    .collect()\n            } else {\n                vec![Line::from(\"No logs yet\")]\n            };\n\n            if let Some(buffer) = log_line\n                && !buffer.is_empty()\n            {\n                let text_with_colors = handle_cr(&buffer)\n                    .into_text()\n                    .unwrap_or_else(|_| Text::raw(\"--unrenderable line--\"));\n\n                if let Some(line) = text_with_colors.lines.into_iter().next() {\n                    log_lines.push(line);\n                }\n            }\n\n            let instruct = format!(\n                \" Keys: [c] Stop [PageUp/Down] Scroll{}{} \",\n                match app.auto_scroll {\n                    true => \"\",\n                    false => \" [End] Follow log trails\",\n                },\n                match (&app.log_view_job, app.fetch_complete) {\n                    (JobType::Fetch, _) => \" [2] View Cook Log\",\n                    (JobType::Cook, false) => \" [1] View Fetch Log\",\n                    (JobType::Cook, true) => \"\",\n                }\n            );\n\n            let mut log_paragraph = Paragraph::new(log_lines).block(\n                Block::default()\n                    .title(log_title)\n                    .title_bottom(instruct)\n                    .borders(Borders::ALL),\n            );\n\n            if !app.auto_scroll {\n                log_paragraph = log_paragraph.wrap(Wrap { trim: false });\n            }\n\n            f.render_widget(\n                log_paragraph,\n                chunks[if app.fetch_complete { 1 } else { 2 }],\n            );\n            if let Some(prompt) = &mut app.prompt {\n                if config.cook.nonstop && prompt.selected == PromptOption::Retry {\n                    prompt.selected = PromptOption::Skip;\n                }\n                draw_prompt(f, prompt, config.cook.nonstop);\n            }\n            if enable_auto_scroll {\n                app.auto_scroll = true;\n            }\n            if intended_scroll_pos > 0 {\n                app.log_scroll = intended_scroll_pos;\n            }\n\n            while let Ok(event) = input_rx.try_recv() {\n                if let Some((app, res)) = handle_prompt_input(&event, &mut app) {\n                    prompting.swap(res as u32, Ordering::SeqCst);\n                    if res == PromptOption::Exit {\n                        // TODO: This can be a different log with what prompted on nonstop mode\n                        let (name, log, line) = app.get_active_log();\n                        if let Some(name) = name\n                            && let Some(log) = log\n                        {\n                            app.dump_logs_on_exit = Some((name.to_owned(), join_logs(log, line)));\n                        }\n                        running.store(false, Ordering::SeqCst);\n                    }\n                    app.prompt = None;\n                } else {\n                    handle_main_event(&mut app, &event);\n                }\n            }\n        })?;\n\n        while let Ok(update) = status_rx.try_recv() {\n            app.update_status(update);\n        }\n\n        if app.cook_complete {\n            running.swap(false, Ordering::SeqCst);\n        }\n\n        if let Some(sleep_duration) = TICK_RATE.checked_sub(frame_start.elapsed()) {\n            thread::sleep(sleep_duration);\n        }\n    }\n\n    drop(mstdout);\n    let _ = stdout().flush();\n\n    if config.cook.nonstop && app.dump_logs_on_exit.is_some() {\n        kill_everything();\n    }\n\n    let _ = fetcher_handle.join();\n    let _ = cooker_handle.join();\n\n    Ok(app.dump_logs_on_exit)\n}\n\nfn join_logs(log: &Vec<String>, line: Option<Cow<'_, str>>) -> String {\n    let mut logs = log.join(\"\\n\");\n    if let Some(line) = line {\n        logs.push_str(\"\\n\");\n        logs.push_str(handle_cr(&line));\n    }\n    logs\n}\n\nfn handle_cr<'a>(buffer: &'a Cow<'_, str>) -> &'a str {\n    let st = buffer.trim_end();\n    st.rsplit('\\r').next().unwrap_or(&st)\n}\n\nfn handle_main_event(app: &mut TuiApp, event: &Event) {\n    match event {\n        Event::Key(key) => match key {\n            Key::Char('1') => {\n                app.log_view_job = JobType::Fetch;\n            }\n            Key::Char('2') => {\n                app.log_view_job = JobType::Cook;\n            }\n            Key::Char('c') => {\n                // as compilers still running, we use this way to stop it\n                kill_everything();\n            }\n            Key::Up => {\n                app.auto_scroll = false;\n                app.log_scroll = app.log_scroll.saturating_sub(1);\n            }\n            Key::Down => {\n                app.auto_scroll = false;\n                app.log_scroll = app.log_scroll.saturating_add(1);\n            }\n            Key::PageUp => {\n                app.auto_scroll = false;\n                app.log_scroll = app.log_scroll.saturating_sub(20);\n            }\n            Key::PageDown => {\n                app.auto_scroll = false;\n                app.log_scroll = app.log_scroll.saturating_add(20);\n            }\n            Key::End => {\n                app.auto_scroll = true;\n            }\n            Key::Home => {\n                app.auto_scroll = false;\n                app.log_scroll = 0;\n            }\n            _ => {}\n        },\n\n        //FIXME: This does nothing, it seems ratatui handles this itself magically\n        Event::Mouse(mouse_event) => {\n            match mouse_event {\n                MouseEvent::Press(termion::event::MouseButton::WheelUp, x, y) => {\n                    // termion is 1-based, ratatui rects are 0-based\n                    let pos = Position {\n                        x: x.saturating_sub(1),\n                        y: y.saturating_sub(1),\n                    };\n\n                    if app.fetch_panel_rect.map_or(false, |r| r.contains(pos)) {\n                        app.fetch_scroll = app.fetch_scroll.saturating_sub(1);\n                    } else if app.cook_panel_rect.map_or(false, |r| r.contains(pos)) {\n                        app.cook_scroll = app.cook_scroll.saturating_sub(1);\n                        app.cook_auto_scroll = false;\n                    } else if app.log_panel_rect.map_or(false, |r| r.contains(pos)) {\n                        app.auto_scroll = false;\n                        app.log_scroll = app.log_scroll.saturating_sub(1);\n                    }\n                }\n                MouseEvent::Press(termion::event::MouseButton::WheelDown, x, y) => {\n                    let pos = Position {\n                        x: x.saturating_sub(1),\n                        y: y.saturating_sub(1),\n                    };\n\n                    if app.fetch_panel_rect.map_or(false, |r| r.contains(pos)) {\n                        app.fetch_scroll = app.fetch_scroll.saturating_add(1);\n                    } else if app.cook_panel_rect.map_or(false, |r| r.contains(pos)) {\n                        app.cook_scroll = app.cook_scroll.saturating_add(1);\n                        app.cook_auto_scroll = false;\n                    } else if app.log_panel_rect.map_or(false, |r| r.contains(pos)) {\n                        app.auto_scroll = false;\n                        app.log_scroll = app.log_scroll.saturating_add(1);\n                    }\n                }\n                _ => {}\n            }\n        }\n        _ => {}\n    }\n}\n\nfn kill_everything() {\n    let pid = std::process::id();\n    Command::new(\"bash\")\n        .arg(\"-c\")\n        .arg(KILL_ALL_PID.replace(\"$PID\", &pid.to_string()))\n        .stdout(process::Stdio::null())\n        .stderr(process::Stdio::null())\n        .spawn()\n        .expect(\"unable to spawn kill\");\n}\n\nfn handle_prompt_input<'a>(\n    event: &Event,\n    app: &'a mut TuiApp,\n) -> Option<(&'a mut TuiApp, PromptOption)> {\n    if let Some(prompt) = &mut app.prompt {\n        match event {\n            Event::Key(key) => match key {\n                Key::Char('q') | Key::Ctrl('c') | Key::Esc => {\n                    // Treat as \"Exit\"\n                    return Some((app, PromptOption::Exit));\n                }\n                Key::Left | Key::BackTab => prompt.prev(),\n                Key::Right | Key::Char('\\t') => prompt.next(),\n                Key::Char('\\n') => {\n                    let prompt = app.prompt.take().unwrap();\n                    return Some((app, prompt.selected));\n                }\n                _ => {}\n            },\n            _ => {} // Ignore mouse events\n        }\n    }\n    None\n}\n\nfn draw_prompt(f: &mut ratatui::Frame, prompt: &FailurePrompt, is_nonstop: bool) {\n    let title = format!(\n        \" FAILURE in {} {}\",\n        prompt.recipe.name,\n        if is_nonstop { \"(skipped) \" } else { \"\" }\n    );\n    let mut error_text = prompt.error.clone();\n    if error_text.len() > 200 {\n        error_text = error_text[0..100].to_string()\n            + \"..\"\n            + &error_text[(error_text.len() - 100)..(error_text.len() - 1)];\n    } else if error_text.len() > 100 {\n        error_text = error_text[0..100].to_string() + \"..\";\n    }\n\n    // Style for options\n    let retry_style = if prompt.selected == PromptOption::Retry {\n        Style::default().bg(Color::White).fg(Color::Black)\n    } else {\n        Style::default()\n    };\n    let skip_style = if prompt.selected == PromptOption::Skip {\n        Style::default().bg(Color::White).fg(Color::Black)\n    } else {\n        Style::default()\n    };\n    let exit_style = if prompt.selected == PromptOption::Exit {\n        Style::default().bg(Color::White).fg(Color::Black)\n    } else {\n        Style::default()\n    };\n\n    let mut buttons = vec![\n        Span::styled(\" [Skip] \", skip_style),\n        Span::raw(\"   \"),\n        Span::styled(\" [Exit] \", exit_style),\n    ];\n\n    if !is_nonstop {\n        buttons.push(Span::raw(\"   \"));\n        buttons.push(Span::styled(\" [Retry] \", retry_style));\n    }\n\n    let text = vec![\n        Line::from(error_text).style(Style::default().fg(Color::Yellow)),\n        Line::from(\"\"),\n        Line::from(buttons),\n    ];\n\n    let block = Block::default()\n        .title(Span::styled(\n            title,\n            Style::default().fg(Color::White).bg(Color::Red),\n        ))\n        .borders(Borders::ALL)\n        .border_style(Style::default().fg(Color::Red));\n\n    let paragraph = Paragraph::new(text)\n        .block(block)\n        .alignment(ratatui::layout::Alignment::Center)\n        .wrap(Wrap { trim: true });\n\n    let area = f.area();\n    let popup_area = Rect {\n        x: area.width / 4,\n        y: area.height / 3,\n        width: area.width / 2,\n        height: 10,\n    };\n\n    f.render_widget(Clear, popup_area); // Clear the background\n    f.render_widget(paragraph, popup_area);\n}\n\nfn spawn_log_reader<R>(\n    mut reader: R,\n    package_name: PackageName,\n    status_tx: mpsc::Sender<StatusUpdate>,\n) where\n    R: Read + Send + 'static,\n{\n    thread::spawn(move || {\n        let mut buffer = [0; 1024];\n        loop {\n            let buf = match reader.read(&mut buffer) {\n                Ok(0) => break,\n                Ok(n) => buffer[..n].to_vec(),\n                Err(e) => format!(\"[IO Error] {}\", e).into_bytes(),\n            };\n            if status_tx\n                .send(StatusUpdate::PushLog(package_name.clone(), buf))\n                .is_err()\n            {\n                // TUI thread hung up\n                break;\n            }\n        }\n    });\n}\n\nfn setup_logger(\n    status_tx: &mpsc::Sender<StatusUpdate>,\n    name: &PackageName,\n) -> (UnixSlavePty, std::io::PipeWriter) {\n    let (pty_reader, log_reader, pipes) = setup_pty();\n\n    spawn_log_reader(pty_reader, name.clone(), status_tx.clone());\n    spawn_log_reader(log_reader, name.clone(), status_tx.clone());\n    pipes\n}\n\n#[derive(PartialEq, Clone, Copy)]\n#[repr(u32)]\nenum PromptOption {\n    Retry = 2,\n    Skip,\n    Exit,\n}\n\nstruct FailurePrompt {\n    recipe: CookRecipe,\n    error: String,\n    selected: PromptOption,\n}\n\nimpl FailurePrompt {\n    fn new(recipe: CookRecipe, error: String) -> Self {\n        Self {\n            recipe,\n            error,\n            selected: PromptOption::Exit,\n        }\n    }\n\n    fn next(&mut self) {\n        self.selected = match self.selected {\n            PromptOption::Retry => PromptOption::Skip,\n            PromptOption::Skip => PromptOption::Exit,\n            PromptOption::Exit => PromptOption::Retry,\n        }\n    }\n\n    fn prev(&mut self) {\n        self.selected = match self.selected {\n            PromptOption::Retry => PromptOption::Exit,\n            PromptOption::Skip => PromptOption::Retry,\n            PromptOption::Exit => PromptOption::Skip,\n        }\n    }\n}\n"
  },
  {
    "path": "src/bin/repo_builder.rs",
    "content": "use cookbook::WALK_DEPTH;\nuse cookbook::cook::ident::{get_ident, init_ident};\nuse cookbook::cook::{fetch, package as cook_package};\nuse cookbook::recipe::CookRecipe;\nuse cookbook::web::{CliWebConfig, generate_web};\nuse pkg::{Package, PackageName, recipes};\nuse pkg::{Repository, SourceIdentifier};\nuse std::collections::{BTreeMap, BTreeSet, HashMap};\nuse std::env;\nuse std::fs::{self, File};\nuse std::io::{Read, Write};\nuse std::path::{Path, PathBuf};\nuse std::process::Command;\nuse toml::Value;\n\nfn is_newer(src: &Path, dst: &Path) -> bool {\n    match (fs::metadata(src), fs::metadata(dst)) {\n        (Ok(src_meta), Ok(dst_meta)) => match (src_meta.modified(), dst_meta.modified()) {\n            (Ok(src_time), Ok(dst_time)) => src_time > dst_time,\n            (Ok(_), Err(_)) => true,\n            _ => false,\n        },\n        (Ok(_), Err(_)) => true,\n        _ => false,\n    }\n}\n\n#[derive(Clone)]\nstruct CliConfig {\n    repo_dir: PathBuf,\n    appstream: bool,\n    recipe_list: Vec<String>,\n    web: Option<CliWebConfig>,\n}\n\nimpl CliConfig {\n    fn parse_args() -> Result<Self, std::io::Error> {\n        let mut args = env::args().skip(1);\n        let repo_dir = PathBuf::from(\n            args.next()\n                .expect(\"Usage: repo_builder <REPO_DIR> <recipe1> <recipe2> ...\"),\n        );\n        let web = CliWebConfig::parse_args();\n        Ok(CliConfig {\n            repo_dir,\n            appstream: env::var(\"COOKBOOK_APPSTREAM\").ok().as_deref() == Some(\"true\"),\n            recipe_list: args.collect(),\n            web,\n        })\n    }\n}\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n    init_ident();\n    let conf = CliConfig::parse_args()?;\n    Ok(publish_packages(&conf)?)\n}\n\n// TODO: Make this callable from repo bin\nfn publish_packages(config: &CliConfig) -> anyhow::Result<()> {\n    let repo_path = &config.repo_dir.join(redoxer::target());\n    if !repo_path.is_dir() {\n        fs::create_dir_all(repo_path)?;\n    }\n\n    // Don't publish host packages\n    let target_packages = &config\n        .recipe_list\n        .iter()\n        .map(PackageName::new)\n        .filter(|pkg| pkg.as_ref().is_ok_and(|p| !p.is_host()))\n        .collect::<Result<Vec<_>, _>>()?;\n\n    if target_packages.len() == 0 {\n        return Ok(());\n    }\n\n    // TODO: publish cross target builds?\n    if std::env::var(\"COOKBOOK_CROSS_TARGET\").is_ok_and(|x| !x.is_empty()) {\n        return Ok(());\n    }\n\n    // Runtime dependencies include both `[package.dependencies]` and dynamically\n    // linked packages discovered by auto_deps.\n    //\n    // The following adds the package dependencies of the recipes to the repo as\n    // well.\n    let (recipe_list, recipe_map) = Package::new_recursive_nonstop(target_packages, WALK_DEPTH);\n\n    if recipe_list.len() == 0 {\n        // Fail-Safe\n        anyhow::bail!(\"Zero packages are passing the build\");\n    }\n\n    let mut appstream_sources: HashMap<String, PathBuf> = HashMap::new();\n    let mut packages: BTreeMap<String, String> = BTreeMap::new();\n    let mut outdated_packages: BTreeMap<String, SourceIdentifier> = BTreeMap::new();\n\n    // === 1. Push recipes in list ===\n    for recipe_toml in &recipe_list {\n        let recipe = &recipe_toml.name;\n        let Some(recipe_path) = recipes::find(recipe.name()) else {\n            eprintln!(\"recipe {} not found\", recipe);\n            continue;\n        };\n        let Ok(cookbook_recipe) = CookRecipe::from_path(recipe_path, true, false) else {\n            eprintln!(\"recipe {} unable to read\", recipe);\n            continue;\n        };\n\n        let target_dir = cookbook_recipe.target_dir();\n        for package in cookbook_recipe.recipe.get_packages_list() {\n            let (stage_dir, pkgar_src, toml_src) =\n                cook_package::package_stage_paths(package, &target_dir);\n            let recipe_name = cook_package::get_package_name(recipe.name(), package);\n            let pkgar_dst = repo_path.join(format!(\"{}.pkgar\", recipe_name));\n            let toml_dst = repo_path.join(format!(\"{}.toml\", recipe_name));\n\n            if !fs::exists(&toml_src)? {\n                eprintln!(\"recipe {} is missing stage.toml\", recipe_name);\n                continue;\n            }\n\n            if is_newer(&toml_src, &toml_dst) {\n                eprintln!(\"\\x1b[01;38;5;155mrepo - publishing {}\\x1b[0m\", recipe_name);\n                if fs::exists(&pkgar_src)? {\n                    fs::copy(&pkgar_src, &pkgar_dst)?;\n                }\n                fs::copy(&toml_src, &toml_dst)?;\n            }\n\n            // TODO: Extract from pkgar instead to handle config.cook.clean_target == true\n            if stage_dir.join(\"usr/share/metainfo\").exists() {\n                appstream_sources.insert(recipe.name().to_string(), stage_dir.clone());\n            }\n        }\n    }\n\n    // === 2. Optional AppStream generation ===\n    if config.appstream {\n        eprintln!(\"\\x1b[01;38;5;155mrepo - generating appstream data\\x1b[0m\");\n\n        let root = env::var(\"ROOT\").unwrap_or_else(|_| \".\".into());\n        let target = env::var(\"TARGET\").unwrap_or_else(|_| \"x86_64-unknown-linux-gnu\".into());\n        let appstream_root = Path::new(&root)\n            .join(\"build\")\n            .join(&target)\n            .join(\"appstream\");\n\n        fs::remove_dir_all(&appstream_root).ok();\n        fs::create_dir_all(&appstream_root)?;\n\n        if !appstream_sources.is_empty() {\n            let mut compose_cmd = Command::new(\"appstreamcli\");\n            compose_cmd\n                .arg(\"compose\")\n                .arg(\"--origin=pkgar\")\n                .arg(\"--print-report=full\")\n                .arg(format!(\"--result-root={}\", appstream_root.display()));\n\n            for (_recipe, source_path) in &appstream_sources {\n                compose_cmd.arg(source_path);\n            }\n\n            let exit_status = compose_cmd.status()?;\n            if exit_status.success() {\n                let appstream_pkg = repo_path.join(\"repo-appstream.pkgar\");\n                fs::remove_file(&appstream_pkg).ok();\n                pkgar::create(\n                    format!(\"{}/build/id_ed25519.toml\", root),\n                    &appstream_pkg,\n                    &appstream_root,\n                )?;\n            } else {\n                eprintln!(\"\\x1b[1;91;49mrepo - appstreamcli failed:\\x1b[0m {exit_status:?}\");\n                for (_recipe, source_path) in &appstream_sources {\n                    eprintln!(\"- {}\", source_path.display());\n                }\n                eprintln!();\n            }\n        }\n    }\n\n    // === 3. List outdated packages ===\n    for (recipe, e) in recipe_map\n        .into_iter()\n        .filter_map(|(k, v)| v.err().and_then(|e| Some((k, e))))\n    {\n        eprintln!(\n            \"\\x1b[0;91;49mrepo - marking {} as outdated:\\x1b[0m {e}\",\n            recipe\n        );\n\n        let Some(recipe_path) = recipes::find(recipe.name()) else {\n            eprintln!(\"recipe {} not found\", recipe);\n            continue;\n        };\n        let Ok(cookbook_recipe) = CookRecipe::from_path(recipe_path, true, false) else {\n            eprintln!(\"recipe {} unable to read\", recipe);\n            continue;\n        };\n\n        match fetch::fetch_get_source_info(&cookbook_recipe) {\n            Ok(source_ident) => {\n                outdated_packages.insert(recipe.name().to_string(), source_ident);\n            }\n            Err(e) => {\n                eprintln!(\n                    \"\\x1b[0;91;49m  source of {} is not identifiable:\\x1b[0m {e}\",\n                    recipe\n                );\n                let ident = get_ident();\n                outdated_packages.insert(\n                    recipe.name().to_string(),\n                    SourceIdentifier {\n                        source_identifier: \"missing_source\".to_string(),\n                        commit_identifier: ident.commit.clone(),\n                        time_identifier: ident.time.clone(),\n                    },\n                );\n            }\n        };\n    }\n\n    eprintln!(\"\\x1b[01;38;5;155mrepo - generating repo.toml\\x1b[0m\");\n\n    // === 4. Read and update repo.toml ===\n    let repo_toml_path = repo_path.join(\"repo.toml\");\n    if repo_toml_path.exists() {\n        let mut file = File::open(&repo_toml_path)?;\n        let mut contents = String::new();\n        file.read_to_string(&mut contents)?;\n\n        let parsed: Repository = toml::from_str(&contents)?;\n        for (k, v) in parsed.packages {\n            packages.insert(k, v);\n        }\n        if parsed.outdated_packages.len() > 0 {\n            let built_packages: BTreeSet<String> = recipe_list\n                .iter()\n                .map(|p| p.name.name().to_string())\n                .collect();\n            for (k, v) in parsed.outdated_packages {\n                if outdated_packages.contains_key(&k) || !built_packages.contains(&k) {\n                    outdated_packages.insert(k, v);\n                }\n            }\n        }\n    }\n\n    for entry in fs::read_dir(&repo_path)? {\n        let entry = entry?;\n        let path = entry.path();\n\n        if path.extension().and_then(|s| s.to_str()) != Some(\"toml\") {\n            continue;\n        }\n\n        if path.file_stem().and_then(|s| s.to_str()) == Some(\"repo\") {\n            continue;\n        }\n\n        let content = fs::read_to_string(&path)?;\n        let parsed: Value = toml::from_str(&content)?;\n\n        let empty_ver = Value::String(\"\".to_string());\n        let version_str = parsed\n            .get(\"blake3\")\n            .unwrap_or_else(|| parsed.get(\"version\").unwrap_or_else(|| &empty_ver))\n            .as_str()\n            .unwrap_or(\"\");\n        let package_name = path.file_stem().unwrap().to_string_lossy().to_string();\n        packages.insert(package_name, version_str.to_string());\n    }\n\n    let repository = Repository {\n        packages,\n        outdated_packages,\n    };\n\n    let output = toml::to_string(&repository)?;\n    let mut output_file = File::create(&repo_toml_path)?;\n    output_file.write_all(output.as_bytes())?;\n\n    if let Some(conf) = &config.web {\n        eprintln!(\"\\x1b[01;38;5;155mrepo - generating web content\\x1b[0m\");\n        generate_web(&repository.packages.keys().cloned().collect(), conf);\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "src/blake3.rs",
    "content": "use blake3::Hasher;\nuse std::{fs, io::Result, path::Path, time::Duration};\n\nuse crate::progress_bar::{ProgressBar, ProgressBarRead};\n\npub fn blake3_progress<P: AsRef<Path>>(path: P) -> Result<String> {\n    let len = fs::metadata(&path)?.len();\n\n    let mut f = fs::File::open(&path)?;\n\n    let mut pb = ProgressBar::new(len);\n    pb.message(\"blake3: \");\n    pb.set_max_refresh_rate(Some(Duration::new(1, 0)));\n    pb.set_units(pbr::Units::Bytes);\n\n    let mut pbr = ProgressBarRead::new(&mut pb, &mut f);\n    let hash = Hasher::new().update_reader(&mut pbr)?.finalize();\n    let res = format!(\"{}\", hash.to_hex());\n\n    pb.finish_println(\"\");\n\n    Ok(res)\n}\n\npub fn blake3_silent<P: AsRef<Path>>(path: P) -> Result<String> {\n    let mut f = fs::File::open(&path)?;\n\n    let hash = Hasher::new().update_reader(&mut f)?.finalize();\n    let res = format!(\"{}\", hash.to_hex());\n    Ok(res)\n}\n\npub fn hash_to_hex(h: [u8; 32]) -> String {\n    format!(\"{}\", blake3::Hash::from_bytes(h).to_hex())\n}\n"
  },
  {
    "path": "src/config.rs",
    "content": "use std::{collections::HashMap, env, fs, str::FromStr, sync::OnceLock};\n\nuse serde::{Deserialize, Serialize};\n\n#[derive(Debug, Default, Clone, Deserialize, PartialEq, Serialize)]\n#[serde(default)]\npub struct CookConfigOpt {\n    /// whether to run offline\n    pub offline: Option<bool>,\n    /// whether to set jobs number instead of from nproc\n    pub jobs: Option<usize>,\n    /// whether to use TUI to allow parallel build\n    /// default value is yes if \"CI\" env unset and STDIN is open.\n    pub tui: Option<bool>,\n    /// whether to write logs to build/logs dir, default true on TUI\n    pub logs: Option<bool>,\n    /// whether to ignore build errors\n    pub nonstop: Option<bool>,\n    /// whether to archive packages with compressed format\n    pub compressed: Option<bool>,\n    /// whether to print verbose logs to certain commands\n    /// build failure still be printed anyway\n    pub verbose: Option<bool>,\n    /// whether to always clean the build directory before building\n    pub clean_build: Option<bool>,\n    /// whether to always clean the target directory after building\n    /// (deletes everything except pkgar files)\n    pub clean_target: Option<bool>,\n    /// whether to always write stage.files metadata\n    pub write_filetree: Option<bool>,\n}\n\n#[derive(Debug, Default, Clone, Deserialize, PartialEq, Serialize)]\npub struct CookConfig {\n    pub offline: bool,\n    pub jobs: usize,\n    pub tui: bool,\n    pub logs: bool,\n    pub nonstop: bool,\n    pub compressed: bool,\n    pub verbose: bool,\n    pub clean_build: bool,\n    pub clean_target: bool,\n    pub write_filetree: bool,\n}\n\nimpl From<CookConfigOpt> for CookConfig {\n    fn from(value: CookConfigOpt) -> Self {\n        CookConfig {\n            offline: value.offline.unwrap(),\n            jobs: value.jobs.unwrap(),\n            tui: value.tui.unwrap(),\n            logs: value.logs.unwrap(),\n            nonstop: value.nonstop.unwrap(),\n            compressed: value.compressed.unwrap(),\n            verbose: value.verbose.unwrap(),\n            clean_build: value.clean_build.unwrap(),\n            clean_target: value.clean_target.unwrap(),\n            write_filetree: value.write_filetree.unwrap(),\n        }\n    }\n}\n\n#[derive(Debug, Default, Deserialize, PartialEq, Serialize)]\n#[serde(default)]\npub struct CookbookConfig {\n    #[serde(rename = \"cook\")]\n    cook_opt: CookConfigOpt,\n    #[serde(skip)]\n    pub cook: CookConfig,\n    pub mirrors: HashMap<String, String>,\n}\n\nstatic CONFIG: OnceLock<CookbookConfig> = OnceLock::new();\n\npub fn init_config() {\n    let mut config: CookbookConfig = if fs::exists(\"cookbook.toml\").unwrap_or(false) {\n        let toml_content = fs::read_to_string(\"cookbook.toml\")\n            .map_err(|e| format!(\"Unable to read config: {:?}\", e))\n            .unwrap();\n        toml::from_str(&toml_content)\n            .map_err(|e| format!(\"Unable to parse config: {:?}\", e))\n            .unwrap()\n    } else {\n        CookbookConfig::default()\n    };\n\n    if config.cook_opt.tui.is_none() {\n        config.cook_opt.tui = Some(!env::var(\"CI\").is_ok_and(|s| !s.is_empty()));\n    }\n    if config.cook_opt.jobs.is_none() {\n        config.cook_opt.jobs = Some(extract_env(\n            \"COOKBOOK_MAKE_JOBS\",\n            std::thread::available_parallelism()\n                .map(|f| usize::from(f))\n                .unwrap_or(1),\n        ));\n    }\n    if config.cook_opt.logs.is_none() {\n        config.cook_opt.logs = Some(extract_env(\"COOKBOOK_LOGS\", config.cook_opt.tui.unwrap()));\n    }\n    if config.cook_opt.offline.is_none() {\n        config.cook_opt.offline = Some(extract_env(\"COOKBOOK_OFFLINE\", false));\n    }\n    if config.cook_opt.compressed.is_none() {\n        config.cook_opt.compressed = Some(extract_env(\"COOKBOOK_COMPRESSED\", false));\n    }\n    if config.cook_opt.verbose.is_none() {\n        config.cook_opt.verbose = Some(extract_env(\"COOKBOOK_VERBOSE\", true));\n    }\n    if config.cook_opt.nonstop.is_none() {\n        config.cook_opt.nonstop = Some(extract_env(\"COOKBOOK_NONSTOP\", false));\n    }\n    if config.cook_opt.clean_build.is_none() {\n        config.cook_opt.clean_build = Some(extract_env(\"COOKBOOK_CLEAN_BUILD\", false));\n    }\n    if config.cook_opt.clean_target.is_none() {\n        config.cook_opt.clean_target = Some(extract_env(\"COOKBOOK_CLEAN_TARGET\", false));\n    }\n    if config.cook_opt.write_filetree.is_none() {\n        config.cook_opt.write_filetree = Some(extract_env(\n            \"COOKBOOK_WRITE_FILETREE\",\n            config.cook_opt.clean_target.unwrap_or(false) || extract_env(\"COOKBOOK_WEB\", false),\n        ));\n    }\n    if config.mirrors.len() == 0 {\n        // The GNU FTP mirror below is automatically inserted for convenience\n        // You can choose other mirrors by setting it on cookbook.toml\n        config.mirrors.insert(\n            \"ftp.gnu.org/gnu\".to_string(),\n            \"mirrors.ocf.berkeley.edu/gnu\".to_string(),\n        );\n    }\n\n    config.cook = CookConfig::from(config.cook_opt.clone());\n\n    CONFIG.set(config).expect(\"config is initialized twice\");\n}\n\nfn extract_env<T: FromStr>(key: &str, default: T) -> T {\n    if let Ok(e) = env::var(&key) {\n        str::parse(&e).unwrap_or(default)\n    } else {\n        default\n    }\n}\n\npub fn get_config() -> &'static CookbookConfig {\n    return CONFIG.get().expect(\"Configuration is not initialized\");\n}\n\npub fn translate_mirror(original_url: &str) -> String {\n    let config = CONFIG.get().expect(\"Configuration is not initialized\");\n\n    let stripped_url = original_url\n        .strip_prefix(\"https://\")\n        .or_else(|| original_url.strip_prefix(\"http://\"))\n        .unwrap_or(original_url);\n\n    let mut best_match_prefix: Option<&String> = None;\n\n    for prefix in config.mirrors.keys() {\n        if stripped_url.starts_with(prefix) {\n            match best_match_prefix {\n                Some(current_best) if prefix.len() > current_best.len() => {\n                    best_match_prefix = Some(prefix);\n                }\n                None => {\n                    best_match_prefix = Some(prefix);\n                }\n                _ => {}\n            }\n        }\n    }\n\n    if let Some(prefix) = best_match_prefix {\n        let mirror_base = config.mirrors.get(prefix).unwrap();\n        let suffix = &stripped_url[prefix.len()..];\n        let ptotocol = &original_url[..(original_url.len() - stripped_url.len())];\n        return format!(\"{}{}{}\", ptotocol, mirror_base, suffix);\n    }\n\n    original_url.to_string()\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    fn setup_test_config() {\n        let app_config = toml::from_str(\n            \"[mirrors]\\n\\\n            \\\"ftp.gnu.org/gnu\\\" = \\\"example.com/gnu\\\"\\n\\\n            \\\"github.com/foo/bar\\\" = \\\"github.com/baz/bar\\\"\\n\\\n            \\\"github.com/a\\\" = \\\"github.com/b\\\"\\n\",\n        )\n        .expect(\"Unable to parse test config\");\n        // This will be called for each test. If the config is already set,\n        // it will do nothing, which is fine as all tests use the same config.\n        let _ = CONFIG.set(app_config);\n    }\n\n    #[test]\n    fn test_parse_cook() {\n        let app_config: CookbookConfig = toml::from_str(\n            \"[cook]\\n\\\n            offline = true\\n\",\n        )\n        .expect(\"Unable to parse test config\");\n        assert_eq!(app_config.cook_opt.offline, Some(true));\n        assert_eq!(app_config.cook_opt.jobs, None);\n    }\n\n    #[test]\n    fn test_exact_match() {\n        setup_test_config();\n        assert_eq!(translate_mirror(\"ftp.gnu.org/gnu\"), \"example.com/gnu\");\n        assert_eq!(translate_mirror(\"github.com/foo/bar\"), \"github.com/baz/bar\");\n    }\n\n    #[test]\n    fn test_prefix_match() {\n        setup_test_config();\n        assert_eq!(\n            translate_mirror(\"https://github.com/a/c\"),\n            \"https://github.com/b/c\"\n        );\n        assert_eq!(\n            translate_mirror(\"https://ftp.gnu.org/gnu/bash/bash-5.2.15.tar.gz\"),\n            \"https://example.com/gnu/bash/bash-5.2.15.tar.gz\"\n        );\n    }\n\n    #[test]\n    fn test_longest_prefix_match() {\n        setup_test_config();\n        // \"github.com/foo/bar\" is a longer and more specific prefix than \"github.com/a\",\n        // so it should be chosen for the translation.\n        assert_eq!(\n            translate_mirror(\"https://github.com/foo/bar/baz\"),\n            \"https://github.com/baz/bar/baz\"\n        );\n    }\n\n    #[test]\n    fn test_no_match() {\n        setup_test_config();\n        assert_eq!(translate_mirror(\"www.rust-lang.org\"), \"www.rust-lang.org\");\n        assert_eq!(\n            translate_mirror(\"http://github.com/unrelated/repo\"),\n            \"http://github.com/unrelated/repo\"\n        );\n    }\n}\n"
  },
  {
    "path": "src/cook/cook_build.rs",
    "content": "use pkg::PackageError;\nuse pkg::{Package, PackageName};\n\nuse crate::config::CookConfig;\nuse crate::cook::package::{package_source_paths, package_target};\nuse crate::cook::pty::PtyOut;\nuse crate::cook::script::*;\nuse crate::cook::{fetch, fs::*};\nuse crate::recipe::Recipe;\nuse crate::recipe::{AutoDeps, CookRecipe};\nuse crate::recipe::{BuildKind, OptionalPackageRecipe};\nuse std::collections::VecDeque;\nuse std::{\n    collections::BTreeSet,\n    fs,\n    path::{Path, PathBuf},\n    process::Command,\n    str,\n    time::SystemTime,\n};\n\nuse crate::{is_redox, log_to_pty};\n\nfn auto_deps_from_dynamic_linking(\n    stage_dirs: &[PathBuf],\n    target_dir: &Path,\n    dep_pkgars: &BTreeSet<(PackageName, PathBuf)>,\n    logger: &PtyOut,\n) -> BTreeSet<PackageName> {\n    let mut paths = BTreeSet::new();\n    let mut visited = BTreeSet::new();\n    let verbose = crate::config::get_config().cook.verbose;\n    // Base directories may need to be updated for packages that place binaries in odd locations.\n    let mut walk = VecDeque::new();\n\n    for stage_dir in stage_dirs {\n        walk.push_back(stage_dir.join(\"usr/bin\"));\n        walk.push_back(stage_dir.join(\"usr/games\"));\n        walk.push_back(stage_dir.join(\"usr/lib\"));\n        walk.push_back(stage_dir.join(\"usr/libexec\"));\n    }\n\n    // Recursively (DFS) walk each directory to ensure nested libs and bins are checked.\n    while let Some(dir) = walk.pop_front() {\n        let Ok(dir) = dir.canonicalize() else {\n            continue;\n        };\n        if visited.contains(&dir) {\n            #[cfg(debug_assertions)]\n            log_to_pty!(\n                logger,\n                \"DEBUG: auto_deps => Skipping `{dir:?}` (already visited)\"\n            );\n            continue;\n        }\n        assert!(\n            visited.insert(dir.clone()),\n            \"Directory `{:?}` should not be in visited\\nVisited: {:#?}\",\n            dir,\n            visited\n        );\n\n        let Ok(read_dir) = fs::read_dir(&dir) else {\n            continue;\n        };\n        for entry_res in read_dir {\n            let Ok(entry) = entry_res else { continue };\n            let Ok(file_type) = entry.file_type() else {\n                continue;\n            };\n            if file_type.is_file() {\n                paths.insert(entry.path());\n            } else if file_type.is_dir() {\n                walk.push_front(entry.path());\n            }\n        }\n    }\n\n    let mut needed = BTreeSet::new();\n    for path in paths {\n        let Ok(file) = fs::File::open(&path) else {\n            continue;\n        };\n        let read_cache = object::ReadCache::new(file);\n        let Ok(object) = object::build::elf::Builder::read(&read_cache) else {\n            continue;\n        };\n        let Some(dynamic_data) = object.dynamic_data() else {\n            continue;\n        };\n        for dynamic in dynamic_data {\n            let object::build::elf::Dynamic::String { tag, val } = dynamic else {\n                continue;\n            };\n            if *tag == object::elf::DT_NEEDED {\n                let Ok(name) = str::from_utf8(val) else {\n                    continue;\n                };\n                if let Ok(relative_path) = path.strip_prefix(target_dir) {\n                    if verbose {\n                        log_to_pty!(logger, \"DEBUG: {} needs {}\", relative_path.display(), name);\n                    }\n                }\n                needed.insert(name.to_string());\n            }\n        }\n    }\n\n    let mut missing = needed.clone();\n    // relibc and friends will always be installed\n    for preinstalled in &[\"libc.so.6\", \"libgcc_s.so.1\", \"libstdc++.so.6\"] {\n        missing.remove(*preinstalled);\n    }\n\n    let mut deps = BTreeSet::new();\n    if let Ok(key_file) = pkgar_keys::PublicKeyFile::open(\"build/id_ed25519.pub.toml\") {\n        for (dep, archive_path) in dep_pkgars.iter() {\n            let Ok(mut package) = pkgar::PackageFile::new(archive_path, &key_file.pkey) else {\n                continue;\n            };\n            let Ok(entries) = pkgar_core::PackageSrc::read_entries(&mut package) else {\n                continue;\n            };\n            for entry in entries {\n                let Ok(entry_path) = pkgar::ext::EntryExt::check_path(&entry) else {\n                    continue;\n                };\n                for prefix in &[\"lib\", \"usr/lib\"] {\n                    let Ok(child_path) = entry_path.strip_prefix(prefix) else {\n                        continue;\n                    };\n                    let Some(child_name) = child_path.to_str() else {\n                        continue;\n                    };\n                    if needed.contains(child_name) {\n                        if verbose {\n                            log_to_pty!(logger, \"DEBUG: {} provides {}\", dep, child_name);\n                        }\n                        deps.insert(dep.with_prefix(pkg::PackagePrefix::Any));\n                        missing.remove(child_name);\n                    }\n                }\n            }\n        }\n    }\n\n    if verbose {\n        for name in missing {\n            log_to_pty!(logger, \"INFO: {} missing\", name);\n        }\n    }\n\n    deps\n}\n\nfn auto_deps_from_static_package_deps(\n    build_dep_pkgars: &BTreeSet<(PackageName, PathBuf)>,\n    dynamic_dep_pkgars: &BTreeSet<PackageName>,\n) -> Result<BTreeSet<PackageName>, PackageError> {\n    let static_dep_pkgars: Vec<PackageName> = build_dep_pkgars\n        .iter()\n        .map(|x| x.0.clone())\n        .filter(|x| !dynamic_dep_pkgars.contains(x))\n        .collect();\n    let pkgs = CookRecipe::get_package_deps_recursive(&static_dep_pkgars, false)?;\n\n    Ok(pkgs.into_iter().collect())\n}\n\npub struct BuildResult {\n    pub stage_dirs: Vec<PathBuf>,\n    pub auto_deps: BTreeSet<PackageName>,\n    pub cached: bool,\n}\n\nimpl BuildResult {\n    pub fn new(stage_dirs: Vec<PathBuf>, auto_deps: BTreeSet<PackageName>) -> Self {\n        BuildResult {\n            stage_dirs,\n            auto_deps,\n            cached: false,\n        }\n    }\n\n    pub fn cached(stage_dirs: Vec<PathBuf>, auto_deps: BTreeSet<PackageName>) -> Self {\n        BuildResult {\n            stage_dirs,\n            auto_deps,\n            cached: true,\n        }\n    }\n}\n\npub fn build(\n    recipe_dir: &Path,\n    source_dir: &Path,\n    target_dir: &Path,\n    cook_recipe: &CookRecipe,\n    cook_config: &CookConfig,\n    logger: &PtyOut,\n) -> Result<BuildResult, String> {\n    let recipe = &cook_recipe.recipe;\n    let name = &cook_recipe.name;\n    let check_source = !cook_recipe.is_deps;\n    let sysroot_dir = target_dir.join(\"sysroot\");\n    let toolchain_dir = target_dir.join(\"toolchain\");\n    let stage_dirs = get_stage_dirs(&recipe.optional_packages, target_dir);\n    let stage_pkgars: Vec<PathBuf> = stage_dirs\n        .iter()\n        .map(|p| p.with_added_extension(\"pkgar\"))\n        .collect();\n    let cli_verbose = cook_config.verbose;\n    let cli_jobs = cook_config.jobs;\n    if recipe.build.kind == BuildKind::None {\n        // metapackages don't need to do anything here\n        return Ok(BuildResult::new(stage_dirs, BTreeSet::new()));\n    }\n\n    let mut dep_pkgars = BTreeSet::new();\n    let mut dep_host_pkgars = BTreeSet::new();\n    let build_deps = [\n        &recipe.build.dependencies[..],\n        &recipe.build.dev_dependencies[..],\n    ]\n    .concat();\n    let build_deps =\n        CookRecipe::get_build_deps_recursive(&build_deps, false).map_err(|e| format!(\"{:?}\", e))?;\n    for dependency in build_deps.iter() {\n        let (_, pkgar, _) = dependency.stage_paths();\n        if dependency.name.is_host() {\n            dep_host_pkgars.insert((dependency.name.clone(), pkgar));\n        } else {\n            dep_pkgars.insert((dependency.name.clone(), pkgar));\n        }\n    }\n\n    macro_rules! make_auto_deps {\n        () => {\n            build_auto_deps(\n                recipe,\n                target_dir,\n                &stage_dirs,\n                cook_config,\n                dep_pkgars,\n                logger,\n            )\n        };\n    }\n\n    if !check_source {\n        let stage_present = if cook_config.clean_target {\n            stage_pkgars.iter().all(|file| file.is_file())\n        } else {\n            stage_dirs.iter().all(|file| file.is_dir())\n        };\n        if stage_present {\n            if cli_verbose {\n                log_to_pty!(logger, \"DEBUG: using cached build, not checking source\");\n            }\n            let auto_deps = make_auto_deps!()?;\n            return Ok(BuildResult::cached(stage_dirs, auto_deps));\n        }\n    }\n\n    let mut source_modified = modified_dir_ignore_git(source_dir).unwrap_or(SystemTime::UNIX_EPOCH);\n    if let Ok(recipe_modified) = modified(&recipe_dir.join(\"recipe.toml\")) {\n        if recipe_modified > source_modified {\n            source_modified = recipe_modified\n        }\n    }\n\n    let deps_modified = dep_pkgars\n        .iter()\n        .map(|(_dep, pkgar)| modified(pkgar))\n        .max()\n        .unwrap_or(Ok(SystemTime::UNIX_EPOCH))?;\n    let deps_host_modified = dep_host_pkgars\n        .iter()\n        .map(|(_dep, pkgar)| modified(pkgar))\n        .max()\n        .unwrap_or(Ok(SystemTime::UNIX_EPOCH))?;\n\n    // check stage dir modified against pkgar files, any files missing will result in UNIX_EPOCH\n    let stage_modified = modified_all(&stage_pkgars, modified).unwrap_or(SystemTime::UNIX_EPOCH);\n    // Rebuild stage if source is newer\n    if stage_modified < source_modified\n        || stage_modified < deps_modified\n        || stage_modified < deps_host_modified\n    {\n        for stage_dir in &stage_dirs {\n            if stage_dir.is_dir() {\n                log_to_pty!(logger, \"DEBUG: updating '{}'\", stage_dir.display());\n                remove_stage_dir(stage_dir)?;\n            }\n        }\n    } else {\n        if cli_verbose {\n            log_to_pty!(logger, \"DEBUG: using cached build\");\n        }\n        if cook_config.clean_target {\n            // stop early otherwise we'll end up rebuilding\n            let auto_deps = make_auto_deps!()?;\n            return Ok(BuildResult::cached(stage_dirs, auto_deps));\n        }\n    }\n\n    // Rebuild sysroot if source is newer\n    if recipe.build.kind != BuildKind::Remote {\n        let updated = build_deps_dir(\n            logger,\n            &sysroot_dir,\n            target_dir.join(\"sysroot.tmp\"),\n            if name.is_host() {\n                &dep_host_pkgars\n            } else {\n                &dep_pkgars\n            },\n            source_modified,\n            deps_modified,\n        )?;\n        if cli_verbose && !updated {\n            log_to_pty!(logger, \"DEBUG: using cached sysroot\");\n        }\n    }\n    if recipe.build.kind != BuildKind::Remote && !name.is_host() && dep_host_pkgars.len() > 0 {\n        let updated = build_deps_dir(\n            logger,\n            &toolchain_dir,\n            target_dir.join(\"toolchain.tmp\"),\n            &dep_host_pkgars,\n            source_modified,\n            deps_host_modified,\n        )?;\n        if cli_verbose && !updated {\n            log_to_pty!(logger, \"DEBUG: using cached toolchain\");\n        }\n    }\n\n    let stage_dir = stage_dirs\n        .last()\n        .expect(\"Should have atleast one stage dir\");\n    let build_dir = get_build_dir(target_dir);\n    if !stage_dir.is_dir() {\n        // Create stage.tmp\n        let stage_dir_tmp = target_dir.join(\"stage.tmp\");\n        create_dir_clean(&stage_dir_tmp)?;\n\n        // Create build dir, if it does not exist\n        if cook_config.clean_build || !build_dir.is_dir() {\n            create_dir_clean(&build_dir)?;\n        }\n\n        let flags_fn = |name, flags: &Vec<String>| {\n            format!(\n                \"{name}+=(\\n{}\\n)\\n\",\n                flags\n                    .iter()\n                    .map(|s| format!(\"  \\\"{s}\\\"\"))\n                    .collect::<Vec<String>>()\n                    .join(\"\\n\")\n            )\n        };\n\n        if recipe.build.kind == BuildKind::Remote {\n            return build_remote(stage_dirs, recipe, target_dir, cook_config);\n        }\n\n        //TODO: better integration with redoxer (library instead of binary)\n        //TODO: configurable target\n        //TODO: Add more configurability, convert scripts to Rust?\n        let script = match &recipe.build.kind {\n            BuildKind::Cargo {\n                cargopath,\n                cargoflags,\n                cargopackages,\n                cargoexamples,\n            } => {\n                let mut script = format!(\n                    \"DYNAMIC_INIT\\n{}\\nCOOKBOOK_CARGO_PATH={} \",\n                    flags_fn(\"COOKBOOK_CARGO_FLAGS\", cargoflags),\n                    cargopath.as_deref().unwrap_or(\".\")\n                );\n                if cargopackages.len() == 0 && cargoexamples.len() == 0 {\n                    script += \"cookbook_cargo\\n\"\n                } else {\n                    if cargopackages.len() > 0 {\n                        script += \"cookbook_cargo_packages\";\n                        for package in cargopackages {\n                            script += \" \";\n                            script += package;\n                        }\n                        script += \"\\n\";\n                    }\n                    if cargoexamples.len() > 0 {\n                        script += \"cookbook_cargo_examples\";\n                        for example in cargoexamples {\n                            script += \" \";\n                            script += example;\n                        }\n                        script += \"\\n\";\n                    }\n                }\n\n                script\n            }\n            BuildKind::Configure { configureflags } => format!(\n                \"DYNAMIC_INIT\\n{}cookbook_configure\",\n                flags_fn(\"COOKBOOK_CONFIGURE_FLAGS\", configureflags),\n            ),\n            BuildKind::Cmake { cmakeflags } => format!(\n                \"DYNAMIC_INIT\\n{}cookbook_cmake\",\n                flags_fn(\"COOKBOOK_CMAKE_FLAGS\", cmakeflags),\n            ),\n            BuildKind::Meson { mesonflags } => format!(\n                \"DYNAMIC_INIT\\n{}cookbook_meson\",\n                flags_fn(\"COOKBOOK_MESON_FLAGS\", mesonflags),\n            ),\n            BuildKind::Custom { script } => script.clone(),\n            BuildKind::Remote => unreachable!(),\n            BuildKind::None => \"\".to_owned(),\n        };\n\n        let command = {\n            //TODO: remove unwraps\n            let cookbook_build = build_dir.canonicalize().unwrap();\n            let cookbook_recipe = recipe_dir.canonicalize().unwrap();\n            let cookbook_root = Path::new(\".\").canonicalize().unwrap();\n            let cookbook_stage = stage_dir_tmp.canonicalize().unwrap();\n            let cookbook_source = source_dir.canonicalize().unwrap();\n            let cookbook_sysroot = sysroot_dir.canonicalize().unwrap();\n            let cookbook_toolchain = toolchain_dir.canonicalize().ok();\n            let bash_args = if cli_verbose { \"-ex\" } else { \"-e\" };\n            let local_redoxer = Path::new(\"target/release/cookbook_redoxer\");\n            let mut command = if is_redox() && !local_redoxer.is_file() {\n                let mut command = Command::new(\"cookbook_redoxer\");\n                command.arg(bash_args);\n                command.env(\"COOKBOOK_REDOXER\", \"cookbook_redoxer\");\n                command\n            } else {\n                let cookbook_redoxer = local_redoxer\n                    .canonicalize()\n                    .unwrap_or(PathBuf::from(\"/bin/false\"));\n                let mut command = Command::new(&cookbook_redoxer);\n                command.arg(\"env\").arg(\"bash\").arg(bash_args);\n                command.env(\"COOKBOOK_REDOXER\", &cookbook_redoxer);\n                command\n            };\n            command.current_dir(&cookbook_build);\n            command.env(\"TARGET\", package_target(name));\n            command.env(\"COOKBOOK_BUILD\", &cookbook_build);\n            command.env(\"COOKBOOK_NAME\", name.name());\n            command.env(\"COOKBOOK_HOST_TARGET\", redoxer::host_target());\n            command.env(\"COOKBOOK_RECIPE\", &cookbook_recipe);\n            command.env(\"COOKBOOK_ROOT\", &cookbook_root);\n            command.env(\"COOKBOOK_STAGE\", &cookbook_stage);\n            command.env(\"COOKBOOK_SOURCE\", &cookbook_source);\n            command.env(\"COOKBOOK_SYSROOT\", &cookbook_sysroot);\n            if let Some(cookbook_toolchain) = &cookbook_toolchain {\n                command.env(\"COOKBOOK_TOOLCHAIN\", cookbook_toolchain);\n            } else if name.is_host() {\n                command.env(\"COOKBOOK_TOOLCHAIN\", &cookbook_sysroot);\n            }\n            command.env(\"COOKBOOK_MAKE_JOBS\", cli_jobs.to_string());\n            if cli_verbose {\n                command.env(\"COOKBOOK_VERBOSE\", \"1\");\n            }\n            if cook_config.offline {\n                command.env(\"COOKBOOK_OFFLINE\", \"1\");\n            }\n            if let Ok(ident_source) = fetch::fetch_get_source_info(&cook_recipe) {\n                command.env(\"COOKBOOK_SOURCE_IDENT\", ident_source.source_identifier);\n                command.env(\"COOKBOOK_COMMIT_IDENT\", ident_source.commit_identifier);\n            }\n            command\n        };\n\n        let full_script = format!(\n            \"{}\\n{}\\n{}\\n{}\",\n            BUILD_PRESCRIPT, SHARED_PRESCRIPT, script, BUILD_POSTSCRIPT\n        );\n        run_command_stdin(command, full_script.as_bytes(), logger)?;\n\n        // Move to each features dir\n        let mut globs = Vec::new();\n        for (i, feat) in recipe.optional_packages.iter().enumerate() {\n            let stage_dir = &stage_dirs[i];\n            create_dir_clean(&stage_dir)?;\n            for path in &feat.files {\n                let glob = globset::Glob::new(&path).map_err(|e| format!(\"{}\", e))?;\n                globs.push((glob.compile_matcher(), stage_dir.clone()));\n            }\n        }\n        move_dir_all_fn(\n            &stage_dir_tmp,\n            &Box::new(|path: PathBuf| {\n                for (glob, dst) in &globs {\n                    if glob.is_match(&path) {\n                        return Some(dst.as_path());\n                    }\n                }\n                None\n            }),\n        )\n        .map_err(|e| format!(\"Unable to move {e:?}\"))?;\n\n        // Move stage.tmp to stage atomically\n        rename(&stage_dir_tmp, &stage_dir)?;\n    }\n\n    if cook_config.clean_target {\n        remove_all(&build_dir)?;\n        remove_all(&sysroot_dir)?;\n        if toolchain_dir.is_dir() {\n            remove_all(&toolchain_dir)?;\n        }\n        // don't remove stage dir yet\n    }\n\n    let auto_deps = make_auto_deps!()?;\n    Ok(BuildResult::new(stage_dirs, auto_deps))\n}\n\npub fn remove_stage_dir(stage_dir: &PathBuf) -> Result<(), String> {\n    if stage_dir.is_dir() {\n        remove_all(&stage_dir)?;\n    }\n    let stage_file = stage_dir.with_added_extension(\"pkgar\");\n    if stage_file.is_file() {\n        remove_all(&stage_file)?;\n    }\n    let stage_meta = stage_dir.with_added_extension(\"toml\");\n    if stage_meta.is_file() {\n        remove_all(&stage_meta)?;\n    }\n    let stage_files = stage_dir.with_added_extension(\"files\");\n    if stage_files.is_file() {\n        remove_all(&stage_files)?;\n    }\n    Ok(())\n}\n\npub fn get_stage_dirs(features: &Vec<OptionalPackageRecipe>, target_dir: &Path) -> Vec<PathBuf> {\n    let mut target_dir = target_dir.to_path_buf();\n    if let Some(cross_target) = std::env::var(\"COOKBOOK_CROSS_TARGET\").ok() {\n        if cross_target != \"\" {\n            // TODO: automatically pass COOKBOOK_CROSS_GNU_TARGET?\n            target_dir = target_dir.join(cross_target)\n        }\n    }\n    let mut v = Vec::new();\n    for f in features {\n        v.push(target_dir.join(format!(\"stage.{}\", f.name)));\n    }\n    // intentionally added last as it contains leftover files from package features\n    v.push(target_dir.join(\"stage\"));\n    v\n}\n\npub fn get_build_dir(target_dir: &Path) -> PathBuf {\n    let mut target_dir = target_dir.to_path_buf();\n    if let Some(cross_target) = std::env::var(\"COOKBOOK_CROSS_TARGET\").ok() {\n        if cross_target != \"\" {\n            // TODO: automatically pass COOKBOOK_CROSS_GNU_TARGET?\n            target_dir = target_dir.join(cross_target)\n        }\n    }\n    target_dir.join(\"build\")\n}\n\nfn build_deps_dir(\n    logger: &PtyOut,\n    deps_dir: &PathBuf,\n    deps_dir_tmp: PathBuf,\n    dep_pkgars: &BTreeSet<(PackageName, PathBuf)>,\n    source_modified: SystemTime,\n    deps_modified: SystemTime,\n) -> Result<bool, String> {\n    if deps_dir.is_dir() {\n        let tags_dir = deps_dir.join(\".tags\");\n        let sysroot_modified = modified_dir(&tags_dir).unwrap_or(SystemTime::UNIX_EPOCH);\n        if sysroot_modified < source_modified\n            || sysroot_modified < deps_modified\n            || !check_files_present(\n                &tags_dir,\n                &dep_pkgars\n                    .iter()\n                    .map(|(name, _)| name.without_prefix())\n                    .collect(),\n            )?\n        {\n            log_to_pty!(logger, \"DEBUG: updating '{}'\", deps_dir.display());\n            remove_all(deps_dir)?;\n        }\n    }\n    if !deps_dir.is_dir() {\n        // Create sysroot.tmp\n        create_dir_clean(&deps_dir_tmp)?;\n        let tags_dir = deps_dir_tmp.join(\".tags\");\n        let usr_dir = deps_dir_tmp.join(\"usr\");\n        create_dir(&tags_dir)?;\n        create_dir(&usr_dir)?;\n\n        for folder in &[\"bin\", \"include\", \"lib\", \"share\"] {\n            // Make sure sysroot/usr/$folder exists\n            create_dir(&usr_dir.join(folder))?;\n\n            // Link sysroot/$folder sysroot/usr/$folder\n            symlink(Path::new(\"usr\").join(folder), &deps_dir_tmp.join(folder))?;\n        }\n\n        let pkey_path = \"build/id_ed25519.pub.toml\";\n        for (name, archive_path) in dep_pkgars {\n            let tag_file = tags_dir.join(name.without_prefix());\n            fs::write(&tag_file, \"\")\n                .map_err(|e| format!(\"failed to write tag file {}: {:?}\", tag_file.display(), e))?;\n            pkgar::extract(pkey_path, &archive_path, deps_dir_tmp.to_str().unwrap()).map_err(\n                |err| {\n                    format!(\n                        \"failed to install '{}' in '{}': {:?}\",\n                        archive_path.display(),\n                        deps_dir_tmp.display(),\n                        err\n                    )\n                },\n            )?;\n        }\n\n        // Move sysroot.tmp to sysroot atomically\n        rename(&deps_dir_tmp, deps_dir)?;\n\n        return Ok(true);\n    }\n\n    Ok(false)\n}\n\n/// Calculate automatic dependencies\nfn build_auto_deps(\n    recipe: &Recipe,\n    target_dir: &Path,\n    stage_dirs: &Vec<PathBuf>,\n    cook_config: &CookConfig,\n    mut dep_pkgars: BTreeSet<(PackageName, PathBuf)>,\n    logger: &PtyOut,\n) -> Result<BTreeSet<PackageName>, String> {\n    let auto_deps_path = target_dir.join(\"auto_deps.toml\");\n    if auto_deps_path.is_file() && !cook_config.clean_target {\n        if modified(&auto_deps_path)? < modified_all(stage_dirs, modified)? {\n            if cook_config.verbose {\n                log_to_pty!(logger, \"DEBUG: updating {}\", auto_deps_path.display());\n            }\n            remove_all(&auto_deps_path)?;\n        } else {\n            if cook_config.verbose {\n                log_to_pty!(logger, \"DEBUG: Using cached auto deps\");\n            }\n        }\n    }\n\n    let auto_deps = if auto_deps_path.exists() {\n        let toml_content =\n            fs::read_to_string(&auto_deps_path).map_err(|_| \"failed to read cached auto_deps\")?;\n        let wrapper: AutoDeps =\n            toml::from_str(&toml_content).map_err(|_| \"failed to deserialize cached auto_deps\")?;\n        wrapper.packages\n    } else {\n        let mut dynamic_deps =\n            auto_deps_from_dynamic_linking(stage_dirs, target_dir, &dep_pkgars, logger);\n        dep_pkgars.retain(|x| recipe.build.dependencies.contains(&x.0));\n        let package_deps =\n            auto_deps_from_static_package_deps(&dep_pkgars, &dynamic_deps).unwrap_or_default();\n        dynamic_deps.extend(package_deps);\n\n        let wrapper = AutoDeps {\n            packages: dynamic_deps,\n        };\n        serialize_and_write(&auto_deps_path, &wrapper)?;\n        wrapper.packages\n    };\n    Ok(auto_deps)\n}\n\npub fn build_remote(\n    stage_dirs: Vec<PathBuf>,\n    recipe: &Recipe,\n    target_dir: &Path,\n    cook_config: &CookConfig,\n) -> Result<BuildResult, String> {\n    let source_toml = target_dir.join(\"source.toml\");\n    let source_pubkey = \"build/remotes/pub_key_static.redox-os.org.toml\";\n\n    let packages = recipe.get_packages_list();\n    for (i, package) in packages.into_iter().enumerate() {\n        // declare pkg dependencies as autodeps dependency\n        let stage_dir = &stage_dirs[i];\n\n        if cook_config.clean_target && stage_dir.with_added_extension(\"pkgar\").is_file() {\n            continue;\n        }\n\n        if !stage_dir.is_dir() {\n            let (_, source_pkgar, _) = package_source_paths(package, &target_dir);\n            let stage_dir_tmp = target_dir.join(\"stage.tmp\");\n            pkgar::extract(&source_pubkey, &source_pkgar, &stage_dir_tmp).map_err(|err| {\n                format!(\n                    \"failed to install '{}' in '{}': {:?}\",\n                    source_pkgar.display(),\n                    stage_dir_tmp.display(),\n                    err\n                )\n            })?;\n            // Move stage.tmp to stage atomically\n            rename(&stage_dir_tmp, &stage_dir)?;\n        }\n    }\n\n    let auto_deps_path = target_dir.join(\"auto_deps.toml\");\n    if auto_deps_path.is_file() && !cook_config.clean_target {\n        if modified(&auto_deps_path)? < modified_all(&stage_dirs, modified)? {\n            remove_all(&auto_deps_path)?\n        }\n    }\n\n    let auto_deps = if auto_deps_path.exists() {\n        let toml_content =\n            fs::read_to_string(&auto_deps_path).map_err(|_| \"failed to read cached auto_deps\")?;\n        let wrapper: AutoDeps =\n            toml::from_str(&toml_content).map_err(|_| \"failed to deserialize cached auto_deps\")?;\n        wrapper.packages\n    } else {\n        let toml_content =\n            fs::read_to_string(&source_toml).map_err(|_| \"failed to read source.toml\")?;\n        let pkg_toml: Package =\n            toml::from_str(&toml_content).map_err(|_| \"failed to deserialize source.toml\")?;\n        let wrapper = AutoDeps {\n            packages: pkg_toml.depends.into_iter().collect(),\n        };\n        serialize_and_write(&auto_deps_path, &wrapper)?;\n        wrapper.packages\n    };\n    Ok(BuildResult::new(stage_dirs, auto_deps))\n}\n\n#[cfg(test)]\nmod tests {\n    use std::os::unix;\n\n    #[test]\n    fn file_system_loop_no_infinite_loop() {\n        let mut root = std::env::temp_dir();\n        root.push(\"temp_test_dir_file_system_loop_no_infinite_loop\");\n        let _ = std::fs::remove_dir_all(&root);\n        std::fs::create_dir_all(&root).expect(\"Failed to create temporary root directory\");\n\n        // Hierarchy with an infinite loop\n        let dir = root.join(\"loop\");\n        unix::fs::symlink(&root, &dir).expect(\"Linking {dir:?} to {root:?}\");\n\n        // Sanity check that we have a loop\n        assert_eq!(\n            root.canonicalize().unwrap(),\n            dir.canonicalize().unwrap(),\n            \"Expected a loop where {dir:?} points to {root:?}\"\n        );\n\n        let entries = super::auto_deps_from_dynamic_linking(\n            &vec![root.clone()],\n            &root.join(\"..\"),\n            &Default::default(),\n            &None,\n        );\n        assert!(\n            entries.is_empty(),\n            \"auto_deps shouldn't have yielded any libraries\"\n        );\n    }\n}\n"
  },
  {
    "path": "src/cook/fetch.rs",
    "content": "use crate::config::translate_mirror;\nuse crate::cook::fetch_repo;\nuse crate::cook::fetch_repo::PlainPtyCallback;\nuse crate::cook::fs::*;\nuse crate::cook::package::get_package_name;\nuse crate::cook::package::package_source_paths;\nuse crate::cook::pty::PtyOut;\nuse crate::cook::script::*;\nuse crate::is_redox;\nuse crate::log_to_pty;\nuse crate::recipe::BuildKind;\nuse crate::recipe::CookRecipe;\nuse crate::{blake3, recipe::SourceRecipe};\nuse pkg::SourceIdentifier;\nuse pkg::net_backend::DownloadBackendWriter;\nuse std::cell::RefCell;\nuse std::fs;\nuse std::fs::File;\nuse std::io::Read;\nuse std::path::{Path, PathBuf};\nuse std::process::Command;\nuse std::rc::Rc;\n\npub(crate) fn get_blake3(path: &PathBuf, show_progress: bool) -> Result<String, String> {\n    if show_progress {\n        blake3::blake3_progress(&path)\n    } else {\n        blake3::blake3_silent(&path)\n    }\n    .map_err(|err| {\n        format!(\n            \"failed to calculate blake3 of '{}': {}\\n{:?}\",\n            path.display(),\n            err,\n            err\n        )\n    })\n}\n\npub fn fetch_offline(recipe: &CookRecipe, logger: &PtyOut) -> Result<PathBuf, String> {\n    let recipe_dir = &recipe.dir;\n    let source_dir = recipe_dir.join(\"source\");\n    match recipe.recipe.build.kind {\n        BuildKind::None => {\n            // the build function doesn't need source dir exists\n            fetch_apply_source_info(recipe, \"\".to_string())?;\n            return Ok(source_dir);\n        }\n        BuildKind::Remote => {\n            fetch_remote(recipe_dir, recipe, true, logger)?;\n            return Ok(source_dir);\n        }\n        _ => {}\n    }\n\n    let ident = match &recipe.recipe.source {\n        Some(SourceRecipe::Path { path: _ }) | None => {\n            fetch(recipe, true, logger)?;\n            \"local_source\".to_string()\n        }\n        Some(SourceRecipe::SameAs { same_as }) => {\n            let recipe = fetch_resolve_canon(recipe_dir, &same_as, recipe.name.is_host())?;\n            // recursively fetch\n            fetch_offline(&recipe, logger)?;\n            fetch_make_symlink(&source_dir, &same_as)?;\n            fetch_get_source_info(&recipe)?.source_identifier\n        }\n        Some(SourceRecipe::Git {\n            git: _,\n            upstream: _,\n            branch: _,\n            rev: _,\n            patches: _,\n            script: _,\n            shallow_clone: _,\n        }) => {\n            offline_check_exists(&source_dir)?;\n            let (head_rev, _) = get_git_head_rev(&source_dir)?;\n            head_rev\n        }\n        Some(SourceRecipe::Tar {\n            tar: _,\n            blake3,\n            patches,\n            script,\n        }) => {\n            if !source_dir.is_dir() {\n                let source_tar = recipe_dir.join(\"source.tar\");\n                let source_tar_blake3 = get_blake3(&source_tar, true && logger.is_none())?;\n                if source_tar.exists() {\n                    if let Some(blake3) = blake3 {\n                        if source_tar_blake3 != *blake3 {\n                            return Err(format!(\n                                \"The downloaded tar blake3 '{source_tar_blake3}' is not equal to blake3 in recipe.toml.\"\n                            ));\n                        }\n                        create_dir(&source_dir)?;\n                        fetch_extract_tar(source_tar, &source_dir, logger)?;\n                        fetch_apply_patches(recipe_dir, patches, script, &source_dir, logger)?;\n                    } else {\n                        // need to trust this tar file\n                        return Err(format!(\n                            \"Please add blake3 = \\\"{source_tar_blake3}\\\" to '{recipe}'\",\n                            recipe = recipe_dir.join(\"recipe.toml\").display(),\n                        ));\n                    }\n                } else {\n                    offline_check_exists(&source_dir)?;\n                }\n            }\n            blake3.clone().unwrap_or(\"no_tar_blake3_hash_info\".into())\n        }\n    };\n\n    fetch_apply_source_info(recipe, ident)?;\n\n    Ok(source_dir)\n}\n\npub fn fetch(recipe: &CookRecipe, check_source: bool, logger: &PtyOut) -> Result<PathBuf, String> {\n    let recipe_dir = &recipe.dir;\n    let source_dir = recipe_dir.join(\"source\");\n    match recipe.recipe.build.kind {\n        BuildKind::None => {\n            // the build function doesn't need source dir exists\n            fetch_apply_source_info(recipe, \"\".to_string())?;\n            return Ok(source_dir);\n        }\n        BuildKind::Remote => {\n            fetch_remote(recipe_dir, recipe, false, logger)?;\n            return Ok(source_dir);\n        }\n        _ => {}\n    }\n\n    let ident = match &recipe.recipe.source {\n        Some(SourceRecipe::SameAs { same_as }) => {\n            let recipe = fetch_resolve_canon(recipe_dir, &same_as, recipe.name.is_host())?;\n            // recursively fetch\n            fetch(&recipe, check_source, logger)?;\n            fetch_make_symlink(&source_dir, &same_as)?;\n            fetch_get_source_info(&recipe)?.source_identifier\n        }\n        Some(SourceRecipe::Path { path }) => {\n            if !source_dir.is_dir() || modified_dir(Path::new(&path))? > modified_dir(&source_dir)?\n            {\n                log_to_pty!(\n                    logger,\n                    \"[DEBUG]: {} is newer than {}\",\n                    path,\n                    source_dir.display()\n                );\n                copy_dir_all(path, &source_dir).map_err(|e| {\n                    format!(\n                        \"Couldn't copy source from {} to {}: {}\",\n                        path,\n                        source_dir.display(),\n                        e\n                    )\n                })?;\n            }\n            \"local_source\".to_string()\n        }\n        Some(SourceRecipe::Git {\n            git,\n            upstream,\n            branch,\n            rev,\n            patches,\n            script,\n            shallow_clone,\n        }) => {\n            //TODO: use libgit?\n            let shallow_clone = *shallow_clone == Some(true);\n            let can_skip_rebuild = if !source_dir.is_dir() {\n                // Create source.tmp\n                let source_dir_tmp = recipe_dir.join(\"source.tmp\");\n                create_dir_clean(&source_dir_tmp)?;\n\n                // Clone the repository to source.tmp\n                let mut command = Command::new(\"git\");\n                command\n                    .arg(\"clone\")\n                    .arg(\"--recursive\")\n                    .arg(translate_mirror(&git));\n                if let Some(branch) = branch {\n                    command.arg(\"--branch\").arg(branch);\n                }\n                if shallow_clone {\n                    command\n                        .arg(\"--filter=tree:0\")\n                        .arg(\"--also-filter-submodules\");\n                }\n                command.arg(&source_dir_tmp);\n                run_command(command, logger)?;\n\n                // Move source.tmp to source atomically\n                rename(&source_dir_tmp, &source_dir)?;\n\n                false\n            } else if !check_source {\n                true\n            } else {\n                if !source_dir.join(\".git\").is_dir() {\n                    return Err(format!(\n                        \"'{}' is not a git repository, but recipe indicated git source\",\n                        source_dir.display(),\n                    ));\n                }\n\n                // Reset origin\n                let mut command = Command::new(\"git\");\n                command.arg(\"-C\").arg(&source_dir);\n                command.arg(\"remote\").arg(\"set-url\").arg(\"origin\").arg(git);\n                run_command(command, logger)?;\n\n                // Fetch origin\n                let mut command = Command::new(\"git\");\n                command.arg(\"-C\").arg(&source_dir);\n                command.arg(\"fetch\").arg(\"origin\");\n                run_command(command, logger)?;\n\n                let (head_rev, detached_rev) = get_git_head_rev(&source_dir)?;\n                if detached_rev {\n                    if let Some(rev) = rev\n                        && let Ok(exp_rev) = get_git_tag_rev(&source_dir, &rev)\n                    {\n                        exp_rev == head_rev\n                    } else {\n                        false\n                    }\n                } else {\n                    let (_, remote_branch, remote_name, remote_url) =\n                        get_git_remote_tracking(&source_dir)?;\n                    // TODO: how to get default branch and compare it here?\n                    if let Some(branch) = branch\n                        && branch != &remote_branch\n                    {\n                        false\n                    } else if remote_name != \"origin\" {\n                        false\n                    } else if &remote_url != chop_dot_git(git) {\n                        false\n                    } else {\n                        match get_git_fetch_rev(&source_dir, &remote_url, &remote_branch) {\n                            Ok(fetch_rev) => fetch_rev == head_rev,\n                            Err(e) => {\n                                log_to_pty!(logger, \"{}\", e);\n                                false\n                            }\n                        }\n                    }\n                }\n            };\n\n            if !can_skip_rebuild {\n                if let Some(_upstream) = upstream {\n                    //TODO: set upstream URL (is this needed?)\n                    // git remote set-url upstream \"$GIT_UPSTREAM\" &> /dev/null ||\n                    // git remote add upstream \"$GIT_UPSTREAM\"\n                    // git fetch upstream\n                }\n\n                if !patches.is_empty() || script.is_some() {\n                    // Hard reset\n                    let mut command = Command::new(\"git\");\n                    command.arg(\"-C\").arg(&source_dir);\n                    command.arg(\"reset\").arg(\"--hard\");\n                    run_command(command, logger)?;\n                }\n\n                if let Some(rev) = rev {\n                    // Check out specified revision\n                    let mut command = Command::new(\"git\");\n                    command.arg(\"-C\").arg(&source_dir);\n                    command.arg(\"checkout\").arg(rev);\n                    run_command(command, logger)?;\n                } else if !is_redox() {\n                    //TODO: complicated stuff to check and reset branch to origin\n                    //TODO: redox can't undestand this (got exit status 1)\n                    let mut command = Command::new(\"bash\");\n                    command.arg(\"-c\").arg(GIT_RESET_BRANCH);\n                    if let Some(branch) = branch {\n                        command.env(\"BRANCH\", branch);\n                    }\n                    command.current_dir(&source_dir);\n                    run_command(command, logger)?;\n                }\n\n                // Sync submodules URL\n                let mut command = Command::new(\"git\");\n                command.arg(\"-C\").arg(&source_dir);\n                command.arg(\"submodule\").arg(\"sync\").arg(\"--recursive\");\n\n                run_command(command, logger)?;\n\n                // Update submodules\n                let mut command = Command::new(\"git\");\n                command.arg(\"-C\").arg(&source_dir);\n                command\n                    .arg(\"submodule\")\n                    .arg(\"update\")\n                    .arg(\"--init\")\n                    .arg(\"--recursive\");\n                if shallow_clone {\n                    command.arg(\"--filter=tree:0\");\n                }\n                run_command(command, logger)?;\n\n                fetch_apply_patches(recipe_dir, patches, script, &source_dir, logger)?;\n            }\n\n            let (head_rev, _) = get_git_head_rev(&source_dir)?;\n            head_rev\n        }\n        Some(SourceRecipe::Tar {\n            tar,\n            blake3,\n            patches,\n            script,\n        }) => {\n            let source_tar = recipe_dir.join(\"source.tar\");\n            let mut tar_updated = false;\n            loop {\n                if !source_tar.is_file() {\n                    tar_updated = true;\n                    download_wget(&tar, &source_tar, logger)?;\n                }\n                if !check_source {\n                    break;\n                }\n                let source_tar_blake3 = get_blake3(&source_tar, tar_updated && logger.is_none())?;\n                if let Some(blake3) = blake3 {\n                    if source_tar_blake3 == *blake3 {\n                        break;\n                    }\n                    if tar_updated {\n                        return Err(format!(\n                            \"The downloaded tar blake3 '{source_tar_blake3}' is not equal to blake3 in recipe.toml\"\n                        ));\n                    } else {\n                        log_to_pty!(\n                            logger,\n                            \"DEBUG: source tar blake3 is different and need redownload\"\n                        );\n                        remove_all(&source_tar)?;\n                    }\n                } else {\n                    //TODO: set blake3 hash on the recipe with something like \"cook fix\"\n                    log_to_pty!(\n                        logger,\n                        \"WARNING: set blake3 for '{}' to '{}'\",\n                        source_tar.display(),\n                        source_tar_blake3\n                    );\n                    break;\n                }\n            }\n            if source_dir.is_dir() {\n                if tar_updated || fetch_is_patches_newer(recipe_dir, patches, &source_dir)? {\n                    log_to_pty!(\n                        logger,\n                        \"DEBUG: source tar or patches is newer than the source directory\"\n                    );\n                    remove_all(&source_dir)?\n                }\n            }\n            if !source_dir.is_dir() {\n                // Create source.tmp\n                let source_dir_tmp = recipe_dir.join(\"source.tmp\");\n                create_dir_clean(&source_dir_tmp)?;\n                fetch_extract_tar(source_tar, &source_dir_tmp, logger)?;\n                fetch_apply_patches(recipe_dir, patches, script, &source_dir_tmp, logger)?;\n\n                // Move source.tmp to source atomically\n                rename(&source_dir_tmp, &source_dir)?;\n            }\n            blake3.clone().unwrap_or(\"no_tar_blake3_hash_info\".into())\n        }\n        // Local Sources\n        None => {\n            if !source_dir.is_dir() {\n                log_to_pty!(\n                    logger,\n                    \"WARNING: Recipe without source section expected source dir at '{}'\",\n                    source_dir.display(),\n                );\n                create_dir(&source_dir)?;\n            }\n            \"local_source\".into()\n        }\n    };\n\n    if let BuildKind::Cargo {\n        cargopath,\n        cargoflags: _,\n        cargopackages: _,\n        cargoexamples: _,\n    } = &recipe.recipe.build.kind\n    {\n        // TODO: No need to fetch if !check_source and already fetched?\n        fetch_cargo(&source_dir, cargopath.as_ref(), logger)?;\n    }\n\n    fetch_apply_source_info(recipe, ident)?;\n\n    Ok(source_dir)\n}\n\npub(crate) fn fetch_make_symlink(source_dir: &PathBuf, same_as: &String) -> Result<(), String> {\n    let target_dir = Path::new(same_as).join(\"source\");\n    if !source_dir.is_symlink() {\n        if source_dir.is_dir() {\n            return Err(format!(\n                \"'{dir}' is a directory, but recipe indicated a symlink. \\n\\\n                        try removing '{dir}' if you haven't made any changes that would be lost\",\n                dir = source_dir.display(),\n            ));\n        }\n        std::os::unix::fs::symlink(&target_dir, source_dir).map_err(|err| {\n            format!(\n                \"failed to symlink '{}' to '{}': {}\\n{:?}\",\n                target_dir.display(),\n                source_dir.display(),\n                err,\n                err\n            )\n        })?;\n    }\n    Ok(())\n}\n\npub(crate) fn fetch_resolve_canon(\n    recipe_dir: &Path,\n    same_as: &String,\n    is_host: bool,\n) -> Result<CookRecipe, String> {\n    let canon_dir = Path::new(recipe_dir).join(same_as);\n    if canon_dir\n        .to_str()\n        .unwrap()\n        .chars()\n        .filter(|c| *c == '/')\n        .count()\n        > 50\n    {\n        return Err(format!(\"Infinite loop detected\"));\n    }\n    if !canon_dir.exists() {\n        return Err(format!(\"'{dir}' is not exists.\", dir = canon_dir.display()));\n    }\n    CookRecipe::from_path(canon_dir.as_path(), true, is_host)\n        .map_err(|e| format!(\"Unable to load {dir}: {e:?}\", dir = canon_dir.display()))\n}\n\npub(crate) fn fetch_extract_tar(\n    source_tar: PathBuf,\n    source_dir_tmp: &PathBuf,\n    logger: &PtyOut,\n) -> Result<(), String> {\n    let mut command = Command::new(\"tar\");\n    let verbose = crate::config::get_config().cook.verbose;\n    if is_redox() {\n        command.arg(if verbose { \"xvf\" } else { \"xf\" });\n    } else {\n        command.arg(\"--extract\");\n        command.arg(\"--no-same-owner\");\n        if verbose {\n            command.arg(\"--verbose\");\n        }\n        command.arg(\"--file\");\n    }\n    command.arg(&source_tar);\n    command.arg(\"--directory\").arg(source_dir_tmp);\n    command.arg(\"--strip-components\").arg(\"1\");\n    run_command(command, logger)?;\n    Ok(())\n}\n\npub(crate) fn fetch_cargo(\n    source_dir: &PathBuf,\n    cargopath: Option<&String>,\n    logger: &PtyOut,\n) -> Result<(), String> {\n    let mut source_dir = source_dir.clone();\n    if let Some(cargopath) = cargopath {\n        source_dir = source_dir.join(cargopath);\n    }\n\n    let local_redoxer = Path::new(\"target/release/cookbook_redoxer\");\n    let mut command = if is_redox() && !local_redoxer.is_file() {\n        Command::new(\"cookbook_redoxer\")\n    } else {\n        let cookbook_redoxer = local_redoxer\n            .canonicalize()\n            .unwrap_or(PathBuf::from(\"cargo\"));\n        Command::new(&cookbook_redoxer)\n    };\n    command.arg(\"fetch\");\n    command.arg(\"--manifest-path\");\n    command.arg(source_dir.join(\"Cargo.toml\").into_os_string());\n    run_command(command, logger)?;\n    Ok(())\n}\n\npub fn fetch_remote(\n    recipe_dir: &Path,\n    recipe: &CookRecipe,\n    offline_mode: bool,\n    logger: &PtyOut,\n) -> Result<(), String> {\n    let (mut manager, repository) = fetch_repo::get_binary_repo();\n    let target_dir = create_target_dir(recipe_dir, recipe.target)?;\n    if logger.is_some() {\n        let writer = logger.as_ref().unwrap().1.try_clone().unwrap();\n        manager.set_callback(Rc::new(RefCell::new(PlainPtyCallback::new(writer))));\n    }\n    let packages = recipe.recipe.get_packages_list();\n\n    let name = recipe_dir\n        .file_name()\n        .ok_or(\"Unable to get recipe name\")?\n        .to_str()\n        .unwrap();\n\n    for package in packages {\n        let (_, source_pkgar, source_toml) = package_source_paths(package, &target_dir);\n        let source_name = get_package_name(name, package);\n        let Some(repo_blake3) = repository.packages.get(&source_name) else {\n            return Err(format!(\n                \"Package {source_name} does not exist in server repository\"\n            ));\n        };\n\n        if !offline_mode {\n            if source_toml.is_file() {\n                let pkg_toml = read_source_toml(&source_toml)?;\n                if &pkg_toml.blake3 != repo_blake3 {\n                    log_to_pty!(logger, \"DEBUG: Updating source binaries\");\n                    remove_all(&source_toml)?;\n                    if source_pkgar.is_file() {\n                        remove_all(&source_pkgar)?;\n                    }\n                }\n            }\n\n            if !source_toml.is_file() {\n                {\n                    let toml_file = File::create(&source_toml)\n                        .map_err(|e| format!(\"Unable to create source.toml: {e:?}\"))?;\n                    let mut writer = DownloadBackendWriter::ToFile(toml_file);\n                    manager\n                        .download(&format!(\"{}.toml\", &source_name), None, &mut writer)\n                        .map_err(|e| format!(\"Unable to download source.toml: {e:?}\"))?;\n                }\n                let pkg_toml = read_source_toml(&source_toml)?;\n                let pkgar_file = File::create(&source_pkgar)\n                    .map_err(|e| format!(\"Unable to create source.pkgar: {e:?}\"))?;\n                let mut writer = DownloadBackendWriter::ToFile(pkgar_file);\n                manager\n                    .download(\n                        &format!(\"{}.pkgar\", &source_name),\n                        Some(pkg_toml.network_size),\n                        &mut writer,\n                    )\n                    .map_err(|e| format!(\"Unable to download source.pkgar: {e:?}\"))?;\n            }\n\n            // manager.download(file, 0, dest)\n        } else {\n            offline_check_exists(&source_pkgar)?;\n            offline_check_exists(&source_toml)?;\n        }\n\n        // guaranteed to exist once\n        if package.is_none() {\n            let pkg_toml = read_source_toml(&source_toml)?;\n\n            fetch_apply_source_info_from_remote(\n                recipe,\n                &SourceIdentifier {\n                    commit_identifier: pkg_toml.commit_identifier.clone(),\n                    source_identifier: pkg_toml.source_identifier.clone(),\n                    time_identifier: pkg_toml.time_identifier.clone(),\n                    ..Default::default()\n                },\n            )?;\n        }\n    }\n\n    Ok(())\n}\n\nfn read_source_toml(source_toml: &Path) -> Result<pkg::Package, String> {\n    let mut file =\n        File::open(source_toml).map_err(|e| format!(\"Unable to open source.toml: {e:?}\"))?;\n    let mut contents = String::new();\n    file.read_to_string(&mut contents)\n        .map_err(|e| format!(\"Unable to read source.toml: {e:?}\"))?;\n    let pkg_toml = pkg::Package::from_toml(&contents)\n        .map_err(|e| format!(\"Unable to parse source.toml: {e:?}\"))?;\n    Ok(pkg_toml)\n}\n\npub(crate) fn fetch_is_patches_newer(\n    recipe_dir: &Path,\n    patches: &Vec<String>,\n    source_dir: &PathBuf,\n) -> Result<bool, String> {\n    // don't check source files inside as it can be mixed with user patches\n    let source_time = modified(&source_dir)?;\n    for patch_name in patches {\n        let patch_file = recipe_dir.join(patch_name);\n        if !patch_file.is_file() {\n            return Err(format!(\n                \"failed to find patch file '{}'\",\n                patch_file.display()\n            ));\n        }\n\n        let patch_time = modified(&patch_file)?;\n        if patch_time > source_time {\n            return Ok(true);\n        }\n    }\n    return Ok(false);\n}\n\npub(crate) fn fetch_apply_patches(\n    recipe_dir: &Path,\n    patches: &Vec<String>,\n    script: &Option<String>,\n    source_dir_tmp: &PathBuf,\n    logger: &PtyOut,\n) -> Result<(), String> {\n    for patch_name in patches {\n        let patch_file = recipe_dir.join(patch_name);\n        if !patch_file.is_file() {\n            return Err(format!(\n                \"failed to find patch file '{}'\",\n                patch_file.display()\n            ));\n        }\n\n        let patch = fs::read_to_string(&patch_file).map_err(|err| {\n            format!(\n                \"failed to read patch file '{}': {}\\n{:#?}\",\n                patch_file.display(),\n                err,\n                err\n            )\n        })?;\n\n        let mut command = Command::new(\"patch\");\n        command.arg(\"--directory\").arg(source_dir_tmp);\n        command.arg(\"--strip=1\");\n        run_command_stdin(command, patch.as_bytes(), logger)?;\n    }\n    Ok(if let Some(script) = script {\n        let mut command = Command::new(\"bash\");\n        command.arg(\"-ex\");\n        command.current_dir(source_dir_tmp);\n        run_command_stdin(\n            command,\n            format!(\"{SHARED_PRESCRIPT}\\n{script}\").as_bytes(),\n            logger,\n        )?;\n    })\n}\n\npub(crate) fn fetch_apply_source_info(\n    recipe: &CookRecipe,\n    source_identifier: String,\n) -> Result<(), String> {\n    let ident = crate::cook::ident::get_ident();\n    let info = SourceIdentifier {\n        commit_identifier: ident.commit.to_string(),\n        time_identifier: ident.time.to_string(),\n        source_identifier: source_identifier,\n    };\n\n    fetch_apply_source_info_from_remote(&recipe, &info)\n}\n\npub(crate) fn fetch_apply_source_info_from_remote(\n    recipe: &CookRecipe,\n    info: &SourceIdentifier,\n) -> Result<(), String> {\n    let target_dir = create_target_dir(&recipe.dir, recipe.target)?;\n    let source_toml_path = target_dir.join(\"source_info.toml\");\n    serialize_and_write(&source_toml_path, &info)?;\n    Ok(())\n}\n\npub fn fetch_get_source_info(recipe: &CookRecipe) -> Result<SourceIdentifier, String> {\n    let target_dir = recipe.target_dir();\n    let source_toml_path = target_dir.join(\"source_info.toml\");\n    let toml_content = fs::read_to_string(source_toml_path)\n        .map_err(|e| format!(\"Unable to read source_info.toml: {:?}\", e))?;\n    let parsed = toml::from_str(&toml_content)\n        .map_err(|e| format!(\"Unable to parse source_info.toml: {:?}\", e))?;\n    Ok(parsed)\n}\n"
  },
  {
    "path": "src/cook/fetch_repo.rs",
    "content": "use std::{\n    cell::RefCell,\n    io::{PipeWriter, Write},\n    path::{Path, PathBuf},\n    rc::Rc,\n    time::Duration,\n};\n\nuse pkg::{\n    PackageName, RemotePackage, RepoManager, Repository,\n    callback::{Callback, SilentCallback},\n    net_backend::{CurlBackend, DownloadBackend},\n};\n\n// TODO: This is a workaround, but as long as whole\n// fetch operation is in single thread, this is ok\nthread_local! {\nstatic BINARY_REPO: RefCell<Option<(RepoManager, Repository)>> = RefCell::new(None);\n}\n\nfn load_cached_repo(path: &Path) -> Option<Repository> {\n    let metadata = std::fs::metadata(path).ok()?;\n\n    if !crate::config::get_config().cook.offline {\n        let yesterday = std::time::SystemTime::now().checked_sub(Duration::from_secs(24 * 3600))?;\n        if metadata.modified().ok()? < yesterday {\n            // stale cache\n            let _ = std::fs::remove_file(path);\n            return None;\n        }\n    }\n\n    let toml_str = std::fs::read_to_string(path).ok()?;\n    Repository::from_toml(&toml_str).ok()\n}\n\nfn init_binary_repo() -> (RepoManager, Repository) {\n    let callback = Rc::new(RefCell::new(SilentCallback::new()));\n    let download_backend = CurlBackend::new().expect(\"Curl not found\");\n    let mut repo = RepoManager::new(callback, Box::new(download_backend));\n\n    repo.add_remote(crate::REMOTE_PKG_SOURCE, redoxer::target())\n        .expect(\"Unable to add remote\");\n\n    let repo_path = PathBuf::from(\"build/remotes\");\n    repo.set_download_path(repo_path.clone());\n    repo.sync_keys().expect(\"Unable to sync keys\");\n\n    let repo_toml = load_cached_repo(&repo_path.join(\"repo.toml\")).unwrap_or_else(|| {\n        let (toml_str, _) = repo\n            .get_package_toml(&PackageName::new(\"repo\").unwrap())\n            .expect(\"Failed to fetch repo.toml\");\n        Repository::from_toml(&toml_str).expect(\"Fetched repo.toml is invalid\")\n    });\n\n    (repo, repo_toml)\n}\n\npub fn get_binary_repo() -> (RepoManager, Repository) {\n    BINARY_REPO.with(|cell| {\n        let mut opt = cell.borrow_mut();\n        if opt.is_none() {\n            *opt = Some(init_binary_repo());\n        }\n        let (repo, repo_toml) = opt.as_ref().unwrap();\n        ((*repo).clone(), repo_toml.clone())\n    })\n}\n\npub struct PlainPtyCallback {\n    size: u64,\n    unknown_size: bool,\n    pos: u64,\n    fetch_processed: usize,\n    fetch_total: usize,\n    interactive: bool,\n    download_file: Option<String>,\n    pty: PipeWriter,\n}\n\nimpl PlainPtyCallback {\n    pub fn new(pty: PipeWriter) -> Self {\n        Self {\n            size: 0,\n            unknown_size: false,\n            pos: 0,\n            fetch_processed: 0,\n            fetch_total: 0,\n            interactive: false,\n            download_file: None,\n            pty,\n        }\n    }\n\n    /// Set if user require to agree on terminal\n    pub fn set_interactive(&mut self, enabled: bool) {\n        self.interactive = enabled;\n    }\n\n    fn flush(&self) {\n        let _ = std::io::stderr().flush();\n    }\n\n    pub fn format_size(bytes: u64) -> String {\n        if bytes == 0 {\n            return \"0 B\".to_string();\n        }\n        const UNITS: [&str; 5] = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\"];\n        let i = (bytes as f64).log(1024.0).floor() as usize;\n        let size = bytes as f64 / 1024.0_f64.powi(i as i32);\n        format!(\"{:.2} {}\", size, UNITS[i])\n    }\n\n    fn downloading_str(&self) -> &'static str {\n        \"Downloading\"\n    }\n}\n\nconst RESET_LINE: &str = \"\\r\\x1b[2K\";\n\nimpl Callback for PlainPtyCallback {\n    fn fetch_start(&mut self, initial_count: usize) {\n        self.fetch_total = 0;\n        self.fetch_processed = 0;\n        self.fetch_package_increment(0, initial_count);\n    }\n\n    fn fetch_package_name(&mut self, pkg_name: &PackageName) {\n        // resuming after fetch_package_increment\n        let _ = write!(&self.pty, \" {}\", pkg_name.as_str());\n        self.flush();\n    }\n\n    fn fetch_package_increment(&mut self, added_processed: usize, added_count: usize) {\n        self.fetch_processed += added_processed;\n        self.fetch_total += added_count;\n\n        let _ = write!(\n            &self.pty,\n            \"{RESET_LINE}Fetching: [{}/{}]\",\n            self.fetch_processed, self.fetch_total\n        );\n        self.flush();\n    }\n\n    fn fetch_end(&mut self) {\n        if self.fetch_processed == self.fetch_total {\n            let _ = writeln!(&self.pty, \"{RESET_LINE}Fetch complete.\");\n        } else {\n            let _ = writeln!(&self.pty, \"{RESET_LINE}Fetch incomplete.\");\n        }\n    }\n\n    fn download_start(&mut self, length: u64, file: &str) {\n        self.size = length;\n        self.unknown_size = length == 0;\n        self.pos = 0;\n        if !self.unknown_size {\n            let _ = write!(&self.pty, \"{RESET_LINE}{} {file}\", self.downloading_str());\n            self.download_file = Some(file.to_string());\n            self.flush();\n        }\n    }\n\n    fn download_increment(&mut self, downloaded: u64) {\n        self.pos += downloaded;\n        if self.unknown_size {\n            self.size += downloaded;\n        }\n        if self.unknown_size {\n            return;\n        }\n\n        // keep using MB for consistency\n        let pos_mb = self.pos as f64 / 1_048_576.0;\n        let size_mb = self.size as f64 / 1_048_576.0;\n        let file_name = self\n            .download_file\n            .as_ref()\n            .map(|s| s.as_str())\n            .unwrap_or(\"\");\n        let _ = write!(\n            &self.pty,\n            \"{RESET_LINE}{} {} [{:.2} MB / {:.2} MB]\",\n            self.downloading_str(),\n            file_name,\n            pos_mb,\n            size_mb\n        );\n        self.flush();\n    }\n\n    fn download_end(&mut self) {\n        if !self.unknown_size {\n            let _ = writeln!(&self.pty, \"\");\n            self.download_file = None;\n        }\n    }\n\n    fn install_extract(&mut self, remote_pkg: &RemotePackage) {\n        let _ = writeln!(&self.pty, \"Extracting {}...\", remote_pkg.package.name);\n        self.flush();\n    }\n}\n"
  },
  {
    "path": "src/cook/fs.rs",
    "content": "use serde::Serialize;\nuse std::{\n    collections::BTreeSet,\n    fs,\n    io::{self, Write},\n    path::{Path, PathBuf},\n    process::{self, Command, Stdio},\n    time::SystemTime,\n};\nuse walkdir::{DirEntry, WalkDir};\n\nuse crate::{\n    config::translate_mirror,\n    cook::pty::{PtyOut, spawn_to_pipe},\n    wrap_io_err,\n};\n\n//TODO: pub(crate) for all of these functions\n\npub fn remove_all(path: &Path) -> Result<(), String> {\n    if path.is_dir() {\n        fs::remove_dir_all(path)\n    } else {\n        fs::remove_file(path)\n    }\n    .map_err(|err| format!(\"failed to remove '{}': {}\\n{:?}\", path.display(), err, err))\n}\n\npub fn create_dir(dir: &Path) -> Result<(), String> {\n    fs::create_dir(dir)\n        .map_err(|err| format!(\"failed to create '{}': {}\\n{:?}\", dir.display(), err, err))\n}\n\npub fn create_dir_clean(dir: &Path) -> Result<(), String> {\n    if dir.is_dir() {\n        remove_all(dir)?;\n    }\n    fs::create_dir_all(dir)\n        .map_err(|err| format!(\"failed to create '{}': {}\\n{:?}\", dir.display(), err, err))\n}\n\npub fn create_target_dir(recipe_dir: &Path, target: &'static str) -> Result<PathBuf, String> {\n    let target_parent_dir = recipe_dir.join(\"target\");\n    if !target_parent_dir.is_dir() {\n        create_dir(&target_parent_dir)?;\n    }\n    let target_dir = target_parent_dir.join(target);\n    if !target_dir.is_dir() {\n        create_dir(&target_dir)?;\n    }\n    Ok(target_dir)\n}\n\npub fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> io::Result<()> {\n    fs::create_dir_all(&dst)?;\n    for entry in fs::read_dir(src)? {\n        let entry = entry?;\n        let ty = entry.file_type()?;\n        if ty.is_dir() {\n            copy_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?;\n        } else {\n            fs::copy(entry.path(), dst.as_ref().join(entry.file_name()))?;\n        }\n    }\n    Ok(())\n}\n\npub fn move_dir_all_fn<'a>(\n    src: impl AsRef<Path>,\n    mv: &'a Box<impl Fn(PathBuf) -> Option<&'a Path>>,\n) -> io::Result<()> {\n    move_dir_all_inner_fn(&src, &src, mv)\n}\n\nfn move_dir_all_inner_fn<'a>(\n    src: impl AsRef<Path>,\n    srcrel: impl AsRef<Path>,\n    mv: &'a Box<impl Fn(PathBuf) -> Option<&'a Path>>,\n) -> io::Result<()> {\n    let mut files = Vec::new();\n    for entry in fs::read_dir(&src)? {\n        let entry = entry?;\n        let ty = entry.file_type()?;\n        if ty.is_dir() {\n            move_dir_all_inner_fn(entry.path(), srcrel.as_ref(), mv)?;\n        } else {\n            let path: PathBuf = entry.path();\n            let Ok(relpath) = path.strip_prefix(&srcrel) else {\n                continue;\n            };\n\n            if let Some(dst) = mv(relpath.to_path_buf()) {\n                files.push((entry.path(), relpath.to_path_buf(), dst.to_owned()));\n            }\n        }\n    }\n    for (src, srcrel, dst) in files {\n        let path = dst.join(&srcrel);\n        fs::create_dir_all(&path.parent().unwrap())?;\n        std::fs::rename(&src, &path)?;\n    }\n    Ok(())\n}\n\npub fn symlink(original: impl AsRef<Path>, link: impl AsRef<Path>) -> Result<(), String> {\n    std::os::unix::fs::symlink(&original, &link).map_err(|err| {\n        format!(\n            \"failed to symlink '{}' to '{}': {}\\n{:?}\",\n            original.as_ref().display(),\n            link.as_ref().display(),\n            err,\n            err\n        )\n    })\n}\n\npub fn modified(path: &Path) -> Result<SystemTime, String> {\n    let metadata = fs::metadata(path).map_err(|err| {\n        format!(\n            \"failed to get metadata of '{}': {}\\n{:#?}\",\n            path.display(),\n            err,\n            err\n        )\n    })?;\n    metadata.modified().map_err(|err| {\n        format!(\n            \"failed to get modified time of '{}': {}\\n{:#?}\",\n            path.display(),\n            err,\n            err\n        )\n    })\n}\n\npub fn modified_all(\n    path: &Vec<PathBuf>,\n    func: fn(path: &Path) -> Result<SystemTime, String>,\n) -> Result<SystemTime, String> {\n    let mut newest = SystemTime::UNIX_EPOCH;\n    for entry_res in path {\n        let modified = func(entry_res)?;\n        if modified > newest {\n            newest = modified;\n        }\n    }\n    Ok(newest)\n}\n\npub fn modified_dir_inner<F: FnMut(&DirEntry) -> bool>(\n    dir: &Path,\n    filter: F,\n) -> io::Result<SystemTime> {\n    let mut newest = fs::metadata(dir)?.modified()?;\n    for entry_res in WalkDir::new(dir).into_iter().filter_entry(filter) {\n        let entry = entry_res?;\n        let modified = entry.metadata()?.modified()?;\n        if modified > newest {\n            newest = modified;\n        }\n    }\n    Ok(newest)\n}\n\npub fn modified_dir(dir: &Path) -> Result<SystemTime, String> {\n    modified_dir_inner(dir, |_| true).map_err(|err| {\n        format!(\n            \"failed to get modified time of '{}': {}\\n{:#?}\",\n            dir.display(),\n            err,\n            err\n        )\n    })\n}\n\npub fn modified_dir_ignore_git(dir: &Path) -> Result<SystemTime, String> {\n    modified_dir_inner(dir, |entry| {\n        entry\n            .file_name()\n            .to_str()\n            .map(|s| s != \".git\")\n            .unwrap_or(true)\n    })\n    .map_err(|err| {\n        format!(\n            \"failed to get modified time of '{}': {}\\n{:#?}\",\n            dir.display(),\n            err,\n            err\n        )\n    })\n}\n\npub fn check_files_present(dir: &Path, expected_files: &BTreeSet<&str>) -> Result<bool, String> {\n    let entries = fs::read_dir(dir)\n        .map_err(|err| format!(\"failed to get list files of '{}': {:?}\", dir.display(), err))?;\n\n    let mut matches = 0;\n    for entry_res in entries {\n        let entry = entry_res\n            .map_err(|err| format!(\"failed to get file entry of '{}': {:?}\", dir.display(), err))?;\n\n        let filename = entry.file_name();\n        let Some(filename) = filename.to_str() else {\n            continue;\n        };\n\n        if expected_files.contains(&filename) {\n            matches += 1\n        } else if filename.starts_with('.') {\n            continue;\n        } else {\n            return Ok(false);\n        }\n    }\n\n    Ok(matches == expected_files.len())\n}\n\npub fn rename(src: &Path, dst: &Path) -> Result<(), String> {\n    fs::rename(src, dst).map_err(|err| {\n        format!(\n            \"failed to rename '{}' to '{}': {}\\n{:?}\",\n            src.display(),\n            dst.display(),\n            err,\n            err\n        )\n    })\n}\n\npub fn run_command(mut command: process::Command, stdout_pipe: &PtyOut) -> Result<(), String> {\n    let status = spawn_to_pipe(&mut command, stdout_pipe)\n        .map_err(|err| format!(\"failed to run {:?}: {}\\n{:#?}\", command, err, err))?\n        .wait()\n        .map_err(|err| format!(\"failed to run {:?}: {}\\n{:#?}\", command, err, err))?;\n\n    if !status.success() {\n        return Err(format!(\n            \"failed to run {:?}: exited with status {}\",\n            command, status\n        ));\n    }\n\n    Ok(())\n}\n\npub fn run_command_stdin(\n    mut command: process::Command,\n    stdin_data: &[u8],\n    stdout_pipe: &PtyOut,\n) -> Result<(), String> {\n    command.stdin(Stdio::piped());\n    let mut child = spawn_to_pipe(&mut command, stdout_pipe)\n        .map_err(|err| format!(\"failed to spawn {:?}: {}\\n{:#?}\", command, err, err))?;\n\n    if let Some(ref mut stdin) = child.stdin {\n        stdin.write_all(stdin_data).map_err(|err| {\n            format!(\n                \"failed to write stdin of {:?}: {}\\n{:#?}\",\n                command, err, err\n            )\n        })?;\n    } else {\n        return Err(format!(\"failed to find stdin of {:?}\", command));\n    }\n\n    let status = child\n        .wait()\n        .map_err(|err| format!(\"failed to run {:?}: {}\\n{:#?}\", command, err, err))?;\n\n    if !status.success() {\n        return Err(format!(\n            \"failed to run {:?}: exited with status {}\",\n            command, status\n        ));\n    }\n\n    Ok(())\n}\n\npub fn serialize_and_write<T: Serialize>(file_path: &Path, content: &T) -> Result<(), String> {\n    let toml_content = toml::to_string(content).map_err(|err| {\n        format!(\n            \"Failed to serialize content for '{}': {}\",\n            file_path.display(),\n            err\n        )\n    })?;\n\n    fs::write(file_path, toml_content)\n        .map_err(|err| format!(\"Failed to write to file '{}': {}\", file_path.display(), err))?;\n    Ok(())\n}\n\npub fn offline_check_exists(path: &PathBuf) -> Result<(), String> {\n    if !path.exists() {\n        return Err(format!(\n            \"'{path}' is not exist and unable to continue in offline mode\",\n            path = path.display(),\n        ))?;\n    }\n    Ok(())\n}\n\npub fn download_wget(url: &str, dest: &PathBuf, logger: &PtyOut) -> Result<(), String> {\n    if !dest.is_file() {\n        let dest_tmp = PathBuf::from(format!(\"{}.tmp\", dest.display()));\n        let mut command = Command::new(\"wget\");\n        command.arg(translate_mirror(url));\n        command.arg(\"--continue\").arg(\"-O\").arg(&dest_tmp);\n        run_command(command, logger)?;\n        rename(&dest_tmp, &dest)?;\n    }\n    Ok(())\n}\n\npub fn read_to_string(path: &Path) -> crate::Result<String> {\n    fs::read_to_string(path).map_err(wrap_io_err!(path, \"Reading file to string\"))\n}\n\n/// get commit rev and return if it's detached or not\npub fn get_git_head_rev(dir: &PathBuf) -> Result<(String, bool), String> {\n    let git_head = dir.join(\".git/HEAD\");\n    let head_str = fs::read_to_string(&git_head)\n        .map_err(|e| format!(\"unable to read {path}: {e}\", path = git_head.display()))?;\n    if head_str.starts_with(\"ref: \") {\n        let entry = head_str[\"ref: \".len()..].trim_end();\n        let git_ref = dir.join(\".git\").join(entry);\n        let ref_str = if git_ref.is_file() {\n            fs::read_to_string(&git_ref)\n                .map_err(|e| format!(\"unable to read {path}: {e}\", path = git_ref.display()))?\n        } else {\n            get_git_ref_entry(dir, entry)?\n        };\n        Ok((ref_str.trim().to_string(), false))\n    } else {\n        Ok((head_str.trim().to_string(), true))\n    }\n}\n\n/// get commit from \"rev\" which either a full commit hash or a tag name\npub fn get_git_tag_rev(dir: &PathBuf, tag: &str) -> Result<String, String> {\n    if tag.len() == 40 && tag.chars().all(|f| f.is_ascii_hexdigit()) {\n        return Ok(tag.to_string());\n    }\n    get_git_ref_entry(dir, &format!(\"refs/tags/{tag}\"))\n}\npub fn get_git_ref_entry(dir: &PathBuf, entry: &str) -> Result<String, String> {\n    let git_refs = dir.join(\".git/packed-refs\");\n    let refs_str = fs::read_to_string(&git_refs)\n        .map_err(|e| format!(\"unable to read {path}: {e}\", path = git_refs.display()))?;\n    for line in refs_str.lines() {\n        if line.contains(entry) {\n            let sha = line\n                .split_whitespace()\n                .next()\n                .ok_or_else(|| \"packed-refs line is malformed.\".to_string())?;\n\n            return Ok(sha.to_string());\n        }\n    }\n\n    Err(format!(\"Could not find a rev for {}\", entry))\n}\n\n/// get commit rev after fetch\npub fn get_git_fetch_rev(\n    dir: &PathBuf,\n    remote_url: &str,\n    remote_branch: &str,\n) -> Result<String, String> {\n    let git_fetch_head = dir.join(\".git/FETCH_HEAD\");\n\n    let fetch_head_content = fs::read_to_string(&git_fetch_head).map_err(|e| {\n        format!(\n            \"unable to read {path}: {e}\",\n            path = git_fetch_head.display()\n        )\n    })?;\n\n    let expected_comment_part = format!(\"branch '{}' of {}\", remote_branch, remote_url);\n\n    for line in fetch_head_content.lines() {\n        if line.contains(&expected_comment_part) && !line.contains(\"not-for-merge\") {\n            let sha = line\n                .split_whitespace()\n                .next()\n                .ok_or_else(|| \"FETCH_HEAD line is malformed.\".to_string())?;\n\n            return Ok(sha.to_string());\n        }\n    }\n\n    Err(format!(\n        \"Could not find a fetch target for tracking {}\",\n        expected_comment_part\n    ))\n}\n\n/// (local_branch_name, remote_branch, remote_name, remote_url)\n///    -> (\"fix_stuff\", \"master\", \"origin\", \"https://gitlab.redox-os.org/willnode/redox\")\npub fn get_git_remote_tracking(dir: &PathBuf) -> Result<(String, String, String, String), String> {\n    let git_head = dir.join(\".git/HEAD\");\n    let git_config = dir.join(\".git/config\");\n\n    let head_content = fs::read_to_string(&git_head)\n        .map_err(|e| format!(\"unable to read {path}: {e}\", path = git_head.display()))?;\n\n    if !head_content.starts_with(\"ref: \") {\n        let sha = head_content.trim_end().to_string();\n        return Ok((sha, \"\".to_string(), \"\".to_string(), \"\".to_string()));\n    }\n\n    let local_branch_path = head_content[\"ref: \".len()..].trim_end();\n    let local_branch_name = get_git_branch_name(local_branch_path)?;\n\n    let config_content = fs::read_to_string(&git_config)\n        .map_err(|e| format!(\"unable to read {path}: {e}\", path = git_config.display()))?;\n\n    let branch_section = format!(\"[branch \\\"{}\\\"]\", local_branch_name);\n    let mut remote_name: Option<String> = None;\n    let mut remote_branch: Option<String> = None;\n    let mut parsing_branch_section = false;\n\n    for line in config_content.lines().map(|l| l.trim()) {\n        if line.is_empty() {\n            continue;\n        }\n\n        if line == branch_section {\n            parsing_branch_section = true;\n            continue;\n        }\n\n        if parsing_branch_section {\n            if line.starts_with('[') {\n                break;\n            }\n            if line.starts_with(\"remote = \") {\n                remote_name = Some(line[\"remote = \".len()..].trim().to_string());\n            }\n            if line.starts_with(\"merge = \") {\n                remote_branch = Some(get_git_branch_name(line[\"merge = \".len()..].trim())?);\n            }\n        }\n    }\n\n    let remote_name_str = remote_name\n        .ok_or_else(|| format!(\"Branch '{}' is not tracking a remote.\", local_branch_name))?;\n    let remote_branch_str = remote_branch.unwrap_or(\"\".into());\n\n    let remote_section = format!(\"[remote \\\"{}\\\"]\", remote_name_str);\n    let mut remote_url: Option<String> = None;\n    let mut parsing_remote_section = false;\n\n    for line in config_content.lines().map(|l| l.trim()) {\n        if line.is_empty() {\n            continue;\n        }\n\n        if line == remote_section {\n            parsing_remote_section = true;\n            continue;\n        }\n\n        if parsing_remote_section {\n            if line.starts_with('[') {\n                break;\n            }\n            if line.starts_with(\"url = \") {\n                let mut url = line[\"url = \".len()..].trim();\n                url = chop_dot_git(url);\n                remote_url = Some(url.to_string());\n            }\n        }\n    }\n\n    let remote_url_str = remote_url.ok_or_else(|| {\n        format!(\n            \"Could not find URL for remote '{}' in .git/config.\",\n            remote_name_str\n        )\n    })?;\n\n    Ok((\n        local_branch_name,\n        remote_branch_str,\n        remote_name_str,\n        remote_url_str,\n    ))\n}\n\npub(crate) fn chop_dot_git(url: &str) -> &str {\n    if url.ends_with(\".git\") {\n        return &url[..url.len() - \".git\".len()];\n    }\n    url\n}\n\nfn get_git_branch_name(local_branch_path: &str) -> Result<String, String> {\n    // TODO: incorrectly handle branch with slashes\n    Ok(local_branch_path\n        .split('/')\n        .last()\n        .ok_or_else(|| format!(\"Failed to parse branch name of {:?}\", local_branch_path))?\n        .to_string())\n}\n"
  },
  {
    "path": "src/cook/ident.rs",
    "content": "use std::{\n    process::{Command, Stdio},\n    sync::OnceLock,\n};\n\n#[derive(Debug, Default)]\npub struct IdentifierConfig {\n    pub commit: String,\n    pub time: String,\n}\n\nimpl IdentifierConfig {\n    fn new() -> Self {\n        let (commit, _) = crate::cook::fs::get_git_head_rev(\n            &std::env::current_dir().expect(\"unable to get $PWD\"),\n        )\n        .unwrap_or((\"\".into(), false));\n        // better than importing heavy deps like chrono\n        let time = String::from_utf8_lossy(\n            &Command::new(\"date\")\n                .arg(\"-u\")\n                .arg(\"+%Y-%m-%dT%H:%M:%SZ\")\n                .stdout(Stdio::piped())\n                .output()\n                .expect(\"Failed to get current ISO-formatted time\")\n                .stdout\n                .trim_ascii(),\n        )\n        .into();\n        IdentifierConfig { commit, time }\n    }\n}\n\nstatic IDENTIFIER_CONFIG: OnceLock<IdentifierConfig> = OnceLock::new();\n\npub fn get_ident() -> &'static IdentifierConfig {\n    IDENTIFIER_CONFIG\n        .get()\n        .expect(\"Identifier is not initialized\")\n}\n\npub fn init_ident() {\n    IDENTIFIER_CONFIG\n        .set(IdentifierConfig::new())\n        .expect(\"Identifier is initialized twice\")\n}\n"
  },
  {
    "path": "src/cook/package.rs",
    "content": "use std::{\n    collections::BTreeSet,\n    path::{Path, PathBuf},\n};\n\nuse pkg::{InstallState, Package, PackageName, PackagePrefix, PackageState};\nuse pkgar::ext::PackageSrcExt;\nuse pkgar_core::HeaderFlags;\n\nuse crate::{\n    blake3::hash_to_hex,\n    config::CookConfig,\n    cook::{cook_build::BuildResult, fetch, fs::*, pty::PtyOut},\n    log_to_pty,\n    recipe::{BuildKind, CookRecipe, OptionalPackageRecipe},\n};\n\npub fn package(\n    recipe: &CookRecipe,\n    build_result: &BuildResult,\n    cook_config: &CookConfig,\n    logger: &PtyOut,\n) -> Result<(), String> {\n    let name = &recipe.name;\n    let target_dir = &recipe.target_dir();\n    let auto_deps = &build_result.auto_deps;\n    if recipe.recipe.build.kind == BuildKind::None {\n        // metapackages don't have stage dir and optional packages\n        package_toml(\n            target_dir.join(\"stage.toml\"),\n            recipe,\n            None,\n            recipe.recipe.package.dependencies.clone(),\n            &auto_deps,\n        )?;\n        return Ok(());\n    }\n\n    let secret_path = \"build/id_ed25519.toml\";\n    let public_path = \"build/id_ed25519.pub.toml\";\n    if !Path::new(secret_path).is_file() || !Path::new(public_path).is_file() {\n        if !Path::new(\"build\").is_dir() {\n            create_dir(Path::new(\"build\"))?;\n        }\n        let (public_key, secret_key) = pkgar_keys::SecretKeyFile::new();\n        public_key\n            .save(public_path)\n            .map_err(|err| format!(\"failed to save pkgar public key: {:?}\", err))?;\n        secret_key\n            .save(secret_path)\n            .map_err(|err| format!(\"failed to save pkgar secret key: {:?}\", err))?;\n    }\n\n    let packages = recipe.recipe.get_packages_list();\n\n    for package in packages {\n        let (stage_dir, package_file, package_meta) = package_stage_paths(package, target_dir);\n        // Rebuild package if stage is newer\n        if package_file.is_file() && !build_result.cached {\n            log_to_pty!(logger, \"DEBUG: updating '{}'\", package_file.display());\n            remove_all(&package_file)?;\n            if package_meta.is_file() {\n                remove_all(&package_meta)?;\n            }\n        }\n\n        if !package_file.is_file() {\n            pkgar::create_with_flags(\n                secret_path,\n                package_file.to_str().unwrap(),\n                stage_dir.to_str().unwrap(),\n                HeaderFlags::latest(\n                    pkgar_core::Architecture::Independent,\n                    match cook_config.compressed {\n                        true => pkgar_core::Packaging::LZMA2,\n                        false => pkgar_core::Packaging::Uncompressed,\n                    },\n                ),\n            )\n            .map_err(|err| format!(\"failed to create pkgar archive: {:?}\", err))?;\n        }\n\n        let deps = if package.is_some() {\n            BTreeSet::from([name.with_prefix(PackagePrefix::Any)])\n        } else {\n            auto_deps.clone()\n        };\n\n        if !package_meta.is_file() {\n            let name = match package {\n                Some(p) => PackageName::new(format!(\"{}.{}\", name.name(), p.name))\n                    .map_err(|e| format!(\"{}\", e))?,\n                None => name.clone(),\n            };\n            let package_deps = match package {\n                Some(p) => p\n                    .dependencies\n                    .iter()\n                    .map(|dep| {\n                        if dep.name().is_empty() {\n                            name.with_suffix(dep.suffix())\n                        } else {\n                            dep.clone()\n                        }\n                    })\n                    .collect(),\n                None => recipe.recipe.package.dependencies.clone(),\n            };\n            package_toml(\n                package_meta,\n                recipe,\n                Some((Path::new(public_path), &package_file)),\n                package_deps,\n                &deps,\n            )?;\n        }\n    }\n\n    Ok(())\n}\n\npub fn package_toml(\n    toml_path: PathBuf,\n    recipe: &CookRecipe,\n    package_file: Option<(&Path, &PathBuf)>,\n    mut package_deps: Vec<PackageName>,\n    auto_deps: &BTreeSet<PackageName>,\n) -> Result<(), String> {\n    for dep in auto_deps.iter() {\n        if !package_deps.contains(dep) {\n            package_deps.push(dep.clone());\n        }\n    }\n\n    let (hash, network_size, storage_size) = if let Some((pkey_path, archive_path)) = package_file {\n        use pkgar_core::PackageSrc;\n        let pkey = pkgar_keys::PublicKeyFile::open(pkey_path)\n            .map_err(|e| format!(\"Unable to read public key: {e:?}\"))?\n            .pkey;\n        let mut package = pkgar::PackageFile::new(archive_path, &pkey).map_err(|e| {\n            format!(\n                \"Unable to read packaged pkgar file {}: {e:?}\",\n                archive_path.display(),\n            )\n        })?;\n        let mt = std::fs::metadata(archive_path).map_err(|e| {\n            format!(\n                \"Unable to read packaged pkgar file {}: {e:?}\",\n                archive_path.display(),\n            )\n        })?;\n        let package_size = mt.len();\n        let storage_size = match package.header().flags.packaging() {\n            pkgar_core::Packaging::LZMA2 => {\n                let mut size = 0;\n                let entries = package\n                    .read_entries()\n                    .map_err(|e| format!(\"Unable to get lzma entry: {e}\"))?;\n                for entry in entries {\n                    let data_reader = package\n                        .data_reader(&entry)\n                        .map_err(|e| format!(\"Unable to read lzma entry: {e}\"))?;\n                    size += data_reader.unpacked_size;\n                    package\n                        .restore_reader(data_reader.into_inner())\n                        .map_err(|e| format!(\"Unable to put lzma entry: {e}\"))?;\n                }\n                size\n            }\n            _ => package_size,\n        };\n\n        (\n            hash_to_hex(package.header().blake3),\n            package_size,\n            storage_size,\n        )\n    } else {\n        (\"\".into(), 0, 0)\n    };\n\n    let ident_source = fetch::fetch_get_source_info(recipe)?;\n\n    let package = Package {\n        name: recipe.name.with_prefix(PackagePrefix::Any),\n        version: recipe.guess_version().unwrap_or(\"TODO\".into()),\n        target: recipe.target.to_string(),\n        blake3: hash,\n        network_size,\n        storage_size,\n        depends: package_deps,\n        commit_identifier: ident_source.commit_identifier,\n        source_identifier: ident_source.source_identifier,\n        time_identifier: ident_source.time_identifier,\n        ..Default::default()\n    };\n\n    serialize_and_write(&toml_path, &package)?;\n    return Ok(());\n}\n\npub fn package_target(name: &PackageName) -> &'static str {\n    if name.is_host() {\n        redoxer::host_target()\n    } else {\n        redoxer::target()\n    }\n}\n\npub fn package_stage_paths(\n    package: Option<&OptionalPackageRecipe>,\n    target_dir: &Path,\n) -> (PathBuf, PathBuf, PathBuf) {\n    let mut target_dir = target_dir.to_path_buf();\n    if let Some(cross_target) = std::env::var(\"COOKBOOK_CROSS_TARGET\").ok() {\n        if cross_target != \"\" {\n            // TODO: automatically pass COOKBOOK_CROSS_GNU_TARGET?\n            target_dir = target_dir.join(cross_target)\n        }\n    }\n    package_name_paths(package, &target_dir, \"stage\")\n}\n\npub fn package_source_paths(\n    package: Option<&OptionalPackageRecipe>,\n    target_dir: &Path,\n) -> (PathBuf, PathBuf, PathBuf) {\n    package_name_paths(package, target_dir, \"source\")\n}\n\nfn package_name_paths(\n    package: Option<&OptionalPackageRecipe>,\n    target_dir: &Path,\n    name: &str,\n) -> (PathBuf, PathBuf, PathBuf) {\n    let prefix_name = get_package_name(name, package);\n    let package_stage = target_dir.join(&prefix_name);\n    let package_file = package_stage.with_added_extension(\"pkgar\");\n    let package_meta = package_stage.with_added_extension(\"toml\");\n    (package_stage, package_file, package_meta)\n}\n\npub fn get_package_name(name: &str, package: Option<&OptionalPackageRecipe>) -> String {\n    get_package_name_inner(name, package.map(|p| p.name.as_str()))\n}\n\nfn get_package_name_inner(name: &str, package: Option<&str>) -> String {\n    let mut prefix_name = name.to_string();\n    if let Some(package) = package {\n        prefix_name.push('.');\n        prefix_name.push_str(package);\n    }\n    prefix_name\n}\n\npub fn package_handle_push(\n    state: &mut PackageState,\n    archive_path: &Path,\n    sysroot_dir: &Path,\n    reinstall: bool,\n) -> crate::Result<bool> {\n    let archive_toml = archive_path.with_extension(\"toml\");\n    let pkey_path = \"build/id_ed25519.pub.toml\";\n    let pkg_toml = Package::from_file(&archive_toml)?;\n    match state.installed.get(&pkg_toml.name) {\n        Some(s) if !reinstall && pkg_toml.blake3 == s.blake3 => Ok(true),\n        Some(s) => {\n            // \"local\" is what remote name from installer is hardcoded into\n            let remote_name = \"local\".to_string();\n\n            let install_state =\n                InstallState::from_package(&pkg_toml, remote_name, s.manual, s.dependents.clone());\n\n            // TODO: use pkgar::replace unless forced reinstall\n            pkgar::extract(pkey_path, &archive_path, sysroot_dir)?;\n\n            state.installed.insert(pkg_toml.name.clone(), install_state);\n\n            Ok(false)\n        }\n        None => {\n            // \"local\" is what remote name from installer is hardcoded into\n            let remote_name = \"local\".to_string();\n\n            // TODO: Handle manual & depedents\n            let install_state =\n                InstallState::from_package(&pkg_toml, remote_name, true, BTreeSet::new());\n\n            pkgar::extract(pkey_path, &archive_path, sysroot_dir)?;\n\n            // TODO: Inject dependencies\n            // TODO: Check if we need to inject remote key\n\n            state.installed.insert(pkg_toml.name.clone(), install_state);\n\n            Ok(false)\n        }\n    }\n}\n"
  },
  {
    "path": "src/cook/pty.rs",
    "content": "use anyhow::{Error, bail};\nuse libc::{self, winsize};\nuse std::fs::File;\nuse std::io::{Read, Write};\nuse std::os::fd::FromRawFd;\nuse std::os::unix::io::AsRawFd;\nuse std::os::unix::process::CommandExt;\nuse std::process::Child;\nuse std::time::Duration;\nuse std::{io, mem, ptr};\nuse std::{\n    io::{PipeReader, PipeWriter},\n    process::Command,\n};\n\npub use std::os::unix::io::RawFd;\n\n#[macro_export]\nmacro_rules! log_to_pty {\n    ($logger:expr, $($arg:tt)+) => {\n        if $logger.is_some() {\n            use std::io::Write;\n            let mut logfd = $logger.as_ref().unwrap().1.try_clone().unwrap();\n            let _ = logfd.write(format!($($arg)+).as_bytes());\n            let _ = logfd.write(&[b'\\n']);\n        } else {\n            eprintln!($($arg)+);\n        }\n    };\n}\n\npub type PtyOut<'a> = Option<(&'a mut UnixSlavePty, &'a mut PipeWriter)>;\n\npub fn setup_pty() -> (\n    Box<dyn Read + Send>,\n    PipeReader,\n    (UnixSlavePty, std::io::PipeWriter),\n) {\n    let pty_system = UnixPtySystem::default();\n    let pair = pty_system\n        .openpty(PtySize {\n            rows: 24, // Standard terminal size\n            cols: 80, // Standard terminal size\n            ..Default::default()\n        })\n        .expect(\"Unable to open pty\");\n\n    // TODO: There's no way to handle stdin\n    let pty_reader = pair\n        .master\n        .try_clone_reader()\n        .expect(\"Unable to clone pty reader\");\n\n    let (log_reader, log_writer) = std::io::pipe().expect(\"Failed to create log pipe\");\n    let pipes = (pair.slave, log_writer);\n    (pty_reader, log_reader, pipes)\n}\n\npub fn flush_pty(logger: &mut PtyOut) {\n    let Some((pty, file)) = logger else {\n        return;\n    };\n    // Not sure if flush actually working\n    let _ = pty.flush();\n    std::thread::sleep(Duration::from_millis(10));\n    let _ = file.flush();\n}\n\npub fn spawn_to_pipe(command: &mut Command, stdout_pipe: &PtyOut) -> Result<Child, Error> {\n    match stdout_pipe {\n        Some(stdout) => stdout.0.spawn_command(command.into()),\n        None => Ok(command.spawn()?),\n    }\n}\n\n//\n// based on portable-pty crate\n// copied here since it isn't flexible enough\n//\n\n#[derive(Default)]\npub struct UnixPtySystem {}\n\n/// Represents the size of the visible display area in the pty\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub struct PtySize {\n    /// The number of lines of text\n    pub rows: u16,\n    /// The number of columns of text\n    pub cols: u16,\n    /// The width of a cell in pixels.  Note that some systems never\n    /// fill this value and ignore it.\n    pub pixel_width: u16,\n    /// The height of a cell in pixels.  Note that some systems never\n    /// fill this value and ignore it.\n    pub pixel_height: u16,\n}\n\nimpl Default for PtySize {\n    fn default() -> Self {\n        PtySize {\n            rows: 24,\n            cols: 80,\n            pixel_width: 0,\n            pixel_height: 0,\n        }\n    }\n}\n\nfn openpty(size: PtySize) -> anyhow::Result<(UnixMasterPty, UnixSlavePty)> {\n    let mut master: RawFd = -1;\n    let mut slave: RawFd = -1;\n\n    let mut size = winsize {\n        ws_row: size.rows,\n        ws_col: size.cols,\n        ws_xpixel: size.pixel_width,\n        ws_ypixel: size.pixel_height,\n    };\n\n    let result = unsafe {\n        // BSDish systems may require mut pointers to some args\n        #[allow(clippy::unnecessary_mut_passed)]\n        libc::openpty(\n            &mut master,\n            &mut slave,\n            ptr::null_mut(),\n            ptr::null_mut(),\n            &mut size,\n        )\n    };\n\n    if result != 0 {\n        bail!(\"failed to openpty: {:?}\", io::Error::last_os_error());\n    }\n\n    let master = UnixMasterPty {\n        fd: PtyFd(unsafe { File::from_raw_fd(master) }),\n    };\n    let slave = UnixSlavePty {\n        fd: PtyFd(unsafe { File::from_raw_fd(slave) }),\n    };\n\n    // Ensure that these descriptors will get closed when we execute\n    // the child process.  This is done after constructing the Pty\n    // instances so that we ensure that the Ptys get drop()'d if\n    // the cloexec() functions fail (unlikely!).\n    cloexec(master.fd.as_raw_fd())?;\n    cloexec(slave.fd.as_raw_fd())?;\n\n    Ok((master, slave))\n}\n\npub struct PtyPair {\n    // slave is listed first so that it is dropped first.\n    // The drop order is stable and specified by rust rfc 1857\n    pub slave: UnixSlavePty,\n    pub master: UnixMasterPty,\n}\n\nimpl UnixPtySystem {\n    fn openpty(&self, size: PtySize) -> anyhow::Result<PtyPair> {\n        let (master, slave) = openpty(size)?;\n        Ok(PtyPair {\n            master: master,\n            slave: slave,\n        })\n    }\n}\n\nstruct PtyFd(pub File);\nimpl std::ops::Deref for PtyFd {\n    type Target = File;\n    fn deref(&self) -> &File {\n        &self.0\n    }\n}\n\nimpl Read for PtyFd {\n    fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {\n        match self.0.read(buf) {\n            Err(ref e) if e.raw_os_error() == Some(libc::EIO) => {\n                // EIO indicates that the slave pty has been closed.\n                // Treat this as EOF so that std::io::Read::read_to_string\n                // and similar functions gracefully terminate when they\n                // encounter this condition\n                Ok(0)\n            }\n            x => x,\n        }\n    }\n}\n\nimpl PtyFd {\n    fn resize(&self, size: PtySize) -> Result<(), Error> {\n        let ws_size = winsize {\n            ws_row: size.rows,\n            ws_col: size.cols,\n            ws_xpixel: size.pixel_width,\n            ws_ypixel: size.pixel_height,\n        };\n\n        if unsafe {\n            libc::ioctl(\n                self.0.as_raw_fd(),\n                libc::TIOCSWINSZ as _,\n                &ws_size as *const _,\n            )\n        } != 0\n        {\n            bail!(\n                \"failed to ioctl(TIOCSWINSZ): {:?}\",\n                io::Error::last_os_error()\n            );\n        }\n\n        Ok(())\n    }\n\n    fn get_size(&self) -> Result<PtySize, Error> {\n        let mut size: winsize = unsafe { mem::zeroed() };\n        if unsafe {\n            libc::ioctl(\n                self.0.as_raw_fd(),\n                libc::TIOCGWINSZ as _,\n                &mut size as *mut _,\n            )\n        } != 0\n        {\n            bail!(\n                \"failed to ioctl(TIOCGWINSZ): {:?}\",\n                io::Error::last_os_error()\n            );\n        }\n        Ok(PtySize {\n            rows: size.ws_row,\n            cols: size.ws_col,\n            pixel_width: size.ws_xpixel,\n            pixel_height: size.ws_ypixel,\n        })\n    }\n\n    fn spawn_command(&self, cmd: &mut Command) -> anyhow::Result<std::process::Child> {\n        unsafe {\n            cmd\n                // .stdin(self.as_stdio()?)\n                .stdout(self.try_clone()?)\n                .stderr(self.try_clone()?)\n                .pre_exec(move || {\n                    // Clean up a few things before we exec the program\n                    // Clear out any potentially problematic signal\n                    // dispositions that we might have inherited\n                    for signo in &[\n                        libc::SIGCHLD,\n                        libc::SIGHUP,\n                        libc::SIGINT,\n                        libc::SIGQUIT,\n                        libc::SIGTERM,\n                        libc::SIGALRM,\n                    ] {\n                        libc::signal(*signo, libc::SIG_DFL);\n                    }\n\n                    let empty_set: libc::sigset_t = std::mem::zeroed();\n                    libc::sigprocmask(libc::SIG_SETMASK, &empty_set, std::ptr::null_mut());\n\n                    // Establish ourselves as a session leader.\n                    if libc::setsid() == -1 {\n                        return Err(io::Error::last_os_error());\n                    }\n\n                    Ok(())\n                })\n        };\n\n        let mut child = cmd.spawn()?;\n\n        // Ensure that we close out the slave fds that Child retains;\n        // they are not what we need (we need the master side to reference\n        // them) and won't work in the usual way anyway.\n        // In practice these are None, but it seems best to be move them\n        // out in case the behavior of Command changes in the future.\n        // child.stdin.take();\n        child.stdout.take();\n        child.stderr.take();\n\n        Ok(child)\n    }\n\n    fn flush(&mut self) -> std::io::Result<()> {\n        self.0.flush()\n    }\n}\n\n/// Represents the master end of a pty.\n/// The file descriptor will be closed when the Pty is dropped.\npub struct UnixMasterPty {\n    fd: PtyFd,\n}\n\n/// Represents the slave end of a pty.\n/// The file descriptor will be closed when the Pty is dropped.\npub struct UnixSlavePty {\n    fd: PtyFd,\n}\n\n/// Helper function to set the close-on-exec flag for a raw descriptor\nfn cloexec(fd: RawFd) -> Result<(), Error> {\n    let flags = unsafe { libc::fcntl(fd, libc::F_GETFD) };\n    if flags == -1 {\n        bail!(\n            \"fcntl to read flags failed: {:?}\",\n            io::Error::last_os_error()\n        );\n    }\n    let result = unsafe { libc::fcntl(fd, libc::F_SETFD, flags | libc::FD_CLOEXEC) };\n    if result == -1 {\n        bail!(\n            \"fcntl to set CLOEXEC failed: {:?}\",\n            io::Error::last_os_error()\n        );\n    }\n    Ok(())\n}\n\nimpl UnixSlavePty {\n    fn spawn_command(&self, builder: &mut Command) -> Result<std::process::Child, Error> {\n        Ok(self.fd.spawn_command(builder)?)\n    }\n    fn flush(&mut self) -> Result<(), anyhow::Error> {\n        Ok(self.fd.flush()?)\n    }\n}\n\nimpl UnixMasterPty {\n    #[allow(unused)]\n    fn resize(&self, size: PtySize) -> Result<(), Error> {\n        self.fd.resize(size)\n    }\n\n    #[allow(unused)]\n    fn get_size(&self) -> Result<PtySize, Error> {\n        self.fd.get_size()\n    }\n\n    fn try_clone_reader(&self) -> Result<Box<dyn Read + Send>, Error> {\n        let fd = PtyFd(self.fd.try_clone()?);\n        Ok(Box::new(fd))\n    }\n}\n"
  },
  {
    "path": "src/cook/script.rs",
    "content": "// Scripts here is executed using \"cookbook_redoxer env\" where CC, RUSTFLAGS, etc. defined.\n// Look up redoxer env script if you want to see how they work.\n\npub(crate) static SHARED_PRESCRIPT: &str = r#\"\n# Build dynamically\nfunction DYNAMIC_INIT {\n    case \"${TARGET}\" in\n        \"i586-unknown-redox\" | \"riscv64gc-unknown-redox\")\n            [ -z \"${COOKBOOK_VERBOSE}\" ] || echo \"WARN: ${TARGET} does not support dynamic linking.\" >&2\n            return\n            ;;\n    esac\n\n    [ -z \"${COOKBOOK_VERBOSE}\" ] || echo \"DEBUG: Program is being compiled dynamically.\"\n\n    COOKBOOK_CONFIGURE_FLAGS=(\n        --host=\"${GNU_TARGET}\"\n        --prefix=\"/usr\"\n        --enable-shared\n        --disable-static\n    )\n\n    COOKBOOK_CMAKE_FLAGS=(\n        -DBUILD_SHARED_LIBS=True\n        -DENABLE_SHARED=True\n        -DENABLE_STATIC=False\n    )\n\n    COOKBOOK_MESON_FLAGS=(\n        --buildtype release\n        --wrap-mode nofallback\n        -Ddefault_library=shared\n        -Dprefix=/usr\n    )\n\n    # TODO: check paths for spaces\n    export LDFLAGS=\"${USER_LDFLAGS}-Wl,-rpath-link,${COOKBOOK_SYSROOT}/lib -L${COOKBOOK_SYSROOT}/lib\"\n    export RUSTFLAGS=\"-C target-feature=-crt-static -L native=${COOKBOOK_SYSROOT}/lib -C link-arg=-Wl,-rpath-link,${COOKBOOK_SYSROOT}/lib\"\n    export COOKBOOK_DYNAMIC=1\n\n    if [ function = $(type -t reexport_flags) ]; then\n        reexport_flags\n    fi\n}\n\nCOOKBOOK_AUTORECONF=\"autoreconf\"\nautotools_recursive_regenerate() {\n    for f in $(find . -name configure.ac -o -name configure.in -type f | sort); do\n        echo \"* autotools regen in '$(dirname $f)'...\"\n        ( cd \"$(dirname \"$f\")\" && \"${COOKBOOK_AUTORECONF}\" -fvi \"$@\" -I${COOKBOOK_HOST_SYSROOT}/share/aclocal )\n    done\n}\n\n# Build both dynamically and statically\nfunction DYNAMIC_STATIC_INIT {\n    DYNAMIC_INIT\n    if [ \"${COOKBOOK_DYNAMIC}\" == \"1\" ]\n    then\n        COOKBOOK_CONFIGURE_FLAGS=(\n            --host=\"${GNU_TARGET}\"\n            --prefix=\"/usr\"\n            --enable-shared\n            --enable-static\n        )\n\n        COOKBOOK_CMAKE_FLAGS=(\n            -DBUILD_SHARED_LIBS=True\n            -DENABLE_SHARED=True\n            -DENABLE_STATIC=True\n        )\n\n        COOKBOOK_MESON_FLAGS=(\n            --buildtype release\n            --wrap-mode nofallback\n            -Ddefault_library=both\n            -Dprefix=/usr\n        )\n    fi\n}\n\nfunction GNU_CONFIG_GET {\n  wget -O \"$1\" \"https://gitlab.redox-os.org/redox-os/gnu-config/-/raw/master/config.sub?inline=false\"\n}\n\"#;\n\npub(crate) static BUILD_PRESCRIPT: &str = r#\"\n# Add cookbook bins to path\nexport PATH=\"${COOKBOOK_ROOT}/bin:${PATH}\"\n\n# Add toolchain dir to path if exists\nif [ ! -z \"${COOKBOOK_TOOLCHAIN}\" ]\nthen\nexport PATH=\"${COOKBOOK_TOOLCHAIN}/bin:${PATH}\"\nexport LD_LIBRARY_PATH=\"${COOKBOOK_TOOLCHAIN}/lib:${LD_LIBRARY_PATH}\"\nfi\n\n# This puts cargo build artifacts in the build directory\nexport CARGO_TARGET_DIR=\"${COOKBOOK_BUILD}/target\"\n\n# This adds the sysroot includes for most C compilation\n#TODO: check paths for spaces!\nexport CPPFLAGS=\"${CPPFLAGS:+$CPPFLAGS }-I${COOKBOOK_SYSROOT}/include\"\n\n# This adds the sysroot libraries and compiles binaries statically for most C compilation\n#TODO: check paths for spaces!\nUSER_LDFLAGS=\"${LDFLAGS:+$LDFLAGS }\"\nexport LDFLAGS=\"${USER_LDFLAGS}-L${COOKBOOK_SYSROOT}/lib --static\"\n\n# This reexport C variables into custom build script that can be consumed by cc crate\nfunction reexport_flags {\n    target=${TARGET//-/_}\n    export CFLAGS_${target}=\"${CFLAGS:+$CFLAGS }${CPPFLAGS}\"\n    export CXXFLAGS_${target}=\"${CXXFLAGS:+$CXXFLAGS }${CPPFLAGS}\"\n    export LDFLAGS_${target}=\"${LDFLAGS}\"\n}\n\n# These ensure that pkg-config gets the right flags from the sysroot\nif [ \"${TARGET}\" != \"${COOKBOOK_HOST_TARGET}\" ]\nthen\n    export PKG_CONFIG_ALLOW_CROSS=1\n    export PKG_CONFIG_PATH=\n    export PKG_CONFIG_LIBDIR=\"${COOKBOOK_SYSROOT}/lib/pkgconfig\"\n    export PKG_CONFIG_SYSROOT_DIR=\"${COOKBOOK_SYSROOT}\"\nfi\n\n# To build the debug version of a Cargo program, add COOKBOOK_DEBUG=true, and\n# to not strip symbols from the final package, add COOKBOOK_NOSTRIP=true to the recipe\n# (or to your environment) before calling cookbook_cargo or cookbook_cargo_packages\nbuild_type=release\ninstall_flags=--no-track\nbuild_flags=--release\nif [ ! -z \"${COOKBOOK_DEBUG}\" ]\nthen\n    install_flags+=\" --debug\"\n    build_flags=\n    build_type=debug\n    export CPPFLAGS=\"${CPPFLAGS} -g\"\nfi\n\nif [ ! -z \"${COOKBOOK_OFFLINE}\" ]\nthen\nbuild_flags+=\" --offline\"\ninstall_flags+=\" --offline\"\nfi\n\nreexport_flags\n\nCOOKBOOK_CARGO=\"${COOKBOOK_REDOXER}\"\nCOOKBOOK_CARGO_FLAGS=(\n    --locked\n)\n# cargo template using cargo install\nfunction cookbook_cargo {\n    \"${COOKBOOK_CARGO}\" install \\\n        --path \"${COOKBOOK_SOURCE}${COOKBOOK_CARGO_PATH:+/$COOKBOOK_CARGO_PATH}\" \\\n        --root \"${COOKBOOK_STAGE}/usr\" \\\n        -j \"${COOKBOOK_MAKE_JOBS}\" ${install_flags} \\\n        ${COOKBOOK_CARGO_FLAGS[@]} \"$@\"\n}\n\n# cargo template using cargo build (prefixed name)\nfunction cookbook_cargo_build {\n    recipe=\"${recipe:-$(basename \"${COOKBOOK_RECIPE}\")}\"\n    bin_dir=\"${bin_dir:-.}\"\n    bin_flags=\"${bin_flags:-}\"\n    bin_name=\"${bin_name:-$(basename \"${COOKBOOK_CARGO_PATH}\")}\"\n    bin_final_name=\"${bin_final_name:-${recipe}_${bin_name//_/-}}\"\n    mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n    \"${COOKBOOK_CARGO}\" build \\\n        --manifest-path \"${COOKBOOK_SOURCE}${COOKBOOK_CARGO_PATH:+/$COOKBOOK_CARGO_PATH}/Cargo.toml\" \\\n        ${bin_flags} ${build_flags} -j \"${COOKBOOK_MAKE_JOBS}\" ${COOKBOOK_CARGO_FLAGS[@]}\n    cp -v \\\n        \"target/${TARGET}/${build_type}/${bin_dir}/${bin_name}\" \\\n        \"${COOKBOOK_STAGE}/usr/bin/${bin_final_name}\"\n    unset bin_name bin_flags bin_dir bin_final_name\n}\n\n# helper for installing binaries that are cargo examples\nfunction cookbook_cargo_examples {\n    recipe=\"$(basename \"${COOKBOOK_RECIPE}\")\"\n    for example in \"$@\"\n    do\n        bin_dir=\"examples\" bin_name=\"${example}\" bin_flags=\"--example ${example}\" cookbook_cargo_build\n    done\n}\n\n# helper for installing binaries that are cargo packages\nfunction cookbook_cargo_packages {\n    recipe=\"$(basename \"${COOKBOOK_RECIPE}\")\"\n    mkdir -pv \"${COOKBOOK_STAGE}/usr/bin\"\n    for package in \"$@\"\n    do\n        bin_name=\"${package}\" bin_flags=\"--package ${package}\" bin_final_name=\"${package//_/-}\" cookbook_cargo_build\n    done\n}\n\n# configure template\nCOOKBOOK_CONFIGURE=\"${COOKBOOK_SOURCE}/configure\"\nCOOKBOOK_CONFIGURE_FLAGS=(\n    --host=\"${GNU_TARGET}\"\n    --prefix=\"/usr\"\n    --disable-shared\n    --enable-static\n)\nCOOKBOOK_MAKE=\"make\"\n\nfunction cookbook_configure {\n    \"${COOKBOOK_CONFIGURE}\" \"${COOKBOOK_CONFIGURE_FLAGS[@]}\" \"$@\"\n    \"${COOKBOOK_MAKE}\" -j \"${COOKBOOK_MAKE_JOBS}\"\n    \"${COOKBOOK_MAKE}\" install DESTDIR=\"${COOKBOOK_STAGE}\"\n}\n\nCOOKBOOK_CMAKE=\"cmake\"\nCOOKBOOK_NINJA=\"ninja\"\nCOOKBOOK_CMAKE_FLAGS=(\n    -DBUILD_SHARED_LIBS=False\n    -DENABLE_SHARED=False\n    -DENABLE_STATIC=True\n)\n\nfunction generate_cookbook_cmake_file {\n    target=$1\n    gcc_prefix=$2\n    sysroot=$3\n    file=$4\n    arch=$(echo \"$target\" | cut -d - -f1)\n    os=$(echo \"$target\" | cut -d - -f3)\n\n    if [ \"$os\" = \"linux\" ]; then\n        SYSTEM_NAME=\"Linux\"\n    else\n        SYSTEM_NAME=\"UnixPaths\"\n    fi\n\n    cat > $file <<EOF\nset(CMAKE_AR ${gcc_prefix}ar)\nset(CMAKE_CXX_COMPILER ${gcc_prefix}g++)\nset(CMAKE_C_COMPILER ${gcc_prefix}gcc)\nset(CMAKE_FIND_ROOT_PATH ${sysroot})\nset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\nset(CMAKE_PLATFORM_USES_PATH_WHEN_NO_SONAME 1)\nset(CMAKE_PREFIX_PATH, ${sysroot})\nset(CMAKE_RANLIB ${gcc_prefix}ranlib)\nset(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG \"-Wl,-soname,\")\nset(CMAKE_SYSTEM_NAME ${SYSTEM_NAME})\nset(CMAKE_SYSTEM_PROCESSOR ${arch})\nEOF\n\n    if [ \"$target\" = \"$TARGET\" ]\n    then\n        echo \"set(CMAKE_C_FLAGS \\\"${CFLAGS} ${CPPFLAGS}\\\")\" >> $file\n        echo \"set(CMAKE_CXX_FLAGS \\\"${CFLAGS} ${CPPFLAGS}\\\")\" >> $file\n    fi\n\n    if [ -n \"${CC_WRAPPER}\" ]\n    then\n        echo \"set(CMAKE_C_COMPILER_LAUNCHER ${CC_WRAPPER})\" >> $file\n        echo \"set(CMAKE_CXX_COMPILER_LAUNCHER ${CC_WRAPPER})\" >> $file\n    fi\n}\n\nfunction cookbook_cmake {\n\n    generate_cookbook_cmake_file $TARGET $GNU_TARGET- \"$COOKBOOK_SYSROOT\" cross_file.cmake\n\n    \"${COOKBOOK_CMAKE}\" \"${COOKBOOK_SOURCE}\" \\\n        -DCMAKE_BUILD_TYPE=Release \\\n        -DCMAKE_CROSSCOMPILING=True \\\n        -DCMAKE_INSTALL_INCLUDEDIR=include \\\n        -DCMAKE_INSTALL_LIBDIR=lib \\\n        -DCMAKE_INSTALL_OLDINCLUDEDIR=/include \\\n        -DCMAKE_INSTALL_PREFIX=/usr \\\n        -DCMAKE_INSTALL_SBINDIR=bin \\\n        -DCMAKE_TOOLCHAIN_FILE=cross_file.cmake \\\n        -GNinja \\\n        -Wno-dev \\\n        \"${COOKBOOK_CMAKE_FLAGS[@]}\" \\\n        \"$@\"\n\n    \"${COOKBOOK_NINJA}\" -j\"${COOKBOOK_MAKE_JOBS}\"\n    DESTDIR=\"${COOKBOOK_STAGE}\" \"${COOKBOOK_NINJA}\" install -j\"${COOKBOOK_MAKE_JOBS}\"\n}\n\nCOOKBOOK_MESON=\"meson\"\nCOOKBOOK_MESON_FLAGS=(\n    --buildtype release\n    --wrap-mode nofallback\n    -Ddefault_library=static\n    -Dprefix=/usr\n)\nfunction cookbook_meson {\n    # TODO: do this in rust, to handle path spaces as well\n    function format_flags {\n        local flags=($1)\n        local formatted=\"\"\n        for i in \"${!flags[@]}\"; do\n            formatted+=\"'${flags[$i]}'\"\n            if [ $i -lt $((${#flags[@]} - 1)) ]; then\n                formatted+=\", \"\n            fi\n        done\n        echo \"$formatted\"\n    }\n\n    echo \"[binaries]\" > cross_file.txt\n    echo \"c = [$(printf \"'%s', \" $CC | sed 's/, $//')]\"  >> cross_file.txt\n    echo \"cpp = [$(printf \"'%s', \" $CXX | sed 's/, $//')]\" >> cross_file.txt\n    echo \"ar = '${AR}'\" >> cross_file.txt\n    echo \"strip = '${STRIP}'\" >> cross_file.txt\n    echo \"pkg-config = '${PKG_CONFIG}'\" >> cross_file.txt\n    echo \"llvm-config = '${TARGET}-llvm-config'\" >> cross_file.txt\n    echo \"glib-compile-resources = 'glib-compile-resources'\" >> cross_file.txt\n    echo \"glib-compile-schemas = 'glib-compile-schemas'\" >> cross_file.txt\n\n    echo \"[host_machine]\" >> cross_file.txt\n    echo \"system = '$(echo \"${TARGET}\" | cut -d - -f3)'\" >> cross_file.txt\n    echo \"cpu_family = '$(echo \"${TARGET}\" | cut -d - -f1)'\" >> cross_file.txt\n    echo \"cpu = '$(echo \"${TARGET}\" | cut -d - -f1)'\" >> cross_file.txt\n    echo \"endian = 'little'\" >> cross_file.txt\n\n    echo \"[built-in options]\" >> cross_file.txt\n    echo \"prefix = '/usr'\" >> cross_file.txt\n    echo \"libdir = 'lib'\" >> cross_file.txt\n    echo \"bindir = 'bin'\" >> cross_file.txt\n    echo \"c_args = [$(format_flags \"$CFLAGS $CPPFLAGS\")]\" >> cross_file.txt\n    echo \"cpp_args = [$(format_flags \"$CXXFLAGS $CPPFLAGS\")]\" >> cross_file.txt\n    echo \"c_link_args = [$(format_flags \"$LDFLAGS\")]\" >> cross_file.txt\n\n    echo \"[properties]\" >> cross_file.txt\n    echo \"needs_exe_wrapper = true\" >> cross_file.txt\n    echo \"sys_root = '${COOKBOOK_SYSROOT}'\" >> cross_file.txt\n\n    unset AR AS CC CXX LD NM OBJCOPY OBJDUMP PKG_CONFIG RANLIB READELF STRIP\n\n    \"${COOKBOOK_MESON}\" setup \\\n        \"${COOKBOOK_SOURCE}\" \\\n        . \\\n        --cross-file cross_file.txt \\\n        \"${COOKBOOK_MESON_FLAGS[@]}\" \\\n        \"$@\"\n    \"${COOKBOOK_NINJA}\" -j\"${COOKBOOK_MAKE_JOBS}\"\n    DESTDIR=\"${COOKBOOK_STAGE}\" \"${COOKBOOK_NINJA}\" install -j\"${COOKBOOK_MAKE_JOBS}\"\n}\n\"#;\n\npub(crate) static BUILD_POSTSCRIPT: &str = r#\"\n# Strip binaries\nfor dir in \"${COOKBOOK_STAGE}/bin\" \"${COOKBOOK_STAGE}/usr/bin\" \"${COOKBOOK_STAGE}/libexec\" \"${COOKBOOK_STAGE}/usr/libexec\"\ndo\n    if [ -d \"${dir}\" ] && [ -z \"${COOKBOOK_NOSTRIP}\" ]\n    then\n        find \"${dir}\" -type f -exec \"${GNU_TARGET}-strip\" -v {} ';'\n    fi\ndone\n\n# Remove libtool files\nfor dir in \"${COOKBOOK_STAGE}/lib\" \"${COOKBOOK_STAGE}/usr/lib\"\ndo\n    if [ -d \"${dir}\" ]\n    then\n        find \"${dir}\" -type f -name '*.la' -exec rm -fv {} ';'\n    fi\ndone\n\n# Remove cargo install files\nfor file in .crates.toml .crates2.json\ndo\n    if [ -f \"${COOKBOOK_STAGE}/${file}\" ]\n    then\n        rm -v \"${COOKBOOK_STAGE}/${file}\"\n    fi\ndone\n\n# Add pkgname to appstream metadata\nfor dir in \"${COOKBOOK_STAGE}/share/metainfo\" \"${COOKBOOK_STAGE}/usr/share/metainfo\"\ndo\n    if [ -d \"${dir}\" ]\n    then\n        find \"${dir}\" -type f -name '*.xml' -exec sed -i 's|</component>|<pkgname>'\"${COOKBOOK_NAME}\"'</pkgname></component>|g' {} ';'\n    fi\ndone\n\"#;\n\npub(crate) static GIT_RESET_BRANCH: &str = r#\"\nORIGIN_BRANCH=\"$(git branch --remotes | grep '^  origin/HEAD -> ' | cut -d ' ' -f 5-)\"\nif [ -n \"$BRANCH\" ]\nthen\n    ORIGIN_BRANCH=\"origin/$BRANCH\"\nfi\n\nif [ \"$(git rev-parse HEAD)\" != \"$(git rev-parse $ORIGIN_BRANCH)\" ]\nthen\n    git checkout -B \"$(echo \"$ORIGIN_BRANCH\" | cut -d / -f 2-)\" \"$ORIGIN_BRANCH\"\nfi\"#;\n\npub static KILL_ALL_PID: &str = r#\"\nTHISPID=$$\nCHILDREN=$(ps -o pid= --ppid $PID | grep -v $THISPID);\n\nALL_DESCENDANTS='';\n\nwhile [ -n \"$CHILDREN\" ]; do\n    ALL_DESCENDANTS=\"$ALL_DESCENDANTS $CHILDREN\";\n    CHILDREN=$(ps -o pid= --ppid $(echo $CHILDREN) | tr '\\n' ' ');\ndone;\n\nif [ -n \"$ALL_DESCENDANTS\" ]; then\n    kill -9 $ALL_DESCENDANTS;\nfi\n\"#;\n"
  },
  {
    "path": "src/cook/tree.rs",
    "content": "use anyhow::Context;\nuse pkg::{Package, PackageName};\nuse std::fmt::Write as _;\nuse std::{\n    collections::{HashMap, HashSet},\n    fs::read_to_string,\n    path::PathBuf,\n};\n\nuse crate::recipe::CookRecipe;\n\npub enum WalkTreeEntry<'a> {\n    Built(&'a PathBuf, u64),\n    NotBuilt,\n    Deduped,\n    Missing,\n}\n\npub fn display_tree_entry(\n    package_name: &PackageName,\n    recipe_map: &HashMap<&PackageName, &CookRecipe>,\n    prefix: &str,\n    is_last: bool,\n    is_build_tree: bool,\n    visited: &mut HashSet<PackageName>,\n    total_size: &mut u64,\n    total_count: &mut u64,\n) -> anyhow::Result<()> {\n    walk_tree_entry(\n        package_name,\n        recipe_map,\n        prefix,\n        is_last,\n        is_build_tree,\n        visited,\n        total_size,\n        total_count,\n        display_pkg_fn,\n    )\n}\n\npub fn walk_tree_entry(\n    package_name: &PackageName,\n    recipe_map: &HashMap<&PackageName, &CookRecipe>,\n    prefix: &str,\n    is_last: bool,\n    is_build_tree: bool,\n    visited: &mut HashSet<PackageName>,\n    total_size: &mut u64,\n    total_count: &mut u64,\n    op: fn(&PackageName, &str, bool, &WalkTreeEntry) -> anyhow::Result<bool>,\n) -> anyhow::Result<()> {\n    let cook_recipe = match recipe_map.get(package_name) {\n        Some(r) => r,\n        None => {\n            // Data not provided, will not be processed by the build system\n            op(package_name, prefix, is_last, &WalkTreeEntry::Missing)?;\n            return Ok(());\n        }\n    };\n\n    let (_, pkg_path, pkg_toml) = cook_recipe.stage_paths();\n\n    let deduped = visited.contains(package_name);\n    let entry = match (std::fs::metadata(&pkg_path), deduped) {\n        (_, true) => WalkTreeEntry::Deduped,\n        (Ok(meta), _) => WalkTreeEntry::Built(&pkg_path, meta.len()),\n        (Err(_), _) => WalkTreeEntry::NotBuilt,\n    };\n\n    let cached = op(package_name, prefix, is_last, &entry)?;\n\n    if deduped || cached {\n        return Ok(());\n    }\n\n    visited.insert(package_name.clone());\n    if !cached {\n        if is_build_tree {\n            if matches!(entry, WalkTreeEntry::NotBuilt) {\n                *total_size += 1;\n            }\n        } else {\n            if let WalkTreeEntry::Built(_p, pkg_size) = &entry {\n                *total_size += pkg_size;\n            }\n        }\n        *total_count += 1;\n    }\n    let pkg_meta: Package;\n\n    let mut all_deps_set: HashSet<&PackageName> = HashSet::new();\n    if is_build_tree {\n        all_deps_set.extend(cook_recipe.recipe.build.dependencies.iter());\n        all_deps_set.extend(cook_recipe.recipe.package.dependencies.iter());\n    } else {\n        if let Ok(pkg_toml_str) = read_to_string(&pkg_toml) {\n            // more accurate with auto deps\n            pkg_meta = toml::from_str(&pkg_toml_str)\n                .context(format!(\"Unable to parse {}\", pkg_toml.display()))?;\n            all_deps_set.extend(pkg_meta.depends.iter());\n        }\n    }\n\n    if all_deps_set.is_empty() {\n        return Ok(());\n    }\n\n    let sorted_deps: Vec<&PackageName> = all_deps_set.into_iter().collect();\n    let deps_count = sorted_deps.len();\n    let child_prefix = if is_last { \"    \" } else { \"│   \" };\n    for (i, dep_name) in sorted_deps.iter().enumerate() {\n        walk_tree_entry(\n            dep_name,\n            recipe_map,\n            &format!(\"{}{}\", prefix, child_prefix),\n            i == deps_count - 1,\n            is_build_tree,\n            visited,\n            total_size,\n            total_count,\n            op,\n        )?;\n    }\n\n    Ok(())\n}\n\npub fn display_pkg_fn(\n    package_name: &PackageName,\n    prefix: &str,\n    is_last: bool,\n    entry: &WalkTreeEntry,\n) -> anyhow::Result<bool> {\n    let size_str = match entry {\n        WalkTreeEntry::Built(_path_buf, size) => format!(\"[{}]\", format_size(*size)),\n        WalkTreeEntry::NotBuilt => \"(not built)\".to_string(),\n        WalkTreeEntry::Deduped => \"\".to_string(),\n        WalkTreeEntry::Missing => \"(omitted)\".to_string(),\n    };\n    let line_prefix = if is_last { \"└── \" } else { \"├── \" };\n    println!(\"{}{}{} {}\", prefix, line_prefix, package_name, size_str);\n    // TODO: check dirty build by checking source ident\n    Ok(false)\n}\n\npub fn walk_file_tree(dir: &PathBuf, prefix: &str, buffer: &mut String) -> std::io::Result<u64> {\n    if !dir.is_dir() {\n        return Ok(0);\n    }\n    let fmt_err = std::io::Error::other;\n    let entries: Vec<_> = std::fs::read_dir(dir)?.filter_map(|e| e.ok()).collect();\n    let mut total_size = 0;\n    for (index, entry) in entries.iter().enumerate() {\n        let path = entry.path();\n        let metadata = entry.metadata()?;\n        let is_last = index == entries.len() - 1;\n\n        let line_prefix = if is_last { \"└── \" } else { \"├── \" };\n        let file_name = path\n            .file_name()\n            .and_then(|n| n.to_str())\n            .unwrap_or(\"Unknown\");\n\n        if path.is_dir() {\n            writeln!(buffer, \"{}{}{}/\", prefix, line_prefix, file_name).map_err(fmt_err)?;\n            let new_prefix = format!(\"{}{}\", prefix, if is_last { \"    \" } else { \"│   \" });\n            walk_file_tree(&path, &new_prefix, buffer)?;\n        } else {\n            let size = metadata.len();\n            total_size += size;\n            writeln!(\n                buffer,\n                \"{}{}{} ({})\",\n                prefix,\n                line_prefix,\n                file_name,\n                format_size(size)\n            )\n            .map_err(fmt_err)?;\n        }\n    }\n\n    Ok(total_size)\n}\n\npub fn format_size(bytes: u64) -> String {\n    if bytes == 0 {\n        return \"0 B\".to_string();\n    }\n    const UNITS: [&str; 5] = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\"];\n    let i = (bytes as f64).log(1024.0).floor() as usize;\n    let size = bytes as f64 / 1024.0_f64.powi(i as i32);\n    format!(\"{:.2} {}\", size, UNITS[i])\n}\n"
  },
  {
    "path": "src/cook.rs",
    "content": "// avoid confusion with build.rs\npub mod cook_build;\npub mod fetch;\npub mod fetch_repo;\npub mod fs;\npub mod ident;\npub mod package;\npub mod pty;\npub mod script;\npub mod tree;\n"
  },
  {
    "path": "src/lib.rs",
    "content": "pub mod blake3;\npub mod config;\npub mod cook;\npub mod recipe;\npub mod web;\n\nmod progress_bar;\n\n/// Default for maximum number of levels to descend down dependencies tree.\npub const WALK_DEPTH: usize = 16;\n\n/// Default remote package source, for recipes with build type = \"remote\"\npub const REMOTE_PKG_SOURCE: &str = \"https://static.redox-os.org/pkg\";\n\npub fn is_redox() -> bool {\n    cfg!(target_os = \"redox\")\n}\n\n// Errors\n\nuse std::io;\nuse std::path::PathBuf;\n\n#[derive(Debug)]\npub enum Error {\n    Io {\n        source: io::Error,\n        path: Option<PathBuf>,\n        context: &'static str,\n    },\n    Package(pkg::PackageError),\n    Pkgar(pkgar::Error),\n    Other(String),\n}\n\nmacro_rules! wrap_io_err {\n    ($context:expr) => {\n        |source| crate::Error::Io {\n            source,\n            path: None,\n            context: $context,\n        }\n    };\n    ($path:expr, $context:expr) => {\n        |source| crate::Error::Io {\n            source,\n            path: Some($path.to_path_buf()),\n            context: $context,\n        }\n    };\n}\n\nimpl From<String> for Error {\n    fn from(value: String) -> Self {\n        Error::Other(value)\n    }\n}\n\nimpl From<pkg::PackageError> for Error {\n    fn from(value: pkg::PackageError) -> Self {\n        Error::Package(value)\n    }\n}\n\nimpl From<pkgar::Error> for Error {\n    fn from(value: pkgar::Error) -> Self {\n        match value {\n            pkgar::Error::Io {\n                source,\n                path,\n                context,\n            } => Error::Io {\n                source,\n                path,\n                context,\n            },\n            _ => Error::Pkgar(value),\n        }\n    }\n}\n\npub(crate) type Result<T> = std::result::Result<T, Error>;\n\npub(crate) use wrap_io_err;\n"
  },
  {
    "path": "src/progress_bar.rs",
    "content": "pub use pbr::ProgressBar;\n\nuse std::io::{Read, Result, Write};\n\npub struct ProgressBarRead<'p, 'r, P: Write + 'p, R: Read + 'r> {\n    pb: &'p mut ProgressBar<P>,\n    r: &'r mut R,\n}\n\nimpl<'p, 'r, P: Write, R: Read> ProgressBarRead<'p, 'r, P, R> {\n    pub fn new(pb: &'p mut ProgressBar<P>, r: &'r mut R) -> ProgressBarRead<'p, 'r, P, R> {\n        ProgressBarRead { pb, r }\n    }\n}\n\nimpl<'p, 'r, P: Write, R: Read> Read for ProgressBarRead<'p, 'r, P, R> {\n    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {\n        let count = self.r.read(buf)?;\n        self.pb.add(count as u64);\n        Ok(count)\n    }\n}\n"
  },
  {
    "path": "src/recipe.rs",
    "content": "use std::{\n    collections::BTreeSet,\n    convert::TryInto,\n    fs,\n    path::{Path, PathBuf},\n};\n\nuse pkg::{PackageError, PackageName, recipes};\nuse regex::Regex;\nuse serde::{Deserialize, Serialize};\n\nuse crate::{WALK_DEPTH, cook::package as cook_package};\n\n/// Specifies how to download the source for a recipe\n#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]\n#[serde(untagged)]\npub enum SourceRecipe {\n    /// Reuse the source directory of another package\n    ///\n    /// This is useful when a single source repo contains multiple projects which each have their\n    /// own recipe to build them.\n    SameAs {\n        /// Relative path to the package for which to reuse the source dir\n        same_as: String,\n    },\n    /// Path source\n    Path {\n        /// The path to the source\n        path: String,\n    },\n    /// A git repository source\n    Git {\n        /// The URL for the git repository, such as https://gitlab.redox-os.org/redox-os/ion.git\n        git: String,\n        /// The URL for an upstream repository\n        upstream: Option<String>,\n        /// The optional branch of the git repository to track, such as master. Please specify to\n        /// make updates to the rev easier\n        branch: Option<String>,\n        /// The optional revision of the git repository to use for builds. Please specify for\n        /// reproducible builds\n        rev: Option<String>,\n        /// The optional config to clone with treeless clone. Default is true if \"rev\" added\n        shallow_clone: Option<bool>,\n        /// A list of patch files to apply to the source\n        #[serde(default)]\n        patches: Vec<String>,\n        /// Optional script to run to prepare the source\n        script: Option<String>,\n    },\n    /// A tar file source\n    Tar {\n        /// The URL of a tar source\n        tar: String,\n        /// The optional blake3 sum of the tar file. Please specify this to make reproducible\n        /// builds more reliable\n        blake3: Option<String>,\n        /// A list of patch files to apply to the source\n        #[serde(default)]\n        patches: Vec<String>,\n        /// Optional script to run to prepare the source, such as ./autogen.sh\n        script: Option<String>,\n    },\n}\n\n/// Specifies how to build a recipe\n#[derive(Debug, Clone, Deserialize, PartialEq, Serialize)]\n#[serde(tag = \"template\")]\npub enum BuildKind {\n    /// Will not build (for meta packages)\n    #[serde(rename = \"none\")]\n    None,\n    /// Will download compiled package from remote\n    #[serde(rename = \"remote\")]\n    Remote,\n    /// Will build and install using cargo\n    #[serde(rename = \"cargo\")]\n    Cargo {\n        #[serde(default)]\n        cargopath: Option<String>,\n        #[serde(default)]\n        cargoflags: Vec<String>,\n        #[serde(default)]\n        cargopackages: Vec<String>,\n        #[serde(default)]\n        cargoexamples: Vec<String>,\n    },\n    /// Will build and install using configure and make\n    #[serde(rename = \"configure\")]\n    Configure {\n        #[serde(default)]\n        configureflags: Vec<String>,\n    },\n    /// Will build and install using cmake\n    #[serde(rename = \"cmake\")]\n    Cmake {\n        #[serde(default)]\n        cmakeflags: Vec<String>,\n    },\n    /// Will build and install using meson\n    #[serde(rename = \"meson\")]\n    Meson {\n        #[serde(default)]\n        mesonflags: Vec<String>,\n    },\n    /// Will build and install using custom commands\n    #[serde(rename = \"custom\")]\n    Custom { script: String },\n}\n\nimpl Default for BuildKind {\n    fn default() -> Self {\n        BuildKind::None\n    }\n}\n\n#[derive(Debug, Clone, Default, Deserialize, PartialEq, Serialize)]\n#[serde(default)]\npub struct BuildRecipe {\n    #[serde(flatten)]\n    pub kind: BuildKind,\n    pub dependencies: Vec<PackageName>,\n    #[serde(rename = \"dev-dependencies\")]\n    pub dev_dependencies: Vec<PackageName>,\n}\n\n#[derive(Debug, Clone, Default, Deserialize, PartialEq, Serialize)]\n#[serde(default)]\npub struct PackageRecipe {\n    pub dependencies: Vec<PackageName>,\n    pub version: Option<String>,\n    pub description: Option<String>,\n}\n\n#[derive(Debug, Clone, Default, Deserialize, PartialEq, Serialize)]\n#[serde(default)]\npub struct OptionalPackageRecipe {\n    pub name: String,\n    pub dependencies: Vec<PackageName>,\n    pub files: Vec<String>,\n}\n\n/// Everything required to build a Redox package\n#[derive(Debug, Clone, Default, Deserialize, PartialEq, Serialize)]\n#[serde(default)]\npub struct Recipe {\n    /// Specifies how to download the source for this recipe\n    pub source: Option<SourceRecipe>,\n    /// Specifies how to build this recipe\n    pub build: BuildRecipe,\n    /// Specifies how to package this recipe\n    pub package: PackageRecipe,\n    /// Specifies optional packages based from this recipe\n    #[serde(rename = \"optional-packages\")]\n    pub optional_packages: Vec<OptionalPackageRecipe>,\n}\n\nimpl BuildRecipe {\n    pub fn new(kind: BuildKind) -> Self {\n        let mut build = Self::default();\n        build.kind = kind;\n        build\n    }\n\n    pub fn set_as_remote(&mut self) {\n        if self.kind == BuildKind::None {\n            // BuildKind::Remote won't handle remote meta-packages\n            return;\n        }\n        self.kind = BuildKind::Remote;\n        self.dev_dependencies = Vec::new();\n    }\n\n    pub fn set_as_none(&mut self) {\n        self.kind = BuildKind::None;\n        self.dependencies = Vec::new();\n        self.dev_dependencies = Vec::new();\n    }\n}\n\n#[derive(Debug, Clone, PartialEq)]\npub struct CookRecipe {\n    pub name: PackageName,\n    pub dir: PathBuf,\n    pub recipe: Recipe,\n    pub target: &'static str,\n    /// If false, it's listed on install config\n    pub is_deps: bool,\n    pub rule: String,\n}\n\nimpl Recipe {\n    pub fn new(file: &PathBuf) -> Result<Recipe, PackageError> {\n        if !file.is_file() {\n            return Err(PackageError::FileMissing(file.clone()));\n        }\n        let toml = fs::read_to_string(&file)\n            .map_err(|err| PackageError::FileError(err.raw_os_error(), file.clone()))?;\n        let recipe: Recipe =\n            toml::from_str(&toml).map_err(|err| PackageError::Parse(err, Some(file.clone())))?;\n        Ok(recipe)\n    }\n\n    pub fn get_packages_list(&self) -> Vec<Option<&OptionalPackageRecipe>> {\n        let mut packages: Vec<Option<&OptionalPackageRecipe>> =\n            self.optional_packages.iter().map(|p| Some(p)).collect();\n        // the mandatory package, put last because of cook_build\n        packages.push(None);\n        packages\n    }\n}\n\nimpl CookRecipe {\n    pub fn new(name: PackageName, dir: PathBuf, mut recipe: Recipe) -> Result<Self, PackageError> {\n        let target = cook_package::package_target(&name);\n        if name.is_host() {\n            let thisname = name.name();\n            let fn_map = |p: PackageName| {\n                if p.is_host() {\n                    if p.name() == thisname { None } else { Some(p) }\n                } else if p.is_target() {\n                    None\n                } else {\n                    Some(p.with_host())\n                }\n            };\n            recipe.build.dependencies = recipe\n                .build\n                .dependencies\n                .into_iter()\n                .filter_map(fn_map)\n                .collect();\n            recipe.build.dev_dependencies = recipe\n                .build\n                .dev_dependencies\n                .into_iter()\n                .filter_map(fn_map)\n                .collect();\n        }\n        Ok(Self {\n            name,\n            dir,\n            recipe,\n            target,\n            is_deps: false,\n            rule: \"\".into(),\n        })\n    }\n\n    pub fn from_name(name: PackageName) -> Result<Self, PackageError> {\n        let dir = recipes::find(name.name())\n            .ok_or_else(|| PackageError::PackageNotFound(name.clone()))?;\n        let file = dir.join(\"recipe.toml\");\n        let recipe = Recipe::new(&file)?;\n        Self::new(name, dir.to_path_buf(), recipe)\n    }\n\n    pub fn from_list(names: Vec<PackageName>) -> Result<Vec<Self>, PackageError> {\n        let mut packages = Vec::new();\n        for name in names {\n            packages.push(Self::from_name(name)?);\n        }\n        Ok(packages)\n    }\n\n    pub fn from_path(dir: &Path, read_recipe: bool, is_host: bool) -> Result<Self, PackageError> {\n        let file = dir.join(\"recipe.toml\");\n        let mut name: PackageName = dir.file_name().unwrap().try_into()?;\n        if is_host {\n            name = name.with_host();\n        }\n        let recipe = if read_recipe {\n            Recipe::new(&file)?\n        } else {\n            // clean/unfetch don't need to read recipe\n            Recipe::default()\n        };\n        Self::new(name, dir.to_path_buf(), recipe)\n    }\n\n    fn new_recursive(\n        names: &[PackageName],\n        recurse_build_deps: bool,\n        recurse_dev_build_deps: bool,\n        recurse_package_deps: bool,\n        collect_build_deps: bool,\n        collect_package_deps: bool,\n        collect_self: bool,\n        recursion: usize,\n    ) -> Result<Vec<Self>, PackageError> {\n        if recursion == 0 {\n            return Err(PackageError::Recursion(Default::default()));\n        }\n\n        let mut recipes = Vec::new();\n        let mut recipes_set = BTreeSet::new();\n        for name in names {\n            let recipe = Self::from_name(name.clone())?;\n\n            if recurse_build_deps {\n                let dependencies = Self::new_recursive(\n                    &recipe.recipe.build.dependencies,\n                    recurse_build_deps,\n                    recurse_dev_build_deps,\n                    recurse_package_deps,\n                    collect_build_deps,\n                    collect_package_deps,\n                    collect_build_deps,\n                    recursion - 1,\n                )\n                .map_err(|mut err| {\n                    err.append_recursion(name);\n                    err\n                })?;\n\n                for dependency in dependencies {\n                    if !recipes_set.contains(&dependency.name) {\n                        recipes_set.insert(dependency.name.clone());\n                        recipes.push(dependency);\n                    }\n                }\n            }\n\n            if recurse_dev_build_deps {\n                let dependencies = Self::new_recursive(\n                    &recipe.recipe.build.dev_dependencies,\n                    recurse_build_deps,\n                    recurse_dev_build_deps,\n                    recurse_package_deps,\n                    collect_build_deps,\n                    collect_package_deps,\n                    collect_build_deps,\n                    recursion - 1,\n                )\n                .map_err(|mut err| {\n                    err.append_recursion(name);\n                    err\n                })?;\n\n                for dependency in dependencies {\n                    if !recipes_set.contains(&dependency.name) {\n                        recipes_set.insert(dependency.name.clone());\n                        recipes.push(dependency);\n                    }\n                }\n            }\n\n            if recurse_package_deps {\n                let dependencies = Self::new_recursive(\n                    &recipe.recipe.package.dependencies,\n                    recurse_build_deps,\n                    recurse_dev_build_deps,\n                    recurse_package_deps,\n                    collect_build_deps,\n                    collect_package_deps,\n                    collect_package_deps,\n                    recursion - 1,\n                )\n                .map_err(|mut err| {\n                    err.append_recursion(name);\n                    err\n                })?;\n\n                for dependency in dependencies {\n                    if !recipes_set.contains(&dependency.name) {\n                        recipes_set.insert(dependency.name.clone());\n                        recipes.push(dependency);\n                    }\n                }\n            }\n\n            if collect_self && !recipes_set.contains(&recipe.name) {\n                recipes_set.insert(recipe.name.clone());\n                recipes.push(recipe);\n            }\n        }\n\n        Ok(recipes)\n    }\n\n    pub fn get_build_deps_recursive(\n        names: &[PackageName],\n        include_dev: bool,\n    ) -> Result<Vec<Self>, PackageError> {\n        let packages = Self::new_recursive(\n            names,\n            true,\n            include_dev,\n            false,\n            true,\n            false,\n            true,\n            WALK_DEPTH,\n        )?;\n\n        Ok(packages)\n    }\n\n    pub fn get_package_deps_recursive(\n        names: &[PackageName],\n        include_names: bool,\n    ) -> Result<Vec<PackageName>, PackageError> {\n        // recurse_build_deps == true here as libraries (build deps) can have runtime files (package deps)\n        let packages = Self::new_recursive(\n            names,\n            true,\n            false,\n            true,\n            false,\n            true,\n            include_names,\n            WALK_DEPTH,\n        )?;\n\n        Ok(packages.into_iter().map(|p| p.name).collect())\n    }\n\n    pub fn get_all_deps_names_recursive(\n        names: &[PackageName],\n        include_dev: bool,\n    ) -> Result<Vec<PackageName>, PackageError> {\n        let packages =\n            Self::new_recursive(names, true, include_dev, true, true, true, true, WALK_DEPTH)?;\n\n        Ok(packages.into_iter().map(|p| p.name).collect())\n    }\n\n    pub fn reload_recipe(&mut self) -> Result<(), PackageError> {\n        self.recipe = Self::from_path(&self.dir, true, self.name.is_host())?.recipe;\n        let _ = self.apply_filesystem_config(&self.rule.clone());\n        Ok(())\n    }\n\n    /// returns stage dir, pkgar file and toml file.\n    pub fn stage_paths(&self) -> (PathBuf, PathBuf, PathBuf) {\n        let r = self.name.suffix().map(|p| OptionalPackageRecipe {\n            name: p.to_string(),\n            ..Default::default()\n        });\n        cook_package::package_stage_paths(r.as_ref(), &self.target_dir())\n    }\n\n    pub fn target_dir(&self) -> PathBuf {\n        self.dir.join(\"target\").join(self.target)\n    }\n\n    pub fn apply_filesystem_config(&mut self, rule: &str) -> Result<(), anyhow::Error> {\n        match rule {\n            // build from source as usual\n            \"source\" => {}\n            // keep local changes\n            \"local\" => self.recipe.source = None,\n            // download from remote build\n            \"binary\" => {\n                self.recipe.source = None;\n                self.recipe.build.set_as_remote();\n            }\n            // don't build this recipe (unlikely to go here unless some deps need it)\n            // TODO: Note that we're assuming this being ignored from e.g. metapackages\n            // TODO: Will totally broke build if this recipe needed as some other build dependencies\n            \"ignore\" => {\n                self.recipe.source = None;\n                self.recipe.build.set_as_none();\n            }\n            rule => {\n                anyhow::bail!(\n                    // Fail fast because we could risk losing local changes if \"local\" was typo'ed\n                    \"Invalid pkg config {} = \\\"{}\\\"\\nExpecting either 'source', 'local', 'binary' or 'ignore'\",\n                    self.name.as_str(),\n                    rule\n                );\n            }\n        }\n        self.rule = rule.to_string();\n\n        Ok(())\n    }\n\n    pub fn guess_version(&self) -> Option<String> {\n        let recipe = &self.recipe;\n        if recipe.build.kind == BuildKind::None {\n            return Some(\"\".into()); // signifies a meta package\n        } else if let Some(v) = &recipe.package.version {\n            return Some(v.to_string());\n        }\n\n        let re = VersionExtractor::new();\n        let mut dir = self.dir.to_path_buf();\n        if let Some(r) = &recipe.source {\n            match r {\n                SourceRecipe::Tar {\n                    tar,\n                    blake3: _,\n                    patches: _,\n                    script: _,\n                } => {\n                    if let Some(ver) = re.extract_ver(&tar) {\n                        return Some(ver);\n                    }\n                }\n                SourceRecipe::Git {\n                    git: _,\n                    upstream: _,\n                    branch,\n                    rev,\n                    shallow_clone: _,\n                    patches: _,\n                    script: _,\n                } => {\n                    if let Some(rev) = rev {\n                        if let Some(ver) = re.extract_ver(&rev) {\n                            return Some(ver);\n                        }\n                    }\n                    if let Some(branch) = branch {\n                        if let Some(ver) = re.extract_ver(&branch) {\n                            return Some(ver);\n                        }\n                    }\n                }\n                SourceRecipe::SameAs { same_as } => {\n                    dir = self.dir.join(same_as);\n                }\n                _ => {}\n            }\n        };\n\n        let cargo_path = dir.join(\"source/Cargo.toml\");\n        if let Some(ver) = VersionExtractor::extract_cargo_ver(&cargo_path) {\n            return Some(ver);\n        }\n        None\n    }\n}\n\n// TODO: Wrap these vectors in a struct\n\npub fn recipes_mark_as_deps(names: &[PackageName], packages: &mut Vec<CookRecipe>) {\n    for package in packages.iter_mut() {\n        package.is_deps = !names.contains(&package.name);\n    }\n}\n\npub fn recipes_flatten_package_names(packages: Vec<CookRecipe>) -> Vec<CookRecipe> {\n    let mut new_packages = Vec::new();\n    let mut packages_set = BTreeSet::new();\n    for mut package in packages {\n        let is_host = package.name.is_host();\n        let mut name = package.name.with_suffix(None);\n        if is_host {\n            name = name.with_host();\n        }\n        if !packages_set.contains(name.as_str()) {\n            packages_set.insert(name.to_string());\n            package.name = name;\n            new_packages.push(package);\n        }\n    }\n    new_packages\n}\n\n#[derive(Serialize, Deserialize)]\npub struct AutoDeps {\n    pub packages: BTreeSet<PackageName>,\n}\n\npub struct VersionExtractor {\n    regex: Regex,\n}\n\nimpl VersionExtractor {\n    pub fn new() -> Self {\n        Self {\n            regex: Regex::new(r\"\\d+(\\.\\d+){1,2}\").unwrap(),\n        }\n    }\n    pub fn extract_ver(&self, text: &str) -> Option<String> {\n        if let Some(arm) = self.regex.captures(&text) {\n            return Some(arm.get(0)?.as_str().to_string());\n        }\n        None\n    }\n    fn extract_cargo_ver(path: &Path) -> Option<String> {\n        let content = std::fs::read_to_string(path).ok()?;\n        let manifest = content.parse::<toml::Table>().ok()?;\n\n        if let Some(version) = manifest\n            .get(\"package\")\n            .and_then(|pkg| pkg.get(\"version\"))\n            .and_then(|v| v.as_str())\n        {\n            return Some(version.to_string());\n        }\n\n        if let Some(version) = manifest\n            .get(\"workspace\")\n            .and_then(|ws| ws.get(\"package\"))\n            .and_then(|pkg| pkg.get(\"version\"))\n            .and_then(|v| v.as_str())\n        {\n            return Some(version.to_string());\n        }\n\n        None\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use pkg::PackageName;\n\n    #[test]\n    fn git_cargo_recipe() {\n        use crate::recipe::{BuildKind, BuildRecipe, Recipe, SourceRecipe};\n\n        let recipe: Recipe = toml::from_str(\n            r#\"\n            [source]\n            git = \"https://gitlab.redox-os.org/redox-os/acid.git\"\n            branch = \"master\"\n            rev = \"06344744d3d55a5ac9a62a6059cb363d40699bbc\"\n\n            [build]\n            template = \"cargo\"\n        \"#,\n        )\n        .unwrap();\n\n        assert_eq!(\n            recipe,\n            Recipe {\n                source: Some(SourceRecipe::Git {\n                    git: \"https://gitlab.redox-os.org/redox-os/acid.git\".to_string(),\n                    upstream: None,\n                    branch: Some(\"master\".to_string()),\n                    rev: Some(\"06344744d3d55a5ac9a62a6059cb363d40699bbc\".to_string()),\n                    patches: Vec::new(),\n                    script: None,\n                    shallow_clone: None,\n                }),\n                build: BuildRecipe::new(BuildKind::Cargo {\n                    cargopath: None,\n                    cargoflags: Vec::new(),\n                    cargopackages: Vec::new(),\n                    cargoexamples: Vec::new(),\n                }),\n                ..Default::default()\n            }\n        );\n    }\n\n    #[test]\n    fn tar_custom_recipe() {\n        use crate::recipe::{BuildKind, BuildRecipe, Recipe, SourceRecipe};\n\n        let recipe: Recipe = toml::from_str(\n            r#\"\n            [source]\n            tar = \"http://downloads.xiph.org/releases/ogg/libogg-1.3.3.tar.xz\"\n            blake3 = \"8220c0e4082fa26c07b10bfe31f641d2e33ebe1d1bb0b20221b7016bc8b78a3a\"\n\n            [build]\n            template = \"custom\"\n            script = \"make\"\n        \"#,\n        )\n        .unwrap();\n\n        assert_eq!(\n            recipe,\n            Recipe {\n                source: Some(SourceRecipe::Tar {\n                    tar: \"http://downloads.xiph.org/releases/ogg/libogg-1.3.3.tar.xz\".to_string(),\n                    blake3: Some(\n                        \"8220c0e4082fa26c07b10bfe31f641d2e33ebe1d1bb0b20221b7016bc8b78a3a\"\n                            .to_string()\n                    ),\n                    patches: Vec::new(),\n                    script: None,\n                }),\n                build: BuildRecipe::new(BuildKind::Custom {\n                    script: \"make\".to_string()\n                }),\n                ..Default::default()\n            }\n        );\n    }\n\n    #[test]\n    fn meta_recipe() {\n        use crate::recipe::{BuildKind, BuildRecipe, PackageRecipe, Recipe};\n\n        let recipe: Recipe = toml::from_str(\n            r#\"\n            [package]\n            dependencies = [\n                \"gcc13\",\n            ]\n        \"#,\n        )\n        .unwrap();\n\n        assert_eq!(\n            recipe,\n            Recipe {\n                source: None,\n                build: BuildRecipe::new(BuildKind::None),\n                package: PackageRecipe {\n                    dependencies: vec![PackageName::new(\"gcc13\").unwrap()],\n                    ..Default::default()\n                },\n                ..Default::default()\n            }\n        );\n    }\n}\n"
  },
  {
    "path": "src/web/html.rs",
    "content": "use crate::cook::ident;\nuse crate::recipe::SourceRecipe;\nuse crate::web::get_category;\nuse crate::{cook::tree::format_size, recipe::CookRecipe};\nuse pkg::Package;\nuse std::collections::BTreeMap;\nuse std::{fs, path::Path};\n\npub fn generate_html_pkg(\n    package: &Package,\n    recipe: &CookRecipe,\n    dependents: &Vec<String>,\n    stage_files: &Option<String>,\n    html_path: &Path,\n    config: &crate::web::CliWebConfig,\n) {\n    let name = &package.name;\n    let version = &package.version;\n    let target = &package.target;\n    let category = &get_category(&recipe.dir);\n    let description = recipe\n        .recipe\n        .package\n        .description\n        .as_ref()\n        .map(|p| p.as_str())\n        .unwrap_or(\"-\");\n\n    let desc_html = recipe\n        .recipe\n        .package\n        .description\n        .as_ref()\n        .map(|desc| format!(r#\"<p class=\"description\">{}</p>\"#, desc))\n        .unwrap_or_default();\n\n    let repo_url = &config.repo_url;\n\n    let deps_html = if package.depends.is_empty() {\n        String::from(\"<p>None</p>\")\n    } else {\n        let items: Vec<String> = package\n            .depends\n            .iter()\n            .map(|dep| format!(r#\"<li><a href=\"{dep}.html\">{dep}</a></li>\"#))\n            .collect();\n        format!(\"<ul>\\n{}\\n</ul>\", items.join(\"\\n\"))\n    };\n\n    let dependents_html = if dependents.is_empty() {\n        String::from(\"<p>None</p>\")\n    } else {\n        let items: Vec<String> = dependents\n            .iter()\n            .map(|dep| format!(r#\"<li><a href=\"{dep}.html\">{dep}</a></li>\"#))\n            .collect();\n        format!(\"<ul>\\n{}\\n</ul>\", items.join(\"\\n\"))\n    };\n\n    let mut source_html = match &recipe.recipe.source {\n        Some(SourceRecipe::Git { git, .. }) => {\n            let host = get_hostname(git);\n            let tree_link = get_tree_url(git, host, &package.source_identifier, None);\n            let short_commit = get_short_commit(&package.source_identifier);\n            format!(\n                r#\"\n<table>\n    <tr><th>Git:</th><td><a href=\"{git}\" target=\"_blank\">{host}</a></td></tr>\n    <tr><th>Commit:</th><td><a href=\"{tree_link}\" target=\"_blank\">{short_commit}</a></td></tr>\n</table>\"#\n            )\n        }\n        Some(SourceRecipe::Tar { tar, .. }) => {\n            let host = get_hostname(tar);\n            format!(\n                r#\"<table>\n    <tr><th>Tarball:</th><td><a href=\"{tar}\" target=\"_blank\">{host}</a></td></tr>\n</table>\"#\n            )\n        }\n        Some(SourceRecipe::SameAs { same_as }) => {\n            let r = Path::new(same_as).file_name().unwrap().to_string_lossy();\n            format!(\n                r#\"<table>\n    <tr><th>Same as:</th><td><a href=\"{r}.html\">{r}</a></td></tr>\n</table>\"#\n            )\n        }\n        _ => String::from(r#\"<p>No source specified.</p>\"#),\n    };\n\n    let (files_html, files_count) = if let Some(stage_files) = stage_files {\n        let count = stage_files\n            .split('\\n')\n            .filter(|p| !p.ends_with('/') && !p.is_empty())\n            .count();\n        (format!(\"<pre>{stage_files}</pre>\"), format!(\"{}\", count))\n    } else {\n        (\n            String::from(r#\"<p>No package files defined.</p>\"#),\n            String::from(\"?\"),\n        )\n    };\n\n    {\n        let host = get_hostname(&config.this_repo);\n        let tree_link = get_tree_url(\n            &config.this_repo,\n            host,\n            &package.commit_identifier,\n            Some(&format!(\"recipes/{category}/{name}/recipe.toml\")),\n        );\n        let short_commit = get_short_commit(&package.commit_identifier);\n        source_html += &format!(\n            r#\"\n<table>\n    <tr><th>Build script:</th><td><a href=\"{tree_link}\" target=\"_blank\">{short_commit}</a></td></tr>\n</table>\n\"#\n        );\n    }\n\n    let (arch, os) = {\n        let target_split: Vec<&str> = package.target.split('-').collect();\n        (\n            target_split\n                .get(0)\n                .map(|s| s.to_string())\n                .unwrap_or(\"-\".into()),\n            target_split\n                .get(2)\n                .map(|s| s.to_string())\n                .unwrap_or(\"-\".into()),\n        )\n    };\n\n    let html = format!(\n        r#\"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>{name} - Redox OS Package</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n</head>\n<body>\n    <header class=\"pkg-header\">\n        <div class=\"container\">\n            <a href=\"index.html\" class=\"back-link\">&larr; Back to packages</a>\n            <h1>{name} <span class=\"version\">{version}</span></h1>\n{desc_html}\n            <p class=\"description\">{description}</p>\n            <div class=\"install-action\">\n                <span class=\"prompt\">$</span>\n                <code>pkg install {name}</code>\n            </div>\n        </div>\n    </header>\n    <main class=\"pkg-content container\">\n        <div class=\"pkg-main\">\n            <section class=\"pkg-deps card\">\n                <h2>Dependencies</h2>\n{deps_html}\n            </section>\n            <section class=\"pkg-dependents card\">\n                <h2>Dependents</h2>\n{dependents_html}\n            </section>\n            <section class=\"pkg-recipe card\">\n                <h2>Package Files</h2>\n{files_html}\n            </section>\n        </div>\n        \n        <section class=\"pkg-meta card\">\n            <table>\n                <tr><th></th><td><a href=\"{repo_url}/{target}/{name}.pkgar\" target=\"_blank\">Download</a></td></tr>\n            </table>\n            <h2>Package Info</h2>\n            <table>\n                <tr><th>OS</th><td>{os}</td></tr>\n                <tr><th>Architecture</th><td>{arch}</td></tr>\n                <tr><th>Category</th><td><a href=\"index.html#cat-{category}\">{category}</a></td></tr>\n                <tr><th>Network Size</th><td>{network_size}</td></tr>\n                <tr><th>Storage Size</th><td>{storage_size}</td></tr>\n                <tr><th>File count</th><td>{files_count}</td></tr>\n                <tr><th>Published</th><td title=\"{published}\">{published_short}</td></tr>\n                <tr><th>Hash</th><td><code class=\"hash meta-box\">{blake3}</code></td></tr>\n            </table>\n            <h2>Package Source</h2>\n{source_html}\n            <div style=\"height:100px\"></div>\n        </section>\n    </main>\n</body>\n</html>\"#,\n        network_size = format_size(package.network_size),\n        storage_size = format_size(package.storage_size),\n        published_short = &package.time_identifier[0..10],\n        published = package.time_identifier,\n        blake3 = package.blake3,\n    );\n\n    fs::write(html_path, html).expect(\"Failed to write package HTML file\");\n}\n\npub fn generate_html_index(\n    grouped_packages: BTreeMap<String, Vec<&(Package, CookRecipe)>>,\n    index_path: &Path,\n    config: &crate::web::CliWebConfig,\n) {\n    let mut categories_html = Vec::new();\n\n    for (category, pkgs) in grouped_packages {\n        let cards_html: Vec<String> = pkgs\n            .iter()\n            .map(|(pkg, _recipe)| {\n                let name = &pkg.name;\n                format!(\n                    r#\"\n<div class=\"package-card\">\n    <h3 class=\"pkg-name\"><a href=\"{name}.html\">{name}</a></h3>\n    <div class=\"pkg-stats\">\n        <span class=\"pkg-version\">{version}</span>\n        <span class=\"pkg-size\">{size}</span>\n    </div>\n</div>\"#,\n                    name = name,\n                    version = pkg.version,\n                    size = format_size(pkg.network_size)\n                )\n            })\n            .collect();\n\n        let category_block = format!(\n            r#\"\n<section class=\"category-section\">\n    <h2 class=\"category-title\" id=\"cat-{category}\">{category}</h2>\n    <div class=\"package-grid\">\n{cards}\n    </div>\n</section>\"#,\n            category = category,\n            cards = cards_html.join(\"\\n\")\n        );\n\n        categories_html.push(category_block);\n    }\n\n    let html = format!(\n        r#\"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Redox Package Repository</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n</head>\n<body>\n    <header class=\"index-header\">\n        <h1>Redox OS Package Repository</h1>\n        <p class=\"description\">Repository for <code>{target}</code></p>\n    </header>\n\n    <main class=\"index-content container\">\n{category_sections}\n\n    <footer>\n        <p>Generated at <code>{commit_time}</code> with build tree <a href=\"{commit_tree}\" target=\"_blank\">{commit_hash}</a></p>\n        <div style=\"height:100px\"></div>\n    </footer>\n    </main>\n</body>\n</html>\"#,\n        target = redoxer::target(),\n        category_sections = categories_html.join(\"\\n\\n\"),\n        commit_time = &ident::get_ident().time,\n        commit_hash = get_short_commit(&ident::get_ident().commit),\n        commit_tree = get_tree_url(\n            &config.this_repo,\n            get_hostname(&config.this_repo),\n            &ident::get_ident().commit,\n            None\n        ),\n    );\n\n    fs::write(index_path, html).expect(\"Failed to write index HTML file\");\n}\n\nfn get_hostname(url: &str) -> &str {\n    url.split(\"://\")\n        .nth(1)\n        .unwrap_or(url)\n        .split('/')\n        .next()\n        .unwrap_or(url)\n        .split(':')\n        .next()\n        .unwrap_or(url)\n}\n\npub fn get_tree_url(git_url: &str, host: &str, commit: &str, folder: Option<&str>) -> String {\n    let mut base_url = git_url.trim_end_matches(\".git\").to_string();\n\n    if let Some(ssh_path) = base_url.strip_prefix(\"git@\") {\n        // \"git@github.com:user/repo\" -> \"https://github.com/user/repo\"\n        base_url = format!(\"https://{}\", ssh_path.replace(':', \"/\"));\n    } else if base_url.starts_with(\"git://\") {\n        // \"git://github.com/user/repo\" -> \"https://github.com/user/repo\"\n        base_url = base_url.replacen(\"git://\", \"https://\", 1);\n    }\n\n    let base_url = if host == \"github.com\" {\n        format!(\"{}/tree/{}\", base_url, commit)\n    } else if host.contains(\"gitlab\") {\n        format!(\"{}/-/tree/{}\", base_url, commit)\n    } else {\n        return format!(\"{}?commit={}\", base_url, commit);\n    };\n\n    match folder {\n        Some(f) => format!(\"{base_url}/{f}\"),\n        None => base_url,\n    }\n}\n\nfn get_short_commit(commit: &str) -> &str {\n    commit.get(0..7).unwrap_or(\"?\")\n}\n"
  },
  {
    "path": "src/web/style.css",
    "content": "* {\n    box-sizing: border-box;\n    margin: 0;\n    padding: 0;\n}\n\nbody {\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n    background-color: #f9f9fb;\n    color: #24292e;\n    line-height: 1.6;\n}\n\n.container {\n    max-width: 1280px;\n    margin: 0 auto;\n    padding: 0 20px;\n}\n\n.category-section {\n    margin-bottom: 50px;\n}\n\n.category-title {\n    font-size: 1.5rem;\n    color: #24292e;\n    border-bottom: 2px solid #e1e4e8;\n    padding-bottom: 10px;\n    margin-bottom: 20px;\n    font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n}\n\n.package-grid {\n    display: block;\n    display: flex;\n    flex-wrap: wrap;\n    margin: -10px;\n}\n\n.package-card {\n    background-color: #ffffff;\n    border: 1px solid #e1e4e8;\n    border-radius: 6px;\n    padding: 15px;\n    margin: 10px;\n    \n    display: inline-block;\n    width: 30%;\n    vertical-align: top;\n    \n    display: flex;\n    flex: 0 1 280px;\n    flex-direction: column;\n    justify-content: space-between;\n}\n\n.package-card .pkg-name {\n    margin-bottom: 15px;\n    font-size: 1.25rem;\n}\n\n.package-card .pkg-name a {\n    border: none;\n}\n\n.package-card .pkg-name a:hover {\n    text-decoration: underline;\n}\n\n.package-card .pkg-stats {\n    display: block;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    color: #6a737d;\n    font-size: 0.9rem;\n    border-top: 1px solid #e1e4e8;\n    padding-top: 10px;\n}\n\n.package-card .pkg-version {\n    font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n    background-color: #f3f4f6;\n    padding: 3px 6px;\n    border-radius: 4px;\n    color: #24292e;\n}\n\n.package-card .pkg-size {\n    font-weight: 500;\n}\n\na {\n    color: #24292e;\n    text-decoration: none;\n    border-bottom: 1px solid #e1e4e8;\n}\n\na:hover {\n    color: #000000;\n    border-bottom: 1px solid #24292e;\n}\n\nh1, h2, h3 {\n    font-weight: 600;\n    margin: 1rem 0;\n}\n\ncode {\n    font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;\n    background-color: #f3f4f6;\n    padding: 0.2em 0.4em;\n    border-radius: 3px;\n    font-size: 0.9em;\n}\n\n.card {\n    background-color: #ffffff;\n    border: 1px solid #e1e4e8;\n    border-radius: 6px;\n    padding: 20px;\n    margin-bottom: 20px;\n}\n\n.pkg-header, .index-header {\n    background-color: #ffffff;\n    border-bottom: 1px solid #d1d5da;\n    padding: 40px 0;\n    margin-bottom: 40px;\n    text-align: center;\n}\n\n.pkg-header h1 {\n    font-size: 2.5rem;\n    margin-bottom: 0.5rem;\n}\n\n.pkg-header .version {\n    color: #6a737d;\n    font-size: 1.5rem;\n    font-weight: 400;\n}\n\n.pkg-header .description {\n    font-size: 1.2rem;\n    color: #586069;\n    max-width: 600px;\n    margin: 0 auto 1.5rem auto;\n}\n\n.back-link {\n    display: inline-block;\n    margin-bottom: 20px;\n    color: #6a737d;\n    border: none;\n    font-size: 0.9rem;\n}\n\n.back-link:hover {\n    color: #24292e;\n    border: none;\n}\n\n.install-action {\n    display: inline-block; \n    background-color: #f3f4f6;\n    border: 1px solid #d1d5da;\n    border-radius: 6px;\n    padding: 12px 20px;\n    font-family: ui-monospace, SFMono-Regular, monospace;\n    font-size: 1.1rem;\n    color: #24292e;\n}\n\n.install-action .prompt {\n    color: #6a737d;\n    margin-right: 12px;\n}\n\n.install-action code {\n    background-color: transparent;\n    padding: 0;\n    font-size: 1.1rem;\n    user-select: all;\n}\n\n.pkg-content {\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-between;\n}\n\n.pkg-main, .pkg-meta {\n    width: 100%; \n}\n\n@media (min-width: 768px) {\n    .pkg-main {\n        width: 60%;\n    }\n    .pkg-meta {\n        width: 35%;\n    }\n}\n\n.meta-box {\n    overflow-x: auto;\n    display: block;\n    max-width: 150px;\n    user-select: all;\n    padding: 8px;\n    white-space: nowrap;\n}\n\ntable {\n    width: 100%;\n    border-collapse: collapse;\n}\n\nth, td {\n    padding: 10px 0;\n    text-align: left;\n    border-bottom: 1px solid #e1e4e8;\n}\n\nth {\n    color: #6a737d;\n    font-weight: 500;\n}\n\n.pkg-meta table th {\n    width: 40%;\n    padding-right: 10px;\n}\n\n.pkg-deps ul, .pkg-dependents ul {\n    list-style-type: none;\n    display: flex;\n    flex-wrap: wrap;\n}\n\n.pkg-deps li, .pkg-dependents li {\n    padding: 8px 0;\n    border-bottom: 1px solid #e1e4e8;\n    width: 50%;\n}\n"
  },
  {
    "path": "src/web.rs",
    "content": "use std::{\n    collections::{BTreeMap, BTreeSet, HashMap},\n    env, fs,\n    path::{Path, PathBuf},\n};\n\nuse pkg::{Package, PackageName};\n\nuse crate::{\n    recipe::CookRecipe,\n    web::html::{generate_html_index, generate_html_pkg},\n};\n\npub mod html;\n\n#[derive(Clone)]\npub struct CliWebConfig {\n    /// path relative to cwd dir to generate web files\n    out_dir: PathBuf,\n    /// absolute url to repo (not the web) instead of \"/repo\"\n    repo_url: String,\n    /// this repository build url\n    this_repo: String,\n}\n\nimpl CliWebConfig {\n    pub fn parse_args() -> Option<CliWebConfig> {\n        if env::var(\"COOKBOOK_WEB\").ok().as_deref() != Some(\"true\") {\n            return None;\n        }\n        let Ok(pwd) = env::current_dir() else {\n            return None;\n        };\n\n        Some(CliWebConfig {\n            repo_url: env::var(\"COOKBOOK_WEB_REPO_URL\")\n                .ok()\n                .unwrap_or(\"/repo\".to_string()),\n            out_dir: pwd.join(\n                env::var(\"COOKBOOK_WEB_OUT_DIR\")\n                    .ok()\n                    .unwrap_or(\"web\".to_string()),\n            ),\n            // TODO: Hardcoded URL, maybe get this remote-url next time\n            this_repo: \"https://gitlab.redox-os.org/redox-os/redox\".to_string(),\n        })\n    }\n}\n\nconst CSS: &str = include_str!(\"./web/style.css\");\n\npub fn generate_web(all_packages: &Vec<String>, config: &CliWebConfig) {\n    let repo_path = &config.out_dir.join(redoxer::target());\n    if !repo_path.is_dir() {\n        fs::create_dir_all(repo_path).unwrap();\n    }\n\n    let mut valid_packages = Vec::new();\n    let mut dependents_map: HashMap<String, BTreeSet<String>> = HashMap::new();\n\n    for package_name in all_packages {\n        let Some(recipe_path) = pkg::recipes::find(package_name) else {\n            continue;\n        };\n        // TODO: Package::from_path\n        let Ok(package) = Package::new(&PackageName::new(package_name).unwrap()) else {\n            continue;\n        };\n        let Ok(recipe) = CookRecipe::from_path(&recipe_path, true, false) else {\n            continue;\n        };\n\n        for dep in &package.depends {\n            dependents_map\n                .entry(dep.to_string())\n                .or_default()\n                .insert(package.name.to_string());\n        }\n\n        valid_packages.push((package, recipe));\n    }\n\n    for (package, recipe) in &valid_packages {\n        let dependents = dependents_map\n            .get(package.name.as_str())\n            .cloned()\n            .unwrap_or_default();\n\n        let stage_files_path = recipe.stage_paths().0.with_added_extension(\"files\");\n        let stage_files = fs::read_to_string(stage_files_path).ok();\n\n        let html_path = repo_path.join(format!(\"{}.html\", package.name.as_str()));\n\n        generate_html_pkg(\n            &package,\n            &recipe,\n            &dependents.into_iter().collect(),\n            &stage_files,\n            &html_path,\n            &config,\n        );\n    }\n\n    let mut grouped_packages: BTreeMap<String, Vec<&(Package, CookRecipe)>> = BTreeMap::new();\n\n    for item in &valid_packages {\n        let category = get_category(&item.1.dir);\n        grouped_packages.entry(category).or_default().push(item);\n    }\n\n    let index_path = repo_path.join(\"index.html\");\n    let style_path = repo_path.join(\"style.css\");\n    generate_html_index(grouped_packages, &index_path, &config);\n    fs::write(style_path, CSS).expect(\"Failed to write CSS file\");\n}\n\npub(crate) fn get_category(dir: &Path) -> String {\n    let Some(category) = dir.parent().map(|p| p.display().to_string()) else {\n        return \"uncategorized\".to_string();\n    };\n    category[\"recipes/\".len()..].to_string()\n}\n"
  }
]