{ stdenv, lib, fetchurl, pkg-config, perl , http2Support ? true, nghttp2 , idnSupport ? false, libidn ? null , ldapSupport ? false, openldap ? null , zlibSupport ? true, zlib ? null , sslSupport ? zlibSupport, openssl ? null , gnutlsSupport ? false, gnutls ? null , wolfsslSupport ? false, wolfssl ? null , scpSupport ? zlibSupport && !stdenv.isSunOS && !stdenv.isCygwin, libssh2 ? null , gssSupport ? with stdenv.hostPlatform; ( !isWindows && # disable gss becuase of: undefined reference to `k5_bcmp' # a very sad story re static: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=439039 !isStatic && # the "mig" tool does not configure its compiler correctly. This could be # fixed in mig, but losing gss support on cross compilation to darwin is # not worth the effort. !(isDarwin && (stdenv.buildPlatform != stdenv.hostPlatform)) ), libkrb5 ? null , c-aresSupport ? false, c-ares ? null , brotliSupport ? false, brotli ? null }: # Note: this package is used for bootstrapping fetchurl, and thus # cannot use fetchpatch! All mutable patches (generated by GitHub or # cgit) that are needed here should be included directly in Nixpkgs as # files. assert http2Support -> nghttp2 != null; assert idnSupport -> libidn != null; assert ldapSupport -> openldap != null; assert zlibSupport -> zlib != null; assert sslSupport -> openssl != null; assert !(gnutlsSupport && sslSupport); assert !(gnutlsSupport && wolfsslSupport); assert !(sslSupport && wolfsslSupport); assert gnutlsSupport -> gnutls != null; assert wolfsslSupport -> wolfssl != null; assert scpSupport -> libssh2 != null; assert c-aresSupport -> c-ares != null; assert brotliSupport -> brotli != null; assert gssSupport -> libkrb5 != null; stdenv.mkDerivation rec { pname = "curl"; version = "7.76.1"; src = fetchurl { urls = [ "https://curl.haxx.se/download/${pname}-${version}.tar.bz2" "https://github.com/curl/curl/releases/download/${lib.replaceStrings ["."] ["_"] pname}-${version}/${pname}-${version}.tar.bz2" ]; sha256 = "1scmfrp0c27pkd7yva9k50miprjpsyfbb33apx72qc9igm6ii3ks"; }; patches = [ ./CVE-2021-22897.patch ./CVE-2021-22898.patch ./CVE-2021-22901.patch ]; outputs = [ "bin" "dev" "out" "man" "devdoc" ]; separateDebugInfo = stdenv.isLinux; enableParallelBuilding = true; strictDeps = true; nativeBuildInputs = [ pkg-config perl ]; # Zlib and OpenSSL must be propagated because `libcurl.la' contains # "-lz -lssl", which aren't necessary direct build inputs of # applications that use Curl. propagatedBuildInputs = with lib; optional http2Support nghttp2 ++ optional idnSupport libidn ++ optional ldapSupport openldap ++ optional zlibSupport zlib ++ optional gssSupport libkrb5 ++ optional c-aresSupport c-ares ++ optional sslSupport openssl ++ optional gnutlsSupport gnutls ++ optional wolfsslSupport wolfssl ++ optional scpSupport libssh2 ++ optional brotliSupport brotli; # for the second line see https://curl.haxx.se/mail/tracker-2014-03/0087.html preConfigure = '' sed -e 's|/usr/bin|/no-such-path|g' -i.bak configure rm src/tool_hugehelp.c ''; configureFlags = [ # Disable default CA bundle, use NIX_SSL_CERT_FILE or fallback # to nss-cacert from the default profile. "--without-ca-bundle" "--without-ca-path" # The build fails when using wolfssl with --with-ca-fallback (lib.withFeature (!wolfsslSupport) "ca-fallback") "--disable-manual" (lib.withFeatureAs sslSupport "ssl" openssl.dev) (lib.withFeatureAs gnutlsSupport "gnutls" gnutls.dev) (lib.withFeatureAs scpSupport "libssh2" libssh2.dev) (lib.enableFeature ldapSupport "ldap") (lib.enableFeature ldapSupport "ldaps") (lib.withFeatureAs idnSupport "libidn" libidn.dev) (lib.withFeature brotliSupport "brotli") ] ++ lib.optional wolfsslSupport "--with-wolfssl=${wolfssl.dev}" ++ lib.optional c-aresSupport "--enable-ares=${c-ares}" ++ lib.optional gssSupport "--with-gssapi=${libkrb5.dev}" # For the 'urandom', maybe it should be a cross-system option ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) "--with-random=/dev/urandom" ++ lib.optionals stdenv.hostPlatform.isWindows [ "--disable-shared" "--enable-static" ]; CXX = "${stdenv.cc.targetPrefix}c++"; CXXCPP = "${stdenv.cc.targetPrefix}c++ -E"; doCheck = false; # expensive, fails postInstall = '' moveToOutput bin/curl-config "$dev" # Install completions make -C scripts install '' + lib.optionalString scpSupport '' sed '/^dependency_libs/s|${libssh2.dev}|${libssh2.out}|' -i "$out"/lib/*.la '' + lib.optionalString gnutlsSupport '' ln $out/lib/libcurl.so $out/lib/libcurl-gnutls.so ln $out/lib/libcurl.so $out/lib/libcurl-gnutls.so.4 ln $out/lib/libcurl.so $out/lib/libcurl-gnutls.so.4.4.0 ''; passthru = { inherit sslSupport openssl; }; meta = with lib; { description = "A command line tool for transferring files with URL syntax"; homepage = "https://curl.haxx.se/"; license = licenses.curl; maintainers = with maintainers; [ lovek323 ]; platforms = platforms.all; # Fails to link against static brotli or gss broken = stdenv.hostPlatform.isStatic && (brotliSupport || gssSupport); }; }