Source code for spack.archspec
# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
"""Adapter for the archspec library."""
import spack.vendor.archspec.cpu
import spack.spec
[docs]
def microarchitecture_flags(spec: spack.spec.Spec, language: str) -> str:
"""Get compiler flags for the spec's microarchitecture.
Args:
spec: The spec defining the target microarchitecture and compiler.
language: The language (``"c"``, ``"cxx"``, ``"fortran"``) used to select the appropriate
compiler from the spec.
Example::
>>> spec.format("{target}")
'm1'
>>> spec["c"].format("{name}{@version}")
'apple-clang@17.0.0'
>>> microarchitecture_flags(spec, language="c")
'-mcpu=apple-m1'
"""
target = spec.target
if not spec.has_virtual_dependency(language):
raise ValueError(f"The spec {spec.name} does not depend on {language}")
elif target is None:
raise ValueError(f"The spec {spec.name} does not have a target defined")
compiler = spec.dependencies(virtuals=language)[0]
return microarchitecture_flags_from_target(target, compiler)
[docs]
def microarchitecture_flags_from_target(
target: spack.vendor.archspec.cpu.Microarchitecture, compiler: spack.spec.Spec
) -> str:
"""Get compiler flags for the spec's microarchitecture. Similar to
:func:`microarchitecture_flags`, but takes a ``target`` and ``compiler`` directly instead of a
spec.
Args:
target: The target microarchitecture.
compiler: The spec defining the compiler.
"""
# Try to check if the current compiler comes with a version number or has an unexpected suffix.
# If so, treat it as a compiler with a custom spec.
version_number, _ = spack.vendor.archspec.cpu.version_components(
compiler.version.dotted_numeric_string
)
try:
return target.optimization_flags(compiler.package.archspec_name(), version_number)
except ValueError:
return ""
#: The host target family, like x86_64 or aarch64
HOST_TARGET_FAMILY = spack.vendor.archspec.cpu.host().family