about summary refs log tree commit diff
path: root/nixos/modules/apple-silicon-support/packages/m1n1/default.nix
blob: ee5450fd71089b0f7dfcfb67df8c0881786cf68d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
  '';
}