mirror of
https://github.com/NixOS/nix
synced 2025-06-25 02:21:16 +02:00
packaging: Move layers from dependencies to components
This makes it easier to implement batch overriding for the components.
This commit is contained in:
parent
5facd492ad
commit
cca01407a7
3 changed files with 161 additions and 147 deletions
|
@ -155,6 +155,8 @@
|
||||||
f = import ./packaging/components.nix {
|
f = import ./packaging/components.nix {
|
||||||
inherit (final) lib;
|
inherit (final) lib;
|
||||||
inherit officialRelease;
|
inherit officialRelease;
|
||||||
|
inherit stdenv;
|
||||||
|
pkgs = final;
|
||||||
src = self;
|
src = self;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,13 +1,22 @@
|
||||||
{
|
{
|
||||||
lib,
|
lib,
|
||||||
|
pkgs,
|
||||||
src,
|
src,
|
||||||
|
stdenv,
|
||||||
officialRelease,
|
officialRelease,
|
||||||
}:
|
}:
|
||||||
|
|
||||||
scope:
|
scope:
|
||||||
|
|
||||||
let
|
let
|
||||||
inherit (scope) callPackage;
|
inherit (scope)
|
||||||
|
callPackage
|
||||||
|
;
|
||||||
|
inherit (pkgs.buildPackages)
|
||||||
|
meson
|
||||||
|
ninja
|
||||||
|
pkg-config
|
||||||
|
;
|
||||||
|
|
||||||
baseVersion = lib.fileContents ../.version;
|
baseVersion = lib.fileContents ../.version;
|
||||||
|
|
||||||
|
@ -20,6 +29,129 @@ let
|
||||||
}_${src.shortRev or "dirty"}";
|
}_${src.shortRev or "dirty"}";
|
||||||
|
|
||||||
fineVersion = baseVersion + fineVersionSuffix;
|
fineVersion = baseVersion + fineVersionSuffix;
|
||||||
|
|
||||||
|
root = ../.;
|
||||||
|
|
||||||
|
# Nixpkgs implements this by returning a subpath into the fetched Nix sources.
|
||||||
|
resolvePath = p: p;
|
||||||
|
|
||||||
|
# Indirection for Nixpkgs to override when package.nix files are vendored
|
||||||
|
filesetToSource = lib.fileset.toSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Given a set of layers, create a mkDerivation-like function
|
||||||
|
*/
|
||||||
|
mkPackageBuilder =
|
||||||
|
exts: userFn: stdenv.mkDerivation (lib.extends (lib.composeManyExtensions exts) userFn);
|
||||||
|
|
||||||
|
setVersionLayer = finalAttrs: prevAttrs: {
|
||||||
|
preConfigure =
|
||||||
|
prevAttrs.prevAttrs or ""
|
||||||
|
+
|
||||||
|
# Update the repo-global .version file.
|
||||||
|
# Symlink ./.version points there, but by default only workDir is writable.
|
||||||
|
''
|
||||||
|
chmod u+w ./.version
|
||||||
|
echo ${finalAttrs.version} > ./.version
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
localSourceLayer =
|
||||||
|
finalAttrs: prevAttrs:
|
||||||
|
let
|
||||||
|
workDirPath =
|
||||||
|
# Ideally we'd pick finalAttrs.workDir, but for now `mkDerivation` has
|
||||||
|
# the requirement that everything except passthru and meta must be
|
||||||
|
# serialized by mkDerivation, which doesn't work for this.
|
||||||
|
prevAttrs.workDir;
|
||||||
|
|
||||||
|
workDirSubpath = lib.path.removePrefix root workDirPath;
|
||||||
|
sources =
|
||||||
|
assert prevAttrs.fileset._type == "fileset";
|
||||||
|
prevAttrs.fileset;
|
||||||
|
src = lib.fileset.toSource {
|
||||||
|
fileset = sources;
|
||||||
|
inherit root;
|
||||||
|
};
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
sourceRoot = "${src.name}/" + workDirSubpath;
|
||||||
|
inherit src;
|
||||||
|
|
||||||
|
# Clear what `derivation` can't/shouldn't serialize; see prevAttrs.workDir.
|
||||||
|
fileset = null;
|
||||||
|
workDir = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
mesonLayer = finalAttrs: prevAttrs: {
|
||||||
|
# NOTE:
|
||||||
|
# As of https://github.com/NixOS/nixpkgs/blob/8baf8241cea0c7b30e0b8ae73474cb3de83c1a30/pkgs/by-name/me/meson/setup-hook.sh#L26,
|
||||||
|
# `mesonBuildType` defaults to `plain` if not specified. We want our Nix-built binaries to be optimized by default.
|
||||||
|
# More on build types here: https://mesonbuild.com/Builtin-options.html#details-for-buildtype.
|
||||||
|
mesonBuildType = "release";
|
||||||
|
# NOTE:
|
||||||
|
# Users who are debugging Nix builds are expected to set the environment variable `mesonBuildType`, per the
|
||||||
|
# guidance in https://github.com/NixOS/nix/blob/8a3fc27f1b63a08ac983ee46435a56cf49ebaf4a/doc/manual/source/development/debugging.md?plain=1#L10.
|
||||||
|
# For this reason, we don't want to refer to `finalAttrs.mesonBuildType` here, but rather use the environment variable.
|
||||||
|
preConfigure =
|
||||||
|
prevAttrs.preConfigure or ""
|
||||||
|
+
|
||||||
|
lib.optionalString
|
||||||
|
(
|
||||||
|
!stdenv.hostPlatform.isWindows
|
||||||
|
# build failure
|
||||||
|
&& !stdenv.hostPlatform.isStatic
|
||||||
|
# LTO breaks exception handling on x86-64-darwin.
|
||||||
|
&& stdenv.system != "x86_64-darwin"
|
||||||
|
)
|
||||||
|
''
|
||||||
|
case "$mesonBuildType" in
|
||||||
|
release|minsize) appendToVar mesonFlags "-Db_lto=true" ;;
|
||||||
|
*) appendToVar mesonFlags "-Db_lto=false" ;;
|
||||||
|
esac
|
||||||
|
'';
|
||||||
|
nativeBuildInputs = [
|
||||||
|
meson
|
||||||
|
ninja
|
||||||
|
] ++ prevAttrs.nativeBuildInputs or [ ];
|
||||||
|
mesonCheckFlags = prevAttrs.mesonCheckFlags or [ ] ++ [
|
||||||
|
"--print-errorlogs"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
mesonBuildLayer = finalAttrs: prevAttrs: {
|
||||||
|
nativeBuildInputs = prevAttrs.nativeBuildInputs or [ ] ++ [
|
||||||
|
pkg-config
|
||||||
|
];
|
||||||
|
separateDebugInfo = !stdenv.hostPlatform.isStatic;
|
||||||
|
hardeningDisable = lib.optional stdenv.hostPlatform.isStatic "pie";
|
||||||
|
env =
|
||||||
|
prevAttrs.env or { }
|
||||||
|
// lib.optionalAttrs (
|
||||||
|
stdenv.isLinux
|
||||||
|
&& !(stdenv.hostPlatform.isStatic && stdenv.system == "aarch64-linux")
|
||||||
|
&& !(stdenv.hostPlatform.useLLVM or false)
|
||||||
|
) { LDFLAGS = "-fuse-ld=gold"; };
|
||||||
|
};
|
||||||
|
|
||||||
|
mesonLibraryLayer = finalAttrs: prevAttrs: {
|
||||||
|
outputs = prevAttrs.outputs or [ "out" ] ++ [ "dev" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Work around weird `--as-needed` linker behavior with BSD, see
|
||||||
|
# https://github.com/mesonbuild/meson/issues/3593
|
||||||
|
bsdNoLinkAsNeeded =
|
||||||
|
finalAttrs: prevAttrs:
|
||||||
|
lib.optionalAttrs stdenv.hostPlatform.isBSD {
|
||||||
|
mesonFlags = [ (lib.mesonBool "b_asneeded" false) ] ++ prevAttrs.mesonFlags or [ ];
|
||||||
|
};
|
||||||
|
|
||||||
|
miscGoodPractice = finalAttrs: prevAttrs: {
|
||||||
|
strictDeps = prevAttrs.strictDeps or true;
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
};
|
||||||
|
|
||||||
in
|
in
|
||||||
|
|
||||||
# This becomes the pkgs.nixComponents attribute set
|
# This becomes the pkgs.nixComponents attribute set
|
||||||
|
@ -27,6 +159,32 @@ in
|
||||||
version = baseVersion + versionSuffix;
|
version = baseVersion + versionSuffix;
|
||||||
inherit versionSuffix;
|
inherit versionSuffix;
|
||||||
|
|
||||||
|
inherit resolvePath filesetToSource;
|
||||||
|
|
||||||
|
mkMesonDerivation = mkPackageBuilder [
|
||||||
|
miscGoodPractice
|
||||||
|
localSourceLayer
|
||||||
|
setVersionLayer
|
||||||
|
mesonLayer
|
||||||
|
];
|
||||||
|
mkMesonExecutable = mkPackageBuilder [
|
||||||
|
miscGoodPractice
|
||||||
|
bsdNoLinkAsNeeded
|
||||||
|
localSourceLayer
|
||||||
|
setVersionLayer
|
||||||
|
mesonLayer
|
||||||
|
mesonBuildLayer
|
||||||
|
];
|
||||||
|
mkMesonLibrary = mkPackageBuilder [
|
||||||
|
miscGoodPractice
|
||||||
|
bsdNoLinkAsNeeded
|
||||||
|
localSourceLayer
|
||||||
|
mesonLayer
|
||||||
|
setVersionLayer
|
||||||
|
mesonBuildLayer
|
||||||
|
mesonLibraryLayer
|
||||||
|
];
|
||||||
|
|
||||||
nix-util = callPackage ../src/libutil/package.nix { };
|
nix-util = callPackage ../src/libutil/package.nix { };
|
||||||
nix-util-c = callPackage ../src/libutil-c/package.nix { };
|
nix-util-c = callPackage ../src/libutil-c/package.nix { };
|
||||||
nix-util-test-support = callPackage ../src/libutil-test-support/package.nix { };
|
nix-util-test-support = callPackage ../src/libutil-test-support/package.nix { };
|
||||||
|
|
|
@ -17,8 +17,6 @@ in
|
||||||
let
|
let
|
||||||
inherit (pkgs) lib;
|
inherit (pkgs) lib;
|
||||||
|
|
||||||
root = ../.;
|
|
||||||
|
|
||||||
stdenv = if prevStdenv.isDarwin && prevStdenv.isx86_64 then darwinStdenv else prevStdenv;
|
stdenv = if prevStdenv.isDarwin && prevStdenv.isx86_64 then darwinStdenv else prevStdenv;
|
||||||
|
|
||||||
# Fix the following error with the default x86_64-darwin SDK:
|
# Fix the following error with the default x86_64-darwin SDK:
|
||||||
|
@ -30,125 +28,6 @@ let
|
||||||
# all the way back to 10.6.
|
# all the way back to 10.6.
|
||||||
darwinStdenv = pkgs.overrideSDK prevStdenv { darwinMinVersion = "10.13"; };
|
darwinStdenv = pkgs.overrideSDK prevStdenv { darwinMinVersion = "10.13"; };
|
||||||
|
|
||||||
# Nixpkgs implements this by returning a subpath into the fetched Nix sources.
|
|
||||||
resolvePath = p: p;
|
|
||||||
|
|
||||||
# Indirection for Nixpkgs to override when package.nix files are vendored
|
|
||||||
filesetToSource = lib.fileset.toSource;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Given a set of layers, create a mkDerivation-like function
|
|
||||||
*/
|
|
||||||
mkPackageBuilder =
|
|
||||||
exts: userFn: stdenv.mkDerivation (lib.extends (lib.composeManyExtensions exts) userFn);
|
|
||||||
|
|
||||||
setVersionLayer = finalAttrs: prevAttrs: {
|
|
||||||
preConfigure =
|
|
||||||
prevAttrs.prevAttrs or ""
|
|
||||||
+
|
|
||||||
# Update the repo-global .version file.
|
|
||||||
# Symlink ./.version points there, but by default only workDir is writable.
|
|
||||||
''
|
|
||||||
chmod u+w ./.version
|
|
||||||
echo ${finalAttrs.version} > ./.version
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
localSourceLayer =
|
|
||||||
finalAttrs: prevAttrs:
|
|
||||||
let
|
|
||||||
workDirPath =
|
|
||||||
# Ideally we'd pick finalAttrs.workDir, but for now `mkDerivation` has
|
|
||||||
# the requirement that everything except passthru and meta must be
|
|
||||||
# serialized by mkDerivation, which doesn't work for this.
|
|
||||||
prevAttrs.workDir;
|
|
||||||
|
|
||||||
workDirSubpath = lib.path.removePrefix root workDirPath;
|
|
||||||
sources =
|
|
||||||
assert prevAttrs.fileset._type == "fileset";
|
|
||||||
prevAttrs.fileset;
|
|
||||||
src = lib.fileset.toSource {
|
|
||||||
fileset = sources;
|
|
||||||
inherit root;
|
|
||||||
};
|
|
||||||
|
|
||||||
in
|
|
||||||
{
|
|
||||||
sourceRoot = "${src.name}/" + workDirSubpath;
|
|
||||||
inherit src;
|
|
||||||
|
|
||||||
# Clear what `derivation` can't/shouldn't serialize; see prevAttrs.workDir.
|
|
||||||
fileset = null;
|
|
||||||
workDir = null;
|
|
||||||
};
|
|
||||||
|
|
||||||
mesonLayer = finalAttrs: prevAttrs: {
|
|
||||||
# NOTE:
|
|
||||||
# As of https://github.com/NixOS/nixpkgs/blob/8baf8241cea0c7b30e0b8ae73474cb3de83c1a30/pkgs/by-name/me/meson/setup-hook.sh#L26,
|
|
||||||
# `mesonBuildType` defaults to `plain` if not specified. We want our Nix-built binaries to be optimized by default.
|
|
||||||
# More on build types here: https://mesonbuild.com/Builtin-options.html#details-for-buildtype.
|
|
||||||
mesonBuildType = "release";
|
|
||||||
# NOTE:
|
|
||||||
# Users who are debugging Nix builds are expected to set the environment variable `mesonBuildType`, per the
|
|
||||||
# guidance in https://github.com/NixOS/nix/blob/8a3fc27f1b63a08ac983ee46435a56cf49ebaf4a/doc/manual/source/development/debugging.md?plain=1#L10.
|
|
||||||
# For this reason, we don't want to refer to `finalAttrs.mesonBuildType` here, but rather use the environment variable.
|
|
||||||
preConfigure =
|
|
||||||
prevAttrs.preConfigure or ""
|
|
||||||
+
|
|
||||||
lib.optionalString
|
|
||||||
(
|
|
||||||
!stdenv.hostPlatform.isWindows
|
|
||||||
# build failure
|
|
||||||
&& !stdenv.hostPlatform.isStatic
|
|
||||||
# LTO breaks exception handling on x86-64-darwin.
|
|
||||||
&& stdenv.system != "x86_64-darwin"
|
|
||||||
)
|
|
||||||
''
|
|
||||||
case "$mesonBuildType" in
|
|
||||||
release|minsize) appendToVar mesonFlags "-Db_lto=true" ;;
|
|
||||||
*) appendToVar mesonFlags "-Db_lto=false" ;;
|
|
||||||
esac
|
|
||||||
'';
|
|
||||||
nativeBuildInputs = [
|
|
||||||
pkgs.buildPackages.meson
|
|
||||||
pkgs.buildPackages.ninja
|
|
||||||
] ++ prevAttrs.nativeBuildInputs or [ ];
|
|
||||||
mesonCheckFlags = prevAttrs.mesonCheckFlags or [ ] ++ [
|
|
||||||
"--print-errorlogs"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
mesonBuildLayer = finalAttrs: prevAttrs: {
|
|
||||||
nativeBuildInputs = prevAttrs.nativeBuildInputs or [ ] ++ [
|
|
||||||
pkgs.buildPackages.pkg-config
|
|
||||||
];
|
|
||||||
separateDebugInfo = !stdenv.hostPlatform.isStatic;
|
|
||||||
hardeningDisable = lib.optional stdenv.hostPlatform.isStatic "pie";
|
|
||||||
env =
|
|
||||||
prevAttrs.env or { }
|
|
||||||
// lib.optionalAttrs (
|
|
||||||
stdenv.isLinux
|
|
||||||
&& !(stdenv.hostPlatform.isStatic && stdenv.system == "aarch64-linux")
|
|
||||||
&& !(stdenv.hostPlatform.useLLVM or false)
|
|
||||||
) { LDFLAGS = "-fuse-ld=gold"; };
|
|
||||||
};
|
|
||||||
|
|
||||||
mesonLibraryLayer = finalAttrs: prevAttrs: {
|
|
||||||
outputs = prevAttrs.outputs or [ "out" ] ++ [ "dev" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Work around weird `--as-needed` linker behavior with BSD, see
|
|
||||||
# https://github.com/mesonbuild/meson/issues/3593
|
|
||||||
bsdNoLinkAsNeeded =
|
|
||||||
finalAttrs: prevAttrs:
|
|
||||||
lib.optionalAttrs stdenv.hostPlatform.isBSD {
|
|
||||||
mesonFlags = [ (lib.mesonBool "b_asneeded" false) ] ++ prevAttrs.mesonFlags or [ ];
|
|
||||||
};
|
|
||||||
|
|
||||||
miscGoodPractice = finalAttrs: prevAttrs: {
|
|
||||||
strictDeps = prevAttrs.strictDeps or true;
|
|
||||||
enableParallelBuilding = true;
|
|
||||||
};
|
|
||||||
in
|
in
|
||||||
scope:
|
scope:
|
||||||
{
|
{
|
||||||
|
@ -187,31 +66,6 @@ scope:
|
||||||
installPhase = lib.replaceStrings [ "--without-python" ] [ "" ] old.installPhase;
|
installPhase = lib.replaceStrings [ "--without-python" ] [ "" ] old.installPhase;
|
||||||
});
|
});
|
||||||
|
|
||||||
inherit resolvePath filesetToSource;
|
|
||||||
|
|
||||||
mkMesonDerivation = mkPackageBuilder [
|
|
||||||
miscGoodPractice
|
|
||||||
localSourceLayer
|
|
||||||
setVersionLayer
|
|
||||||
mesonLayer
|
|
||||||
];
|
|
||||||
mkMesonExecutable = mkPackageBuilder [
|
|
||||||
miscGoodPractice
|
|
||||||
bsdNoLinkAsNeeded
|
|
||||||
localSourceLayer
|
|
||||||
setVersionLayer
|
|
||||||
mesonLayer
|
|
||||||
mesonBuildLayer
|
|
||||||
];
|
|
||||||
mkMesonLibrary = mkPackageBuilder [
|
|
||||||
miscGoodPractice
|
|
||||||
bsdNoLinkAsNeeded
|
|
||||||
localSourceLayer
|
|
||||||
mesonLayer
|
|
||||||
setVersionLayer
|
|
||||||
mesonBuildLayer
|
|
||||||
mesonLibraryLayer
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
# libgit2: Nixpkgs 24.11 has < 1.9.0
|
# libgit2: Nixpkgs 24.11 has < 1.9.0
|
||||||
// lib.optionalAttrs (!lib.versionAtLeast pkgs.libgit2.version "1.9.0") {
|
// lib.optionalAttrs (!lib.versionAtLeast pkgs.libgit2.version "1.9.0") {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue