aboutsummaryrefslogtreecommitdiff
path: root/nixos/modules/apple-silicon-support/packages/m1n1
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/modules/apple-silicon-support/packages/m1n1')
-rw-r--r--nixos/modules/apple-silicon-support/packages/m1n1/default.nix100
1 files changed, 100 insertions, 0 deletions
diff --git a/nixos/modules/apple-silicon-support/packages/m1n1/default.nix b/nixos/modules/apple-silicon-support/packages/m1n1/default.nix
new file mode 100644
index 0000000..ee5450f
--- /dev/null
+++ b/nixos/modules/apple-silicon-support/packages/m1n1/default.nix
@@ -0,0 +1,100 @@
+{ stdenv
+, buildPackages
+, lib
+, fetchFromGitHub
+, python3
+, dtc
+, imagemagick
+, isRelease ? false
+, withTools ? true
+, withChainloading ? false
+, rust-bin ? null
+, customLogo ? null
+}:
+
+assert withChainloading -> rust-bin != null;
+
+let
+ pyenv = python3.withPackages (p: with p; [
+ construct
+ pyserial
+ ]);
+
+ rustenv = rust-bin.selectLatestNightlyWith (toolchain: toolchain.minimal.override {
+ targets = [ "aarch64-unknown-none-softfloat" ];
+ });
+in stdenv.mkDerivation rec {
+ pname = "m1n1";
+ version = "1.2.3";
+
+ src = fetchFromGitHub {
+ # tracking: https://github.com/AsahiLinux/PKGBUILDs/blob/stable/m1n1/PKGBUILD
+ owner = "AsahiLinux";
+ repo = "m1n1";
+ rev = "v${version}";
+ hash = "sha256-HEhsg3/OkMvAHvu16VFun87SNBPin69CL6XllE7sb4g=";
+ fetchSubmodules = true;
+ };
+
+ makeFlags = [ "ARCH=${stdenv.cc.targetPrefix}" ]
+ ++ lib.optional isRelease "RELEASE=1"
+ ++ lib.optional withChainloading "CHAINLOADING=1";
+
+ nativeBuildInputs = [
+ dtc
+ buildPackages.gcc
+ ] ++ lib.optional withChainloading rustenv
+ ++ lib.optional (customLogo != null) imagemagick;
+
+ postPatch = ''
+ substituteInPlace proxyclient/m1n1/asm.py \
+ --replace 'aarch64-linux-gnu-' 'aarch64-unknown-linux-gnu-' \
+ --replace 'TOOLCHAIN = ""' 'TOOLCHAIN = "'$out'/toolchain-bin/"'
+ '';
+
+ preConfigure = lib.optionalString (customLogo != null) ''
+ pushd data &>/dev/null
+ ln -fs ${customLogo} bootlogo_256.png
+ if [[ "$(magick identify bootlogo_256.png)" != 'bootlogo_256.png PNG 256x256'* ]]; then
+ echo "Custom logo is not a 256x256 PNG"
+ exit 1
+ fi
+
+ rm bootlogo_128.png
+ convert bootlogo_256.png -resize 128x128 bootlogo_128.png
+ ./makelogo.sh
+ popd &>/dev/null
+ '';
+
+ installPhase = ''
+ runHook preInstall
+
+ mkdir -p $out/build
+ cp build/m1n1.bin $out/build
+ '' + (lib.optionalString withTools ''
+ mkdir -p $out/{bin,script,toolchain-bin}
+ cp -r proxyclient $out/script
+ cp -r tools $out/script
+
+ for toolpath in $out/script/proxyclient/tools/*.py; do
+ tool=$(basename $toolpath .py)
+ script=$out/bin/m1n1-$tool
+ cat > $script <<EOF
+#!/bin/sh
+${pyenv}/bin/python $toolpath "\$@"
+EOF
+ chmod +x $script
+ done
+
+ GCC=${buildPackages.gcc}
+ BINUTILS=${buildPackages.binutils-unwrapped}
+
+ ln -s $GCC/bin/${stdenv.cc.targetPrefix}gcc $out/toolchain-bin/
+ ln -s $GCC/bin/${stdenv.cc.targetPrefix}ld $out/toolchain-bin/
+ ln -s $BINUTILS/bin/${stdenv.cc.targetPrefix}objcopy $out/toolchain-bin/
+ ln -s $BINUTILS/bin/${stdenv.cc.targetPrefix}objdump $out/toolchain-bin/
+ ln -s $GCC/bin/${stdenv.cc.targetPrefix}nm $out/toolchain-bin/
+ '') + ''
+ runHook postInstall
+ '';
+}