From b64a9bb1a9b70726a5ee9fe1cd5daba0eef8cadf Mon Sep 17 00:00:00 2001 From: John Ericson Date: Tue, 30 Apr 2024 19:29:38 -0400 Subject: [PATCH] freebsdBranches{,Cross}: Init This creates multiple package sets for different versions. The other versions don't yet work, but that will be fixed in subsequent PRs. Push versionData into package set so that it can be overridden Co-Authored-By: Audrey Dutcher Co-Authored-By: Artemis Tosini --- .../bsd/freebsd/default-branch.nix | 39 ++++++++++ pkgs/os-specific/bsd/freebsd/default.nix | 72 ------------------- pkgs/os-specific/bsd/freebsd/package-set.nix | 71 ++++++++++++++++++ pkgs/os-specific/bsd/freebsd/versions.nix | 45 ++++++++++++ pkgs/top-level/all-packages.nix | 14 ++-- pkgs/top-level/config.nix | 8 +++ pkgs/top-level/release-attrpaths-superset.nix | 1 + 7 files changed, 174 insertions(+), 76 deletions(-) create mode 100644 pkgs/os-specific/bsd/freebsd/default-branch.nix delete mode 100644 pkgs/os-specific/bsd/freebsd/default.nix create mode 100644 pkgs/os-specific/bsd/freebsd/package-set.nix create mode 100644 pkgs/os-specific/bsd/freebsd/versions.nix diff --git a/pkgs/os-specific/bsd/freebsd/default-branch.nix b/pkgs/os-specific/bsd/freebsd/default-branch.nix new file mode 100644 index 000000000000..df13357aca41 --- /dev/null +++ b/pkgs/os-specific/bsd/freebsd/default-branch.nix @@ -0,0 +1,39 @@ +{ + lib, + config, + freebsdBranches, + freebsdBranchesCross, +}: + +let + branch = + let + fallbackBranch = "release/13.1.0"; + envBranch = builtins.getEnv "NIXPKGS_FREEBSD_BRANCH"; + selectedBranch = + if config.freebsdBranch != null then + config.freebsdBranch + else if envBranch != "" then + envBranch + else + null; + chosenBranch = if selectedBranch != null then selectedBranch else fallbackBranch; + in + if freebsdBranches ? ${chosenBranch} then + chosenBranch + else + throw '' + Unknown FreeBSD branch ${chosenBranch}! + FreeBSD branches normally look like one of: + * `release/..0` for tagged releases without security updates + * `releng/.` for release update branches with security updates + * `stable/` for stable versions working towards the next minor release + * `main` for the latest development version + + Set one with the NIXPKGS_FREEBSD_BRANCH environment variable or by setting `nixpkgs.config.freebsdBranch`. + ''; +in +{ + freebsd = freebsdBranches.${branch}; + freebsdCross = freebsdBranchesCross.${branch}; +} diff --git a/pkgs/os-specific/bsd/freebsd/default.nix b/pkgs/os-specific/bsd/freebsd/default.nix deleted file mode 100644 index b7cf5484c9e9..000000000000 --- a/pkgs/os-specific/bsd/freebsd/default.nix +++ /dev/null @@ -1,72 +0,0 @@ -{ stdenv, lib, stdenvNoCC -, makeScopeWithSplicing', generateSplicesForMkScope -, buildPackages -, fetchgit, fetchzip -}: - -let - inherit (buildPackages.buildPackages) rsync; - - versions = builtins.fromJSON (builtins.readFile ./versions.json); - - version = "13.1.0"; - branch = "release/${version}"; - -in makeScopeWithSplicing' { - otherSplices = generateSplicesForMkScope "freebsd"; - f = (self: lib.packagesFromDirectoryRecursive { - callPackage = self.callPackage; - directory = ./pkgs; - } // { - sourceData = versions.${branch}; - - ports = fetchzip { - url = "https://cgit.freebsd.org/ports/snapshot/ports-dde3b2b456c3a4bdd217d0bf3684231cc3724a0a.tar.gz"; - sha256 = "BpHqJfnGOeTE7tkFJBx0Wk8ryalmf4KNTit/Coh026E="; - }; - - compatIfNeeded = lib.optional (!stdenvNoCC.hostPlatform.isFreeBSD) self.compat; - freebsd-lib = import ./lib { inherit version; }; - - # The manual callPackages below should in principle be unnecessary, but are - # necessary. See note in ../netbsd/default.nix - - compat = self.callPackage ./pkgs/compat/package.nix { - inherit stdenv; - inherit (buildPackages.freebsd) makeMinimal boot-install; - }; - - csu = self.callPackage ./pkgs/csu.nix { - inherit (buildPackages.freebsd) makeMinimal install gencat; - inherit (self) include; - }; - - include = self.callPackage ./pkgs/include/package.nix { - inherit (buildPackages.freebsd) makeMinimal install rpcgen; - }; - - install = self.callPackage ./pkgs/install.nix { - inherit (buildPackages.freebsd) makeMinimal; - inherit (self) mtree libnetbsd; - }; - - libc = self.callPackage ./pkgs/libc/package.nix { - inherit (buildPackages.freebsd) makeMinimal install gencat rpcgen; - inherit (self) csu include; - }; - - libnetbsd = self.callPackage ./pkgs/libnetbsd/package.nix { - inherit (buildPackages.freebsd) makeMinimal; - }; - - mkDerivation = self.callPackage ./pkgs/mkDerivation.nix { - inherit stdenv; - inherit (buildPackages.freebsd) makeMinimal install tsort; - }; - - makeMinimal = self.callPackage ./pkgs/makeMinimal.nix { - inherit (self) make; - }; - - }); -} diff --git a/pkgs/os-specific/bsd/freebsd/package-set.nix b/pkgs/os-specific/bsd/freebsd/package-set.nix new file mode 100644 index 000000000000..363e6693b93e --- /dev/null +++ b/pkgs/os-specific/bsd/freebsd/package-set.nix @@ -0,0 +1,71 @@ +{ stdenv, lib, stdenvNoCC +, fetchzip +, sourceData, versionData, buildFreebsd +}: + +self: + +lib.packagesFromDirectoryRecursive { + callPackage = self.callPackage; + directory = ./pkgs; +} // { + inherit sourceData versionData; + + # Keep the crawled portion of Nixpkgs finite. + buildFreebsd = lib.dontRecurseIntoAttrs buildFreebsd; + + ports = fetchzip { + url = "https://cgit.freebsd.org/ports/snapshot/ports-dde3b2b456c3a4bdd217d0bf3684231cc3724a0a.tar.gz"; + sha256 = "BpHqJfnGOeTE7tkFJBx0Wk8ryalmf4KNTit/Coh026E="; + }; + + compatIfNeeded = lib.optional (!stdenvNoCC.hostPlatform.isFreeBSD) self.compat; + freebsd-lib = import ./lib { + version = lib.concatStringsSep "." (map toString (lib.filter (x: x != null) [ + self.versionData.major + self.versionData.minor + self.versionData.patch or null + ])); + }; + + # The manual callPackages below should in principle be unnecessary, but are + # necessary. See note in ../netbsd/default.nix + + compat = self.callPackage ./pkgs/compat/package.nix { + inherit stdenv; + inherit (buildFreebsd) makeMinimal boot-install; + }; + + csu = self.callPackage ./pkgs/csu.nix { + inherit (buildFreebsd) makeMinimal install gencat; + inherit (self) include; + }; + + include = self.callPackage ./pkgs/include/package.nix { + inherit (buildFreebsd) makeMinimal install rpcgen; + }; + + install = self.callPackage ./pkgs/install.nix { + inherit (buildFreebsd) makeMinimal; + inherit (self) mtree libnetbsd; + }; + + libc = self.callPackage ./pkgs/libc/package.nix { + inherit (buildFreebsd) makeMinimal install gencat rpcgen; + inherit (self) csu include; + }; + + libnetbsd = self.callPackage ./pkgs/libnetbsd/package.nix { + inherit (buildFreebsd) makeMinimal; + }; + + mkDerivation = self.callPackage ./pkgs/mkDerivation.nix { + inherit stdenv; + inherit (buildFreebsd) makeMinimal install tsort; + }; + + makeMinimal = self.callPackage ./pkgs/makeMinimal.nix { + inherit (self) make; + }; + +} diff --git a/pkgs/os-specific/bsd/freebsd/versions.nix b/pkgs/os-specific/bsd/freebsd/versions.nix new file mode 100644 index 000000000000..4acfd5b6198b --- /dev/null +++ b/pkgs/os-specific/bsd/freebsd/versions.nix @@ -0,0 +1,45 @@ +{ + lib, + config, + makeScopeWithSplicing', + generateSplicesForMkScope, + callPackage, + crossLibcStdenv, +}: + +let + versions = builtins.fromJSON (builtins.readFile ./versions.json); + + # `./package-set.nix` should never know the name of the package set we + # are constructing; just this function is allowed to know that. This + # is why we: + # + # - do the splicing for cross compilation here + # + # - construct the *anonymized* `buildFreebsd` attribute to be passed + # to `./package-set.nix`. + callFreeBSDWithAttrs = + extraArgs: branch: sourceData: + let + otherSplices = generateSplicesForMkScope [ + "freebsdBranches" + branch + ]; + in + makeScopeWithSplicing' { + inherit otherSplices; + f = callPackage ./package-set.nix ( + { + buildFreebsd = otherSplices.selfBuildHost; + inherit sourceData; + versionData = sourceData.version; + } + // extraArgs + ); + }; +in +{ + freebsdBranches = lib.mapAttrs (callFreeBSDWithAttrs { }) versions; + + freebsdBranchesCross = lib.mapAttrs (callFreeBSDWithAttrs { stdenv = crossLibcStdenv; }) versions; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 5c97ea86188b..8ded19f002d9 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -40910,10 +40910,16 @@ with pkgs; name = "bsd-setup-hook"; } ../os-specific/bsd/setup-hook.sh; - freebsd = callPackage ../os-specific/bsd/freebsd { }; - freebsdCross = callPackage ../os-specific/bsd/freebsd { - stdenv = crossLibcStdenv; - }; + inherit (callPackage ../os-specific/bsd/freebsd/versions.nix {}) freebsdBranches freebsdBranchesCross; + + freebsd13 = freebsdBranches."release/13.2.0"; + freebsd14 = freebsdBranches."release/14.0.0"; + freebsdGit = freebsdBranches.main; + freebsd13Cross = freebsdBranchesCross."release/13.0.0"; + freebsd14Cross = freebsdBranchesCross."release/14.0.0"; + freebsdGitCross = freebsdBranchesCross.main; + + inherit (callPackage ../os-specific/bsd/freebsd/default-branch.nix {}) freebsd freebsdCross; netbsd = callPackage ../os-specific/bsd/netbsd { }; netbsdCross = callPackage ../os-specific/bsd/netbsd { diff --git a/pkgs/top-level/config.nix b/pkgs/top-level/config.nix index 67a9a60dbaea..4a5b12ed70db 100644 --- a/pkgs/top-level/config.nix +++ b/pkgs/top-level/config.nix @@ -74,6 +74,14 @@ let feature = "set `__contentAddressed` to true by default"; }; + freebsdBranch = mkMassRebuild { + type = types.nullOr types.str; + default = null; + description = '' + Default FreeBSD release to use for FreeBSD packages + ''; + }; + allowAliases = mkOption { type = types.bool; default = true; diff --git a/pkgs/top-level/release-attrpaths-superset.nix b/pkgs/top-level/release-attrpaths-superset.nix index cd48453fa0ee..a80b40d36060 100644 --- a/pkgs/top-level/release-attrpaths-superset.nix +++ b/pkgs/top-level/release-attrpaths-superset.nix @@ -76,6 +76,7 @@ let buildHaskellPackages = true; buildPackages = true; + buildFreebsd = true; generateOptparseApplicativeCompletions = true; callPackage = true;