CargoPackage: add new build system for Cargo packages (#41192)
Co-authored-by: Tom Scogland <scogland1@llnl.gov>
This commit is contained in:
		
							
								
								
									
										89
									
								
								lib/spack/spack/build_systems/cargo.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								lib/spack/spack/build_systems/cargo.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
# Copyright 2013-2023 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 inspect
 | 
			
		||||
 | 
			
		||||
import llnl.util.filesystem as fs
 | 
			
		||||
 | 
			
		||||
import spack.builder
 | 
			
		||||
import spack.package_base
 | 
			
		||||
from spack.directives import build_system, depends_on
 | 
			
		||||
from spack.multimethod import when
 | 
			
		||||
 | 
			
		||||
from ._checks import BaseBuilder, execute_install_time_tests
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CargoPackage(spack.package_base.PackageBase):
 | 
			
		||||
    """Specialized class for packages built using a Makefiles."""
 | 
			
		||||
 | 
			
		||||
    #: This attribute is used in UI queries that need to know the build
 | 
			
		||||
    #: system base class
 | 
			
		||||
    build_system_class = "CargoPackage"
 | 
			
		||||
 | 
			
		||||
    build_system("cargo")
 | 
			
		||||
 | 
			
		||||
    with when("build_system=cargo"):
 | 
			
		||||
        depends_on("rust", type="build")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@spack.builder.builder("cargo")
 | 
			
		||||
class CargoBuilder(BaseBuilder):
 | 
			
		||||
    """The Cargo builder encodes the most common way of building software with
 | 
			
		||||
    a rust Cargo.toml file. It has two phases that can be overridden, if need be:
 | 
			
		||||
 | 
			
		||||
            1. :py:meth:`~.CargoBuilder.build`
 | 
			
		||||
            2. :py:meth:`~.CargoBuilder.install`
 | 
			
		||||
 | 
			
		||||
    For a finer tuning you may override:
 | 
			
		||||
 | 
			
		||||
        +-----------------------------------------------+----------------------+
 | 
			
		||||
        | **Method**                                    | **Purpose**          |
 | 
			
		||||
        +===============================================+======================+
 | 
			
		||||
        | :py:meth:`~.CargoBuilder.build_args`          | Specify arguments    |
 | 
			
		||||
        |                                               | to ``cargo install`` |
 | 
			
		||||
        +-----------------------------------------------+----------------------+
 | 
			
		||||
        | :py:meth:`~.CargoBuilder.check_args`          | Specify arguments    |
 | 
			
		||||
        |                                               | to ``cargo test``    |
 | 
			
		||||
        +-----------------------------------------------+----------------------+
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    phases = ("build", "install")
 | 
			
		||||
 | 
			
		||||
    #: Callback names for install-time test
 | 
			
		||||
    install_time_test_callbacks = ["check"]
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def build_directory(self):
 | 
			
		||||
        """Return the directory containing the main Cargo.toml."""
 | 
			
		||||
        return self.pkg.stage.source_path
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def build_args(self):
 | 
			
		||||
        """Arguments for ``cargo build``."""
 | 
			
		||||
        return []
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def check_args(self):
 | 
			
		||||
        """Argument for ``cargo test`` during check phase"""
 | 
			
		||||
        return []
 | 
			
		||||
 | 
			
		||||
    def build(self, pkg, spec, prefix):
 | 
			
		||||
        """Runs ``cargo install`` in the source directory"""
 | 
			
		||||
        with fs.working_dir(self.build_directory):
 | 
			
		||||
            inspect.getmodule(pkg).cargo(
 | 
			
		||||
                "install", "--root", "out", "--path", ".", *self.build_args
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
    def install(self, pkg, spec, prefix):
 | 
			
		||||
        """Copy build files into package prefix."""
 | 
			
		||||
        with fs.working_dir(self.build_directory):
 | 
			
		||||
            fs.install_tree("out", prefix)
 | 
			
		||||
 | 
			
		||||
    spack.builder.run_after("install")(execute_install_time_tests)
 | 
			
		||||
 | 
			
		||||
    def check(self):
 | 
			
		||||
        """Run "cargo test"."""
 | 
			
		||||
        with fs.working_dir(self.build_directory):
 | 
			
		||||
            inspect.getmodule(self.pkg).cargo("test", *self.check_args)
 | 
			
		||||
@@ -172,6 +172,14 @@ def configure_args(self):
 | 
			
		||||
        return args"""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CargoPackageTemplate(PackageTemplate):
 | 
			
		||||
    """Provides appropriate overrides for cargo-based packages"""
 | 
			
		||||
 | 
			
		||||
    base_class_name = "CargoPackage"
 | 
			
		||||
 | 
			
		||||
    body_def = ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CMakePackageTemplate(PackageTemplate):
 | 
			
		||||
    """Provides appropriate overrides for CMake-based packages"""
 | 
			
		||||
 | 
			
		||||
@@ -575,28 +583,29 @@ def __init__(self, name, *args, **kwargs):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
templates = {
 | 
			
		||||
    "autotools": AutotoolsPackageTemplate,
 | 
			
		||||
    "autoreconf": AutoreconfPackageTemplate,
 | 
			
		||||
    "cmake": CMakePackageTemplate,
 | 
			
		||||
    "bundle": BundlePackageTemplate,
 | 
			
		||||
    "qmake": QMakePackageTemplate,
 | 
			
		||||
    "maven": MavenPackageTemplate,
 | 
			
		||||
    "scons": SconsPackageTemplate,
 | 
			
		||||
    "waf": WafPackageTemplate,
 | 
			
		||||
    "autotools": AutotoolsPackageTemplate,
 | 
			
		||||
    "bazel": BazelPackageTemplate,
 | 
			
		||||
    "bundle": BundlePackageTemplate,
 | 
			
		||||
    "cargo": CargoPackageTemplate,
 | 
			
		||||
    "cmake": CMakePackageTemplate,
 | 
			
		||||
    "generic": PackageTemplate,
 | 
			
		||||
    "intel": IntelPackageTemplate,
 | 
			
		||||
    "lua": LuaPackageTemplate,
 | 
			
		||||
    "makefile": MakefilePackageTemplate,
 | 
			
		||||
    "maven": MavenPackageTemplate,
 | 
			
		||||
    "meson": MesonPackageTemplate,
 | 
			
		||||
    "octave": OctavePackageTemplate,
 | 
			
		||||
    "perlbuild": PerlbuildPackageTemplate,
 | 
			
		||||
    "perlmake": PerlmakePackageTemplate,
 | 
			
		||||
    "python": PythonPackageTemplate,
 | 
			
		||||
    "qmake": QMakePackageTemplate,
 | 
			
		||||
    "r": RPackageTemplate,
 | 
			
		||||
    "racket": RacketPackageTemplate,
 | 
			
		||||
    "perlmake": PerlmakePackageTemplate,
 | 
			
		||||
    "perlbuild": PerlbuildPackageTemplate,
 | 
			
		||||
    "octave": OctavePackageTemplate,
 | 
			
		||||
    "ruby": RubyPackageTemplate,
 | 
			
		||||
    "makefile": MakefilePackageTemplate,
 | 
			
		||||
    "intel": IntelPackageTemplate,
 | 
			
		||||
    "meson": MesonPackageTemplate,
 | 
			
		||||
    "lua": LuaPackageTemplate,
 | 
			
		||||
    "scons": SconsPackageTemplate,
 | 
			
		||||
    "sip": SIPPackageTemplate,
 | 
			
		||||
    "generic": PackageTemplate,
 | 
			
		||||
    "waf": WafPackageTemplate,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -679,6 +688,7 @@ def __call__(self, stage, url):
 | 
			
		||||
        clues = [
 | 
			
		||||
            (r"/CMakeLists\.txt$", "cmake"),
 | 
			
		||||
            (r"/NAMESPACE$", "r"),
 | 
			
		||||
            (r"/Cargo\.toml$", "cargo"),
 | 
			
		||||
            (r"/configure$", "autotools"),
 | 
			
		||||
            (r"/configure\.(in|ac)$", "autoreconf"),
 | 
			
		||||
            (r"/Makefile\.am$", "autoreconf"),
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@
 | 
			
		||||
    cmake_cache_path,
 | 
			
		||||
    cmake_cache_string,
 | 
			
		||||
)
 | 
			
		||||
from spack.build_systems.cargo import CargoPackage
 | 
			
		||||
from spack.build_systems.cmake import CMakePackage, generator
 | 
			
		||||
from spack.build_systems.cuda import CudaPackage
 | 
			
		||||
from spack.build_systems.generic import Package
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user