آرگومانهای نقطه ثابت کمکرسانهای ساخت
stdenv.mkDerivation همچنین به جای یک مجموعه ویژگی ساده، یک تابع نقطه ثابت را میپذیرد:
{
stdenv,
fetchurl,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "hello";
version = "2.12";
src = fetchurl {
url = "mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz";
hash = "sha256-...";
};
}) ورودی تابع، که طبق مرسوم finalAttrs نامیده میشود، وضعیت نهایی مجموعه ویژگی است. در اینجا src به جای تکرار رشته نسخه، finalAttrs.version را میخواند. گفته میشود یک کمکرسان ساخت مانند این، آرگومانهای نقطه ثابت را میپذیرد.
صفاتی که از طریق finalAttrs به یکدیگر ارجاع میدهند، هنگام تغییر هر یک از آنها با overrideAttrs درست باقی میمانند، زیرا همگی به مقادیر نهایی محاسبات نقطه ثابت دسترسی دارند.
rec نمیتواند این کار را انجام دهد: خودارجاعیهای آن در زمان تعریف مجموعه ثابت میشوند و بازنشانیهای بعدی را نادیده میگیرند.
برای سازوکار زیرین، مجموعههای بازگشتی را ببینید.
تعریف یک کمکرسان ساخت با lib.extendMkDerivation
از lib.customisation.extendMkDerivation برای تعریف یک کمکرسان ساخت با پشتیبانی از نقطه ثابت بر اساس یک کمکرسان موجود استفاده کنید.
آرگومان extendDrvArgs آن، یک اورلی صفات شبیه به <pkg>.overrideAttrs میگیرد.
علاوه بر بازنشانی، lib.extendMkDerivation از excludeDrvArgNames نیز پشتیبانی میکند تا در صورت تمایل، برخی از آرگومانها را در آرگومانهای نقطه ثابت ورودی از انتقال به کمکرسان ساخت پایه (که به صورت constructDrv مشخص میشود) مستثنی کند.
{ lib, stdenv, }: lib.extendMkDerivation { constructDrv = stdenv.mkDerivation; excludeDrvArgNames = [ # Don't pass specialArg into mkDerivation. "specialArg" ]; extendDrvArgs = finalAttrs: { preferLocalBuild ? true, allowSubstitute ? false, specialArg ? (_: false), ... }@args: { # Arguments to pass inherit preferLocalBuild allowSubstitute; # Some expressions involving specialArg greeting = if specialArg "hi" then "hi" else "hello"; }; }
برای اعمال تغییرات اضافی روی درایویشن حاصل، transformDrv را به lib.extendMkDerivation پاس دهید:
lib.customisation.extendMkDerivation { transformDrv = drv: /...; } ایجاد یک derivation پوششدهنده در اطراف یک derivation دیگر با استفاده از transformDrv
پوششدهنده به آرگومانهای اصلی دسترسی دارد.
> > > **مثال** > > # تعریف یک کمکرسان ساخت سفارشی که بارگیری و ساخت را انجام میدهد >{ lib, stdenvNoCC, cacert, configure-example, download-example, }: lib.extendMkDerivation { constructDrv = stdenvNoCC.mkDerivation; excludeDrvArgNames = [ "bar" ]; extendDrvArgs = finalAttrs: { bar, foo, hash ? "", ... }@args: { inherit hash; nativeBuildInputs = args.nativeBuildInputs or [ ] ++ [ cacert download-example ]; buildPhase = '' runHook preBuild download-example --foo="$foo" --out="$out" runHook postBuild ''; impureEnvVars = lib.fetchers.proxyImpureEnvVars; outputHash = if finalAttrs.hash != "" then finalAttrs.hash else lib.fakeHash; outputHashFormat = "recursive"; passthru = args.passthru or { } // { inherit bar; }; }; transformDrv = unwrapped: stdenvNoCC.mkDerivation (finalAttrs: { name = finalAttrs.src.name + "-wrapped"; src = unwrapped; nativeBuildInputs = [ configure-example ]; inherit (unwrapped) bar; buildPhase = '' runHook preBuild configure-example --bar="$bar" runHook postBuild ''; }); }