zig3ds allows you to develop applications for 3ds with only zig and no other system dependencies.
Must use zig version 2024.5.0-mach (0.13.0-dev.351+64ef45eb0)
This repo: zig build run:graphics/printing/hello-world
(if citra
is installed & in PATH
)
Your own project:
- Download
example/
from this repo - Run:
zig fetch --save git+https://github.com/pfgithub/zig3ds#main
- Done!
Build your application with zig build
, or run it with zig build run
if citra
is in your PATH. Output file is in zig-out/bin/sample.3dsx
.
zig3ds currently supports citro3d and citro2d. citro3d is required to use citro2d.
const citro3d_includer = zig3ds.CIncluder.find(zig3ds_dep, "citro3d");
const citro2d_includer = zig3ds.CIncluder.find(zig3ds_dep, "citro2d");
citro3d_includer.applyTo(&elf.root_module);
elf.linkLibrary(zig3ds_dep.artifact("citro3d"));
citro2d_includer.applyTo(&elf.root_module);
elf.linkLibrary(zig3ds_dep.artifact("citro2d"));
- Citro3d translate-c bindings cause compile error: ziglang/zig#16302
- This can be worked around by only including citro3d/citro2d from C
- Zig doesn't seem to have an equivalent of
-mtp=soft
. This is probably bad? - A bad patch is applied to libctru to disable its threadlocals because otherwise it doesn't compile. This patch breaks multithreaded use of any libctru functions that use path buffers. The error:
-
error: ld.lld: libctru.a(path_buf.o) has an STT_TLS symbol but doesn't have an SHF_TLS section
-
- 3dsx.ld specifies a bss alignment of 4, but lld wants align(8)
-
error: warning(link): unexpected LLD stderr: ld.lld: warning: address (0x159e88) of section .bss is not a multiple of alignment (64)
-
-
-fno-sanitize=undefined
is required to prevent a crash ingraphics/printing/system-font
and to prevent crashes on exit in all programs. - both libgloss/libsysbase and newlib provide copies of the same functions. Which one is the right one? I chose newlib/libc:
libgloss/libsysbase/unlink.c
defines_unlink_r
to calldevoptab_list[dev]->unlink_r()
newlib/libc/reent/unlinkr.c
defines_unlink_r
to call_unlink
-
c++
files are supposed to be compiled with-fno-rtti -fno-exceptions -std=gnu++11
- From the command line, citra's keyboard just types 'CITRA' and presses button 2 every time.
- Issue in
zig build run:input/software-keyboard
- Works fine in citra-qt
- Issue in
- Audio isn't playing in emulator?
- Test on device
audio/mic.3dsx
- Test on device
- Reduce usage of CIncluder, prefer
lib.installHeadersDirectory
+elf.linkLibrary
instead. - Tell zig that it's linking libc so
std.heap.c_allocator
and other things can be used - Support smdh file generation
- Support
tex3ds
. Unfortunately, it depends on imagemagick which depends on libbzip2 & libjpeg & libpng & libtiff & zlib, and imagemagick already has a huge makefile - Support emitting
.cia
files. This maybe requirescxitool
andmakerom
.
zig-3ds also lets you use zig to compile for 3ds, but requires devkitPro be installed on your system.