]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-31904: setup.py: fix cross-compilation on VxWorks (GH-24191)
authorpxinwr <peixing.xin@windriver.com>
Fri, 22 Jan 2021 00:55:52 +0000 (08:55 +0800)
committerGitHub <noreply@github.com>
Fri, 22 Jan 2021 00:55:52 +0000 (01:55 +0100)
Add library search path by wr-cc in add_cross_compiling_paths().

Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst [new file with mode: 0644]
setup.py

diff --git a/Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst b/Misc/NEWS.d/next/Build/2021-01-11-23-26-00.bpo-31904.ty8f3h.rst
new file mode 100644 (file)
index 0000000..bc02d0a
--- /dev/null
@@ -0,0 +1 @@
+Add library search path by wr-cc in add_cross_compiling_paths() for VxWorks.
index a4d21d4c619727a0dbbf562c30267aa103087aa6..8445546c0116ff888b9d2371156b6b34373dec22 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -682,6 +682,51 @@ class PyBuildExt(build_ext):
         finally:
             os.unlink(tmpfile)
 
+    def add_wrcc_search_dirs(self):
+        # add library search path by wr-cc, the compiler wrapper
+
+        def convert_mixed_path(path):
+            # convert path like C:\folder1\folder2/folder3/folder4
+            # to msys style /c/folder1/folder2/folder3/folder4
+            drive = path[0].lower()
+            left = path[2:].replace("\\", "/")
+            return "/" + drive + left
+
+        def add_search_path(line):
+            # On Windows building machine, VxWorks does
+            # cross builds under msys2 environment.
+            pathsep = (";" if sys.platform == "msys" else ":")
+            for d in line.strip().split("=")[1].split(pathsep):
+                d = d.strip()
+                if sys.platform == "msys":
+                    # On Windows building machine, compiler
+                    # returns mixed style path like:
+                    # C:\folder1\folder2/folder3/folder4
+                    d = convert_mixed_path(d)
+                d = os.path.normpath(d)
+                add_dir_to_list(self.compiler.library_dirs, d)
+
+        cc = sysconfig.get_config_var('CC')
+        tmpfile = os.path.join(self.build_temp, 'wrccpaths')
+        os.makedirs(self.build_temp, exist_ok=True)
+        try:
+            ret = run_command('%s --print-search-dirs >%s' % (cc, tmpfile))
+            if ret:
+                return
+            with open(tmpfile) as fp:
+                # Parse paths in libraries line. The line is like:
+                # On Linux, "libraries: = path1:path2:path3"
+                # On Windows, "libraries: = path1;path2;path3"
+                for line in fp:
+                    if not line.startswith("libraries"):
+                        continue
+                    add_search_path(line)
+        finally:
+            try:
+                os.unlink(tmpfile)
+            except OSError:
+                pass
+
     def add_cross_compiling_paths(self):
         cc = sysconfig.get_config_var('CC')
         tmpfile = os.path.join(self.build_temp, 'ccpaths')
@@ -715,6 +760,9 @@ class PyBuildExt(build_ext):
         finally:
             os.unlink(tmpfile)
 
+        if VXWORKS:
+            self.add_wrcc_search_dirs()
+
     def add_ldflags_cppflags(self):
         # Add paths specified in the environment variables LDFLAGS and
         # CPPFLAGS for header and library files.