File: 0011-Add-object-copy-for-f2py-meson-backend.patch

package info (click to toggle)
numpy 1%3A2.3.4%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 86,056 kB
  • sloc: python: 255,795; asm: 232,483; ansic: 212,593; cpp: 157,465; f90: 1,575; sh: 845; fortran: 567; makefile: 431; sed: 139; xml: 109; java: 97; perl: 82; cs: 62; javascript: 53; objc: 33; lex: 13; yacc: 9
file content (102 lines) | stat: -rw-r--r-- 3,949 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
From: Shirong_Wang <srwang20@fudan.edu.cn>
Date: Sat, 16 Aug 2025 20:35:43 +0800
Subject: Add object copy for f2py meson backend

Origin: upstream, https://github.com/numpy/numpy/pull/29572
Bug: https://github.com/numpy/numpy/issues/28191
Bug-Debian: https://bugs.debian.org/1078861
---
 numpy/f2py/_backends/_meson.py            | 13 +++++++++++++
 numpy/f2py/_backends/meson.build.template |  3 +++
 numpy/f2py/tests/test_f2py2e.py           | 19 +++++++++++++++++++
 3 files changed, 35 insertions(+)

diff --git a/numpy/f2py/_backends/_meson.py b/numpy/f2py/_backends/_meson.py
index cbd9b0e..4c498ba 100644
--- a/numpy/f2py/_backends/_meson.py
+++ b/numpy/f2py/_backends/_meson.py
@@ -50,6 +50,7 @@ class MesonTemplate:
         self.pipeline = [
             self.initialize_template,
             self.sources_substitution,
+            self.objects_substitution,
             self.deps_substitution,
             self.include_substitution,
             self.libraries_substitution,
@@ -79,6 +80,11 @@ class MesonTemplate:
             [f"{self.indent}'''{source}'''," for source in self.sources]
         )
 
+    def objects_substitution(self) -> None:
+        self.substitutions["obj_list"] = ",\n".join(
+            [f"{self.indent}'''{obj}'''," for obj in self.objects]
+        )
+
     def deps_substitution(self) -> None:
         self.substitutions["dep_list"] = f",\n{self.indent}".join(
             [f"{self.indent}dependency('{dep}')," for dep in self.deps]
@@ -186,6 +192,7 @@ class MesonBackend(Backend):
 
     def compile(self) -> None:
         self.sources = _prepare_sources(self.modulename, self.sources, self.build_dir)
+        _prepare_objects(self.modulename, self.extra_objects, self.build_dir)
         self.write_meson_build(self.build_dir)
         self.run_meson(self.build_dir)
         self._move_exec_to_root(self.build_dir)
@@ -216,6 +223,12 @@ def _prepare_sources(mname, sources, bdir):
     ]
     return extended_sources
 
+def _prepare_objects(mname, objects, bdir):
+    Path(bdir).mkdir(parents=True, exist_ok=True)
+    # Copy objects
+    for obj in objects:
+        if Path(obj).exists() and Path(obj).is_file():
+            shutil.copy(obj, bdir)
 
 def _get_flags(fc_flags):
     flag_values = []
diff --git a/numpy/f2py/_backends/meson.build.template b/numpy/f2py/_backends/meson.build.template
index 32b4a71..c521565 100644
--- a/numpy/f2py/_backends/meson.build.template
+++ b/numpy/f2py/_backends/meson.build.template
@@ -42,6 +42,9 @@ ${source_list},
                      include_directories: [
                      inc_np,
 ${inc_list}
+                     ],
+                     objects: [
+${obj_list}
                      ],
                      dependencies : [
                      py_dep,
diff --git a/numpy/f2py/tests/test_f2py2e.py b/numpy/f2py/tests/test_f2py2e.py
index 2f91eb7..959e152 100644
--- a/numpy/f2py/tests/test_f2py2e.py
+++ b/numpy/f2py/tests/test_f2py2e.py
@@ -673,6 +673,25 @@ def test_inclheader(capfd, hello_world_f90, monkeypatch):
             assert "#include <stdbool.h>" in ocmr
             assert "#include <stdio.h>" in ocmr
 
+@pytest.mark.skipif((platform.system() != 'Linux'), reason='Compiler required')
+def test_cli_obj(capfd, hello_world_f90, monkeypatch):
+    """Ensures that the extra object can be specified when using meson backend
+    """
+    ipath = Path(hello_world_f90)
+    mname = "blah"
+    odir = "tttmp"
+    obj = "extra.o"
+    monkeypatch.setattr(sys, "argv",
+                        f'f2py --backend meson --build-dir {odir} -m {mname} -c {obj} {ipath}'.split())
+
+    with util.switchdir(ipath.parent):
+        Path(obj).touch()
+        compiler_check_f2pycli()
+        with Path(f"{odir}/meson.build").open() as mesonbuild:
+            mbld = mesonbuild.read()
+            assert "objects:" in mbld
+            assert f"'''{obj}'''" in mbld
+
 
 def test_inclpath():
     """Add to the include directories