architectds/readme.rst
Antonio Niño Díaz fc09001a4b core: docs: Add support to generate compile_commands.json
Thanks to ninja-build, all we need to do is to run one command [1] and
we can get a compile_commands.json from a ninja.build file.

This commit adds a new argument (-j or --compdb) to let users generate a
compile_commands.json file.

[1] https://ninja-build.org/manual.html#_extra_tools
2025-05-09 20:58:58 +01:00

297 lines
11 KiB
ReStructuredText

ArchitectDS
===========
This is a build system for NDS ROMs meant to be used with BlocksDS. It allows
you to easily define source directories, libraries, etc; and define the location
of assets and their destination (NitroFS or CPU data).
- ARM9 and ARM7 binaries can have a custom list of libraries, definitions and
source code directories.
- If an ARM7 isn't defined, it will use the default ARM7 binary of BlocksDS.
- Assets such as images and audio files can be converted as part of the build
process and added to NitroFS or the CPU binary as data.
- An arbitrary number of DSP binaries can be built, and they can be stored in
NitroFS or in a CPU binary as data.
- Popular NDS libraries and tools are supported:
- grit: Converted assets are saved as GRF files in NitroFS, or as binary files
if they need to be added as data to a CPU binary as an array.
- Maxmod: Soundbanks can be generated to NitroFS or added as data to the CPU.
- NFlib: Assets are converted and saved to NitroFS. Shared palettes are
supported.
- Nitro Engine: Static and animated models are supported.
- ptexconv: Used to generate textures in Tex4x4 format.
- libxm7, dswifi, gbajpg and other libraries that don't require special
tooling are also supported.
Note that this is still an early version of the build system. If you need a
feature, or a suggestion, feel free to create issues in the repository.
For an example of using Nitro Engine, NFlib and libnds at the same time, check
`this example <examples/nitro_engine/using_nflib>`__.
For an example of using the DSP, check `this example <examples/libnds/dsp>`__.
For an example of debug/release builds, check `this example
<examples/libnds/debug_build>`__.
Dependencies
------------
You need to install Ninja and Python 3. In Ubuntu or Debian simply run:
.. code:: bash
sudo apt install python3 ninja-build
Setup
-----
If you don't want to install it in your system, you can just copy the
``architectds`` folder to your project. Then, you will be able to import the module
with:
.. code:: python
from architectds import *
If you want to install it in a virtual environment instead of copying the
folder, follow the steps below:
.. code:: bash
# Create and activate venv
sudo apt install python3-venv
python3 -m venv env
source env/bin/activate
# Install dependencies
pip3 install wheel setuptools
# Create wheel
python3 setup.py bdist_wheel
# Install wheel
pip3 install dist/architectds-*-py3-none-any.whl
If you want to install it in your system, you may find issues. Linux
distributions now disallow installing user packages in system folders. This is
done so that users don't break system libraries, but it affects all packages,
even the ones that your system doesn't depend on. This is discouraged, but you
can force the instalation with:
.. code:: bash
# Install wheel
pip3 install dist/architectds-*-py3-none-any.whl --break-system-packages
Examples
--------
There are lots of examples that show how to use most features. To build any of
the examples, run ``python3 build.py`` in the folder of the example.
- **gbajpeg/**:
- ``load_from_nitrofs``: Load and decode a JPEG image from NitroFS.
- ``load_from_ram``: Load and decode a JPEG image from RAM.
- **gl2d/**: Examples that use the GL2D library included with libnds.
- ``sprite_set``: Generate a sprite set from multiple PNG files and add it to
the ARM9 binary as data.
- ``sprite_set_nitrofs``: Generate a sprite set from multiple PNG files and
add it to NitroFS.
- **libnds/**: Examples with the default BlocksDS libraries.
- ``all``: It shows how to do most things supported by libnds and other very
common libraries:
- DSP: One binary stored in NitroFS, one binary added to the ARM9 as data.
- NitroFS: Graphics files converted with grit to GRF format, audio files
converted with mmutil into a soundbank.
- ARM9: Graphics files converted with grit and added as data. Data files
added to the ARM9 binary. Audio files converted into a soundbank with
mmutil and added to the ARM9 binary.
- ARM7: With Maxmod and dswifi. Data files are added to it.
- NDS: NitroFS directories. Custom ROM title, subtitles, and icon.
- ``arm9``: Simple ROM with only a source file for the ARM9 and default ARM7.
- ``arm9_arm7``: Example of developing custom ARM9 and ARM7 binaries.
- ``arm9_nitrofs``: Simple ROM with only a source file for the ARM9, default
ARM7, and NitroFS data files added to the filesystem by the developer.
- ``dsp``: Example of loading DSP binaries from memory and NitroFS.
- ``opengl``: Example of converting graphics and displaying them with OpenGL.
- **libxm7/**:
- ``nitrofs``: Example that uses LibXM7 to play XM and MOD songs from NitroFS.
It also shows how to use a different pre-built ARM7 core from BlocksDS and
how to add regular files to NitroFS in a ROM without converting them.
- ``play_songs``: Example that uses LibXM7 to play songs included in the ARM9
binary as data.
- **maxmod/**:
- ``audio_as_data``: Example of using Maxmod with ARM9 data as a soundbank.
- ``audio_in_nitrofs``: Example of using Maxmod with a soundbank in NitroFS.
- **nflib/**: NFlib examples ported to ArchitectDS.
- ``3dsprites``: Tiled backgrounds and 3D sprites.
- ``collisions``: Multiple examples that show pixel-perfect collisions, as
well as tile-based collisions.
- **graphics/**:
- ``affine``: Affine backgrounds with and without shared palettes.
- ``animatedbg``: Animated tiled background.
- ``backbuffer3``: 16 bit background.
- ``bg``: Tiled backgrounds.
- ``bg16bits``: 16 bit backgrounds.
- ``bgmixed``: Tiled and 8 bit backgrounds. 256 color sprites. Custom fonts.
- ``bgtiled_spr256``: Tiled backgrounds, 256 color sprites, 8 bit
backgrounds with shared palettes.
- ``textdemo``: Tiled backgrounds and custom fonts.
- **nitro_engine/**: Nitro Engine examples ported to ArchitectDS.
- ``animated_model``: MD5 animated model and 16 bit texture converted with
grit added to the ARM9 as binary data.
- ``error_handling``: Shows how to have release and debug builds with debug
messages.
- ``filesystem_animated_model``: MD5 animated model and 16 bit texture
converted with grit and added to NitroFS.
- ``filesystem_compressed_texture``: Texture converted to Tex4x4 with ptexconv
and saved to NitroFS.
- ``filesystem_paletted_texture``: Paletted textures converted with grit to
GRF format and saved to NitroFS.
- ``filesystem_simple_model``: OBJ static model and 16 bit texture converted
with grit and added to NitroFS.
- ``model_with_vertex_color``: OBJ static model with vertex color information.
- ``paletted_texture``: Paletted textures converted with grit to GRF format
and saved to the ARM9 as binary data.
- ``sdroot_animated_model``: MD5 animated model and 16 bit texture converted
with grit and stored in the SD card of a flashcard or the DSi SD slot.
- ``simple_model``: OBJ static model and 16 bit texture converted with grit
and added to the ARM9 as binary data.
- ``specular_material``: OBJ static model and 16 bit texture converted with
grit and added to the ARM9 as binary data.
Usage guide
-----------
With this build system you need to create an ``Arm9Binary`` object, with a list
of source code directories, defines, include directories, libraries (and things
like CFLAGS, ASFLAGS, CXXFLAGS and LDFLAGS). This object can take any number of
assets through some functions like ``add_data()``, ``add_grit()`` or
``add_tlf()``. Check the examples for more information.
By default, assets functions will use a default path as destination. To define a
custom output path in any of the functions that include assets, set ``out_dir``
to the desired path:
.. code:: python
# This will use the default path:
arm9.add_grit(['graphics/trees'])
arm9.add_grit(['graphics/food'])
# This will set a different path:
arm9.add_grit(['graphics/animals'], 'graphics/animals')
arm9.add_grit(['graphics/rocks'], 'graphics/rocks')
When you're happy with your ARM9 binary, you can do the same thing with an
``Arm7Binary`` object if you want a custom ARM7 binary. If you don't create one,
the default BlocksDS binary will be used. You can also add assets to this binary,
but it only makes sense to use ``add_data()``.
You can also create a ``NitroFS`` object. This object is only used for assets
that need to be converted. For folders that need to be added as they are, check
the ``NdsRom`` class below. The ``NitroFS`` object can take any number of
graphics files to be converted with ``grit`` or ``ptexconv``, audio files that
are converted with ``mmutil``, or even 3D models to be used with Nitro Engine.
If you want to store your files in your SD card instead of the NitroFS
filesystem, you can create a ``FatFS`` object instead. It behaves the same way
as ``NitroFS``, but it will use your chosen folder as a root folder for the
generated files. You will need to copy them to your SD card yourself.
If you want to create DSP binaries, you need to create ``TeakBinary`` objects in
a similar way as ARM binaries.
Finally, once you have all your objects, you need to create an ``NdsRom``
object. This object takes a list of binaries (NitroFS, ARM9, ARM7, DSP) and adds
them to the ROM. It can also take a list of paths to directories to be added to
NitroFS right as they are without any modifications. All directories passed in
this list will be added to the root of the filesystem. If a file is found in
multiple trees it will cause an error.
As mentioned previously, if no ARM7 binary is added to the ROM, the default
BlocksDS binary will be used.
You can also define the header title and subtitles, and the game icon here.
Once your objects are ready, ``run_command_line_arguments()`` will check the
arguments passed to the python script:
- ``python3 build.py``: Create a ``ninja.build`` file and build the ROM.
Equivalent to ``python3 build.py --build``.
- ``python3 build.py --clean``: Clean all build files.
- ``python3 build.py --compdb``: Generate a ``compile_commands.json`` file.
- ``python3 build.py --graph``: If you have ``graphviz`` installed in your
system, this will generate a PNG file with the dependency graph of your
project.
- ``python3 build.py --ninja``: Create a ``ninja.build`` file and exit.
Note that this is just a python script. At any point in the script you can check
``sys.argv`` for your own arguments and change the build definitions based on
them. The ``debug_build`` example in the ``libnds`` folder and the
``error_handling`` example in the ``nitro_engine`` folder use this to handle
debug and release builds differently in the same project.
Also, once you have the ``build.ninja`` file, if you want to invoke ``ninja`` by
itself without the wrapper script, make sure that you set the environment
variable ``BLOCKSDS`` to the path of your installation of BlocksDS (for example,
in Linux, ``export BLOCKSDS=/opt/blocksds/core``).