forked from M-Labs/artiq-zynq
pure Nix build system
This commit is contained in:
parent
0ebe14c474
commit
c28c567e72
5
.gitignore
vendored
5
.gitignore
vendored
@ -1,4 +1,3 @@
|
|||||||
build/
|
result
|
||||||
runtime/src/pl.rs
|
examples/*.elf
|
||||||
target/
|
|
||||||
__pycache__
|
__pycache__
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
Build with:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
cargo xbuild -p runtime --release
|
|
||||||
cargo xbuild -p szl --release
|
|
||||||
```
|
|
72
default.nix
Normal file
72
default.nix
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
mozillaOverlay ? import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz),
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
pkgs = import <nixpkgs> { overlays = [ mozillaOverlay ]; };
|
||||||
|
artiq-fast = <artiq-fast>;
|
||||||
|
rustPlatform = (import ./rustPlatform.nix { inherit pkgs; });
|
||||||
|
buildFirmware = { name, src }:
|
||||||
|
rustPlatform.buildRustPackage rec {
|
||||||
|
inherit name;
|
||||||
|
version = "0.1.0";
|
||||||
|
|
||||||
|
inherit src;
|
||||||
|
cargoSha256 = (import "${src}/cargosha256.nix");
|
||||||
|
|
||||||
|
nativeBuildInputs = [ pkgs.cargo-xbuild pkgs.llvm_9 pkgs.clang_9 ];
|
||||||
|
buildPhase = ''
|
||||||
|
export XARGO_RUST_SRC="${rustPlatform.rust.rustc.src}/src"
|
||||||
|
export CARGO_HOME=$(mktemp -d cargo-home.XXX)
|
||||||
|
cargo xbuild --release -p ${name}
|
||||||
|
'';
|
||||||
|
|
||||||
|
doCheck = false;
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out $out/nix-support
|
||||||
|
cp target/armv7-none-eabihf/release/${name} $out/${name}.elf
|
||||||
|
echo file binary-dist $out/${name}.elf >> $out/nix-support/hydra-build-products
|
||||||
|
'';
|
||||||
|
dontFixup = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
artiqpkgs = import "${artiq-fast}/default.nix" { inherit pkgs; };
|
||||||
|
vivado = import "${artiq-fast}/vivado.nix" { inherit pkgs; };
|
||||||
|
in
|
||||||
|
rec {
|
||||||
|
zc706-runtime-src = pkgs.runCommand "zc706-runtime-src"
|
||||||
|
{ buildInputs = [
|
||||||
|
(pkgs.python3.withPackages(ps: (with artiqpkgs; [ migen migen-axi misoc artiq ])))
|
||||||
|
]; }
|
||||||
|
''
|
||||||
|
cp --no-preserve=mode,ownership -R ${./firmware} $out
|
||||||
|
cd $out/runtime/src
|
||||||
|
python ${./zc706.py} rustif
|
||||||
|
'';
|
||||||
|
zc706-runtime = buildFirmware { name = "runtime"; src = zc706-runtime-src; };
|
||||||
|
zc706-szl-src = pkgs.runCommand "zc706-szl-src"
|
||||||
|
{ nativeBuildInputs = [ pkgs.llvm_9 ]; }
|
||||||
|
''
|
||||||
|
cp --no-preserve=mode,ownership -R ${./firmware} $out
|
||||||
|
llvm-objcopy -O binary ${zc706-runtime}/runtime.elf $out/szl/src/payload.bin
|
||||||
|
lzma $out/szl/src/payload.bin
|
||||||
|
'';
|
||||||
|
zc706-szl = buildFirmware { name = "szl"; src = zc706-szl-src; };
|
||||||
|
zc706-gateware = pkgs.runCommand "zc706-gateware"
|
||||||
|
{ buildInputs = [
|
||||||
|
(pkgs.python3.withPackages(ps: (with artiqpkgs; [ migen migen-axi misoc artiq ])))
|
||||||
|
vivado
|
||||||
|
]; }
|
||||||
|
''
|
||||||
|
python ${./zc706.py} gateware
|
||||||
|
mkdir -p $out $out/nix-support
|
||||||
|
cp build/top.bit $out
|
||||||
|
echo file binary-dist $out/top.bit >> $out/nix-support/hydra-build-products
|
||||||
|
'';
|
||||||
|
zc706-jtag = pkgs.runCommand "zc706-jtag" {}
|
||||||
|
''
|
||||||
|
mkdir $out
|
||||||
|
ln -s ${zc706-szl}/szl $out
|
||||||
|
ln -s ${zc706-gateware}/top.bit $out
|
||||||
|
'';
|
||||||
|
}
|
0
Cargo.lock → firmware/Cargo.lock
generated
0
Cargo.lock → firmware/Cargo.lock
generated
1
firmware/cargosha256.nix
Normal file
1
firmware/cargosha256.nix
Normal file
@ -0,0 +1 @@
|
|||||||
|
"1mfprkcq4cr4jiihy1qn8q8qymxwhafh90vyr3i4brj4aq5kksn1"
|
@ -5,20 +5,8 @@ use std::io::Write;
|
|||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// FIXME: this is dirty and unreliable. How to depend on the output of the runtime build?
|
|
||||||
let payload = "../target/armv7-none-eabihf/release/runtime";
|
|
||||||
|
|
||||||
let out = env::var("OUT_DIR").unwrap();
|
let out = env::var("OUT_DIR").unwrap();
|
||||||
let out_dir = &PathBuf::from(&out);
|
let out_dir = &PathBuf::from(&out);
|
||||||
let status = Command::new("llvm-objcopy")
|
|
||||||
.args(&["-O", "binary", payload, &format!("{}/payload.bin", out)])
|
|
||||||
.status().unwrap();
|
|
||||||
assert!(status.success());
|
|
||||||
let status = Command::new("lzma")
|
|
||||||
.args(&["--keep", "-f", &format!("{}/payload.bin", out)])
|
|
||||||
.status().unwrap();
|
|
||||||
assert!(status.success());
|
|
||||||
println!("cargo:rerun-if-changed={}", payload);
|
|
||||||
|
|
||||||
let status = Command::new("clang")
|
let status = Command::new("clang")
|
||||||
.args(&["-target", "armv7-unknown-linux", "-fno-stack-protector",
|
.args(&["-target", "armv7-unknown-linux", "-fno-stack-protector",
|
@ -39,7 +39,7 @@ pub fn main_core0() {
|
|||||||
libboard_zynq::stdio::drop_uart(); // reinitialize UART after clocking change
|
libboard_zynq::stdio::drop_uart(); // reinitialize UART after clocking change
|
||||||
let mut ddr = zynq::ddr::DdrRam::new();
|
let mut ddr = zynq::ddr::DdrRam::new();
|
||||||
|
|
||||||
let payload = include_bytes!(concat!(env!("OUT_DIR"), "/payload.bin.lzma"));
|
let payload = include_bytes!("payload.bin.lzma");
|
||||||
info!("decompressing payload");
|
info!("decompressing payload");
|
||||||
let result = unsafe {
|
let result = unsafe {
|
||||||
unlzma_simple(payload.as_ptr(), payload.len() as i32, ddr.ptr(), lzma_error)
|
unlzma_simple(payload.as_ptr(), payload.len() as i32, ddr.ptr(), lzma_error)
|
@ -8,6 +8,6 @@ TARGET_FOLDER=/tmp/zynq-\$USER
|
|||||||
|
|
||||||
ssh $TARGET_HOST "mkdir -p $TARGET_FOLDER"
|
ssh $TARGET_HOST "mkdir -p $TARGET_FOLDER"
|
||||||
rsync openocd/* $TARGET_HOST:$TARGET_FOLDER
|
rsync openocd/* $TARGET_HOST:$TARGET_FOLDER
|
||||||
rsync target/armv7-none-eabihf/release/szl $TARGET_HOST:$TARGET_FOLDER
|
rsync result/szl $TARGET_HOST:$TARGET_FOLDER
|
||||||
rsync build/top.bit $TARGET_HOST:$TARGET_FOLDER
|
rsync result/top.bit $TARGET_HOST:$TARGET_FOLDER
|
||||||
ssh $TARGET_HOST "cd $TARGET_FOLDER; openocd -f zc706.cfg -c 'pld load 0 top.bit; load_image szl; resume 0; exit'"
|
ssh $TARGET_HOST "cd $TARGET_FOLDER; openocd -f zc706.cfg -c 'pld load 0 top.bit; load_image szl; resume 0; exit'"
|
||||||
|
BIN
runtime.bin
BIN
runtime.bin
Binary file not shown.
24
rustPlatform.nix
Normal file
24
rustPlatform.nix
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{ pkgs }:
|
||||||
|
|
||||||
|
let
|
||||||
|
rustcSrc = pkgs.fetchgit {
|
||||||
|
url = "https://github.com/rust-lang/rust.git";
|
||||||
|
# master of 2020-04-10
|
||||||
|
rev = "94d346360da50f159e0dc777dc9bc3c5b6b51a00";
|
||||||
|
sha256 = "1hcqdz4w2vqb12rrqqcjbfs5s0w4qwjn7z45d1zh0fzncdcf6f7d";
|
||||||
|
fetchSubmodules = true;
|
||||||
|
};
|
||||||
|
rustManifest = ./channel-rust-nightly.toml;
|
||||||
|
|
||||||
|
targets = [];
|
||||||
|
rustChannelOfTargets = _channel: _date: targets:
|
||||||
|
(pkgs.lib.rustLib.fromManifestFile rustManifest {
|
||||||
|
inherit (pkgs) stdenv fetchurl patchelf;
|
||||||
|
}).rust.override { inherit targets; };
|
||||||
|
rust =
|
||||||
|
rustChannelOfTargets "nightly" null targets;
|
||||||
|
in
|
||||||
|
pkgs.recurseIntoAttrs (pkgs.makeRustPlatform {
|
||||||
|
rustc = rust // { src = rustcSrc; };
|
||||||
|
cargo = rust;
|
||||||
|
})
|
50
shell.nix
50
shell.nix
@ -1,50 +0,0 @@
|
|||||||
let
|
|
||||||
mozillaOverlay = import (builtins.fetchTarball "https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz");
|
|
||||||
artiq-fast = builtins.fetchTarball "https://nixbld.m-labs.hk/channel/custom/artiq/fast-beta/artiq-fast/nixexprs.tar.xz";
|
|
||||||
|
|
||||||
pkgs = import <nixpkgs> { overlays = [ mozillaOverlay ]; };
|
|
||||||
|
|
||||||
rustcSrc = pkgs.fetchgit {
|
|
||||||
url = "https://github.com/rust-lang/rust.git";
|
|
||||||
# master of 2020-04-10
|
|
||||||
rev = "94d346360da50f159e0dc777dc9bc3c5b6b51a00";
|
|
||||||
sha256 = "1hcqdz4w2vqb12rrqqcjbfs5s0w4qwjn7z45d1zh0fzncdcf6f7d";
|
|
||||||
fetchSubmodules = true;
|
|
||||||
};
|
|
||||||
rustManifest = ./channel-rust-nightly.toml;
|
|
||||||
|
|
||||||
targets = [];
|
|
||||||
rustChannelOfTargets = _channel: _date: targets:
|
|
||||||
(pkgs.lib.rustLib.fromManifestFile rustManifest {
|
|
||||||
inherit (pkgs) stdenv fetchurl patchelf;
|
|
||||||
}).rust.override { inherit targets; };
|
|
||||||
rust =
|
|
||||||
rustChannelOfTargets "nightly" null targets;
|
|
||||||
rustPlatform = pkgs.recurseIntoAttrs (pkgs.makeRustPlatform {
|
|
||||||
rustc = rust // { src = rustcSrc; };
|
|
||||||
cargo = rust;
|
|
||||||
});
|
|
||||||
|
|
||||||
artiqpkgs = import "${artiq-fast}/default.nix" { inherit pkgs; };
|
|
||||||
vivado = import "${artiq-fast}/vivado.nix" { inherit pkgs; };
|
|
||||||
in
|
|
||||||
pkgs.stdenv.mkDerivation {
|
|
||||||
name = "artiq-zynq-env";
|
|
||||||
buildInputs = [
|
|
||||||
rustPlatform.rust.rustc
|
|
||||||
rustPlatform.rust.cargo
|
|
||||||
rustcSrc
|
|
||||||
pkgs.clang_9
|
|
||||||
pkgs.cacert
|
|
||||||
pkgs.cargo-xbuild
|
|
||||||
|
|
||||||
pkgs.openssh pkgs.rsync
|
|
||||||
|
|
||||||
(pkgs.python3.withPackages(ps: (with artiqpkgs; [ migen migen-axi misoc artiq ])))
|
|
||||||
vivado
|
|
||||||
pkgs.llvm_9
|
|
||||||
pkgs.lld_9
|
|
||||||
];
|
|
||||||
|
|
||||||
XARGO_RUST_SRC = "${rustcSrc}/src";
|
|
||||||
}
|
|
3
zc706.py
3
zc706.py
@ -1,7 +1,6 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
|
||||||
|
|
||||||
from migen import *
|
from migen import *
|
||||||
|
|
||||||
@ -71,7 +70,7 @@ def main():
|
|||||||
if action == "gateware":
|
if action == "gateware":
|
||||||
soc.build()
|
soc.build()
|
||||||
elif action == "rustif":
|
elif action == "rustif":
|
||||||
write_csr_file(soc, os.path.join("runtime", "src", "pl.rs"))
|
write_csr_file(soc, "pl.rs")
|
||||||
else:
|
else:
|
||||||
raise ValueError("invalid action", action)
|
raise ValueError("invalid action", action)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user