Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dev: Adding shell.nix for development environments #1850

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ Fast open-source firmware for the [PineTime smartwatch](https://www.pine64.org/p
- [InfiniTime simulator](https://github.com/InfiniTimeOrg/InfiniSim)
- [Build the project](doc/buildAndProgram.md)
- [Build the project with Docker](doc/buildWithDocker.md)
- [Build the project with Nix](doc/buildWithNix.md)
- [Build the project with VSCode](doc/buildWithVScode.md)
- [Flash the firmware using OpenOCD and STLinkV2](doc/openOCD.md)
- [Flash the firmware using SWD interface](doc/SWD.md)
Expand Down
49 changes: 49 additions & 0 deletions doc/buildWithNix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Build the project using `nix-shell`
A `shell.nix` file is included in the repository to set up the development environment on systems that have the [Nix package manager](https://nixos.org/) installed.
It prevents your system from getting polluted with build dependencies while also guaranteeing a reproducible build environment.
All dependencies and tools required to build InfiniTime will automatically be fetched for you.

## Install Nix

Nix is available for Linux, MacOS and WSL2.
[Visit the official website for instructions on how to install it.](https://nixos.org/download#download-nix)

## Clone the repository

Before building, local repository must be fully initialized.

```sh
git clone https://github.com/InfiniTimeOrg/InfiniTime.git
cd InfiniTime
git submodule update --init
```

## Enter the development shell

Creating and entering the development environment is as easy as typing the following command in the project root:
```sh
nix-shell --run "$SHELL"
```

## Build the project
Two steps are required to build the project: `cmake` and `make`.
The `shell.nix` file provides a custom script called `cmake_infinitime` that calls `cmake` with the proper paths for the compiler and the SDK.

Inside the shell you can build a target like this:
```sh
cmake_infinitime
make pinetime-app
```

You can pass additional arguments to the `cmake` script:
```sh
cmake_infinitime -DBUILD_RESOURCES=1`
```

To make use of all the cores your host machine has pass the `-j` argument to `make`:
```sh
make -j$(nproc) pinetime-app
```

There are more targets and configuration options available.
You can find them in [`buildAndProgram.md`](./buildAndProgram.md).
33 changes: 33 additions & 0 deletions shell.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{ pkgs ? import <nixpkgs> {} }:

let
infinitime-nrf5-sdk = pkgs.nrf5-sdk.overrideAttrs (old: {
version = "15.3.0";
src = pkgs.fetchzip {
url = "https://nsscprodmedia.blob.core.windows.net/prod/software-and-other-downloads/sdks/nrf5/binaries/nrf5sdk153059ac345.zip";
sha256 = "sha256-pfmhbpgVv5x2ju489XcivguwpnofHbgVA7bFUJRTj08=";
};
});
in pkgs.mkShell {
# build tools
nativeBuildInputs = with pkgs; [
cmake
lv_img_conv
nodePackages.lv_font_conv
python3
python3.pkgs.cbor
python3.pkgs.click
python3.pkgs.cryptography
python3.pkgs.intelhex
python3.pkgs.adafruit-nrfutil

(pkgs.writeShellScriptBin "cmake_infinitime" ''
cmake -DARM_NONE_EABI_TOOLCHAIN_PATH="${pkgs.gcc-arm-embedded-10}" \
-DNRF5_SDK_PATH="${infinitime-nrf5-sdk}/share/nRF5_SDK" \
"$@"
'')
];

# libraries/dependencies
buildInputs = with pkgs; [];
}