<rss version="2.0">
  <channel>
    <title>The Skylark&apos;s Garden</title>
    <link>https://voidsleeper.xyz</link>
    <description>The Skylark&apos;s Garden - Blog</description>
    <generator>Zine -- https://zine-ssg.io</generator>
    <language>en-US</language>
    <lastBuildDate>Mon, 17 Aug 2026 07:05:54 +0000</lastBuildDate>
    
      <item>
        <title>Installing PostmarketOS on an Ouya</title>
        <description>&lt;p&gt;I was hunting around for a device suitable to use as a home server. Specifically I was checking Ebay for a Raspberry Pi Zero 2 W, and found they’ve all been bought by scalpers selling them for nearly twice MSRP. And sure, that’s only $25, but I still have to buy a storage device, and I’m &lt;em&gt;completely&lt;/em&gt; broke right now. I also have an ideological aversion to e-waste.&lt;/p&gt;&lt;p&gt;Then, somehow, I remembered that I had an old &lt;a href=&quot;https://en.wikipedia.org/wiki/Ouya&quot;&gt;Ouya&lt;/a&gt; laying around. When it originally came out, I was a teenager with delusions of competence, and its promise to be an open development platform excited me.  Surely, this would be the thing that jumpstarted my career as a game dev.&lt;/p&gt;&lt;p&gt;Anyway the console was a massive commercial failure beyond its very successful Kickstarter campaign, and I’ve had a completely useless cube sitting around for the past decade and a half. I’d had aspirations to jailbreak it in the past, but there didn’t seem to be much point beyond just saying I’d done it.&lt;/p&gt;&lt;p&gt;Then, on a whim, I thought I’d check if &lt;a href=&quot;https://postmarketos.org/&quot;&gt;PostmarketOS&lt;/a&gt; supported it. I didn’t have much optimism, since it’s an obscure device, and at first glance I didn’t see it on the list. But then I noticed “tegra armv7” on the list of testing platforms. And, a little reading later, I see that includes the Tegra 3 that the Ouya is running on.&lt;/p&gt;&lt;p&gt;Of course since it &lt;em&gt;is&lt;/em&gt; an obscure device, there weren’t any tutorials on how to install it on the Ouya specifically. I had to synthesize a few different guides, which wasn’t &lt;em&gt;that&lt;/em&gt; hard, but idk. I guess I figure when I successfully do something weird that I didn’t have a good tutorial for I should probably post a good tutorial for it. Just in case someone else ever wants to do it.&lt;/p&gt;&lt;p&gt;So anyway.&lt;/p&gt;&lt;h1&gt;A tutorial on how to do it&lt;/h1&gt;&lt;p&gt;You will need:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Your test subject (the Ouya)&lt;/li&gt;&lt;li&gt;A 2mm hex key/screwdriver (I actually used a Torx key but I don’t recommend doing that)&lt;/li&gt;&lt;li&gt;A spare HDMI-capable monitor and cable&lt;/li&gt;&lt;li&gt;A spare USB keyboard&lt;/li&gt;&lt;li&gt;A micro-USB cable&lt;/li&gt;&lt;li&gt;A power adapter (barrel jack, 12VDC, maximum 1.5A). I don’t have my original one, so I grabbed a random one that turned out to put out 24VDC and 0.8A. I’m kind of surprised that didn’t kill it, in hindsight. I didn’t even check the specs. Guess they put a decent regulator on the thing.&lt;/li&gt;&lt;li&gt;A computer running Linux. Mine was running elementaryOS (I haven’t bothered switching it over to Fedora yet)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First, prepare the software side of things. You’ll need to clone the git repos for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://codeberg.org/libre-tegra/re-crypt&quot;&gt;re-crypt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://codeberg.org/libre-tegra/fusee-tools&quot;&gt;fusee-tools&lt;/a&gt; - make sure to clone this recursively, you need the submodules!&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://git.u-boot-project.org/u-boot/u-boot&quot;&gt;u-boot&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Then, install dependencies. These are for Debian-based distros, if you’re using something else you’ll need to translate them into the appropriate packages for your system.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;constant function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;dpkg&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;--add-architecture&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;i386&lt;/span&gt;
&lt;span class=&quot;constant function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;update&lt;/span&gt;
&lt;span class=&quot;constant function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;autoconf&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;bash&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;bison&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;build-essential&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;fastboot&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;flex&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;gcc-arm-none-eabi&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;git&lt;/span&gt; \
  &lt;span class=&quot;constant&quot;&gt;libgnutls28-dev&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;libncurses-dev&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;libssl-dev&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;python3-cryptography&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;python3-dev&lt;/span&gt; \
  &lt;span class=&quot;constant&quot;&gt;python3-setuptools&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;python3-usb&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;swig&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;libc6:i386&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;libstdc++6:i386&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;zlib1g:i386&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Do not skip those 32-bit packages.&lt;/strong&gt;&lt;/em&gt; They are &lt;em&gt;required&lt;/em&gt; for the &lt;code&gt;nvflash&lt;/code&gt; utility to run properly.&lt;/p&gt;&lt;h2&gt;Build stuff&lt;/h2&gt;&lt;p&gt;Next, in the directory containing u-boot, run:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;constant function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;mrproper&lt;/span&gt;
&lt;span class=&quot;constant function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;ARCH=arm&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;CROSS_COMPILE=arm-none-eabi-&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;ouya_defconfig&lt;/span&gt;
&lt;span class=&quot;constant function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;ARCH=arm&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;CROSS_COMPILE=arm-none-eabi-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can speed up that last command by adding the &lt;code&gt;-jN&lt;/code&gt; option, where &lt;code&gt;N&lt;/code&gt; is the number of threads your processor has. It just runs compile commands in parallel when it can.&lt;/p&gt;&lt;p&gt;This will produce the u-boot image, called &lt;code&gt;u-boot-dtb-tegra.bin&lt;/code&gt;. Copy it to the re-crypt and fusee-tools directories.&lt;/p&gt;&lt;p&gt;Then go to the &lt;code&gt;payloads&lt;/code&gt; directory in fusee-tools and run:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;constant function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;ARCH=arm&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;CROSS_COMPILE=arm-none-eabi-&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;-j1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I don’t know why the libre-tegra guide specified &lt;code&gt;-j1&lt;/code&gt;. I’m assuming it breaks if you try to parallelize. It’s fast to compile though so it doesn’t really matter.&lt;/p&gt;&lt;h2&gt;Backup&lt;/h2&gt;&lt;p&gt;At this point the libre-tegra guide describes how to back up the Google Nexus 7. This backup process is apparently device-specific, and I didn’t want to spend time figuring out how to do it for the Ouya, since the thing is useless to me if this doesn’t work anyway. I definitely should have though! Don’t be like me, be smart and be safe! Don’t leave yourself without a way to recover your device.&lt;/p&gt;&lt;p&gt;It seems to involve booting into APX (see the next section), loading the appropriate device bootloader from &lt;a href=&quot;https://codeberg.org/clamor-s/bootloader-collection&quot;&gt;this repo&lt;/a&gt;, and using nvflash to pull a bunch of data to backup images. I don’t know how you figure out which images are needed to fully back up any specific device, though.&lt;/p&gt;&lt;h2&gt;Prepare u-boot&lt;/h2&gt;&lt;p&gt;Now’s when we start with the fun stuff. First, you have to boot the Ouya into APX mode. The tegra30-debrick guide provides two ways of doing this. The first is to bridge pin 5 of a specific IC to ground. The second is to short two solder pads labeled U33. I found the second method to be far and away the easier method. Just short the pads, hit the power button, and you’re in. The other method is finicky and seems to have a timing to it. I managed to do it once but couldn’t seem to replicate whatever I did that worked. &lt;figure&gt;&lt;img src=&quot;https://voidsleeper.xyz/blog/ouya-postmarketos/ouya_apx_alternate_method.jpg&quot; alt=&quot;The two adjacent pads in the U33 section, opposite where that label is printed, are highlighted as the ones to bridge.&quot;&gt;
&lt;figcaption&gt;These are the pads to bridge. Image from the tegra30-debrick guide.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;If you’ve done it right, and you have the micro-USB cable connected to your computer, running &lt;code&gt;lsusb&lt;/code&gt; should include a line like:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Bus 002 Device 055: ID 0955:7030 NVIDIA Corp. T30 [Tegra 3] recovery mode
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Before you can flash u-boot, you need to prep it with &lt;code&gt;re-crypt&lt;/code&gt; to get a usable partition layout. And to do that, you need your Ouya’s Secure Boot Key.&lt;/p&gt;&lt;p&gt;In the fusee-tools directory, run &lt;code&gt;./dump_sbk.sh -s T30&lt;/code&gt;. It will output a bunch of text. What you’re looking for is a line like this:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#Dumped SBK [ 0xXXXXXXXX 0xXXXXXXXX 0xXXXXXXXX 0xXXXXXXXX ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The Ouya will reboot when you do this. That’s fine, just turn it back off.&lt;/p&gt;&lt;p&gt;Everything between the square brackets is your specific SBK. Now switch to the re-crypt directory, and run this command, substituting in your SBK:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;./re-crypt.py --dev ouya --sbk 0xXXXXXXXX 0xXXXXXXXX 0xXXXXXXXX 0xXXXXXXXX --split
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That will produce two files, &lt;code&gt;bct.img&lt;/code&gt; and &lt;code&gt;ebt.img&lt;/code&gt;. Copy both to the fusee-tools directory, and switch back there.&lt;/p&gt;&lt;h2&gt;Flash u-boot&lt;/h2&gt;&lt;p&gt;Now, finally, you get to actually boot custom firmware. Boot the Ouya back into APX mode, and run this command (in fusee-tools):&lt;/p&gt;&lt;pre&gt;&lt;code&gt;./run_bootloader.sh -s T30 -t ./bct/ouya.bct
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If everything has gone well, you should see u-boot’s console output on your monitor. Quickly hit &lt;code&gt;Ctrl-C&lt;/code&gt; on the connected USB keyboard to interrupt u-boot! Otherwise, it will try and fail to find an operating system to load, and then reboot.&lt;/p&gt;&lt;p&gt;At this point, you haven’t actually &lt;em&gt;flashed&lt;/em&gt; u-boot, you’ve just used the fusee-gelee vulnerability to inject u-boot as a payload. If you’re familiar with Switch hacking, you know the difference; you have to re-inject the payload on every boot. Luckily, we won’t have to do that here, because we can actually replace the bootloader entirely with u-boot.&lt;/p&gt;&lt;p&gt;In u-boot, run the &lt;code&gt;bootmenu&lt;/code&gt; command, then use the arrow keys to highlight the fastboot option, and press Enter.&lt;/p&gt;&lt;p&gt;Then, on your computer, run:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;fastboot flash 0.1 bct.img
fastboot flash 0.2 ebt.img
fastboot reboot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You have now flashed u-boot! The Ouya should boot directly into it now, and every time you press the power button from now on.&lt;/p&gt;&lt;h2&gt;Install PostmarketOS&lt;/h2&gt;&lt;p&gt;On the Ouya, use &lt;code&gt;Ctrl-C&lt;/code&gt; to interrupt the u-boot startup sequence, and again run &lt;code&gt;bootmenu&lt;/code&gt;. This time, choose &lt;code&gt;Mount internal storage&lt;/code&gt; (or something similar; it was the first option for me). This will expose the Ouya’s eMMC as a USB storage device. If you run &lt;code&gt;lsblk&lt;/code&gt; on your computer, you should see it assigned to something like &lt;code&gt;/dev/sdX&lt;/code&gt;. You can identify it by its size, it should be 8 or 16GB depending on which model of Ouya you have.&lt;/p&gt;&lt;p&gt;Download a pre-built PostmarketOS image from &lt;a href=&quot;https://images.postmarketos.org/bpo/edge/nvidia-tegra-armv7&quot;&gt;the website&lt;/a&gt;. Then, in the directory containing the image, run (replacing things with &lt;em&gt;your&lt;/em&gt; specific file names and device paths):&lt;/p&gt;&lt;pre&gt;&lt;code&gt;xzcat xxxxxxxx-xxxx-postmarketOS-channel-ui-nvidia-tegra-armv7.img.xz | sudo dd of=/dev/sdX status=progress
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This took about an hour for me. You can probably speed it up by raising the block size with an option like &lt;code&gt;bs=4M&lt;/code&gt;, but I didn’t do that.&lt;/p&gt;&lt;p&gt;Once that finishes, you should be able to power cycle the Ouya and it’ll boot right into PostmarketOS. Congratulations! Don’t forget to reassemble the thing.&lt;/p&gt;&lt;p&gt;One small awkward thing I noticed is that, when it’s booted into PMOS, the power light will repeatedly flash in groups of two pulses. Not sure what that’s about or how to fix it. I think it’s just cosmetic though.&lt;/p&gt;&lt;h2&gt;Guides I referenced:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://codeberg.org/libre-tegra/user-documentation/src/branch/master/asus-google-grouper-tilapia.md&quot;&gt;libre-tegra guide for the Google Nexus 7&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://wiki.postmarketos.org/wiki/Nvidia_Tegra_armv7_(nvidia-tegra-armv7)&quot;&gt;PMOS wiki&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tofurky/tegra30_debrick#Ouya-Debrick&quot;&gt;tegra30 debrick&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.u-boot-project.org/en/latest/board/ouya/ouya.html&quot;&gt;u-boot docs for the Ouya&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.ifixit.com/Teardown/Ouya+Teardown/14224&quot;&gt;iFixIt teardown&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
        <link>https://voidsleeper.xyz/blog/ouya-postmarketos/</link>
        <pubDate>Thu, 13 Aug 2026 00:00:00 +0000</pubDate>
        <guid>https://voidsleeper.xyz/blog/ouya-postmarketos/</guid>
      </item>
    
      <item>
        <title>Failing To Do 3DS Homebrew with Zig 0.16.0</title>
        <description>&lt;p&gt;I had a 3DS homebrew project I wanted to make. I didn’t want to use C, because I would generally prefer to avoid writing C when I can. I didn’t want to use Rust, because the community’s libctru bindings don’t appear to be very comprehensive yet and I didn’t want to spend the whole project writing my own safe bindings. So I decided to go with Zig.&lt;/p&gt;&lt;p&gt;I then wrote up this post while I went, assuming I’d succeed. I did not. Let this be a cautionary tale, though I’m not really sure what the lesson is supposed to be.&lt;/p&gt;&lt;h1&gt;What the tutorial would’ve been&lt;/h1&gt;&lt;p&gt;The issue is that while there are guides out there for 3DS homebrew with Zig, Zig seems to have had numerous breaking changes since they were written.&lt;/p&gt;&lt;p&gt;So, just in case any other stubborn motherfuckers out there get themselves into this weird position by refusing to just use C or C++, I thought I’d document my own efforts to get it working. I’m basically doing exactly what Erik Wastaken did in  &lt;a href=&quot;https://blog.erikwastaken.dev/posts/2024-10-27-building-3ds-homebrew-with-zig.html&quot;&gt;his blog post&lt;/a&gt; on the topic, but with the current version of Zig, 0.16.0. This post owes a lot to his writeup!&lt;/p&gt;&lt;p&gt;So we are going to:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Start with a C “hello world” program.&lt;/li&gt;&lt;li&gt;Convert the makefile into a &lt;code&gt;build.zig&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Alter the &lt;code&gt;build.zig&lt;/code&gt; to use Zig itself as the C compiler.&lt;/li&gt;&lt;li&gt;Alter the &lt;code&gt;build.zig&lt;/code&gt; and source code to use Zig instead of C.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;(See how I’m switching to first-person &lt;em&gt;plural&lt;/em&gt;? That’s how you know I’m personable and writing a guide and not just documenting the random bullshit I tried.)&lt;/p&gt;&lt;h2&gt;devkitpro Hello World&lt;/h2&gt;&lt;p&gt;Trivial.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ cp -r $DEVKITPRO/examples/3ds/templates/application/* .
$ make
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We get a 3dsx file, which can be uploaded and run on a 3DS via &lt;code&gt;3dslink&lt;/code&gt;. This is the easy part where I just do things the way I probably ought to be doing it to begin with.&lt;/p&gt;&lt;h2&gt;Convert the makefile&lt;/h2&gt;&lt;p&gt;Then get the actual commands that were run, by rebuilding with &lt;code&gt;V=1&lt;/code&gt;.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ make clean
$ make V=1
arm-none-eabi-gcc -MMD -MP -MF /home/skylar/software/scurvytracker/build/main.d   -g -Wall -O2 -mword-relocations -ffunction-sections -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft -I/home/skylar/software/scurvytracker/include -I/opt/devkitpro/libctru/include -I/home/skylar/software/scurvytracker/build -D__3DS__ -c /home/skylar/software/scurvytracker/source/main.c -o main.o
arm-none-eabi-gcc -specs=3dsx.specs -g -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft -Wl,-Map,scurvytracker.map      main.o  -L/opt/devkitpro/libctru/lib -lctru -lm -o /home/skylar/software/scurvytracker/scurvytracker.elf
arm-none-eabi-gcc-nm -CSn /home/skylar/software/scurvytracker/scurvytracker.elf &amp;gt; scurvytracker.lst
smdhtool --create &amp;quot;scurvytracker&amp;quot; &amp;quot;Built with devkitARM &amp;amp; libctru&amp;quot; &amp;quot;Unspecified Author&amp;quot; /opt/devkitpro/libctru/default_icon.png /home/skylar/software/scurvytracker/scurvytracker.smdh
3dsxtool /home/skylar/software/scurvytracker/scurvytracker.elf /home/skylar/software/scurvytracker/scurvytracker.3dsx --smdh=/home/skylar/software/scurvytracker/scurvytracker.smdh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wow! Horrible long commands. Truly now we are become dweeb, developer of software.&lt;/p&gt;&lt;p&gt;The first command builds an object file with devkitARM’s C compiler. This is the step we’re eventually going to replace with Zig’s C compiler and then Zig itself.&lt;/p&gt;&lt;p&gt;The second command uses devkitARM’s linker to produce an ELF binary. Erik Wastaken had trouble switching this to Zig’s linker, hypothesizing there are some 3DS specific quirks that the devkitARM linker is able to account for but the Zig one cannot, so I am ✨ Not Going To Bother Trying To Do That ✨.&lt;/p&gt;&lt;p&gt;The third command generates a list of the symbols in our ELF file. Erik says this is optional and for my part I can’t see where anything is actually using it, so he’s probably right.&lt;/p&gt;&lt;p&gt;The fourth command generates an &lt;a href=&quot;https://www.3dbrew.org/wiki/SMDH&quot;&gt;SMDH&lt;/a&gt; file, which is basically a 3DS application’s metadata.&lt;/p&gt;&lt;p&gt;Then finally, the fifth command patches the ELF binary and the SMDH metadata into a &lt;a href=&quot;https://www.3dbrew.org/wiki/3DSX_Format&quot;&gt;3dsx&lt;/a&gt; file that can be loaded into the Homebrew menu. There are also tools out there that can create &lt;a href=&quot;https://www.3dbrew.org/wiki/CIA&quot;&gt;CIA&lt;/a&gt; files to install directly on the home screen, specifically &lt;a href=&quot;https://github.com/3DSGuy/Project_CTR/tree/master/makerom&quot;&gt;makerom&lt;/a&gt;, which is not packaged with devkitpro. I do want my application to have this in the end, both for the swag and also because you can embed a manual which is accessible via the home menu. But I won’t be bothering with any of that yet, because 3dsx is way more convenient for prototyping.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;zig&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;module constant variable_builtin type variable&quot;&gt;std&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;function_builtin keyword_import&quot;&gt;@import&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;std&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;module constant variable_builtin type variable&quot;&gt;builtin&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;function_builtin keyword_import&quot;&gt;@import&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;builtin&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitpro&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/opt/devkitpro&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitarm&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/opt/devkitpro/devkitARM&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;keyword_modifier&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;keyword_function&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin variable_parameter variable type&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;Build&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;type_builtin&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// WriteFiles step which lets us do all of this in a cache directory&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;wf&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addWriteFiles&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;extension&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;keyword_conditional&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;builtin&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;tag&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;windows&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;.exe&amp;quot;&lt;/span&gt; &lt;span class=&quot;keyword_conditional&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Compile the hello world to an object file&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addSystemCommand&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitarm&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/bin/arm-none-eabi-gcc&amp;quot;&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addArgs&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-MMD&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-MP&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-g&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-Wall&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-O2&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mword-relocations&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-ffunction-sections&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-march=armv6k&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mtune=mpcore&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mfloat-abi=hard&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mtp=soft&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-I/opt/devkitpro/libctru/include&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-D__3DS__&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-c&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/home/skylar/software/scurvytracker/source/main.c&amp;quot;&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj_out&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addPrefixedOutputFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;-o&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;main.o&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Link the object file to an ELF binary&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addSystemCommand&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitarm&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/bin/arm-none-eabi-gcc&amp;quot;&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;setCwd&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;wf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;getDirectory&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addArgs&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-specs=3dsx.specs&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-g&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-march=armv6k&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mtune=mpcore&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mfloat-abi=hard&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mtp=soft&amp;quot;&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addPrefixedOutputFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;-Wl,-Map,&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.map&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj_out&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addArgs&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-L/opt/devkitpro/libctru/lib&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-lctru&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-lm&amp;quot;&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_elf&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addPrefixedOutputFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;-o&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.elf&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Generate SMDH metadata&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;smdh&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addSystemCommand&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitpro&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/tools/bin/smdhtool&amp;quot;&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;smdh&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;setCwd&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;wf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;getDirectory&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;smdh&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addArgs&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;--create&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;Built with Zig, devkitARM, and libctru.&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;Void Sleeper&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/opt/devkitpro/libctru/default_icon.png&amp;quot;&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_smdh&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;smdh&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addOutputFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.smdh&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Create the final 3DSX file&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addSystemCommand&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitpro&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/tools/bin/3dsxtool&amp;quot;&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;setCwd&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;wf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;getDirectory&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_elf&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_dsx&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addOutputFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.3dsx&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addPrefixedFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;--smdh=&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_smdh&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Copy the 3DSX file to the install directory, leaving all of its precursors behind in the cache&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;install_3dsx&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addInstallFileWithDir&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.3dsx&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;getInstallStep&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;dependOn&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;install_3dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So far so basically identical to Erik’s guide. Why am I writing this again?&lt;/p&gt;&lt;h2&gt;Use Zig C compiler&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;diff&quot;&gt;&lt;span class=&quot;punctuation_special diff_minus&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;diff_minus&quot;&gt;     const obj = b.addSystemCommand(&amp;amp;.{devkitarm ++ &amp;quot;/bin/arm-none-eabi-gcc&amp;quot; ++ extension});&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_minus&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;diff_minus&quot;&gt;     obj.addArgs(&amp;amp;.{ &amp;quot;-MMD&amp;quot;, &amp;quot;-MP&amp;quot;, &amp;quot;-g&amp;quot;, &amp;quot;-Wall&amp;quot;, &amp;quot;-O2&amp;quot;, &amp;quot;-mword-relocations&amp;quot;, &amp;quot;-ffunction-sections&amp;quot;, &amp;quot;-march=armv6k&amp;quot;, &amp;quot;-mtune=mpcore&amp;quot;, &amp;quot;-mfloat-abi=hard&amp;quot;, &amp;quot;-mtp=soft&amp;quot;, &amp;quot;-I/opt/devkitpro/libctru/include&amp;quot;, &amp;quot;-D__3DS__&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;/home/skylar/software/scurvytracker/source/main.c&amp;quot; });&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_minus&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;diff_minus&quot;&gt;     const obj_out = obj.addPrefixedOutputFileArg(&amp;quot;-o&amp;quot;, &amp;quot;main.o&amp;quot;);&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_minus&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     const optimize = b.standardOptimizeOption(.{});&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     const target: std.Target.Query = .{&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         .cpu_arch = .arm,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         .os_tag = .freestanding,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         .abi = .eabihf,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         .cpu_model = .{ .explicit = &amp;amp;std.Target.arm.cpu.mpcore },&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     };&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     const obj = b.addObject(.{&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         .name = &amp;quot;scurvytracker&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         .root_module = b.createModule(.{&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             .optimize = optimize,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             .target = b.resolveTargetQuery(target),&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         }),&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     });&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     obj.root_module.addCSourceFiles(.{&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         .root = b.path(&amp;quot;source/&amp;quot;),&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         .files = &amp;amp;.{&amp;quot;main.c&amp;quot;},&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         .flags = &amp;amp;.{&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-MMD&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-MP&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-g&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-Wall&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-O2&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-ffunction-sections&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-march=armv6k&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-mtune=mpcore&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-mfloat-abi=hard&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-mtp=soft&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;             &amp;quot;-D__3DS__&amp;quot;,&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;         },&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     });&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     obj.root_module.addIncludePath(.{ .src_path = .{ .owner = b, .sub_path = devkitpro ++ &amp;quot;/libctru/include&amp;quot; } });&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     obj.root_module.addIncludePath(.{ .src_path = .{ .owner = b, .sub_path = devkitarm ++ &amp;quot;/arm-none-eabi/include&amp;quot; } });&lt;/span&gt;
22c52
&lt;span class=&quot;punctuation_special diff_minus&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;diff_minus&quot;&gt;     elf.addFileArg(obj_out);&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_minus&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;punctuation_special diff_plus&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;diff_plus&quot;&gt;     elf.addArtifactArg(obj);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ah, that’s why. A lot of things are the same as Erik’s guide but notably, Zig now requires you to package compiler options and things into a “module”. Also, the horrible code there for adding the include path is because Zig really does not want you to use absolute paths anywhere in your build script for reasons which I cannot even begin to understand. The error message when I tried said something about a &lt;code&gt;LazyPath.cwd_relative&lt;/code&gt; which handles it but it does not appear to exist.&lt;/p&gt;&lt;p&gt;This particular build script also gives the warnings:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;/opt/devkitpro/devkitARM/arm-none-eabi/bin/ld: warning: ./../db02d4ec2abb95122acf5ee3ab40fee3/scurvytracker.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail
/opt/devkitpro/devkitARM/arm-none-eabi/bin/ld: warning: /opt/devkitpro/devkitARM/lib/gcc/arm-none-eabi/16.1.0/armv6k/fpu/crtn.o: missing .note.GNU-stack section implies executable stack
/opt/devkitpro/devkitARM/arm-none-eabi/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
failed command: cd .zig-cache/o/2fb5824d4233e9fe32370ab196a5b16d &amp;amp;&amp;amp; /opt/devkitpro/devkitARM/bin/arm-none-eabi-gcc -specs=3dsx.specs -g -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft -Wl,-Map,/home/skylar/software/scurvytracker/.zig-cache/o/5f7976b54257210ef9d2ed2712a55036/scurvytracker.map ./../db02d4ec2abb95122acf5ee3ab40fee3/scurvytracker.o -L/opt/devkitpro/libctru/lib -lctru -lm -o/home/skylar/software/scurvytracker/.zig-cache/o/5f7976b54257210ef9d2ed2712a55036/scurvytracker.elf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I have no idea what that’s about but it is concerning. The 3DSX file does appear to build properly though, and runs when I send it to my 3DS, so. Problem for future Skylar.&lt;/p&gt;&lt;h2&gt;Use Zig linker&lt;/h2&gt;&lt;p&gt;I did not attempt to do this. I’ve seen it done in some other guides though so presumably it’s possible, though I am unsure if there’s any real reason to do it.&lt;/p&gt;&lt;h2&gt;Use Zig source code&lt;/h2&gt;&lt;p&gt;And this is where it all went wrong. It was fairly easy to translate the C hello world program into Zig. It was fairly easy to rewrite the build.zig to compile a Zig file instead of a C file. Except it won’t compile properly:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;source/main.zig:3:13: error: C import failed
const ctr = @cImport({
            ^~~~~~~~
source/main.zig:3:13: note: libc headers not available; compilation does not link against libc
referenced by:
    main: source/main.zig:9:5
    main: source/main.zig:8:1
    4 reference(s) hidden; use &amp;apos;-freference-trace=6&amp;apos; to see all references
error: translation failure
/opt/devkitpro/libctru/include/sys/select.h:1:15: error: &amp;apos;sys/select.h&amp;apos; not found
#include_next &amp;lt;sys/select.h&amp;gt;
              ^
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is baffling because the directory which includes &lt;code&gt;&amp;lt;sys/select.h&amp;gt;&lt;/code&gt; (&lt;code&gt;$DEVKITARM/arm-none-eabi/include&lt;/code&gt;) is definitely in our include path. I thought maybe it’s the lack of having linked libc, and that using the Zig linker was going to be mandatory after all. So I added a &lt;code&gt;libc.txt&lt;/code&gt; and configured the module to link libc, referencing that &lt;code&gt;libc.txt&lt;/code&gt;. Same error except the warning about not having libc headers available goes away.&lt;/p&gt;&lt;p&gt;For posterity, here are all the relevant files.&lt;/p&gt;&lt;h3&gt;build.zig&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;zig&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;module constant variable_builtin type variable&quot;&gt;std&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;function_builtin keyword_import&quot;&gt;@import&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;std&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;module constant variable_builtin type variable&quot;&gt;builtin&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;function_builtin keyword_import&quot;&gt;@import&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;builtin&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitpro&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/opt/devkitpro&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitarm&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/opt/devkitpro/devkitARM&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;keyword_modifier&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;keyword_function&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin variable_parameter variable type&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;Build&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;type_builtin&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// WriteFiles step which lets us do all of this in a cache directory&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;wf&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addWriteFiles&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;extension&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;keyword_conditional&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;builtin&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;tag&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;windows&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;.exe&amp;quot;&lt;/span&gt; &lt;span class=&quot;keyword_conditional&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Compile the hello world to an object file&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;optimize&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;standardOptimizeOption&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;Query&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;cpu_arch&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;arm&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;os_tag&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;freestanding&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;abi&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;eabihf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;cpu_model&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;explicit&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;arm&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;mpcore&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addObject&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;root_module&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;createModule&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;root_source_file&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;source/main.zig&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;optimize&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;optimize&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;resolveTargetQuery&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;link_libc&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;root_module&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addIncludePath&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;src_path&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;owner&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;sub_path&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitpro&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/libctru/include&amp;quot;&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;root_module&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addIncludePath&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;src_path&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;owner&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;sub_path&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitarm&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/arm-none-eabi/include&amp;quot;&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;setLibCFile&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;libc.txt&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Link the object file to an ELF binary&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addSystemCommand&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitarm&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/bin/arm-none-eabi-gcc&amp;quot;&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;setCwd&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;wf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;getDirectory&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addArgs&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-specs=3dsx.specs&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-g&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-march=armv6k&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mtune=mpcore&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mfloat-abi=hard&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-mtp=soft&amp;quot;&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addPrefixedOutputFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;-Wl,-Map,&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.map&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addArtifactArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addArgs&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-L/opt/devkitpro/libctru/lib&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-lctru&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-lm&amp;quot;&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_elf&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;elf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addPrefixedOutputFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;-o&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.elf&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Generate SMDH metadata&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;smdh&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addSystemCommand&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitpro&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/tools/bin/smdhtool&amp;quot;&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;smdh&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;setCwd&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;wf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;getDirectory&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;smdh&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addArgs&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;--create&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;Built with Zig, devkitARM, and libctru.&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;Void Sleeper&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/opt/devkitpro/libctru/default_icon.png&amp;quot;&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_smdh&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;smdh&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addOutputFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.smdh&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Create the final 3DSX file&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addSystemCommand&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;devkitpro&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/tools/bin/3dsxtool&amp;quot;&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;setCwd&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;wf&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;getDirectory&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_elf&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_dsx&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addOutputFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.3dsx&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addPrefixedFileArg&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;--smdh=&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_smdh&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;comment_documentation comment spell&quot;&gt;// Copy the 3DSX file to the install directory, leaving all of its precursors behind in the cache&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;install_3dsx&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;addInstallFileWithDir&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;out_dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;scurvytracker.3dsx&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;getInstallStep&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;dependOn&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;install_3dsx&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;libc.txt&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;# The directory that contains `stdlib.h`.
# On POSIX-like systems, include directories be found with: `cc -E -Wp,-v -xc /dev/null`
include_dir=/opt/devkitpro/devkitARM/arm-none-eabi/include

# The system-specific include directory. May be the same as `include_dir`.
# On Windows it&amp;apos;s the directory that includes `vcruntime.h`.
# On POSIX it&amp;apos;s the directory that includes `sys/errno.h`.
sys_include_dir=/opt/devkitpro/devkitARM/arm-none-eabi/include

# The directory that contains `crt1.o` or `crt2.o`.
# On POSIX, can be found with `cc -print-file-name=crt1.o`.
# Not needed when targeting MacOS.
crt_dir=/opt/devkitpro/devkitARM/arm-none-eabi/lib/armv6k/fpu

# The directory that contains `vcruntime.lib`.
# Only needed when targeting MSVC on Windows.
msvc_lib_dir=

# The directory that contains `kernel32.lib`.
# Only needed when targeting MSVC on Windows.
kernel32_lib_dir=

# The directory that contains `crtbeginS.o` and `crtendS.o`
# Only needed when targeting Haiku.
gcc_dir=
&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;main.zig&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;zig&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;module constant variable_builtin type variable&quot;&gt;std&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;function_builtin keyword_import&quot;&gt;@import&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;std&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;module constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;function_builtin keyword_import&quot;&gt;@cImport&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;function_builtin&quot;&gt;@cInclude&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;stdio.h&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;function_builtin&quot;&gt;@cInclude&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;3ds.h&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;keyword_import&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;keyword_function&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin variable_parameter variable type&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;type_builtin&quot;&gt;c_int&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;constant variable_builtin variable_parameter variable type&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;type_builtin&quot;&gt;u8&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;type_builtin&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;gfxInitDefault&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;defer&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;gfxExit&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;consoleInit&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;GFX_TOP&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;constant_builtin&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Hello, world!&lt;/span&gt;&lt;span class=&quot;string string_escape&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;keyword_repeat&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;aptMainLoop&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;gspWaitForVBlank&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;gfxSwapBuffers&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;hidScanInput&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;kDown&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;type constant variable_builtin function_call variable_member variable&quot;&gt;hidKeysDown&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;keyword_conditional&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable&quot;&gt;kDown&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;constant variable_builtin type variable&quot;&gt;ctr&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;constant variable_builtin type variable_member variable&quot;&gt;KEY_START&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;keyword_repeat&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;In conclusion&lt;/h1&gt;&lt;p&gt;Well I guess it probably won’t kill me to write some C++. But &lt;em&gt;this&lt;/em&gt; actually &lt;em&gt;might&lt;/em&gt; kill me.&lt;/p&gt;</description>
        <link>https://voidsleeper.xyz/blog/zig-3ds/</link>
        <pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate>
        <guid>https://voidsleeper.xyz/blog/zig-3ds/</guid>
      </item>
    
      <item>
        <title>Evangelical Christianity is Founded on Contradictions</title>
        <description>&lt;p&gt;I’m sure this has already been written about and in much greater detail, but having just encountered some Jehovah’s Witnesses proselytizing in the subway, I felt like I had something potentially useful to say. Anyone who has interacted with American evangelicals has probably noticed that there is very little they can say to challenge their beliefs. It seems like they have an answer for everything. The answers can be picked apart rationally, of course, but even when you do, they don’t seem to notice or care. The main reason for this, in my experience as a former Southern Baptist, is comfort with cognitive dissonance. Evangelicalism teaches its followers to accept and internalize contradictions.&lt;/p&gt;&lt;p&gt;The example that motivated me to write this is how evangelicals view their interactions with non-believers. Evangelicalism maintains, simultaneously, that:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Evangelical belief is popular and in the majority; it’s what “normal people” believe.&lt;/li&gt;&lt;li&gt;Evangelical belief is unpopular and in the minority; it is actively suppressed and believers are hated by mainstream culture.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Individual evangelicals might resolve this contradiction in different ways, of course.  Maybe one thinks belief is &lt;em&gt;the default&lt;/em&gt;, but still unpopular due to the dominance of secular indoctrination. Maybe another thinks belief is popular, but those hostile to it have outsized power and influence. But ultimately the ideology preaches the contradiction. Believers hear both in equal measure, and if they keep up church attendance, they get used to hearing it. Eventually they stop noticing it’s a contradiction.&lt;/p&gt;&lt;p&gt;And then, when they go out to proselytize, &lt;em&gt;there is no way to interact with them that challenges the ideology&lt;/em&gt;. Anything you say, do, or fail to say or do, reinforces one or the other contradictory tenet, and thus the ideology as a whole. If you are polite and cordial, if you engage with their ideas genuinely, you reinforce that their beliefs are normal and popular. (“We planted a seed today,” they’ll say afterwards.) If you’re hostile, argumentative, or completely ignore them, it’s proof that they are being persecuted. (“God really showed us today how much these people need him, how important our work is”, they’ll say afterward.) In the words of Dan Olsen, &lt;a href=&quot;https://youtu.be/V-a9VDIbZCU?t=533&quot;&gt;“they can use the whole bird.”&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This trick only works because of the contradictory nature of the belief system. If it held only that evangelical belief is popular and in the majority, then hostility would make it clear that wasn’t true. If, conversely, it held only that evangelical belief is unpopular, then politeness and good-faith discussion would challenge the ideology. But it doesn’t hold one or the other, it holds &lt;em&gt;both simultaneously&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;It’s also definitely not a coincidence that contradiction is at the core of fascism; Umberto Eco famously writes that one of its characteristics is the belief that “the enemy is both strong and weak.” Cognitive dissonance is a core component of every ideology founded on high-control social groups. Which makes sense; these ideologies are rarely coherent, and as mathematics tells us, if you accept a contradiction you can prove anything.&lt;/p&gt;</description>
        <link>https://voidsleeper.xyz/blog/founded-on-contradictions/</link>
        <pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate>
        <guid>https://voidsleeper.xyz/blog/founded-on-contradictions/</guid>
      </item>
    
      <item>
        <title>My ideal programming ecosystem</title>
        <description>&lt;p&gt;Over the past few days I’ve spent a lot of time thinking about programming languages. What do I want out of them? How do I think they should work? Do any of the existing options meet those criteria? That kind of thing. So here is a ramble about what I want out of programming languages.&lt;/p&gt;&lt;p&gt;First, I think a language is harmed when it tries to cover too many use cases, or do too many things at once. Rust, for example, is trying to be high-level and low-level at the same time. The versatility this provides is useful, to be sure, but it means that when writing high-level applications you’re forced to think about details like move semantics and lifetimes. This complicates the process of writing Rust software, and also means Rust itself is not as simple to implement as it could be. The trade-off, of course, is that you gain access to those high-level features in low-level Rust, and that every application written in Rust is resource-efficient by default.&lt;/p&gt;&lt;p&gt;The main area where this conflicts with my needs is in the realm of permacomputing. For that, I want &lt;em&gt;simple&lt;/em&gt; languages, capable of being understood and hacked on by a single person. Modern industry might benefit from a language with “batteries included”, but it also means that the language cannot exist without the support of that industry.&lt;/p&gt;&lt;p&gt;Hare is a language that seems to meet this concern, designed to remain small and simple, and using the “hobby-scale” backend &lt;a href=&quot;https://c9x.me/compile/&quot;&gt;QBE&lt;/a&gt;. Having worked with Hare, however, I feel that it both does too much and not enough. It’s simple, sure, but the complexity it &lt;em&gt;does&lt;/em&gt; add doesn’t feel like it buys you much, it’s still a pretty bare environment to work in.&lt;/p&gt;&lt;p&gt;Haskell is another language I’ve looked at. It’s this beautiful, elegant core of a language kneecapped by a preponderance of features, a significant divergence between best practices and the standard library, and generally unimpressive performance from compiled code due to its runtime and garbage collector. Its origins as an academic language to study lazy evaluation ends up really hurting attempts to actually use it; it turns out lazy evaluation is only a good idea in a few scenarios.&lt;/p&gt;&lt;p&gt;All of this has led me to conclude that my ideal programming language needs to actually be &lt;em&gt;two programming languages&lt;/em&gt; designed to interoperate well. The first would be a low-level language with minimal abstractions, just enough features to help the programmer avoid common footguns. The second would be a functional language with an expressive static type system, automatic memory management, and full metaprogramming enabled by homoiconicity. Calling the low-level language from the high-level one should be effortless. Let each language do one job well, rather than writing one language that tries to do both and suffers for it. And crucially, the high-level language should be adaptable via macros rather than try to integrate every possible feature a particular use case might need or want.&lt;/p&gt;&lt;p&gt;I’d like to design and implement a pair of programming languages fitting this description! Once I have a cohesive idea how they’d work, I’ll post the rough outline of the design.&lt;/p&gt;</description>
        <link>https://voidsleeper.xyz/blog/ideal-programming-ecosystem/</link>
        <pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate>
        <guid>https://voidsleeper.xyz/blog/ideal-programming-ecosystem/</guid>
      </item>
    
  </channel>
</rss>
