Development Setup

Note

To make changes to a backend, e.g. to the way a simulator or synthesis tool is called, you need to modify edalize, not fusesoc. Edalize is a separate project, see https://github.com/olofk/edalize for more information.

Get the code

The FuseSoC source code is maintained in a git repository hosted on GitHub. To improve FuseSoC itself, or to test the latest unreleased version, it is necessary to clone the git repository first.

cd your/preferred/source/directory
git clone https://github.com/olofk/fusesoc

Setup development environment

Note

If you have already installed FuseSoC, remove it first using pip3 uninstall fusesoc.

To develop FuseSoC and test the changes, the fusesoc package needs to be installed in editable or development mode. In this mode, the fusesoc command is linked to the source directory, and changes made to the source code are immediately visible when calling fusesoc.

# Install all Python packages required to develop fusesoc
pip3 install --user -r dev-requirements.txt

# Install Git pre-commit hooks, e.g. for the code formatter and lint tools
pre-commit install

# Install the fusesoc package in editable mode
pip3 install --user -e .

Note

All commands above use Python 3 and install software only for the current user. If, after this installation, the fusesoc command cannot be found adjust your PATH environment variable to include ~/.local/bin.

After this installation is completed, you can

  • edit files in the source directory and re-run fusesoc to immediately see the changes,

  • run the unit tests as outlined in the section below, and

  • use linter and automated code formatters.

Formatting and linting code

The FuseSoC code comes with tooling to automatically format code to conform to our expectations. These tools are installed and called through a tool called pre-commit. No setup is required: whenever you do a git commit, the necessary tools are called and your code is automatically formatted and checked for common mistakes.

To check the whole source code pre-commit can be run directly:

# check and fix all files
pre-commit run -a

Running tests

The FuseSoC contains unit tests written using the pytest framework. To run the tests in an isolated environment it is recommended to run pytest through tox, which first creates a package of the source code, installs it, and then runs the tests. This ensures that packaging and environment errors are less likely to slip through.

cd fusesoc/source/directory

# Run all tests in an isolated environment (recommended)
tox

# All arguments passed to tox after -- are passed to pytest directly.
# E.g. run a single test: use filename::method_name, e.g.
tox -- tests/test_capi2.py::test_capi2_get_tool --verbose

# Alternatively, tests can be run directly from the source tree.
# E.g. to run a single test: use filename::method_name, e.g.
python3 -m pytest

Refer to the pytest documentation for more information how tests can be run.

Note

In many installations you can replace python3 -m pytest with the shorter pytest command.

Building the documentation

The FuseSoC documentation (i.e., the thing you’re reading right now) is built from files in the doc directory in the FuseSoC source repository. The documentation is written reStructuredText, and Sphinx is used to convert the documentation into different output formats, such as HTML or PDF.

The most convenient way of working on documentation is to have a browser window open with the rendered documentation next an editor where you work on the reStructuredText files. Run the following command to build the documentation:

cd fusesoc/source/directory
tox -e doc-autobuild

The documentation is now built and can be accessed in a browser. Look for a line similar to [sphinx-autobuild] Serving on http://127.0.0.1:8000 and point your browser to the link, e.g. http://127.0.0.1:8000.

Whenever a change to a documentation file is detected the documentation will be rebuilt automatically and the refreshed in the browser without the need for further manual action (it might take a couple seconds, though).