···
let inherit (lib) nv nvs; in
+
# composableDerivation basically mixes these features:
+
# - provides shortcuts for "options" such as "--enable-foo" and adding
+
# buildInputs, see php example
+
# It predates styles which are common today, such as
+
# * mkDerivation.override feature
+
# * overrideDerivation (lib/customization.nix)
+
# Some of the most more important usage examples (which could be rewritten if it was important):
+
# A minimal example illustrating most features would look like this:
+
# let base = composableDerivation { (fixed : let inherit (fixed.fixed) name in {
+
# preConfigre = "echo ${name}";
+
# # attention, "name" attr is missing, thus you cannot instantiate "base".
+
# # These all add name attribute, thus you can instantiate those:
+
# v1 = base.merge ({ name = "foo-add-B"; buildInputs = [B]; }); // B gets merged into buildInputs
+
# v2 = base.merge ({ name = "mix-in-pre-configure-lines" preConfigre = ""; });
+
# v3 = base.replace ({ name = "foo-no-A-only-B;" buildInputs = [B]; });
+
# So yes, you can think about it being something like nixos modules, and
+
# you'd be merging "features" in one at a time using .merge or .replace
+
# Thanks Shea for telling me that I rethink the documentation ..
+
# * its complicated to understand
+
# * some "features" such as exact merge behaviour are burried in mergeAttrBy
+
# and defaultOverridableDelayableArgs assuming the default behaviour does
+
# the right thing in the common case
+
# * Eelco once said using such fix style functions are slow to evaluate
+
# * Too quick & dirty. Hard to understand for others. The benefit was that
+
# you were able to create a kernel builder like base derivation and replace
+
# / add patches the way you want without having to declare function arguments
+
# declaring "optional featuers" is modular. For instance:
+
# configureFlags = ["--with-curl=${curl}" "--with-curlwrappers"];
+
# buildInputs = [curl openssl];
+
# (Example taken from PHP)
+
# alternative styles / related features:
+
# * Eg see function supporting building the kernel
+
# * versionedDerivation (discussion about this is still going on - or ended)
+
# * mkDerivation.override
+
# * using { .., *Support ? false }: like configurable options.
+
# To find those examples use grep
+
# To sum up: It exists for historical reasons - and for most commonly used
+
# tasks the alternatives should be used
+
# If you have questions about this code ping Marc Weber.
mkDerivation ? pkgs.stdenv.mkDerivation,