166 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{
 | 
						|
  lib,
 | 
						|
  pkgs,
 | 
						|
  callPackage,
 | 
						|
  writeShellScriptBin,
 | 
						|
  writeText,
 | 
						|
  linuxPackagesFor,
 | 
						|
  withRust ? false,
 | 
						|
  _kernelPatches ? [],
 | 
						|
}: let
 | 
						|
  i = builtins.elemAt;
 | 
						|
 | 
						|
  # parse <OPT> [ymn]|foo style configuration as found in a patch's extraConfig
 | 
						|
  # into a list of k, v tuples
 | 
						|
  parseExtraConfig = config: let
 | 
						|
    lines =
 | 
						|
      builtins.filter (s: s != "") (lib.strings.splitString "\n" config);
 | 
						|
    parseLine = line: let
 | 
						|
      t = lib.strings.splitString " " line;
 | 
						|
      join = l:
 | 
						|
        builtins.foldl' (a: b: "${a} ${b}")
 | 
						|
        (builtins.head l) (builtins.tail l);
 | 
						|
      v =
 | 
						|
        if (builtins.length t) > 2
 | 
						|
        then join (builtins.tail t)
 | 
						|
        else (i t 1);
 | 
						|
    in ["CONFIG_${i t 0}" v];
 | 
						|
  in
 | 
						|
    map parseLine lines;
 | 
						|
 | 
						|
  # parse <OPT>=lib.kernel.(yes|module|no)|lib.kernel.freeform "foo"
 | 
						|
  # style configuration as found in a patch's extraStructuredConfig into
 | 
						|
  # a list of k, v tuples
 | 
						|
  parseExtraStructuredConfig = config:
 | 
						|
    lib.attrsets.mapAttrsToList
 | 
						|
    (k: v: ["CONFIG_${k}" (v.tristate or v.freeform)])
 | 
						|
    config;
 | 
						|
 | 
						|
  parsePatchConfig = {
 | 
						|
    extraConfig ? "",
 | 
						|
    extraStructuredConfig ? {},
 | 
						|
    ...
 | 
						|
  }:
 | 
						|
    (parseExtraConfig extraConfig)
 | 
						|
    ++ (parseExtraStructuredConfig extraStructuredConfig);
 | 
						|
 | 
						|
  # parse CONFIG_<OPT>=[ymn]|"foo" style configuration as found in a config file
 | 
						|
  # into a list of k, v tuples
 | 
						|
  parseConfig = config: let
 | 
						|
    parseLine = builtins.match ''(CONFIG_[[:upper:][:digit:]_]+)=(([ymn])|"([^"]*)")'';
 | 
						|
    # get either the [ymn] option or the "foo" option; whichever matched
 | 
						|
    t = l: let
 | 
						|
      v = i l 2;
 | 
						|
    in [
 | 
						|
      (i l 0)
 | 
						|
      (
 | 
						|
        if v != null
 | 
						|
        then v
 | 
						|
        else (i l 3)
 | 
						|
      )
 | 
						|
    ];
 | 
						|
    lines = lib.strings.splitString "\n" config;
 | 
						|
  in
 | 
						|
    map t (builtins.filter (l: l != null) (map parseLine lines));
 | 
						|
 | 
						|
  origConfigfile = ./config;
 | 
						|
 | 
						|
  linux-asahi-pkg = {
 | 
						|
    stdenv,
 | 
						|
    lib,
 | 
						|
    fetchFromGitHub,
 | 
						|
    fetchpatch,
 | 
						|
    linuxKernel,
 | 
						|
    rustPlatform,
 | 
						|
    rustc,
 | 
						|
    rustfmt,
 | 
						|
    rust-bindgen,
 | 
						|
    ...
 | 
						|
  } @ args: let
 | 
						|
    origConfigText = builtins.readFile origConfigfile;
 | 
						|
 | 
						|
    # extraConfig from all patches in order
 | 
						|
    extraConfig =
 | 
						|
      lib.fold (patch: ex: ex ++ (parsePatchConfig patch)) [] _kernelPatches;
 | 
						|
    # config file text for above
 | 
						|
    extraConfigText = let
 | 
						|
      text = k: v:
 | 
						|
        if (v == "y") || (v == "m") || (v == "n")
 | 
						|
        then "${k}=${v}"
 | 
						|
        else ''${k}="${v}"'';
 | 
						|
    in (map (t: text (i t 0) (i t 1)) extraConfig);
 | 
						|
 | 
						|
    # final config as a text file path
 | 
						|
    configfile =
 | 
						|
      if extraConfig == []
 | 
						|
      then origConfigfile
 | 
						|
      else
 | 
						|
        writeText "config" ''
 | 
						|
          ${origConfigText}
 | 
						|
 | 
						|
          # Patches
 | 
						|
          ${lib.strings.concatStringsSep "\n" extraConfigText}
 | 
						|
        '';
 | 
						|
    # final config as an attrset
 | 
						|
    configAttrs = let
 | 
						|
      makePair = t: lib.nameValuePair (i t 0) (i t 1);
 | 
						|
      configList = (parseConfig origConfigText) ++ extraConfig;
 | 
						|
    in
 | 
						|
      builtins.listToAttrs (map makePair (lib.lists.reverseList configList));
 | 
						|
 | 
						|
    # used to (ostensibly) keep compatibility for those running stable versions of nixos
 | 
						|
    rustOlder = version: withRust && (lib.versionOlder rustc.version version);
 | 
						|
    bindgenOlder = version: withRust && (lib.versionOlder rust-bindgen.unwrapped.version version);
 | 
						|
 | 
						|
    # used to fix issues when nixpkgs gets ahead of the kernel
 | 
						|
    rustAtLeast = version: withRust && (lib.versionAtLeast rustc.version version);
 | 
						|
    bindgenAtLeast = version: withRust && (lib.versionAtLeast rust-bindgen.unwrapped.version version);
 | 
						|
  in
 | 
						|
    (linuxKernel.manualConfig rec {
 | 
						|
        inherit stdenv lib;
 | 
						|
 | 
						|
        version = "6.9.12-asahi";
 | 
						|
        modDirVersion = version;
 | 
						|
        extraMeta.branch = "6.9";
 | 
						|
 | 
						|
        src = fetchFromGitHub {
 | 
						|
          # tracking: https://github.com/AsahiLinux/linux/tree/asahi-wip (w/ fedora verification)
 | 
						|
          owner = "AsahiLinux";
 | 
						|
          repo = "linux";
 | 
						|
          rev = "asahi-6.9.12-1";
 | 
						|
          hash = "sha256-LCMrG+RVONK/eIvygRExaVvY/ATV3IfvSsFbVsHVu48=";
 | 
						|
        };
 | 
						|
 | 
						|
        kernelPatches =
 | 
						|
          [
 | 
						|
            {
 | 
						|
              name = "coreutils-fix";
 | 
						|
              patch = ./0001-fs-fcntl-accept-more-values-as-F_DUPFD_CLOEXEC-args.patch;
 | 
						|
            }
 | 
						|
          ]
 | 
						|
          ++ _kernelPatches;
 | 
						|
 | 
						|
        inherit configfile;
 | 
						|
        # hide Rust support from the nixpkgs infra to avoid it re-adding the rust packages.
 | 
						|
        # we can't use it until it's in stable and until we've evaluated the cross-compilation impact.
 | 
						|
        config = configAttrs // {"CONFIG_RUST" = "n";};
 | 
						|
      }
 | 
						|
      // (args.argsOverride or {}))
 | 
						|
    .overrideAttrs (old:
 | 
						|
      if withRust
 | 
						|
      then {
 | 
						|
        nativeBuildInputs =
 | 
						|
          (old.nativeBuildInputs or [])
 | 
						|
          ++ [
 | 
						|
            rust-bindgen
 | 
						|
            rustfmt
 | 
						|
            rustc
 | 
						|
          ];
 | 
						|
        RUST_LIB_SRC = rustPlatform.rustLibSrc;
 | 
						|
      }
 | 
						|
      else {});
 | 
						|
 | 
						|
  linux-asahi = callPackage linux-asahi-pkg {};
 | 
						|
in
 | 
						|
  lib.recurseIntoAttrs (linuxPackagesFor linux-asahi)
 |