@ -1,24 +1,19 @@
{ stdenv
, fetchurl
# Regarding static/shared libaries, the current behaviour is:
#
# - static=true, shared=true: builds both and moves .a to the .static output;
# in this case `pkg-config` auto detection will
# not work if the .static output is given as
# buildInputs to another package (#66461)
# - static=true, shared=false: builds .a only and leaves it in the main output
# - static=false, shared=true: builds shared only
#
# To get both `.a` and shared libraries in one output,
# you currently have to use
# static=false, shared=true
# and use
# .overrideAttrs (old: { dontDisableStatic = true; })
# This is because by default, upstream zlib ./configure builds both.
, static ? true
# Note: If `{ static = false; shared = false; }`, upstream's default is used
# (which is building both static and shared as of zlib 1.2.11).
, shared ? true
, static ? true
# If true, a separate .static ouput is created and the .a is moved there.
# In this case `pkg-config` will auto detection will currently not work if the
# .static output is given as `buildInputs` to another package (#66461), because
# the `.pc` file lists only the main output's lib dir.
# If false, and if `{ static = true; }`, the .a stays in the main output.
, splitStaticOutput ? static
} :
assert splitStaticOutput -> static ;
stdenv . mkDerivation ( rec {
name = " z l i b - ${ version } " ;
version = " 1 . 2 . 1 1 " ;
@ -41,14 +36,35 @@ stdenv.mkDerivation (rec {
'' ;
outputs = [ " o u t " " d e v " ]
++ stdenv . lib . optional ( shared && static ) " s t a t i c " ;
++ stdenv . lib . optional splitStaticOutput " s t a t i c " ;
setOutputFlags = false ;
outputDoc = " d e v " ; # single tiny man3 page
configureFlags = stdenv . lib . optional shared " - - s h a r e d "
++ stdenv . lib . optional ( static && ! shared ) " - - s t a t i c " ;
# For zlib's ./configure (as of verion 1.2.11), the order
# of --static/--shared flags matters!
# `--shared --static` builds only static libs, while
# `--static --shared` builds both.
# So we use the latter order to be able to build both.
# Also, giving just `--shared` builds both,
# giving just `--static` builds only static,
# and giving nothing builds both.
# So we have 3 possible ways to build both:
# `--static --shared`, `--shared` and giving nothing.
# Of these, we choose `--shared`, only because that's
# what we did in the past and we can avoid mass rebuilds this way.
# As a result, we pass `--static` only when we want just static.
configureFlags = stdenv . lib . optional ( static && ! shared ) " - - s t a t i c "
++ stdenv . lib . optional shared " - - s h a r e d " ;
# Note we don't need to set `dontDisableStatic`, because static-disabling
# works by grepping for `enable-static` in the `./configure` script
# (see `pkgs/stdenv/generic/setup.sh`), and zlib's handwritten one does
# not have such.
# It wouldn't hurt setting `dontDisableStatic = static && !splitStaticOutput`
# here (in case zlib ever switches to autoconf in the future),
# but we don't do it simply to avoid mass rebuilds.
postInstall = stdenv . lib . optionalString ( shared && static ) ''
postInstall = stdenv . lib . optionalString splitStaticOutput ''
moveToOutput lib/libz.a " $ s t a t i c "
''
# jww (2015-01-06): Sometimes this library install as a .so, even on
@ -69,6 +85,8 @@ stdenv.mkDerivation (rec {
# to the bootstrap-tools libgcc (as uses to happen on arm/mips)
NIX_CFLAGS_COMPILE = stdenv . lib . optionalString ( ! stdenv . hostPlatform . isDarwin ) " - s t a t i c - l i b g c c " ;
# We don't strip on static cross-compilation because of reports that native
# stripping corrupted the target library; see commit 12e960f5 for the report.
dontStrip = stdenv . hostPlatform != stdenv . buildPlatform && static ;
configurePlatforms = [ ] ;