spack/var/spack/repos/builtin/packages/icu4c/package.py
John W. Parent 182bc87fe1
Windows: Port icu4c; define cxx std flags for MSVC (#45547)
* Adds an MSBuild system + Builder to the icu4c package
* Adds custom install method as MSBuild system does not vendor an
  install target
* The cxxstd variant is not supported on Windows (there are no config
  options you use to tell the build system what cxx standard to
  build against), so the variant definition was updated to occur
  everywhere except Windows

Also, this commit defines the c/cxx..._flag properties of the MSVC
compiler (although they are not used by `icu4c` and not strictly
necessary to bundle with this PR).
2024-08-21 16:08:57 -06:00

135 lines
5.2 KiB
Python

# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import pathlib
from spack.package import *
class Icu4c(AutotoolsPackage, MSBuildPackage):
"""ICU is a mature, widely used set of C/C++ and Java libraries providing
Unicode and Globalization support for software applications. ICU4C is the
C/C++ interface."""
homepage = "http://site.icu-project.org/"
url = "https://github.com/unicode-org/icu/releases/download/release-65-1/icu4c-65_1-src.tgz"
license("Unicode-TOU")
version("74.2", sha256="68db082212a96d6f53e35d60f47d38b962e9f9d207a74cfac78029ae8ff5e08c")
version("67.1", sha256="94a80cd6f251a53bd2a997f6f1b5ac6653fe791dfab66e1eb0227740fb86d5dc")
version("66.1", sha256="52a3f2209ab95559c1cf0a14f24338001f389615bf00e2585ef3dbc43ecf0a2e")
version("65.1", sha256="53e37466b3d6d6d01ead029e3567d873a43a5d1c668ed2278e253b683136d948")
version("64.1", sha256="92f1b7b9d51b396679c17f35a2112423361b8da3c1b9de00aa94fd768ae296e6")
version("60.3", sha256="476287b17db6e0b7da230dce4b58e8e5669b1510847f82cab3647920f1374390")
version("60.1", sha256="f8f5a6c8fbf32c015a467972bdb1477dc5f5d5dfea908b6ed218715eeb5ee225")
version("58.3", sha256="2680f3c547cd26cba1d7ebd819cd336ff92cf444a270e195fd3b10bfdf22276c")
version("58.2", sha256="2b0a4410153a9b20de0e20c7d8b66049a72aef244b53683d0d7521371683da0c")
version("57.2", sha256="623f04b921827a041f42d52495a6f8eee6565a9b7557051ac68e099123ff28dc")
version("57.1", sha256="ff8c67cb65949b1e7808f2359f2b80f722697048e90e7cfc382ec1fe229e9581")
depends_on("c", type="build") # generated
depends_on("cxx", type="build") # generated
build_system("autotools", "msbuild", default="autotools")
for plat in ["linux", "darwin", "freebsd"]:
with when(f"platform={plat}"):
variant(
"cxxstd",
default="11",
values=("11", "14", "17"),
multi=False,
description="Use the specified C++ standard when building",
)
depends_on("python", type="build", when="@64.1:")
with when("build_system=autotools"):
depends_on("autoconf", type="build")
depends_on("automake", type="build")
depends_on("libtool", type="build")
conflicts(
"%intel@:16",
when="@60.1:",
msg="Intel compilers have immature C++11 and multibyte support",
)
conflicts("%gcc@:4", when="@67.1:", msg="Older GCC compilers have immature C++11 support")
patch(
"https://github.com/unicode-org/icu/commit/ddfc30860354cbcb78c2c0bcf800be5ab44a9e4f.patch?full_index=1",
sha256="6be0b8068b0f5047dad7f4f6f655529304f1abbc551c93223c6f41dafc1e8acc",
level=2,
when="@58.0:59",
)
def url_for_version(self, version):
url = "https://github.com/unicode-org/icu/releases/download/release-{0}/icu4c-{1}-src.tgz"
return url.format(version.dashed, version.underscored)
def flag_handler(self, name, flags):
if name == "cxxflags":
# Control of the C++ Standard is via adding the required "-std"
# flag to CXXFLAGS in env
flags.append(getattr(self.compiler, f"cxx{self.spec.variants['cxxstd'].value}_flag"))
return (None, flags, None)
class BuildEnvironment:
# Need to make sure that locale is UTF-8 in order to process source
# files in UTF-8.
@when("@59:")
def setup_build_environment(self, env):
env.set("LC_ALL", "en_US.UTF-8")
class AutotoolsBuilder(spack.build_systems.autotools.AutotoolsBuilder, BuildEnvironment):
configure_directory = "source"
def configure_args(self):
args = []
if self.spec.satisfies("^python"):
# Make sure configure uses Spack's python package
# Without this, configure could pick a broken global installation
args.append(f"PYTHON={self.spec['python'].command}")
# The --enable-rpath option is only needed on MacOS, and it
# breaks the build for xerces-c on Linux.
if self.spec.satisfies("platform=darwin"):
args.append("--enable-rpath")
return args
class MSBuildBuilder(spack.build_systems.msbuild.MSBuildBuilder, BuildEnvironment):
def msbuild_args(self):
return [
"allinone.sln",
self.define("OutputPath", self.spec.prefix),
self.define("Configuration", "Release"),
self.define("SkipUWP", "true"),
]
@property
def build_directory(self):
solution_path = pathlib.Path(self.pkg.stage.source_path)
if self.spec.satsifies("@:67"):
solution_path = solution_path / "icu"
solution_path = solution_path / "source" / "allinone"
return str(solution_path)
def install(self, pkg, spec, prefix):
mkdirp(prefix.lib)
mkdirp(prefix.bin)
mkdirp(prefix.include)
with working_dir(self.pkg.stage.source_path):
# install bin
install_tree("bin64", prefix.bin)
# install lib
install_tree("lib64", prefix.lib)
# intstall headers
install_tree("include", prefix.include)