forked from M-Labs/nac3
218 lines
9.0 KiB
Nix
218 lines
9.0 KiB
Nix
{
|
|
description = "The third-generation ARTIQ compiler";
|
|
|
|
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable;
|
|
|
|
outputs = { self, nixpkgs }:
|
|
let
|
|
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
|
pkgs32 = import nixpkgs { system = "i686-linux"; };
|
|
in rec {
|
|
packages.x86_64-linux = rec {
|
|
llvm-nac3 = pkgs.callPackage ./nix/llvm {};
|
|
llvm-tools-irrt = pkgs.runCommandNoCC "llvm-tools-irrt" {}
|
|
''
|
|
mkdir -p $out/bin
|
|
ln -s ${pkgs.llvmPackages_14.clang-unwrapped}/bin/clang $out/bin/clang-irrt
|
|
ln -s ${pkgs.llvmPackages_14.llvm.out}/bin/llvm-as $out/bin/llvm-as-irrt
|
|
'';
|
|
demo-linalg-stub = pkgs.rustPlatform.buildRustPackage {
|
|
name = "demo-linalg-stub";
|
|
src = ./nac3standalone/demo/linalg;
|
|
cargoLock = {
|
|
lockFile = ./nac3standalone/demo/linalg/Cargo.lock;
|
|
};
|
|
doCheck = false;
|
|
};
|
|
demo-linalg-stub32 = pkgs32.rustPlatform.buildRustPackage {
|
|
name = "demo-linalg-stub32";
|
|
src = ./nac3standalone/demo/linalg;
|
|
cargoLock = {
|
|
lockFile = ./nac3standalone/demo/linalg/Cargo.lock;
|
|
};
|
|
doCheck = false;
|
|
};
|
|
nac3artiq = pkgs.python3Packages.toPythonModule (
|
|
pkgs.rustPlatform.buildRustPackage rec {
|
|
name = "nac3artiq";
|
|
outputs = [ "out" "runkernel" "standalone" ];
|
|
src = self;
|
|
cargoLock = {
|
|
lockFile = ./Cargo.lock;
|
|
};
|
|
passthru.cargoLock = cargoLock;
|
|
nativeBuildInputs = [ pkgs.python3 pkgs.mold-wrapped (pkgs.wrapClangMulti pkgs.llvmPackages_14.clang) llvm-tools-irrt pkgs.llvmPackages_14.llvm.out llvm-nac3 ];
|
|
buildInputs = [ pkgs.python3 pkgs.mold-wrapped llvm-nac3 ];
|
|
checkInputs = [ (pkgs.python3.withPackages(ps: [ ps.numpy ps.scipy ])) pkgs.mold-wrapped ];
|
|
checkPhase =
|
|
''
|
|
echo "Checking nac3standalone demos..."
|
|
pushd nac3standalone/demo
|
|
patchShebangs .
|
|
export DEMO_LINALG_STUB=${demo-linalg-stub}/lib/liblinalg.a
|
|
export DEMO_LINALG_STUB32=${demo-linalg-stub32}/lib/liblinalg.a
|
|
./check_demos.sh -i686
|
|
popd
|
|
echo "Running Cargo tests..."
|
|
cargoCheckHook
|
|
'';
|
|
installPhase =
|
|
''
|
|
PYTHON_SITEPACKAGES=$out/${pkgs.python3Packages.python.sitePackages}
|
|
mkdir -p $PYTHON_SITEPACKAGES
|
|
cp target/x86_64-unknown-linux-gnu/release/libnac3artiq.so $PYTHON_SITEPACKAGES/nac3artiq.so
|
|
|
|
mkdir -p $runkernel/bin
|
|
cp target/x86_64-unknown-linux-gnu/release/runkernel $runkernel/bin
|
|
|
|
mkdir -p $standalone/bin
|
|
cp target/x86_64-unknown-linux-gnu/release/nac3standalone $standalone/bin
|
|
'';
|
|
stdenv = [ pkgs.stdenvAdapters.useMoldLinker pkgs.stdenv ];
|
|
}
|
|
);
|
|
python3-mimalloc = pkgs.python3 // rec {
|
|
withMimalloc = pkgs.python3.buildEnv.override({ makeWrapperArgs = [ "--set LD_PRELOAD ${pkgs.mimalloc}/lib/libmimalloc.so" ]; });
|
|
withPackages = f: let packages = f pkgs.python3.pkgs; in withMimalloc.override { extraLibs = packages; };
|
|
};
|
|
|
|
# LLVM PGO support
|
|
llvm-nac3-instrumented = pkgs.callPackage ./nix/llvm {
|
|
stdenv = pkgs.llvmPackages_14.stdenv;
|
|
extraCmakeFlags = [ "-DLLVM_BUILD_INSTRUMENTED=IR" ];
|
|
};
|
|
nac3artiq-instrumented = pkgs.python3Packages.toPythonModule (
|
|
pkgs.rustPlatform.buildRustPackage {
|
|
name = "nac3artiq-instrumented";
|
|
src = self;
|
|
inherit (nac3artiq) cargoLock;
|
|
nativeBuildInputs = [ pkgs.python3 packages.x86_64-linux.llvm-tools-irrt llvm-nac3-instrumented ];
|
|
buildInputs = [ pkgs.python3 pkgs.mold-wrapped llvm-nac3-instrumented ];
|
|
cargoBuildFlags = [ "--package" "nac3artiq" "--features" "init-llvm-profile" ];
|
|
doCheck = false;
|
|
configurePhase =
|
|
''
|
|
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS="-C link-arg=-L${pkgs.llvmPackages_14.compiler-rt}/lib/linux -C link-arg=-lclang_rt.profile-x86_64"
|
|
'';
|
|
installPhase =
|
|
''
|
|
TARGET_DIR=$out/${pkgs.python3Packages.python.sitePackages}
|
|
mkdir -p $TARGET_DIR
|
|
cp target/x86_64-unknown-linux-gnu/release/libnac3artiq.so $TARGET_DIR/nac3artiq.so
|
|
'';
|
|
stdenv = [ pkgs.stdenvAdapters.useMoldLinker pkgs.stdenv ];
|
|
}
|
|
);
|
|
nac3artiq-profile = pkgs.stdenvNoCC.mkDerivation {
|
|
name = "nac3artiq-profile";
|
|
srcs = [
|
|
(pkgs.fetchFromGitHub {
|
|
owner = "m-labs";
|
|
repo = "sipyco";
|
|
rev = "939f84f9b5eef7efbf7423c735d1834783b6140e";
|
|
sha256 = "sha256-15Nun4EY35j+6SPZkjzZtyH/ncxLS60KuGJjFh5kSTc=";
|
|
})
|
|
(pkgs.fetchFromGitHub {
|
|
owner = "m-labs";
|
|
repo = "artiq";
|
|
rev = "923ca3377d42c815f979983134ec549dc39d3ca0";
|
|
sha256 = "sha256-oJoEeNEeNFSUyh6jXG8Tzp6qHVikeHS0CzfE+mODPgw=";
|
|
})
|
|
];
|
|
buildInputs = [
|
|
(python3-mimalloc.withPackages(ps: [ ps.numpy ps.scipy ps.jsonschema ps.lmdb nac3artiq-instrumented ]))
|
|
pkgs.llvmPackages_14.llvm.out
|
|
];
|
|
phases = [ "buildPhase" "installPhase" ];
|
|
buildPhase =
|
|
''
|
|
srcs=($srcs)
|
|
sipyco=''${srcs[0]}
|
|
artiq=''${srcs[1]}
|
|
export PYTHONPATH=$sipyco:$artiq
|
|
python -m artiq.frontend.artiq_ddb_template $artiq/artiq/examples/nac3devices/nac3devices.json > device_db.py
|
|
cp $artiq/artiq/examples/nac3devices/nac3devices.py .
|
|
python -m artiq.frontend.artiq_compile nac3devices.py
|
|
'';
|
|
installPhase =
|
|
''
|
|
mkdir $out
|
|
llvm-profdata merge -o $out/llvm.profdata /build/llvm/build/profiles/*
|
|
'';
|
|
};
|
|
llvm-nac3-pgo = pkgs.callPackage ./nix/llvm {
|
|
stdenv = pkgs.llvmPackages_14.stdenv;
|
|
extraCmakeFlags = [ "-DLLVM_PROFDATA_FILE=${nac3artiq-profile}/llvm.profdata" ];
|
|
};
|
|
nac3artiq-pgo = pkgs.python3Packages.toPythonModule (
|
|
pkgs.rustPlatform.buildRustPackage {
|
|
name = "nac3artiq-pgo";
|
|
src = self;
|
|
inherit (nac3artiq) cargoLock;
|
|
nativeBuildInputs = [ pkgs.python3 packages.x86_64-linux.llvm-tools-irrt llvm-nac3-pgo ];
|
|
buildInputs = [ pkgs.python3 pkgs.mold-wrapped llvm-nac3-pgo ];
|
|
cargoBuildFlags = [ "--package" "nac3artiq" ];
|
|
cargoTestFlags = [ "--package" "nac3ast" "--package" "nac3parser" "--package" "nac3core" "--package" "nac3artiq" ];
|
|
installPhase =
|
|
''
|
|
TARGET_DIR=$out/${pkgs.python3Packages.python.sitePackages}
|
|
mkdir -p $TARGET_DIR
|
|
cp target/x86_64-unknown-linux-gnu/release/libnac3artiq.so $TARGET_DIR/nac3artiq.so
|
|
'';
|
|
stdenv = [ pkgs.stdenvAdapters.useMoldLinker pkgs.stdenv ];
|
|
}
|
|
);
|
|
};
|
|
|
|
packages.x86_64-w64-mingw32 = import ./nix/windows { inherit pkgs; };
|
|
|
|
devShells.x86_64-linux.default = pkgs.mkShell {
|
|
name = "nac3-dev-shell";
|
|
buildInputs = with pkgs; [
|
|
# build dependencies
|
|
packages.x86_64-linux.llvm-nac3
|
|
(pkgs.wrapClangMulti llvmPackages_14.clang) llvmPackages_14.llvm.out # for running nac3standalone demos
|
|
packages.x86_64-linux.llvm-tools-irrt
|
|
cargo
|
|
rustc
|
|
mold-wrapped
|
|
# runtime dependencies
|
|
lld_14 # for running kernels on the host
|
|
(packages.x86_64-linux.python3-mimalloc.withPackages(ps: [ ps.numpy ps.scipy ]))
|
|
# development tools
|
|
cargo-insta
|
|
clippy
|
|
pre-commit
|
|
rustfmt
|
|
];
|
|
shellHook =
|
|
''
|
|
export DEMO_LINALG_STUB=${packages.x86_64-linux.demo-linalg-stub}/lib/liblinalg.a
|
|
export DEMO_LINALG_STUB32=${packages.x86_64-linux.demo-linalg-stub32}/lib/liblinalg.a
|
|
'';
|
|
stdenv = [ pkgs.stdenvAdapters.useMoldLinker pkgs.stdenv ];
|
|
};
|
|
devShells.x86_64-linux.msys2 = pkgs.mkShell {
|
|
name = "nac3-dev-shell-msys2";
|
|
buildInputs = with pkgs; [
|
|
curl
|
|
pacman
|
|
fakeroot
|
|
packages.x86_64-w64-mingw32.wine-msys2
|
|
];
|
|
};
|
|
|
|
hydraJobs = {
|
|
inherit (packages.x86_64-linux) llvm-nac3 nac3artiq nac3artiq-pgo;
|
|
llvm-nac3-msys2 = packages.x86_64-w64-mingw32.llvm-nac3;
|
|
nac3artiq-msys2 = packages.x86_64-w64-mingw32.nac3artiq;
|
|
nac3artiq-msys2-pkg = packages.x86_64-w64-mingw32.nac3artiq-pkg;
|
|
};
|
|
};
|
|
|
|
nixConfig = {
|
|
extra-trusted-public-keys = "nixbld.m-labs.hk-1:5aSRVA5b320xbNvu30tqxVPXpld73bhtOeH6uAjRyHc=";
|
|
extra-substituters = "https://nixbld.m-labs.hk";
|
|
};
|
|
}
|