libxml2: enable build on Windows (#36261)

Add Nmake-based builder for Windows
This commit is contained in:
John W. Parent 2023-03-21 23:33:22 -04:00 committed by GitHub
parent f49e9591b7
commit 97bdf28b29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2,13 +2,16 @@
# Spack Project Developers. See the top-level COPYRIGHT file for details. # Spack Project Developers. See the top-level COPYRIGHT file for details.
# #
# SPDX-License-Identifier: (Apache-2.0 OR MIT) # SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
import llnl.util.filesystem as fs import llnl.util.filesystem as fs
import llnl.util.tty as tty import llnl.util.tty as tty
from spack.build_systems import autotools, nmake
from spack.package import * from spack.package import *
class Libxml2(AutotoolsPackage): class Libxml2(AutotoolsPackage, NMakePackage):
"""Libxml2 is the XML C parser and toolkit developed for the Gnome """Libxml2 is the XML C parser and toolkit developed for the Gnome
project (but usable outside of the Gnome platform), it is free project (but usable outside of the Gnome platform), it is free
software available under the MIT License.""" software available under the MIT License."""
@ -39,8 +42,10 @@ def url_for_version(self, version):
variant("python", default=False, description="Enable Python support") variant("python", default=False, description="Enable Python support")
depends_on("pkgconfig@0.9.0:", type="build") depends_on("pkgconfig@0.9.0:", type="build", when="build_system=autotools")
depends_on("iconv") # conditional on non Windows, but rather than specify for each platform
# specify for non Windows builder, which has equivalent effect
depends_on("iconv", when="build_system=autotools")
depends_on("zlib") depends_on("zlib")
depends_on("xz") depends_on("xz")
@ -70,6 +75,7 @@ def url_for_version(self, version):
sha256="3e06d42596b105839648070a5921157fe284b932289ffdbfa304ddc3457e5637", sha256="3e06d42596b105839648070a5921157fe284b932289ffdbfa304ddc3457e5637",
when="@2.9.11:2.9.14", when="@2.9.11:2.9.14",
) )
build_system(conditional("nmake", when="platform=windows"), "autotools", default="autotools")
@property @property
def command(self): def command(self):
@ -82,26 +88,6 @@ def headers(self):
hl.directories = [include_dir, self.spec.prefix.include] hl.directories = [include_dir, self.spec.prefix.include]
return hl return hl
def configure_args(self):
spec = self.spec
args = [
"--with-lzma={0}".format(spec["xz"].prefix),
"--with-iconv={0}".format(spec["iconv"].prefix),
]
if "+python" in spec:
args.extend(
[
"--with-python={0}".format(spec["python"].home),
"--with-python-install-dir={0}".format(python_platlib),
]
)
else:
args.append("--without-python")
return args
def patch(self): def patch(self):
# Remove flags not recognized by the NVIDIA compiler # Remove flags not recognized by the NVIDIA compiler
if self.spec.satisfies("%nvhpc"): if self.spec.satisfies("%nvhpc"):
@ -115,13 +101,6 @@ def patch(self):
) )
filter_file("-Wno-long-long -Wno-format-extra-args", "", "configure") filter_file("-Wno-long-long -Wno-format-extra-args", "", "configure")
@run_after("install")
@on_package_attributes(run_tests=True)
def import_module_test(self):
if "+python" in self.spec:
with working_dir("spack-test", create=True):
python("-c", "import libxml2")
def test(self): def test(self):
"""Perform smoke tests on the installed package""" """Perform smoke tests on the installed package"""
# Start with what we already have post-install # Start with what we already have post-install
@ -157,3 +136,61 @@ def test(self):
# Perform some cleanup # Perform some cleanup
fs.force_remove(test_filename) fs.force_remove(test_filename)
class RunAfter(object):
@run_after("install")
@on_package_attributes(run_tests=True)
def import_module_test(self):
if "+python" in self.spec:
with working_dir("spack-test", create=True):
python("-c", "import libxml2")
class AutotoolsBuilder(autotools.AutotoolsBuilder, RunAfter):
def configure_args(self):
spec = self.spec
args = [
"--with-lzma={0}".format(spec["xz"].prefix),
"--with-iconv={0}".format(spec["iconv"].prefix),
]
if "+python" in spec:
args.extend(
[
"--with-python={0}".format(spec["python"].home),
"--with-python-install-dir={0}".format(python_platlib),
]
)
else:
args.append("--without-python")
return args
class NMakeBuilder(nmake.NMakeBuilder, RunAfter):
phases = ("configure", "build", "install")
@property
def makefile_name(self):
return "Makefile.msvc"
@property
def build_directory(self):
return os.path.join(self.stage.source_path, "win32")
def configure(self, pkg, spec, prefix):
with working_dir(self.build_directory):
opts = [
"prefix=%s" % prefix,
"compiler=msvc",
"iconv=no",
"zlib=yes",
"lzma=yes",
"lib=%s" % ";".join((spec["zlib"].prefix.lib, spec["xz"].prefix.lib)),
"include=%s" % ";".join((spec["zlib"].prefix.include, spec["xz"].prefix.include)),
]
if "+python" in spec:
opts.append("python=yes")
cscript("configure.js", *opts)