summaryrefslogtreecommitdiffstats
path: root/pkgs/development/libraries/libxml2/common.nix
blob: 6fbae9218df3ed5550c4a8f001003cb455d7bc56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
{
  stdenv,
  darwin,
  lib,
  pkg-config,
  autoreconfHook,
  python3,
  doxygen,
  ncurses,
  findXMLCatalogs,
  libiconv,
  pythonSupport ? false,
  icuSupport ? false,
  icu,
  zlibSupport ? false,
  zlib,
  enableShared ? !stdenv.hostPlatform.isMinGW && !stdenv.hostPlatform.isStatic,
  enableStatic ? !enableShared,
  gnome,
  testers,
  enableHttp ? false,

  version,
  extraPatches ? [ ],
  src,
  extraMeta ? { },
  freezeUpdateScript ? false,
}:

let
  # libxml2 is a dependency of xcbuild. Avoid an infinite recursion by using a bootstrap stdenv
  # that does not propagate xcrun.
  stdenv' = if stdenv.hostPlatform.isDarwin then darwin.bootstrapStdenv else stdenv;
in
stdenv'.mkDerivation (finalAttrs: {
  inherit
    version
    src
    ;

  pname = "libxml2";

  outputs = [
    "bin"
    "dev"
    "out"
  ]
  ++ lib.optional pythonSupport "py"
  ++ lib.optional (enableStatic && enableShared) "static";
  outputMan = "bin";

  patches = [ ] ++ extraPatches;

  strictDeps = true;

  nativeBuildInputs = [
    pkg-config
    autoreconfHook
  ]
  ++ lib.optionals pythonSupport [
    doxygen
  ];

  buildInputs =
    lib.optionals pythonSupport [
      ncurses
      python3
    ]
    ++ lib.optionals zlibSupport [
      zlib
    ];

  propagatedBuildInputs = [
    findXMLCatalogs
  ]
  ++
    lib.optionals
      (stdenv.hostPlatform.isDarwin || stdenv.hostPlatform.isMinGW || stdenv.hostPlatform.isCygwin)
      [
        libiconv
      ]
  ++ lib.optionals icuSupport [
    icu
  ];

  configureFlags = [
    "--exec-prefix=${placeholder "dev"}"
    (lib.enableFeature enableStatic "static")
    (lib.enableFeature enableShared "shared")
    (lib.withFeature icuSupport "icu")
    (lib.withFeature pythonSupport "python")
    (lib.optionalString pythonSupport "PYTHON=${python3.pythonOnBuildForHost.interpreter}")
    (lib.withFeature enableHttp "http")
    (lib.withFeature zlibSupport "zlib")
    (lib.withFeature false "docs") # docs are built with xsltproc, which would be a cyclic dependency
  ];

  installFlags = lib.optionals pythonSupport [
    "pythondir=\"${placeholder "py"}/${python3.sitePackages}\""
    "pyexecdir=\"${placeholder "py"}/${python3.sitePackages}\""
  ];

  enableParallelBuilding = true;

  doCheck = (stdenv.hostPlatform == stdenv.buildPlatform) && stdenv.hostPlatform.libc != "musl";
  preCheck =
    lib.optional stdenv.hostPlatform.isDarwin ''
      export DYLD_LIBRARY_PATH="$PWD/.libs:$DYLD_LIBRARY_PATH"
    ''
    # cyg prefix doesn't work for python modules
    ++ lib.optional (stdenv.hostPlatform.isCygwin && pythonSupport) ''
      ln -s cygxml2mod.dll python/.libs/libxml2mod.dll
    '';

  preConfigure = lib.optionalString (lib.versionAtLeast stdenv.hostPlatform.darwinMinVersion "11") ''
    MACOSX_DEPLOYMENT_TARGET=10.16
  '';

  preInstall = lib.optionalString pythonSupport ''
    substituteInPlace python/libxml2mod.la --replace-fail "$dev/${python3.sitePackages}" "$py/${python3.sitePackages}"
  '';

  postFixup = ''
    moveToOutput bin/xml2-config "$dev"
    moveToOutput lib/xml2Conf.sh "$dev"
  ''
  + lib.optionalString (enableStatic && enableShared) ''
    moveToOutput lib/libxml2.a "$static"
  ''
  # cyg prefix doesn't work for python modules
  + lib.optionalString (stdenv.hostPlatform.isCygwin && pythonSupport) ''
    for packages in "$py"/lib/python*/site-packages; do
      ln -s cygxml2mod.dll "$packages"/libxml2mod.dll
    done
  '';

  passthru = {
    inherit pythonSupport;

    updateScript = gnome.updateScript {
      packageName = "libxml2";
      versionPolicy = "none";
      freeze = freezeUpdateScript;
    };
    tests = {
      pkg-config = testers.hasPkgConfigModules {
        package = finalAttrs.finalPackage;
      };
      cmake-config = testers.hasCmakeConfigModules {
        moduleNames = [ "LibXml2" ];
        package = finalAttrs.finalPackage;
      };
    };
  };

  __structuredAttrs = true;

  meta = {
    homepage = "https://gitlab.gnome.org/GNOME/libxml2";
    description = "XML parsing library for C";
    license = lib.licenses.mit;
    platforms = lib.platforms.all;
    pkgConfigModules = [ "libxml-2.0" ];
    identifiers.cpeParts = lib.meta.cpeFullVersionWithVendor "xmlsoft" finalAttrs.version;
    # Python limits cross-compilation to an allowlist of host OSes.
    # https://github.com/python/cpython/blob/dfad678d7024ab86d265d84ed45999e031a03691/configure.ac#L534-L562
    broken =
      pythonSupport
      && !(
        enableShared
        && (
          stdenv.hostPlatform == stdenv.buildPlatform
          || stdenv.hostPlatform.isCygwin
          || stdenv.hostPlatform.isLinux
          || stdenv.hostPlatform.isWasi
        )
      );
  }
  // extraMeta;
})