diff --git a/pycheribuild/projects/cross/gdb.py b/pycheribuild/projects/cross/gdb.py index 3120f47f4..a8491136b 100644 --- a/pycheribuild/projects/cross/gdb.py +++ b/pycheribuild/projects/cross/gdb.py @@ -42,6 +42,7 @@ MakeCommandKind, ) from .gmp import BuildGmp +from .mpfr import BuildMpfr from ..project import ComputedDefaultValue from ...utils import OSInfo @@ -75,7 +76,7 @@ def dependencies(cls, config: CheriConfig) -> "tuple[str, ...]": deps = super().dependencies(config) # For the native and native-hybrid builds gmp must be installed via ports. if not cls.get_crosscompile_target().is_native(): - deps += ("gmp",) + deps += ("gmp", "mpfr") return deps @classmethod @@ -93,6 +94,7 @@ def check_system_dependencies(self) -> None: self.check_required_system_tool("makeinfo", default="texinfo") if self.compiling_for_host() and self.target_info.is_cheribsd(): self.check_required_pkg_config("gmp", freebsd="gmp") + self.check_required_pkg_config("mpfr", freebsd="mpfr") self.check_required_pkg_config("expat", freebsd="expat") def __init__(self, *args, **kwargs): @@ -169,6 +171,7 @@ def setup(self) -> None: MAKEINFO="/bin/false", ) self.configure_args.append("--with-gmp=" + str(BuildGmp.get_install_dir(self))) + self.configure_args.append("--with-mpfr=" + str(BuildMpfr.get_install_dir(self))) # GDB > 12 only uses --with-gmp self.configure_args.append("--with-libgmp-prefix=" + str(BuildGmp.get_install_dir(self))) # Autoconf stupidly decides which to use based on file existence diff --git a/pycheribuild/projects/cross/gmp.py b/pycheribuild/projects/cross/gmp.py index 2b7c84677..39b87cf3e 100644 --- a/pycheribuild/projects/cross/gmp.py +++ b/pycheribuild/projects/cross/gmp.py @@ -54,3 +54,8 @@ def setup(self): def configure(self, **kwargs): self.run_cmd("./.bootstrap", cwd=self.source_dir) super().configure(**kwargs) + + def install(self, **kwargs): + super().install(**kwargs) + if not self.compiling_for_host(): + self.delete_file(self.install_dir / "lib/libgmp.la", warn_if_missing=True) diff --git a/pycheribuild/projects/cross/mpfr.py b/pycheribuild/projects/cross/mpfr.py new file mode 100644 index 000000000..7b52740c9 --- /dev/null +++ b/pycheribuild/projects/cross/mpfr.py @@ -0,0 +1,57 @@ +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 John Baldwin +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +from .crosscompileproject import ( + CrossCompileAutotoolsProject, + DefaultInstallDir, + GitRepository, +) +from .gmp import BuildGmp +from ...config.compilation_targets import CompilationTargets + + +class BuildMpfr(CrossCompileAutotoolsProject): + repository = GitRepository("https://gitlab.inria.fr/mpfr/mpfr.git") + supported_architectures = (CompilationTargets.ALL_CHERIBSD_TARGETS_WITH_HYBRID + + CompilationTargets.ALL_CHERIBSD_HYBRID_FOR_PURECAP_ROOTFS_TARGETS + + CompilationTargets.ALL_SUPPORTED_FREEBSD_TARGETS + CompilationTargets.ALL_NATIVE) + native_install_dir = DefaultInstallDir.CHERI_SDK + + def check_system_dependencies(self) -> None: + super().check_system_dependencies() + # It would be nice if we could just disable building documentation, but until we can do so, missing makeinfo + # results in failing build + self.check_required_system_tool("makeinfo", default="texinfo") + if self.compiling_for_host(): + self.check_required_pkg_config("gmp", freebsd="gmp") + + def setup(self): + super().setup() + self.configure_args.append("--with-gmp=" + str(BuildGmp.get_install_dir(self))) + + def install(self, **kwargs): + super().install(**kwargs) + if not self.compiling_for_host(): + self.delete_file(self.install_dir / "lib/libmpfr.la", warn_if_missing=True) diff --git a/tests/test_argument_parsing.py b/tests/test_argument_parsing.py index 7c5efbc35..6732b684b 100644 --- a/tests/test_argument_parsing.py +++ b/tests/test_argument_parsing.py @@ -127,6 +127,7 @@ def test_skip_update(): "llvm-native", "cheribsd-riscv64-purecap", "gmp-riscv64-hybrid-for-purecap-rootfs", + "mpfr-riscv64-hybrid-for-purecap-rootfs", "gdb-riscv64-hybrid-for-purecap-rootfs", "bbl-baremetal-riscv64-purecap", "disk-image-riscv64-purecap", diff --git a/tests/test_target_order.py b/tests/test_target_order.py index a59251170..151e8aae1 100644 --- a/tests/test_target_order.py +++ b/tests/test_target_order.py @@ -22,6 +22,7 @@ from pycheribuild.projects.cross.gdb import BuildGDBBase from pycheribuild.projects.cross.gmp import BuildGmp from pycheribuild.projects.cross.llvm import BuildCheriLLVM, BuildMorelloLLVM +from pycheribuild.projects.cross.mpfr import BuildMpfr from pycheribuild.projects.cross.qt5 import BuildQtBase from pycheribuild.projects.disk_image import BuildDiskImageBase from pycheribuild.projects.project import DefaultInstallDir, Project @@ -187,6 +188,7 @@ def test_build_and_run(target_name: str, expected_list: "list[str]"): "morello-llvm-native", "cheribsd-morello-hybrid", "gmp-morello-hybrid", + "mpfr-morello-hybrid", "gdb-morello-hybrid", "disk-image-morello-hybrid", ], @@ -199,6 +201,7 @@ def test_build_and_run(target_name: str, expected_list: "list[str]"): "morello-llvm-native", "cheribsd-morello-purecap", "gmp-morello-hybrid-for-purecap-rootfs", + "mpfr-morello-hybrid-for-purecap-rootfs", "gdb-morello-hybrid-for-purecap-rootfs", "disk-image-morello-purecap", ], @@ -206,7 +209,15 @@ def test_build_and_run(target_name: str, expected_list: "list[str]"): pytest.param( "run-riscv64", True, - ["qemu", "llvm-native", "cheribsd-riscv64", "gmp-riscv64", "gdb-riscv64", "disk-image-riscv64"], + [ + "qemu", + "llvm-native", + "cheribsd-riscv64", + "gmp-riscv64", + "mpfr-riscv64", + "gdb-riscv64", + "disk-image-riscv64", + ], ), pytest.param( "run-riscv64-hybrid", @@ -216,6 +227,7 @@ def test_build_and_run(target_name: str, expected_list: "list[str]"): "llvm-native", "cheribsd-riscv64-hybrid", "gmp-riscv64-hybrid", + "mpfr-riscv64-hybrid", "gdb-riscv64-hybrid", "bbl-baremetal-riscv64-purecap", "disk-image-riscv64-hybrid", @@ -229,6 +241,7 @@ def test_build_and_run(target_name: str, expected_list: "list[str]"): "llvm-native", "cheribsd-riscv64-purecap", "gmp-riscv64-hybrid-for-purecap-rootfs", + "mpfr-riscv64-hybrid-for-purecap-rootfs", "gdb-riscv64-hybrid-for-purecap-rootfs", "bbl-baremetal-riscv64-purecap", "disk-image-riscv64-purecap", @@ -237,12 +250,28 @@ def test_build_and_run(target_name: str, expected_list: "list[str]"): pytest.param( "run-aarch64", True, - ["qemu", "llvm-native", "cheribsd-aarch64", "gmp-aarch64", "gdb-aarch64", "disk-image-aarch64"], + [ + "qemu", + "llvm-native", + "cheribsd-aarch64", + "gmp-aarch64", + "mpfr-aarch64", + "gdb-aarch64", + "disk-image-aarch64", + ], ), pytest.param( "run-amd64", True, - ["qemu", "llvm-native", "cheribsd-amd64", "gmp-amd64", "gdb-amd64", "disk-image-amd64"], + [ + "qemu", + "llvm-native", + "cheribsd-amd64", + "gmp-amd64", + "mpfr-amd64", + "gdb-amd64", + "disk-image-amd64", + ], ), # Morello code won't run on QEMU (yet) pytest.param( @@ -253,6 +282,7 @@ def test_build_and_run(target_name: str, expected_list: "list[str]"): "morello-llvm-native", "cheribsd-morello-hybrid", "gmp-morello-hybrid", + "mpfr-morello-hybrid", "gdb-morello-hybrid", "morello-firmware", "disk-image-morello-hybrid", @@ -266,6 +296,7 @@ def test_build_and_run(target_name: str, expected_list: "list[str]"): "morello-llvm-native", "cheribsd-morello-purecap", "gmp-morello-hybrid-for-purecap-rootfs", + "mpfr-morello-hybrid-for-purecap-rootfs", "gdb-morello-hybrid-for-purecap-rootfs", "morello-firmware", "disk-image-morello-purecap", @@ -532,6 +563,7 @@ def test_riscv(): "llvm-native", "cheribsd-riscv64", "gmp-riscv64", + "mpfr-riscv64", "gdb-riscv64", "disk-image-riscv64", ] @@ -540,6 +572,7 @@ def test_riscv(): "llvm-native", "cheribsd-riscv64", "gmp-riscv64", + "mpfr-riscv64", "gdb-riscv64", "disk-image-riscv64", "run-riscv64", @@ -697,7 +730,7 @@ def should_include_target(target: Target): return False # Finally, filter out dependencies of any of the above: - if issubclass(cls, BuildGmp): + if issubclass(cls, (BuildGmp, BuildMpfr)): return False # Otherwise this target is unexpected