summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/python/python3-setuptools-rust/8e9892f08b1248dc03862da86915c2745e0ff7ec.patch
blob: 2a531e17aa8b7b8eef52baa39a89ead5a2a2df81 (plain)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
From 8e9892f08b1248dc03862da86915c2745e0ff7ec Mon Sep 17 00:00:00 2001
From: "Andrew J. Hesford" <ajh@sideband.org>
Date: Fri, 15 Jul 2022 10:33:02 -0400
Subject: [PATCH] build_rust: remove linker handling that broke cross
 compilation

Upstream-Status: Submitted [https://github.com/PyO3/setuptools-rust/pull/269]
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
 setuptools_rust/build.py | 151 ++-------------------------------------
 1 file changed, 7 insertions(+), 144 deletions(-)

diff --git a/setuptools_rust/build.py b/setuptools_rust/build.py
index 4fe594b..e81ed8f 100644
--- a/setuptools_rust/build.py
+++ b/setuptools_rust/build.py
@@ -113,23 +113,10 @@ def build_extension(
         self, ext: RustExtension, forced_target_triple: Optional[str] = None
     ) -> List["_BuiltModule"]:
 
-        target_info = self._detect_rust_target(forced_target_triple)
-        if target_info is not None:
-            target_triple = target_info.triple
-            cross_lib = target_info.cross_lib
-            linker = target_info.linker
-            # We're ignoring target_info.linker_args for now because we're not
-            # sure if they will always do the right thing. Might help with some
-            # of the OS-specific logic if it does.
-
-        else:
-            target_triple = None
-            cross_lib = None
-            linker = None
-
+        target_triple = self._detect_rust_target(forced_target_triple)
         rustc_cfgs = get_rustc_cfgs(target_triple)
 
-        env = _prepare_build_environment(cross_lib)
+        env = _prepare_build_environment()
 
         if not os.path.exists(ext.path):
             raise DistutilsFileError(
@@ -150,9 +137,6 @@ def build_extension(
 
         rustflags = []
 
-        if linker is not None:
-            rustflags.extend(["-C", "linker=" + linker])
-
         if ext._uses_exec_binding():
             command = [self.cargo, "build", "--manifest-path", ext.path, *cargo_args]
 
@@ -407,45 +391,12 @@ def _py_limited_api(self) -> _PyLimitedApi:
 
     def _detect_rust_target(
         self, forced_target_triple: Optional[str] = None
-    ) -> Optional["_TargetInfo"]:
+    ) -> Optional[str]:
         assert self.plat_name is not None
-        cross_compile_info = _detect_unix_cross_compile_info()
-        if cross_compile_info is not None:
-            cross_target_info = cross_compile_info.to_target_info()
-            if forced_target_triple is not None:
-                if (
-                    cross_target_info is not None
-                    and not cross_target_info.is_compatible_with(forced_target_triple)
-                ):
-                    self.warn(
-                        f"Forced Rust target `{forced_target_triple}` is not "
-                        f"compatible with deduced Rust target "
-                        f"`{cross_target_info.triple}` - the built package "
-                        f" may not import successfully once installed."
-                    )
-
-                # Forcing the target in a cross-compile environment; use
-                # the cross-compile information in combination with the
-                # forced target
-                return _TargetInfo(
-                    forced_target_triple,
-                    cross_compile_info.cross_lib,
-                    cross_compile_info.linker,
-                    cross_compile_info.linker_args,
-                )
-            elif cross_target_info is not None:
-                return cross_target_info
-            else:
-                raise DistutilsPlatformError(
-                    "Don't know the correct rust target for system type "
-                    f"{cross_compile_info.host_type}. Please set the "
-                    "CARGO_BUILD_TARGET environment variable."
-                )
-
-        elif forced_target_triple is not None:
+        if forced_target_triple is not None:
             # Automatic target detection can be overridden via the CARGO_BUILD_TARGET
             # environment variable or --target command line option
-            return _TargetInfo.for_triple(forced_target_triple)
+            return forced_target_triple
 
         # Determine local rust target which needs to be "forced" if necessary
         local_rust_target = _adjusted_local_rust_target(self.plat_name)
@@ -457,7 +408,7 @@ def _detect_rust_target(
             # check for None first to avoid calling to rustc if not needed
             and local_rust_target != get_rust_host()
         ):
-            return _TargetInfo.for_triple(local_rust_target)
+            return local_rust_target
 
         return None
 
@@ -547,91 +498,6 @@ class _BuiltModule(NamedTuple):
     path: str
 
 
-class _TargetInfo(NamedTuple):
-    triple: str
-    cross_lib: Optional[str]
-    linker: Optional[str]
-    linker_args: Optional[str]
-
-    @staticmethod
-    def for_triple(triple: str) -> "_TargetInfo":
-        return _TargetInfo(triple, None, None, None)
-
-    def is_compatible_with(self, target: str) -> bool:
-        if self.triple == target:
-            return True
-
-        # the vendor field can be ignored, so x86_64-pc-linux-gnu is compatible
-        # with x86_64-unknown-linux-gnu
-        if _replace_vendor_with_unknown(self.triple) == target:
-            return True
-
-        return False
-
-
-class _CrossCompileInfo(NamedTuple):
-    host_type: str
-    cross_lib: Optional[str]
-    linker: Optional[str]
-    linker_args: Optional[str]
-
-    def to_target_info(self) -> Optional[_TargetInfo]:
-        """Maps this cross compile info to target info.
-
-        Returns None if the corresponding target information could not be
-        deduced.
-        """
-        # hopefully an exact match
-        targets = get_rust_target_list()
-        if self.host_type in targets:
-            return _TargetInfo(
-                self.host_type, self.cross_lib, self.linker, self.linker_args
-            )
-
-        # the vendor field can be ignored, so x86_64-pc-linux-gnu is compatible
-        # with x86_64-unknown-linux-gnu
-        without_vendor = _replace_vendor_with_unknown(self.host_type)
-        if without_vendor is not None and without_vendor in targets:
-            return _TargetInfo(
-                without_vendor, self.cross_lib, self.linker, self.linker_args
-            )
-
-        return None
-
-
-def _detect_unix_cross_compile_info() -> Optional["_CrossCompileInfo"]:
-    # See https://github.com/PyO3/setuptools-rust/issues/138
-    # This is to support cross compiling on *NIX, where plat_name isn't
-    # necessarily the same as the system we are running on.  *NIX systems
-    # have more detailed information available in sysconfig. We need that
-    # because plat_name doesn't give us information on e.g., glibc vs musl.
-    host_type = sysconfig.get_config_var("HOST_GNU_TYPE")
-    build_type = sysconfig.get_config_var("BUILD_GNU_TYPE")
-
-    if not host_type or host_type == build_type:
-        # not *NIX, or not cross compiling
-        return None
-
-    if "apple-darwin" in host_type and (build_type and "apple-darwin" in build_type):
-        # On macos and the build and host differ. This is probably an arm
-        # Python which was built on x86_64. Don't try to handle this for now.
-        # (See https://github.com/PyO3/setuptools-rust/issues/192)
-        return None
-
-    stdlib = sysconfig.get_path("stdlib")
-    assert stdlib is not None
-    cross_lib = os.path.dirname(stdlib)
-
-    bldshared = sysconfig.get_config_var("BLDSHARED")
-    if not bldshared:
-        linker = None
-        linker_args = None
-    else:
-        [linker, _, linker_args] = bldshared.partition(" ")
-
-    return _CrossCompileInfo(host_type, cross_lib, linker, linker_args)
-
-
 def _replace_vendor_with_unknown(target: str) -> Optional[str]:
     """Replaces vendor in the target triple with unknown.
 
@@ -644,7 +510,7 @@ def _replace_vendor_with_unknown(target: str) -> Optional[str]:
     return "-".join(components)
 
 
-def _prepare_build_environment(cross_lib: Optional[str]) -> Dict[str, str]:
+def _prepare_build_environment() -> Dict[str, str]:
     """Prepares environment variables to use when executing cargo build."""
 
     # Make sure that if pythonXX-sys is used, it builds against the current
@@ -665,9 +531,6 @@ def _prepare_build_environment(cross_lib: Optional[str]) -> Dict[str, str]:
         }
     )
 
-    if cross_lib:
-        env.setdefault("PYO3_CROSS_LIB_DIR", cross_lib)
-
     env.pop("CARGO", None)
     return env