Homebrew development guide
This article will go over the primary ways of developing various types of homebrew on the Wii U.
Your first step is to install devkitPro pacman, downloading the Linux, OSX or Windows versions as appropriate for your setup. If you use the Windows installer, you don't need to tick any of the "<console> development" options. On Linux and OSX, pacman will be installed into your native terminal, while Windows users will find a new terminal named "msys2" that they will need to use. Once you're up and running, you can use one of
dkp-pacman -S <package> or
pacman -S <package> to install packages! Start off by installing
devkitPPC, followed by
devkit-env on Linux. If that worked without error, your next step is to install wiiu-fling using the instructions in that link. That will add some extra Wii U-related packages to pacman, including most things you'll need to develop homebrew!
Making Native Apps (wut)
The best solution for making Wii U homebrew at this time is wut; an actively-developed toolchain that can build native RPX apps. RPX apps have a high filesize limit, can be launched through HBL or installed to the System Menu as a channel, and can take advantage of many Nintendo features previously unavailable to homebrew. It's recommended to use wut for all new projects.
If you followed the wiiu-fling install instructions above, you should be able to install the
wut-msys2 packages, depending on your system.
There's also a port of SDL2 built on top of wut available to developers; with features like hardware acceleration and sound support. It's designed to be as close to the Switch port of SDL2 as possible, so often Switch and PC SDL2 apps can be used without any changes. It can be installed with
wiiu-sdl2 - real-world examples of use include hb-appstore, Fireplace-WiiU, WiiU-Shell, and many others!
The methods below are useful to know about in case you need to work with or learn from older code, though are generally unsupported and unmaintained.
Making HBL ELF apps
The Homebrew Launcher is an easy platform to target for development. The two below methods are useful for making console and GUI apps respectively. In particular, lib_easy is a good place to start. Apps compiled with this method are in the ELF format.
lib_easy by rw-r-r_0644 was designed to be a quick way to get familiar with programming on the Wii U. That link contains an example hello world project. After setting up your environment, you can compile the hello world project by cd-ing into the folder and running "make".
An example of a homebrew app that was made using lib_easy is UClick. lib_easy is now deprecated in favor of wut.
Using Dimok's libraries
Dimok's libraries provide assistance with interacting with various parts of the Wii U. For some projects that use OSScreen to interact with the see Pong, C@ve, Snake, or Space Game. (Specifically, you will want to look at this HBL pong port).
Dimok's libs also provide many GX2 wrappers that provide a template for creating Homebrew Launcher-style GUIs. Examples of projects that utilize this include Homebrew Launcher, CHIP-8_Emulator, and Homebrew App Store.
Making Userland Apps
The userland environment does not require a kernel exploit to execute programs, but as a result is heavily limited. These apps hijack the browser, but don't go any further. libwiiu is a good build system to use to produce .bin files which can be converted into mp4 payloads. It has detailed compilation instructions and many examples in the readme and repository.
It isn't really recommended to use userland while a kernel exploit environment is available. It is heavily restricted to ~20KB payload files, no access to global variables, and no access to GX2 (OSScreen only).
They have also produced an older, outdated development guide for the userspace environment here.
If you need help developing, here are a few channels that may be able to provide direct assistance.
- fortheusers Discord (formerly wiiubru) has a lot of key homebrew and toolchain devs
- #wiiudev on irc.efnet.org is a good place to talk about the hacking side of things
Don't be afraid to ask! :)