{ pkgs ? import { overlays = [ (import ./artiq-fast/mozilla-overlay.nix) ]; } , use-generated ? }: let sinaraSystemsRev = builtins.readFile ; sinaraSystemsHash = builtins.readFile ; sinaraSystemsSrc = if use-generated then pkgs.fetchgit { url = "https://git.m-labs.hk/M-Labs/sinara-systems-legacy.git"; rev = sinaraSystemsRev; sha256 = sinaraSystemsHash; } else ; artiq-fast = if use-generated then else ; artiqVersion = import (artiq-fast + "/pkgs/artiq-version.nix") { inherit (pkgs) stdenv git fetchgit; }; targets = import ./artiq-full/artiq-targets.nix { inherit pkgs artiqVersion sinaraSystemsSrc; }; kasliVariants = map ({ variant, ... }: variant) ( builtins.filter ({ target, ... }: target == "kasli") ( builtins.attrValues targets ) ); standaloneVariants = map ({ variant, ... }: variant) ( builtins.filter ({ target, standalone ? false, ... }: target == "kasli" && standalone) ( builtins.attrValues targets ) ); serializedTargets = pkgs.lib.generators.toPretty {} ( map (conf: if conf ? buildCommand then conf // { buildCommand = builtins.replaceStrings ["$"] ["\\\\\\$"] conf.buildCommand; } else conf ) (builtins.attrValues targets) ); generatedNix = pkgs.runCommand "generated-nix" { buildInputs = [ pkgs.nix pkgs.git ]; } '' mkdir $out ${if use-generated then '' cp -a ${} $out/board-generated ln -s board-generated/fast $out/fast '' else "cp -a ${} $out/fast"} cp ${./artiq-full}/artiq-board-vivado.nix $out cp ${./artiq-full}/generate-identifier.py $out cp ${./artiq-full}/conda-artiq-board.nix $out cp ${./artiq-full}/extras.nix $out cp ${./artiq-full}/*.patch $out ${if use-generated then '' REV=${sinaraSystemsRev} HASH=${sinaraSystemsHash} '' else '' REV=`git --git-dir ${sinaraSystemsSrc}/.git rev-parse HEAD` SINARA_SRC_CLEAN=`mktemp -d` cp -a ${sinaraSystemsSrc}/. $SINARA_SRC_CLEAN chmod -R 755 $SINARA_SRC_CLEAN/.git chmod 755 $SINARA_SRC_CLEAN rm -rf $SINARA_SRC_CLEAN/.git HASH=`nix-hash --type sha256 --base32 $SINARA_SRC_CLEAN` ''} cat > $out/default.nix << EOF { pkgs ? import { overlays = [ (import ./fast/mozilla-overlay.nix) ]; }}: let artiq-fast = import ${if use-generated then "./board-generated" else "."}/fast { inherit pkgs; }; ddbDeps = [ artiq-fast.artiq (pkgs.python3.withPackages (ps: [ ps.jsonschema ])) ]; kasliVariants = [${builtins.concatStringsSep " " ( builtins.map (variant: "\"${variant}\"") kasliVariants )}]; standaloneVariants = [${builtins.concatStringsSep " " ( builtins.map (variant: "\"${variant}\"") standaloneVariants )}]; vivado = import ${if use-generated then "./board-generated" else "."}/fast/vivado.nix { inherit pkgs; }; artiq-board = ${if use-generated then '' import ./artiq-board-vivado.nix { inherit pkgs vivado; version = artiq-fast.artiq.version; board-generated = import ./board-generated { inherit pkgs; }; } '' else '' import ./fast/artiq-board.nix { inherit pkgs vivado; rustPlatform = import ./fast/rust-platform.nix { inherit pkgs; }; } ''}; conda-artiq-board = import ./conda-artiq-board.nix { inherit pkgs; }; src = pkgs.fetchgit { url = "https://git.m-labs.hk/M-Labs/sinara-systems-legacy.git"; rev = "$REV"; sha256 = "$HASH"; }; artiq-targets = pkgs.lib.lists.foldr (conf: start: let inherit (conf) target variant; json = src + "/\''${variant}.json"; boardBinaries = artiq-board (conf // { src = json; }); in start // { "artiq-board-\''${target}-\''${variant}" = boardBinaries; "conda-artiq-board-\''${target}-\''${variant}" = conda-artiq-board { boardBinaries = boardBinaries; inherit target variant; }; } // (pkgs.lib.optionalAttrs ( target == "kasli" && builtins.elem variant standaloneVariants ) { "device-db-\''${target}-\''${variant}" = pkgs.stdenv.mkDerivation { name = "device-db-\''${target}-\''${variant}"; buildInputs = ddbDeps; phases = [ "buildPhase" ]; buildPhase = " mkdir \$out artiq_ddb_template \''${json} -o \$out/device_db.py mkdir \$out/nix-support echo file device_db_template \$out/device_db.py >> \$out/nix-support/hydra-build-products "; }; }) ) {} ${serializedTargets}; extras = import ./extras.nix { inherit pkgs; inherit (artiq-fast) sipyco asyncserial artiq; }; in artiq-fast // artiq-targets // extras // rec { conda-artiq-board-kasli-tester = conda-artiq-board { target = "kasli"; variant = "tester"; boardBinaries = artiq-fast.artiq-board-kasli-tester; }; conda-artiq-board-kc705-nist_clock = conda-artiq-board { target = "kc705"; variant = "nist_clock"; boardBinaries = artiq-fast.artiq-board-kc705-nist_clock; }; } EOF ''; pythonDeps = import ./artiq-full/python-deps.nix { inherit pkgs; }; sipycoManualPackages = import ./artiq-full/sipyco-manual.nix { inherit (pkgs) stdenv lib python3Packages texlive texinfo; inherit (import artiq-fast { inherit pkgs; }) sipyco; }; artiqManualPackages = import ./artiq-full/artiq-manual.nix { inherit (pkgs) stdenv lib fetchgit git python3Packages texlive texinfo; inherit (pythonDeps) sphinxcontrib-wavedrom; inherit artiq-fast; }; artiq-full = import generatedNix { inherit pkgs; }; exampleUserEnv = import ./artiq-full/example-user-env.nix { inherit pkgs artiq-full; }; jobs = artiq-full // sipycoManualPackages // artiqManualPackages // exampleUserEnv; in builtins.mapAttrs (key: value: pkgs.lib.hydraJob value) jobs // { artiq-full = pkgs.releaseTools.channel { name = "artiq-full"; src = generatedNix; constituents = []; }; conda-channel = import ./artiq-full/conda-channel.nix { inherit pkgs artiq-fast; } { inherit jobs; }; }