109 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{
 | 
						|
  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.4.14";
 | 
						|
 | 
						|
    src = fetchFromGitHub {
 | 
						|
      # tracking: https://src.fedoraproject.org/rpms/m1n1
 | 
						|
      owner = "AsahiLinux";
 | 
						|
      repo = "m1n1";
 | 
						|
      rev = "v${version}";
 | 
						|
      hash = "sha256-bhX6qtyiKgSpBic4q3jNu9Xi+SOw21JC4sBI44YHKK0=";
 | 
						|
      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
 | 
						|
      patchShebangs --build ./makelogo.sh
 | 
						|
      ./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
 | 
						|
      '';
 | 
						|
  }
 |