diff --git a/nix/README.rst b/nix/README.rst index 7df289bd4..c6f69e4d6 100644 --- a/nix/README.rst +++ b/nix/README.rst @@ -1,12 +1,10 @@ -Install ARTIQ via the Nix Package Manager -========================================= +Use ARTIQ via the Nix Package Manager +===================================== These instructions provide an alternative route to install ARTIQ for people who do not wish to use conda. This sets up an environment suitable for using ARTIQ, including the ARTIQ-Python compiler, device drivers, and the graphical user interfaces. This works correctly on Linux, and partially works (but not to a level that we would consider usable) with WSL introduced in Windows 10. -ARTIQ firmware and gateware development tools (e.g. rustc, Migen) and ARTIQ core device flashing tools (OpenOCD, proxy bitstreams) are currently not available on Nix. Pull requests welcome! - * Install the Nix package manager * many Linux distros already have a package for the `Nix package manager `_ @@ -25,4 +23,13 @@ ARTIQ firmware and gateware development tools (e.g. rustc, Migen) and ARTIQ core * $ ``cd artiq/nix`` * $ ``nix-env -i -f default.nix`` -The above command will setup your entire environment. Note that it will compile LLVM and Clang, which uses a lot of CPU time and disk space. +The above command will setup your entire environment. Note that it will compile LLVM, which uses a lot of CPU time and disk space. + +ARTIQ development environment with Nix +====================================== + +Run ``nix-shell artiq-dev.nix`` to obtain an environment containing Migen, MiSoC, Clang, Rust, Cargo, and OpenOCD in addition to the user environment above. + +This creates a FHS chroot environment in order to simplify the installation and patching of Xilinx Vivado (it needs to be installed manually e.g. in your home folder). + +You can then build the firmware and gateware with a command such as ``python -m artiq.gateware.targets.kasli --gateware-toolchain-path ~/Xilinx/Vivado``. diff --git a/nix/artiq-dev.nix b/nix/artiq-dev.nix new file mode 100644 index 000000000..89c079379 --- /dev/null +++ b/nix/artiq-dev.nix @@ -0,0 +1,33 @@ +let + pkgs = import {}; + artiqpkgs = import ./default.nix { inherit pkgs; }; +in +( + pkgs.buildFHSUserEnv { + name = "artiq-dev"; + targetPkgs = pkgs: ( + with pkgs; [ + ncurses5 + gnumake + xorg.libSM + xorg.libICE + xorg.libXrender + xorg.libX11 + xorg.libXext + xorg.libXtst + xorg.libXi + (python3.withPackages(ps: with ps; [ jinja2 numpy artiqpkgs.migen artiqpkgs.misoc artiqpkgs.artiq ])) + ] ++ + (with artiqpkgs; [ + rustc + cargo + binutils-or1k + llvm-or1k + openocd + ]) + ); + profile = '' + export TARGET_AR=${artiqpkgs.binutils-or1k}/bin/or1k-linux-ar + ''; + } +).env diff --git a/nix/default.nix b/nix/default.nix index 72210c430..5aaaf7621 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -14,4 +14,5 @@ in rec { llvm-or1k = callPackage ./llvm-or1k.nix { inherit llvm-src; }; llvmlite = callPackage ./llvmlite.nix { inherit llvm-or1k; }; artiq = callPackage ./artiq.nix { inherit binutils-or1k; inherit llvm-or1k; inherit llvmlite; }; + openocd = callPackage ./pkgs/openocd.nix {}; } diff --git a/nix/pkgs/openocd.nix b/nix/pkgs/openocd.nix new file mode 100644 index 000000000..c820d4c14 --- /dev/null +++ b/nix/pkgs/openocd.nix @@ -0,0 +1,63 @@ +{ stdenv, fetchFromGitHub, autoreconfHook, libftdi, libusb1, pkgconfig, hidapi }: + +stdenv.mkDerivation rec { + name = "openocd-${version}"; + version = "0.10.0"; + + src = fetchFromGitHub { + owner = "m-labs"; + repo = "openocd"; + fetchSubmodules = true; + rev = "c383a57adcff332b2c5cf8d55a84626285b42c2c"; + sha256 = "0xlj9cs72acx3zqagvr7f1c0v6lnqhl8fgrlhgmhmvk5n9knk492"; + }; + + nativeBuildInputs = [ pkgconfig ]; + buildInputs = [ autoreconfHook libftdi libusb1 hidapi ]; + + configureFlags = [ + "--enable-jtag_vpi" + "--enable-usb_blaster_libftdi" + "--enable-amtjtagaccel" + "--enable-gw16012" + "--enable-presto_libftdi" + "--enable-openjtag_ftdi" + "--enable-oocd_trace" + "--enable-buspirate" + "--enable-sysfsgpio" + "--enable-remote-bitbang" + ]; + + NIX_CFLAGS_COMPILE = [ + "-Wno-implicit-fallthrough" + "-Wno-format-truncation" + "-Wno-format-overflow" + ]; + + postInstall = '' + mkdir -p "$out/etc/udev/rules.d" + rules="$out/share/openocd/contrib/60-openocd.rules" + if [ ! -f "$rules" ]; then + echo "$rules is missing, must update the Nix file." + exit 1 + fi + ln -s "$rules" "$out/etc/udev/rules.d/" + ''; + + meta = with stdenv.lib; { + description = "Free and Open On-Chip Debugging, In-System Programming and Boundary-Scan Testing"; + longDescription = '' + OpenOCD provides on-chip programming and debugging support with a layered + architecture of JTAG interface and TAP support, debug target support + (e.g. ARM, MIPS), and flash chip drivers (e.g. CFI, NAND, etc.). Several + network interfaces are available for interactiving with OpenOCD: HTTP, + telnet, TCL, and GDB. The GDB server enables OpenOCD to function as a + "remote target" for source-level debugging of embedded systems using the + GNU GDB program. + ''; + homepage = http://openocd.sourceforge.net/; + license = licenses.gpl2Plus; + maintainers = with maintainers; [ bjornfor ]; + platforms = platforms.linux; + }; +}