summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn W. Parent <45471568+johnwparent@users.noreply.github.com>2023-01-12 13:23:57 -0500
committerGitHub <noreply@github.com>2023-01-12 10:23:57 -0800
commita1c840b3e853b99b13a4c6a00eed758cb0e84b04 (patch)
treebfa0ef29457841e9d9bacddabb6e75e11b917885
parent57e9e77475da0e030e66feefe1b37fa96e5952cc (diff)
downloadspack-a1c840b3e853b99b13a4c6a00eed758cb0e84b04.tar.gz
spack-a1c840b3e853b99b13a4c6a00eed758cb0e84b04.tar.bz2
spack-a1c840b3e853b99b13a4c6a00eed758cb0e84b04.tar.xz
spack-a1c840b3e853b99b13a4c6a00eed758cb0e84b04.zip
cURL package: add support for building on Windows (#30169)
-rw-r--r--var/spack/repos/builtin/packages/curl/package.py86
1 files changed, 78 insertions, 8 deletions
diff --git a/var/spack/repos/builtin/packages/curl/package.py b/var/spack/repos/builtin/packages/curl/package.py
index 26be294245..83b7d8e4ad 100644
--- a/var/spack/repos/builtin/packages/curl/package.py
+++ b/var/spack/repos/builtin/packages/curl/package.py
@@ -3,13 +3,17 @@
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+import glob
+import os
import re
import sys
+from spack.build_systems.autotools import AutotoolsBuilder
+from spack.build_systems.nmake import NMakeBuilder
from spack.package import *
-class Curl(AutotoolsPackage):
+class Curl(NMakePackage, AutotoolsPackage):
"""cURL is an open source command line tool and library for
transferring data with URL syntax"""
@@ -60,6 +64,8 @@ class Curl(AutotoolsPackage):
default_tls = "openssl"
if sys.platform == "darwin":
default_tls = "secure_transport"
+ elif sys.platform == "win32":
+ default_tls = "sspi"
# TODO: add dependencies for other possible TLS backends
variant(
@@ -78,6 +84,7 @@ class Curl(AutotoolsPackage):
# 'schannel',
"secure_transport",
# 'wolfssl',
+ conditional("sspi", when="platform=windows"),
),
multi=True,
)
@@ -88,13 +95,17 @@ class Curl(AutotoolsPackage):
variant("librtmp", default=False, description="enable Rtmp support")
variant("ldap", default=False, description="enable ldap support")
variant("libidn2", default=False, description="enable libidn2 support")
- variant(
- "libs",
- default="shared,static",
- values=("shared", "static"),
- multi=True,
- description="Build shared libs, static libs or both",
- )
+ for plat in ["darwin", "cray", "linux"]:
+ with when("platform=%s" % plat):
+ variant(
+ "libs",
+ default="shared,static",
+ values=("shared", "static"),
+ multi=True,
+ description="Build shared libs, static libs or both",
+ )
+ # curl queries pkgconfig for openssl compilation flags
+ depends_on("pkgconfig", type="build")
conflicts("platform=cray", when="tls=secure_transport", msg="Only supported on macOS")
conflicts("platform=linux", when="tls=secure_transport", msg="Only supported on macOS")
@@ -117,6 +128,12 @@ class Curl(AutotoolsPackage):
# https://github.com/curl/curl/pull/9054
patch("easy-lock-sched-header.patch", when="@7.84.0")
+ build_system(
+ "autotools",
+ conditional("nmake", when="platform=windows"),
+ default="autotools",
+ )
+
@classmethod
def determine_version(cls, exe):
curl = Executable(exe)
@@ -150,6 +167,8 @@ class Curl(AutotoolsPackage):
def command(self):
return Executable(self.prefix.bin.join("curl-config"))
+
+class AutotoolsBuilder(AutotoolsBuilder):
def configure_args(self):
spec = self.spec
@@ -239,3 +258,54 @@ class Curl(AutotoolsPackage):
return "--with-darwinssl"
else:
return "--without-darwinssl"
+
+
+class NMakeBuilder(NMakeBuilder):
+ phases = ["install"]
+
+ def nmake_args(self):
+ args = []
+ mode = "dll" if "libs=dll" in self.spec else "static"
+ args.append("mode=%s" % mode)
+ args.append("WITH_ZLIB=%s" % mode)
+ args.append("ZLIB_PATH=%s" % self.spec["zlib"].prefix)
+ if "+libssh" in self.spec:
+ args.append("WITH_SSH=%s" % mode)
+ if "+libssh2" in self.spec:
+ args.append("WITH_SSH2=%s" % mode)
+ args.append("SSH2_PATH=%s" % self.spec["libssh2"].prefix)
+ if "+nghttp2" in self.spec:
+ args.append("WITH_NGHTTP2=%s" % mode)
+ args.append("NGHTTP2=%s" % self.spec["nghttp2"].prefix)
+ if "tls=openssl" in self.spec:
+ args.append("WITH_SSL=%s" % mode)
+ args.append("SSL_PATH=%s" % self.spec["openssl"].prefix)
+ elif "tls=mbedtls" in self.spec:
+ args.append("WITH_MBEDTLS=%s" % mode)
+ args.append("MBEDTLS_PATH=%s" % self.spec["mbedtls"].prefix)
+ elif "tls=sspi" in self.spec:
+ args.append("ENABLE_SSPI=%s" % mode)
+
+ # The trailing path seperator is REQUIRED for cURL to install
+ # otherwise cURLs build system will interpret the path as a file
+ # and the install will fail with ambiguous errors
+ args.append("WITH_PREFIX=%s" % self.prefix + "\\")
+ return args
+
+ def install(self, spec, prefix):
+ # Spack's env CC and CXX values will cause an error
+ # if there is a path in the space, and escaping with
+ # double quotes raises a syntax issues, instead
+ # cURLs nmake will automatically invoke proper cl.exe if
+ # no env value for CC, CXX is specified
+ # Unset the value to allow for cURLs heuristics (derive via VCVARS)
+ # to derive the proper compiler
+ env = os.environ
+ env["CC"] = ""
+ env["CXX"] = ""
+ winbuild_dir = os.path.join(self.stage.source_path, "winbuild")
+ with working_dir(winbuild_dir):
+ nmake("/f", "Makefile.vc", *self.nmake_args(), ignore_quotes=True)
+ with working_dir(os.path.join(self.stage.source_path, "builds")):
+ install_dir = glob.glob("libcurl-**")[0]
+ install_tree(install_dir, self.prefix)