nix flakes support #64
144
flake.nix
@ -1,87 +1,79 @@
|
|||||||
{
|
{
|
||||||
description = "Firmware for the Sinara 8451 Thermostat";
|
description = "Firmware for the Sinara 8451 Thermostat";
|
||||||
|
|
||||||
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-21.11;
|
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-21.11;
|
||||||
inputs.mozilla-overlay = { url = github:mozilla/nixpkgs-mozilla; flake = false; };
|
inputs.mozilla-overlay = { url = github:mozilla/nixpkgs-mozilla; flake = false; };
|
||||||
|
|
||||||
outputs = { self, nixpkgs, mozilla-overlay }:
|
outputs = { self, nixpkgs, mozilla-overlay }:
|
||||||
let
|
let
|
||||||
pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [ (import mozilla-overlay) ]; };
|
pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [ (import mozilla-overlay) ]; };
|
||||||
rustManifest = pkgs.fetchurl {
|
rustManifest = pkgs.fetchurl {
|
||||||
url = "https://static.rust-lang.org/dist/2020-10-30/channel-rust-nightly.toml";
|
url = "https://static.rust-lang.org/dist/2020-10-30/channel-rust-nightly.toml";
|
||||||
sha256 = "0iygcwzh8s0lfdghj5809krvzifc1ii1wm4sd3qqn7s0rz1s14hi";
|
sha256 = "0iygcwzh8s0lfdghj5809krvzifc1ii1wm4sd3qqn7s0rz1s14hi";
|
||||||
};
|
};
|
||||||
|
|
||||||
targets = [
|
targets = [
|
||||||
"thumbv7em-none-eabihf"
|
"thumbv7em-none-eabihf"
|
||||||
];
|
];
|
||||||
rustChannelOfTargets = _channel: _date: targets:
|
rustChannelOfTargets = _channel: _date: targets:
|
||||||
(pkgs.lib.rustLib.fromManifestFile rustManifest {
|
(pkgs.lib.rustLib.fromManifestFile rustManifest {
|
||||||
inherit (pkgs) stdenv lib fetchurl patchelf;
|
inherit (pkgs) stdenv lib fetchurl patchelf;
|
||||||
}).rust.override {
|
}).rust.override {
|
||||||
inherit targets;
|
inherit targets;
|
||||||
extensions = ["rust-src"];
|
extensions = ["rust-src"];
|
||||||
};
|
};
|
||||||
rust = rustChannelOfTargets "nightly" null targets;
|
rust = rustChannelOfTargets "nightly" null targets;
|
||||||
rustPlatform = pkgs.recurseIntoAttrs (pkgs.makeRustPlatform {
|
rustPlatform = pkgs.recurseIntoAttrs (pkgs.makeRustPlatform {
|
||||||
rustc = rust;
|
rustc = rust;
|
||||||
cargo = rust;
|
cargo = rust;
|
||||||
});
|
});
|
||||||
thermostat = rustPlatform.buildRustPackage rec {
|
thermostat = rustPlatform.buildRustPackage rec {
|
||||||
name = "thermostat";
|
name = "thermostat";
|
||||||
version = "0.0.0";
|
version = "0.0.0";
|
||||||
|
|
||||||
src = self;
|
src = self;
|
||||||
cargoLock = {
|
cargoLock = {
|
||||||
lockFile = ./Cargo.lock;
|
lockFile = ./Cargo.lock;
|
||||||
outputHashes = {
|
outputHashes = {
|
||||||
"stm32-eth-0.2.0" = "sha256-HXRr/NDhdIKqyjdA4D8ZmcO1dDpDawdlYPUOwcEbPQk=";
|
"stm32-eth-0.2.0" = "sha256-HXRr/NDhdIKqyjdA4D8ZmcO1dDpDawdlYPUOwcEbPQk=";
|
||||||
"stm32f4xx-hal-0.8.3" = "sha256-MOv7tVtVMxr3IYMaN0Q8EQWxv3rubmCxjXMXuw/ZKAw=";
|
"stm32f4xx-hal-0.8.3" = "sha256-MOv7tVtVMxr3IYMaN0Q8EQWxv3rubmCxjXMXuw/ZKAw=";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
patchPhase = "";
|
nativeBuildInputs = [ pkgs.llvm ];
|
||||||
|
|||||||
nativeBuildInputs = [ pkgs.llvm ];
|
buildPhase = ''
|
||||||
buildPhase = ''
|
cargo build --release --bin thermostat
|
||||||
sb10q
commented
cargoBuildFlags? cargoBuildFlags?
mwojcik
commented
Is there API of that function described somewhere for quick reference? Besides the little tutorial section... Is there API of that function described somewhere for quick reference? Besides the little tutorial section...
mwojcik
commented
Actually, using just cargoBuildFlags ( Actually, using just cargoBuildFlags (``--bin thermostat`` as release is already included) causes the build to fail, as the default builder forces ``--target=x86_64-linux``.
sb10q
commented
One usually has to RTFS of nixpkgs for this kind of extended documentation :) One usually has to RTFS of nixpkgs for this kind of extended documentation :)
If there's no easy solution then overriding buildPhase is fine.
|
|||||||
export CARGO_HOME=$(mktemp -d cargo-home.XXX)
|
'';
|
||||||
sb10q
commented
Is CARGO_HOME necessary? NAC3 doesn't use it. Is CARGO_HOME necessary? NAC3 doesn't use it.
sb10q
commented
You can use cargoBuildFlags instead. You can use cargoBuildFlags instead.
|
|||||||
cargo build --release --bin thermostat
|
|
||||||
'';
|
|
||||||
|
|
||||||
checkPhase = ''
|
installPhase = ''
|
||||||
cargo test --target=${pkgs.rust.toRustTarget pkgs.stdenv.targetPlatform};
|
mkdir -p $out $out/nix-support
|
||||||
'';
|
cp target/thumbv7em-none-eabihf/release/thermostat $out/thermostat.elf
|
||||||
|
echo file binary-dist $out/thermostat.elf >> $out/nix-support/hydra-build-products
|
||||||
sb10q
commented
cargoTestFlags cargoTestFlags
|
|||||||
|
llvm-objcopy -O binary target/thumbv7em-none-eabihf/release/thermostat $out/thermostat.bin
|
||||||
|
echo file binary-dist $out/thermostat.bin >> $out/nix-support/hydra-build-products
|
||||||
|
'';
|
||||||
|
|
||||||
sb10q
commented
I don't understand this comment? I don't understand this comment?
|
|||||||
# binaryName defaults to the `name` arg (i.e. the Rust package name);
|
dontFixup = true;
|
||||||
# it is used as the Cargo binary filename
|
};
|
||||||
installPhase = ''
|
in rec {
|
||||||
mkdir -p $out $out/nix-support
|
packages.x86_64-linux = rec {
|
||||||
sb10q
commented
rec not needed rec not needed
|
|||||||
cp target/thumbv7em-none-eabihf/release/thermostat $out/thermostat.elf
|
inherit thermostat;
|
||||||
sb10q
commented
also here also here
|
|||||||
echo file binary-dist $out/thermostat.elf >> $out/nix-support/hydra-build-products
|
};
|
||||||
llvm-objcopy -O binary target/thumbv7em-none-eabihf/release/thermostat $out/thermostat.bin
|
|
||||||
echo file binary-dist $out/thermostat.bin >> $out/nix-support/hydra-build-products
|
|
||||||
'';
|
|
||||||
|
|
||||||
dontFixup = true;
|
hydraJobs = {
|
||||||
};
|
inherit (packages.x86_64-linux) thermostat;
|
||||||
in rec {
|
};
|
||||||
packages.x86_64-linux = rec {
|
|
||||||
inherit thermostat;
|
|
||||||
};
|
|
||||||
|
|
||||||
hydraJobs = {
|
devShell.x86_64-linux = pkgs.mkShell {
|
||||||
inherit (packages.x86_64-linux) thermostat;
|
name = "thermostat-dev-shell";
|
||||||
};
|
buildInputs = with pkgs; [
|
||||||
|
rustPlatform.rust.rustc
|
||||||
devShell.x86_64-linux = pkgs.mkShell {
|
rustPlatform.rust.cargo
|
||||||
name = "thermostat-dev-shell";
|
gcc openocd dfu-util
|
||||||
sb10q
commented
gcc? gcc?
|
|||||||
buildInputs = with pkgs; [
|
] ++ (with python3Packages; [
|
||||||
rustPlatform.rust.rustc
|
numpy matplotlib
|
||||||
sb10q
commented
Did you test this? I think this doesn't work and you need Did you test this? I think this doesn't work and you need ``python3.withPackages`` instead.
mwojcik
commented
Weirdly enough it seems to work
Weirdly enough it seems to work
```shell
❯ nix develop
[spaqin@hera:~/m-labs/thermostat]$ python
Python 3.9.6 (default, Jun 28 2021, 08:57:49)
[GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> import matplotlib
>>>
```
sb10q
commented
This is the lab computer and those packages are already included in the system Python. You can use This is the lab computer and those packages are already included in the system Python. You can use ``nix develop --ignore-environment`` to isolate the system profile (see https://github.com/NixOS/nix/issues/4359).
mwojcik
commented
Still available:
Still available:
```shell
❯ nix develop --ignore-environment
bash-5.1$ python
Python 3.9.6 (default, Jun 28 2021, 08:57:49)
[GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> import numpy
>>>
```
|
|||||||
rustPlatform.rust.cargo
|
]);
|
||||||
gcc openocd dfu-util
|
};
|
||||||
] ++ (with python3Packages; [
|
defaultPackage.x86_64-linux = thermostat;
|
||||||
numpy matplotlib
|
};
|
||||||
]);
|
|
||||||
};
|
|
||||||
defaultPackage.x86_64-linux = thermostat;
|
|
||||||
};
|
|
||||||
}
|
}
|
Remove?