2021-08-22 07:53:02 +00:00
{ lib , config }:
stdenv :
2020-04-24 23:36:52 +00:00
let
checkMeta = import ./check-meta.nix {
inherit lib config ;
# Nix itself uses the `system` field of a derivation to decide where
# to build it. This is a bit confusing for cross compilation.
inherit ( stdenv ) hostPlatform ;
} ;
2022-04-27 09:35:20 +00:00
# Based off lib.makeExtensible, with modifications:
2022-06-16 17:23:12 +00:00
makeDerivationExtensible = rattrs :
2022-04-27 09:35:20 +00:00
let
# NOTE: The following is a hint that will be printed by the Nix cli when
# encountering an infinite recursion. It must not be formatted into
# separate lines, because Nix would only show the last line of the comment.
# An infinite recursion here can be caused by having the attribute names of expression `e` in `.overrideAttrs(finalAttrs: previousAttrs: e)` depend on `finalAttrs`. Only the attribute values of `e` can depend on `finalAttrs`.
args = rattrs ( args // { inherit finalPackage ; } ) ;
# ^^^^
finalPackage =
mkDerivationSimple
( f0 :
let
f = self : super :
# Convert f0 to an overlay. Legacy is:
# overrideAttrs (super: {})
# We want to introduce self. We follow the convention of overlays:
# overrideAttrs (self: super: {})
# Which means the first parameter can be either self or super.
# This is surprising, but far better than the confusion that would
# arise from flipping an overlay's parameters in some cases.
let x = f0 super ;
in
if builtins . isFunction x
then
# Can't reuse `x`, because `self` comes first.
# Looks inefficient, but `f0 super` was a cheap thunk.
f0 self super
else x ;
in
2022-06-16 17:23:12 +00:00
makeDerivationExtensible
2022-04-27 09:35:20 +00:00
( self : let super = rattrs self ; in super // f self super ) )
args ;
in finalPackage ;
# makeDerivationExtensibleConst == makeDerivationExtensible (_: attrs),
# but pre-evaluated for a slight improvement in performance.
2022-06-16 17:23:12 +00:00
makeDerivationExtensibleConst = attrs :
2022-04-27 09:35:20 +00:00
mkDerivationSimple
( f0 :
let
f = self : super :
let x = f0 super ;
in
if builtins . isFunction x
then
f0 self super
else x ;
in
2022-06-16 17:23:12 +00:00
makeDerivationExtensible ( self : attrs // f self attrs ) )
2022-04-27 09:35:20 +00:00
attrs ;
2022-06-16 17:23:12 +00:00
mkDerivationSimple = overrideAttrs :
2022-04-27 09:35:20 +00:00
2021-08-22 07:53:02 +00:00
# `mkDerivation` wraps the builtin `derivation` function to
# produce derivations that use this stdenv and its shell.
#
# See also:
#
# * https://nixos.org/nixpkgs/manual/#sec-using-stdenv
# Details on how to use this mkDerivation function
#
2022-05-18 14:49:53 +00:00
# * https://nixos.org/manual/nix/stable/expressions/derivations.html#derivations
2021-08-22 07:53:02 +00:00
# Explanation about derivations in general
{
# These types of dependencies are all exhaustively documented in
# the "Specifying Dependencies" section of the "Standard
# Environment" chapter of the Nixpkgs manual.
# TODO(@Ericson2314): Stop using legacy dep attribute names
# host offset -> target offset
depsBuildBuild ? [ ] # -1 -> -1
, depsBuildBuildPropagated ? [ ] # -1 -> -1
, nativeBuildInputs ? [ ] # -1 -> 0 N.B. Legacy name
, propagatedNativeBuildInputs ? [ ] # -1 -> 0 N.B. Legacy name
, depsBuildTarget ? [ ] # -1 -> 1
, depsBuildTargetPropagated ? [ ] # -1 -> 1
, depsHostHost ? [ ] # 0 -> 0
, depsHostHostPropagated ? [ ] # 0 -> 0
, buildInputs ? [ ] # 0 -> 1 N.B. Legacy name
, propagatedBuildInputs ? [ ] # 0 -> 1 N.B. Legacy name
, depsTargetTarget ? [ ] # 1 -> 1
, depsTargetTargetPropagated ? [ ] # 1 -> 1
, checkInputs ? [ ]
, installCheckInputs ? [ ]
# Configure Phase
, configureFlags ? [ ]
, cmakeFlags ? [ ]
, mesonFlags ? [ ]
, # Target is not included by default because most programs don't care.
# Including it then would cause needless mass rebuilds.
2020-04-24 23:36:52 +00:00
#
2022-06-26 10:26:21 +00:00
# TODO(@Ericson2314): Make [ "build" "host" ] always the default / resolve #87909
2021-08-22 07:53:02 +00:00
configurePlatforms ? lib . optionals
2022-06-26 10:26:21 +00:00
( stdenv . hostPlatform != stdenv . buildPlatform || config . configurePlatformsByDefault )
2021-08-22 07:53:02 +00:00
[ " b u i l d " " h o s t " ]
# TODO(@Ericson2314): Make unconditional / resolve #33599
# Check phase
, doCheck ? config . doCheckByDefault or false
# TODO(@Ericson2314): Make unconditional / resolve #33599
# InstallCheck phase
, doInstallCheck ? config . doCheckByDefault or false
2022-06-26 10:26:21 +00:00
, # TODO(@Ericson2314): Make always true and remove / resolve #178468
2022-04-27 09:35:20 +00:00
strictDeps ? if config . strictDepsByDefault then true else stdenv . hostPlatform != stdenv . buildPlatform
2022-05-18 14:49:53 +00:00
, enableParallelBuilding ? config . enableParallelBuildingByDefault
2021-08-22 07:53:02 +00:00
, meta ? { }
, passthru ? { }
, pos ? # position used in error messages and for meta.position
( if attrs . meta . description or null != null
then builtins . unsafeGetAttrPos " d e s c r i p t i o n " attrs . meta
else if attrs . version or null != null
then builtins . unsafeGetAttrPos " v e r s i o n " attrs
else builtins . unsafeGetAttrPos " n a m e " attrs )
, separateDebugInfo ? false
, outputs ? [ " o u t " ]
, __darwinAllowLocalNetworking ? false
, __impureHostDeps ? [ ]
, __propagatedImpureHostDeps ? [ ]
, sandboxProfile ? " "
, propagatedSandboxProfile ? " "
, hardeningEnable ? [ ]
, hardeningDisable ? [ ]
, patches ? [ ]
, __contentAddressed ?
( ! attrs ? outputHash ) # Fixed-output drvs can't be content addressed too
2022-04-27 09:35:20 +00:00
&& config . contentAddressedByDefault
2021-08-22 07:53:02 +00:00
, . . . } @ attrs :
2020-04-24 23:36:52 +00:00
2021-08-22 07:53:02 +00:00
let
# TODO(@oxij, @Ericson2314): This is here to keep the old semantics, remove when
# no package has `doCheck = true`.
2022-06-16 17:23:12 +00:00
doCheck' = doCheck && stdenv . buildPlatform . canExecute stdenv . hostPlatform ;
doInstallCheck' = doInstallCheck && stdenv . buildPlatform . canExecute stdenv . hostPlatform ;
2021-08-22 07:53:02 +00:00
separateDebugInfo' = separateDebugInfo && stdenv . hostPlatform . isLinux && ! ( stdenv . hostPlatform . useLLVM or false ) ;
outputs' = outputs ++ lib . optional separateDebugInfo' " d e b u g " ;
noNonNativeDeps = builtins . length ( depsBuildTarget ++ depsBuildTargetPropagated
++ depsHostHost ++ depsHostHostPropagated
++ buildInputs ++ propagatedBuildInputs
++ depsTargetTarget ++ depsTargetTargetPropagated ) == 0 ;
dontAddHostSuffix = attrs ? outputHash && ! noNonNativeDeps || ! stdenv . hasCC ;
supportedHardeningFlags = [ " f o r t i f y " " s t a c k p r o t e c t o r " " p i e " " p i c " " s t r i c t o v e r f l o w " " f o r m a t " " r e l r o " " b i n d n o w " ] ;
# Musl-based platforms will keep "pie", other platforms will not.
# If you change this, make sure to update section `{#sec-hardening-in-nixpkgs}`
# in the nixpkgs manual to inform users about the defaults.
defaultHardeningFlags = if stdenv . hostPlatform . isMusl &&
# Except when:
# - static aarch64, where compilation works, but produces segfaulting dynamically linked binaries.
# - static armv7l, where compilation fails.
2022-08-12 12:06:08 +00:00
! ( stdenv . hostPlatform . isAarch && stdenv . hostPlatform . isStatic )
2021-08-22 07:53:02 +00:00
then supportedHardeningFlags
else lib . remove " p i e " supportedHardeningFlags ;
enabledHardeningOptions =
if builtins . elem " a l l " hardeningDisable
then [ ]
else lib . subtractLists hardeningDisable ( defaultHardeningFlags ++ hardeningEnable ) ;
# hardeningDisable additionally supports "all".
erroneousHardeningFlags = lib . subtractLists supportedHardeningFlags ( hardeningEnable ++ lib . remove " a l l " hardeningDisable ) ;
2022-05-18 14:49:53 +00:00
checkDependencyList = checkDependencyList' [ ] ;
checkDependencyList' = positions : name : deps : lib . flip lib . imap1 deps ( index : dep :
if lib . isDerivation dep || isNull dep || builtins . typeOf dep == " s t r i n g " || builtins . typeOf dep == " p a t h " then dep
else if lib . isList dep then checkDependencyList' ( [ index ] ++ positions ) name dep
else throw " D e p e n d e n c y i s n o t o f a v a l i d t y p e : ${ lib . concatMapStrings ( ix : " e l e m e n t ${ toString ix } o f " ) ( [ index ] ++ positions ) } ${ name } f o r ${ attrs . name or attrs . pname } " ) ;
2021-08-22 07:53:02 +00:00
in if builtins . length erroneousHardeningFlags != 0
then abort ( " m k D e r i v a t i o n w a s c a l l e d w i t h u n s u p p o r t e d h a r d e n i n g f l a g s : " + lib . generators . toPretty { } {
inherit erroneousHardeningFlags hardeningDisable hardeningEnable supportedHardeningFlags ;
} )
else let
doCheck = doCheck' ;
doInstallCheck = doInstallCheck' ;
outputs = outputs' ;
references = nativeBuildInputs ++ buildInputs
++ propagatedNativeBuildInputs ++ propagatedBuildInputs ;
dependencies = map ( map lib . chooseDevOutputs ) [
[
2022-05-18 14:49:53 +00:00
( map ( drv : drv . __spliced . buildBuild or drv ) ( checkDependencyList " d e p s B u i l d B u i l d " depsBuildBuild ) )
( map ( drv : drv . nativeDrv or drv ) ( checkDependencyList " n a t i v e B u i l d I n p u t s " nativeBuildInputs
2021-08-22 07:53:02 +00:00
++ lib . optional separateDebugInfo' ../../build-support/setup-hooks/separate-debug-info.sh
++ lib . optional stdenv . hostPlatform . isWindows ../../build-support/setup-hooks/win-dll-link.sh
++ lib . optionals doCheck checkInputs
2022-05-18 14:49:53 +00:00
++ lib . optionals doInstallCheck' installCheckInputs ) )
( map ( drv : drv . __spliced . buildTarget or drv ) ( checkDependencyList " d e p s B u i l d T a r g e t " depsBuildTarget ) )
2021-08-22 07:53:02 +00:00
]
[
2022-05-18 14:49:53 +00:00
( map ( drv : drv . __spliced . hostHost or drv ) ( checkDependencyList " d e p s H o s t H o s t " depsHostHost ) )
( map ( drv : drv . crossDrv or drv ) ( checkDependencyList " b u i l d I n p u t s " buildInputs ) )
2021-08-22 07:53:02 +00:00
]
[
2022-05-18 14:49:53 +00:00
( map ( drv : drv . __spliced . targetTarget or drv ) ( checkDependencyList " d e p s T a r g e t T a r g e t " depsTargetTarget ) )
2021-08-22 07:53:02 +00:00
]
] ;
propagatedDependencies = map ( map lib . chooseDevOutputs ) [
[
2022-05-18 14:49:53 +00:00
( map ( drv : drv . __spliced . buildBuild or drv ) ( checkDependencyList " d e p s B u i l d B u i l d P r o p a g a t e d " depsBuildBuildPropagated ) )
( map ( drv : drv . nativeDrv or drv ) ( checkDependencyList " p r o p a g a t e d N a t i v e B u i l d I n p u t s " propagatedNativeBuildInputs ) )
( map ( drv : drv . __spliced . buildTarget or drv ) ( checkDependencyList " d e p s B u i l d T a r g e t P r o p a g a t e d " depsBuildTargetPropagated ) )
2021-08-22 07:53:02 +00:00
]
[
2022-05-18 14:49:53 +00:00
( map ( drv : drv . __spliced . hostHost or drv ) ( checkDependencyList " d e p s H o s t H o s t P r o p a g a t e d " depsHostHostPropagated ) )
( map ( drv : drv . crossDrv or drv ) ( checkDependencyList " p r o p a g a t e d B u i l d I n p u t s " propagatedBuildInputs ) )
2021-08-22 07:53:02 +00:00
]
[
2022-05-18 14:49:53 +00:00
( map ( drv : drv . __spliced . targetTarget or drv ) ( checkDependencyList " d e p s T a r g e t T a r g e t P r o p a g a t e d " depsTargetTargetPropagated ) )
2021-08-22 07:53:02 +00:00
]
] ;
computedSandboxProfile =
lib . concatMap ( input : input . __propagatedSandboxProfile or [ ] )
( stdenv . extraNativeBuildInputs
++ stdenv . extraBuildInputs
++ lib . concatLists dependencies ) ;
computedPropagatedSandboxProfile =
lib . concatMap ( input : input . __propagatedSandboxProfile or [ ] )
( lib . concatLists propagatedDependencies ) ;
computedImpureHostDeps =
lib . unique ( lib . concatMap ( input : input . __propagatedImpureHostDeps or [ ] )
( stdenv . extraNativeBuildInputs
++ stdenv . extraBuildInputs
++ lib . concatLists dependencies ) ) ;
computedPropagatedImpureHostDeps =
lib . unique ( lib . concatMap ( input : input . __propagatedImpureHostDeps or [ ] )
( lib . concatLists propagatedDependencies ) ) ;
derivationArg =
( removeAttrs attrs
[ " m e t a " " p a s s t h r u " " p o s "
" c h e c k I n p u t s " " i n s t a l l C h e c k I n p u t s "
" _ _ d a r w i n A l l o w L o c a l N e t w o r k i n g "
" _ _ i m p u r e H o s t D e p s " " _ _ p r o p a g a t e d I m p u r e H o s t D e p s "
" s a n d b o x P r o f i l e " " p r o p a g a t e d S a n d b o x P r o f i l e " ] )
// ( lib . optionalAttrs ( attrs ? name || ( attrs ? pname && attrs ? version ) ) {
name =
let
# Indicate the host platform of the derivation if cross compiling.
# Fixed-output derivations like source tarballs shouldn't get a host
# suffix. But we have some weird ones with run-time deps that are
# just used for their side-affects. Those might as well since the
# hash can't be the same. See #32986.
hostSuffix = lib . optionalString
( stdenv . hostPlatform != stdenv . buildPlatform && ! dontAddHostSuffix )
" - ${ stdenv . hostPlatform . config } " ;
# Disambiguate statically built packages. This was originally
# introduce as a means to prevent nix-env to get confused between
# nix and nixStatic. This should be also achieved by moving the
# hostSuffix before the version, so we could contemplate removing
# it again.
staticMarker = lib . optionalString stdenv . hostPlatform . isStatic " - s t a t i c " ;
in
2022-04-15 01:41:22 +00:00
lib . strings . sanitizeDerivationName (
2021-08-22 07:53:02 +00:00
if attrs ? name
then attrs . name + hostSuffix
2022-04-15 01:41:22 +00:00
else " ${ attrs . pname } ${ staticMarker } ${ hostSuffix } - ${ attrs . version } "
) ;
2021-08-22 07:53:02 +00:00
} ) // {
builder = attrs . realBuilder or stdenv . shell ;
args = attrs . args or [ " - e " ( attrs . builder or ./default-builder.sh ) ] ;
inherit stdenv ;
# The `system` attribute of a derivation has special meaning to Nix.
# Derivations set it to choose what sort of machine could be used to
# execute the build, The build platform entirely determines this,
# indeed more finely than Nix knows or cares about. The `system`
# attribute of `buildPlatfom` matches Nix's degree of specificity.
# exactly.
inherit ( stdenv . buildPlatform ) system ;
userHook = config . stdenv . userHook or null ;
__ignoreNulls = true ;
inherit strictDeps ;
depsBuildBuild = lib . elemAt ( lib . elemAt dependencies 0 ) 0 ;
nativeBuildInputs = lib . elemAt ( lib . elemAt dependencies 0 ) 1 ;
depsBuildTarget = lib . elemAt ( lib . elemAt dependencies 0 ) 2 ;
depsHostHost = lib . elemAt ( lib . elemAt dependencies 1 ) 0 ;
buildInputs = lib . elemAt ( lib . elemAt dependencies 1 ) 1 ;
depsTargetTarget = lib . elemAt ( lib . elemAt dependencies 2 ) 0 ;
depsBuildBuildPropagated = lib . elemAt ( lib . elemAt propagatedDependencies 0 ) 0 ;
propagatedNativeBuildInputs = lib . elemAt ( lib . elemAt propagatedDependencies 0 ) 1 ;
depsBuildTargetPropagated = lib . elemAt ( lib . elemAt propagatedDependencies 0 ) 2 ;
depsHostHostPropagated = lib . elemAt ( lib . elemAt propagatedDependencies 1 ) 0 ;
propagatedBuildInputs = lib . elemAt ( lib . elemAt propagatedDependencies 1 ) 1 ;
depsTargetTargetPropagated = lib . elemAt ( lib . elemAt propagatedDependencies 2 ) 0 ;
# This parameter is sometimes a string, sometimes null, and sometimes a list, yuck
configureFlags = let inherit ( lib ) optional elem ; in
2022-06-16 17:23:12 +00:00
( /* */ if lib . isString configureFlags then lib . warn " S t r i n g ' c o n f i g u r e F l a g s ' i s d e p r e c a t e d a n d w i l l b e r e m o v e d i n r e l e a s e 2 3 . 0 5 . P l e a s e u s e a l i s t o f s t r i n g s . D e r i v a t i o n n a m e : ${ derivationArg . name } , f i l e : ${ pos . file or " u n k n o w n f i l e " } " [ configureFlags ]
else if configureFlags == null then lib . warn " N u l l ' c o n f i g u r e F l a g s ' i s d e p r e c a t e d a n d w i l l b e r e m o v e d i n r e l e a s e 2 3 . 0 5 . P l e a s e u s e a e m p t y l i s t i n s t e a d ' [ ] ' . D e r i v a t i o n n a m e : ${ derivationArg . name } , f i l e : ${ pos . file or " u n k n o w n f i l e " } " [ ]
2021-08-22 07:53:02 +00:00
else configureFlags )
++ optional ( elem " b u i l d " configurePlatforms ) " - - b u i l d = ${ stdenv . buildPlatform . config } "
++ optional ( elem " h o s t " configurePlatforms ) " - - h o s t = ${ stdenv . hostPlatform . config } "
++ optional ( elem " t a r g e t " configurePlatforms ) " - - t a r g e t = ${ stdenv . targetPlatform . config } " ;
2022-08-12 12:06:08 +00:00
cmakeFlags =
let
explicitFlags =
if lib . isString cmakeFlags then lib . warn
" S t r i n g ' c m a k e F l a g s ' i s d e p r e c a t e d a n d w i l l b e r e m o v e d i n r e l e a s e 2 3 . 0 5 . P l e a s e u s e a l i s t o f s t r i n g s . D e r i v a t i o n n a m e : ${ derivationArg . name } , f i l e : ${ pos . file or " u n k n o w n f i l e " } "
[ cmakeFlags ]
else if cmakeFlags == null then
lib . warn
" N u l l ' c m a k e F l a g s ' i s d e p r e c a t e d a n d w i l l b e r e m o v e d i n r e l e a s e 2 3 . 0 5 . P l e a s e u s e a e m p t y l i s t i n s t e a d ' [ ] ' . D e r i v a t i o n n a m e : ${ derivationArg . name } , f i l e : ${ pos . file or " u n k n o w n f i l e " } "
[ ]
else
cmakeFlags ;
crossFlags = [
" - D C M A K E _ S Y S T E M _ N A M E = ${ lib . findFirst lib . isString " G e n e r i c " ( lib . optional ( ! stdenv . hostPlatform . isRedox ) stdenv . hostPlatform . uname . system ) } "
] ++ lib . optionals ( stdenv . hostPlatform . uname . processor != null ) [
" - D C M A K E _ S Y S T E M _ P R O C E S S O R = ${ stdenv . hostPlatform . uname . processor } "
] ++ lib . optionals ( stdenv . hostPlatform . uname . release != null ) [
" - D C M A K E _ S Y S T E M _ V E R S I O N = ${ stdenv . hostPlatform . uname . release } "
] ++ lib . optionals ( stdenv . hostPlatform . isDarwin ) [
" - D C M A K E _ O S X _ A R C H I T E C T U R E S = ${ stdenv . hostPlatform . darwinArch } "
] ++ lib . optionals ( stdenv . buildPlatform . uname . system != null ) [
" - D C M A K E _ H O S T _ S Y S T E M _ N A M E = ${ stdenv . buildPlatform . uname . system } "
] ++ lib . optionals ( stdenv . buildPlatform . uname . processor != null ) [
" - D C M A K E _ H O S T _ S Y S T E M _ P R O C E S S O R = ${ stdenv . buildPlatform . uname . processor } "
] ++ lib . optionals ( stdenv . buildPlatform . uname . release != null ) [
" - D C M A K E _ H O S T _ S Y S T E M _ V E R S I O N = ${ stdenv . buildPlatform . uname . release } "
] ;
in
explicitFlags ++ lib . optionals ( stdenv . hostPlatform != stdenv . buildPlatform ) crossFlags ;
mesonFlags =
let
explicitFlags =
if lib . isString mesonFlags then lib . warn
" S t r i n g ' m e s o n F l a g s ' i s d e p r e c a t e d a n d w i l l b e r e m o v e d i n r e l e a s e 2 3 . 0 5 . P l e a s e u s e a l i s t o f s t r i n g s . D e r i v a t i o n n a m e : ${ derivationArg . name } , f i l e : ${ pos . file or " u n k n o w n f i l e " } "
[ mesonFlags ]
else if mesonFlags == null then
lib . warn
" N u l l ' m e s o n F l a g s ' i s d e p r e c a t e d a n d w i l l b e r e m o v e d i n r e l e a s e 2 3 . 0 5 . P l e a s e u s e a e m p t y l i s t i n s t e a d ' [ ] ' . D e r i v a t i o n n a m e : ${ derivationArg . name } , f i l e : ${ pos . file or " u n k n o w n f i l e " } "
[ ]
else
mesonFlags ;
# See https://mesonbuild.com/Reference-tables.html#cpu-families
cpuFamily = platform : with platform ;
/* */ if isAarch32 then " a r m "
else if isAarch64 then " a a r c h 6 4 "
else if isx86_32 then " x 8 6 "
else if isx86_64 then " x 8 6 _ 6 4 "
else platform . parsed . cpu . family + builtins . toString platform . parsed . cpu . bits ;
crossFile = builtins . toFile " c r o s s - f i l e . c o n f " ''
[ properties ]
2022-08-21 13:32:41 +00:00
needs_exe_wrapper = $ { lib . boolToString ( ! stdenv . buildPlatform . canExecute stdenv . hostPlatform ) }
2022-08-12 12:06:08 +00:00
[ host_machine ]
system = ' $ { stdenv . targetPlatform . parsed . kernel . name } '
cpu_family = ' $ { cpuFamily stdenv . targetPlatform } '
cpu = ' $ { stdenv . targetPlatform . parsed . cpu . name } '
endian = $ { if stdenv . targetPlatform . isLittleEndian then " ' l i t t l e ' " else " ' b i g ' " }
[ binaries ]
llvm-config = ' llvm-config-native'
'' ;
crossFlags = lib . optionals ( stdenv . hostPlatform != stdenv . buildPlatform ) [ " - - c r o s s - f i l e = ${ crossFile } " ] ;
in crossFlags ++ explicitFlags ;
2021-08-22 07:53:02 +00:00
inherit patches ;
inherit doCheck doInstallCheck ;
inherit outputs ;
} // lib . optionalAttrs ( __contentAddressed ) {
inherit __contentAddressed ;
# Provide default values for outputHashMode and outputHashAlgo because
# most people won't care about these anyways
outputHashAlgo = attrs . outputHashAlgo or " s h a 2 5 6 " ;
outputHashMode = attrs . outputHashMode or " r e c u r s i v e " ;
2022-05-18 14:49:53 +00:00
} // lib . optionalAttrs ( enableParallelBuilding ) {
2021-08-22 07:53:02 +00:00
enableParallelChecking = attrs . enableParallelChecking or true ;
} // lib . optionalAttrs ( hardeningDisable != [ ] || hardeningEnable != [ ] || stdenv . hostPlatform . isMusl ) {
NIX_HARDENING_ENABLE = enabledHardeningOptions ;
} // lib . optionalAttrs ( stdenv . hostPlatform . isx86_64 && stdenv . hostPlatform ? gcc . arch ) {
requiredSystemFeatures = attrs . requiredSystemFeatures or [ ] ++ [ " g c c a r c h - ${ stdenv . hostPlatform . gcc . arch } " ] ;
} // lib . optionalAttrs ( stdenv . buildPlatform . isDarwin ) {
inherit __darwinAllowLocalNetworking ;
# TODO: remove lib.unique once nix has a list canonicalization primitive
__sandboxProfile =
let profiles = [ stdenv . extraSandboxProfile ] ++ computedSandboxProfile ++ computedPropagatedSandboxProfile ++ [ propagatedSandboxProfile sandboxProfile ] ;
final = lib . concatStringsSep " \n " ( lib . filter ( x : x != " " ) ( lib . unique profiles ) ) ;
in final ;
__propagatedSandboxProfile = lib . unique ( computedPropagatedSandboxProfile ++ [ propagatedSandboxProfile ] ) ;
__impureHostDeps = computedImpureHostDeps ++ computedPropagatedImpureHostDeps ++ __propagatedImpureHostDeps ++ __impureHostDeps ++ stdenv . __extraImpureHostDeps ++ [
" / d e v / z e r o "
" / d e v / r a n d o m "
" / d e v / u r a n d o m "
" / b i n / s h "
] ;
__propagatedImpureHostDeps = computedPropagatedImpureHostDeps ++ __propagatedImpureHostDeps ;
} ;
validity = checkMeta { inherit meta attrs ; } ;
# The meta attribute is passed in the resulting attribute set,
# but it's not part of the actual derivation, i.e., it's not
# passed to the builder and is not a dependency. But since we
# include it in the result, it *is* available to nix-env for queries.
meta = {
2022-04-15 01:41:22 +00:00
# `name` above includes cross-compilation cruft,
# is under assert, and is sanitized.
# Let's have a clean always accessible version here.
2021-08-22 07:53:02 +00:00
name = attrs . name or " ${ attrs . pname } - ${ attrs . version } " ;
# If the packager hasn't specified `outputsToInstall`, choose a default,
# which is the name of `p.bin or p.out or p` along with `p.man` when
# present.
#
# If the packager has specified it, it will be overridden below in
# `// meta`.
#
# Note: This default probably shouldn't be globally configurable.
# Services and users should specify outputs explicitly,
# unless they are comfortable with this default.
outputsToInstall =
let
hasOutput = out : builtins . elem out outputs ;
in [ ( lib . findFirst hasOutput null ( [ " b i n " " o u t " ] ++ outputs ) ) ]
++ lib . optional ( hasOutput " m a n " ) " m a n " ;
}
// attrs . meta or { }
# Fill `meta.position` to identify the source location of the package.
// lib . optionalAttrs ( pos != null ) {
position = pos . file + " : " + toString pos . line ;
} // {
# Expose the result of the checks for everyone to see.
inherit ( validity ) unfree broken unsupported insecure ;
2022-04-27 09:35:20 +00:00
available = validity . valid != " n o "
2021-08-22 07:53:02 +00:00
&& ( if config . checkMetaRecursively or false
then lib . all ( d : d . meta . available or true ) references
else true ) ;
} ;
in
lib . extendDerivation
validity . handled
( {
# A derivation that always builds successfully and whose runtime
# dependencies are the original derivations build time dependencies
# This allows easy building and distributing of all derivations
# needed to enter a nix-shell with
# nix-build shell.nix -A inputDerivation
inputDerivation = derivation ( derivationArg // {
# Add a name in case the original drv didn't have one
name = derivationArg . name or " i n p u t D e r i v a t i o n " ;
# This always only has one output
outputs = [ " o u t " ] ;
# Propagate the original builder and arguments, since we override
# them and they might contain references to build inputs
_derivation_original_builder = derivationArg . builder ;
_derivation_original_args = derivationArg . args ;
builder = stdenv . shell ;
# The bash builtin `export` dumps all current environment variables,
# which is where all build input references end up (e.g. $PATH for
# binaries). By writing this to $out, Nix can find and register
# them as runtime dependencies (since Nix greps for store paths
# through $out to find them)
args = [ " - c " " e x p o r t > $ o u t " ] ;
} ) ;
2022-04-27 09:35:20 +00:00
inherit meta passthru overrideAttrs ;
2021-08-22 07:53:02 +00:00
} //
# Pass through extra attributes that are not inputs, but
# should be made available to Nix expressions using the
# derivation (e.g., in assertions).
passthru )
2022-06-16 17:23:12 +00:00
( derivation derivationArg ) ;
2022-04-27 09:35:20 +00:00
2022-06-16 17:23:12 +00:00
in
fnOrAttrs :
if builtins . isFunction fnOrAttrs
then makeDerivationExtensible fnOrAttrs
else makeDerivationExtensibleConst fnOrAttrs