[Python-checkins] bpo-31904: Add cross-build support for VxWorks RTOS (GH-11968)

Victor Stinner webhook-mailer at python.org
Wed Feb 27 06:09:36 EST 2019


https://github.com/python/cpython/commit/32f5fdd7f4213743fe2f6eedd0fe2108f3157021
commit: 32f5fdd7f4213743fe2f6eedd0fe2108f3157021
branch: master
author: pxinwr <peixing.xin at windriver.com>
committer: Victor Stinner <vstinner at redhat.com>
date: 2019-02-27T12:09:28+01:00
summary:

bpo-31904: Add cross-build support for VxWorks RTOS (GH-11968)

files:
A Misc/NEWS.d/next/Build/2019-02-21-14-48-31.bpo-31904.J82jY2.rst
M Include/osdefs.h
M configure
M configure.ac
M setup.py

diff --git a/Include/osdefs.h b/Include/osdefs.h
index bd84c1c12c19..3243944a1483 100644
--- a/Include/osdefs.h
+++ b/Include/osdefs.h
@@ -14,6 +14,10 @@ extern "C" {
 #define DELIM L';'
 #endif
 
+#ifdef __VXWORKS__
+#define DELIM L';'
+#endif
+
 /* Filename separator */
 #ifndef SEP
 #define SEP L'/'
diff --git a/Misc/NEWS.d/next/Build/2019-02-21-14-48-31.bpo-31904.J82jY2.rst b/Misc/NEWS.d/next/Build/2019-02-21-14-48-31.bpo-31904.J82jY2.rst
new file mode 100644
index 000000000000..1292193b729c
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2019-02-21-14-48-31.bpo-31904.J82jY2.rst
@@ -0,0 +1 @@
+Enable build system to cross-build for VxWorks RTOS.
diff --git a/configure b/configure
index d98d14ab63f3..d0ef8a601b28 100755
--- a/configure
+++ b/configure
@@ -3268,6 +3268,9 @@ then
 	*-*-cygwin*)
 		ac_sys_system=Cygwin
 		;;
+	*-*-vxworks*)
+	    ac_sys_system=VxWorks
+	    ;;
 	*)
 		# for now, limit cross builds to known configurations
 		MACHDEP="unknown"
@@ -3312,6 +3315,9 @@ if test "$cross_compiling" = yes; then
 	*-*-cygwin*)
 		_host_cpu=
 		;;
+	*-*-vxworks*)
+		_host_cpu=$host_cpu
+		;;
 	*)
 		# for now, limit cross builds to known configurations
 		MACHDEP="unknown"
@@ -3399,6 +3405,11 @@ $as_echo "#define _BSD_SOURCE 1" >>confdefs.h
   QNX/6.3.2)
     define_xopen_source=no
     ;;
+  # On VxWorks, defining _XOPEN_SOURCE causes compile failures
+  # in network headers still using system V types.
+  VxWorks/*)
+    define_xopen_source=no
+    ;;
 
 esac
 
@@ -5283,6 +5294,8 @@ cat >> conftest.c <<EOF
         i386-gnu
 #elif defined(__APPLE__)
         darwin
+#elif defined(__VXWORKS__)
+        vxworks
 #else
 # error unknown platform triplet
 #endif
@@ -9391,7 +9404,7 @@ then
 			BLDSHARED="$LDSHARED"
 		fi
 		;;
-	Linux*|GNU*|QNX*)
+	Linux*|GNU*|QNX*|VxWorks*)
 		LDSHARED='$(CC) -shared'
 		LDCXXSHARED='$(CXX) -shared';;
 	FreeBSD*)
@@ -9472,6 +9485,8 @@ then
 		then CCSHARED="-fPIC"
 		else CCSHARED="-Kpic -belf"
 		fi;;
+	VxWorks*)
+		CCSHARED="-fpic -D__SO_PICABILINUX__  -ftls-model=global-dynamic"
 	esac
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCSHARED" >&5
@@ -9530,6 +9545,8 @@ then
 		# to 2048 kilobytes so that the stack doesn't overflow
 		# when running test_compile.py.
 		LINKFORSHARED='-Wl,-E -N 2048K';;
+	VxWorks*)
+		LINKFORSHARED='--export-dynamic';;
 	esac
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINKFORSHARED" >&5
@@ -15079,7 +15096,7 @@ $as_echo "$SOABI" >&6; }
 
 
 case $ac_sys_system in
-    Linux*|GNU*|Darwin)
+    Linux*|GNU*|Darwin|VxWorks)
 	EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX};;
     *)
 	EXT_SUFFIX=${SHLIB_SUFFIX};;
diff --git a/configure.ac b/configure.ac
index c7380caa1964..73ee71c6d249 100644
--- a/configure.ac
+++ b/configure.ac
@@ -379,6 +379,9 @@ then
 	*-*-cygwin*)
 		ac_sys_system=Cygwin
 		;;
+	*-*-vxworks*)
+	    ac_sys_system=VxWorks
+	    ;;
 	*)
 		# for now, limit cross builds to known configurations
 		MACHDEP="unknown"
@@ -423,6 +426,9 @@ if test "$cross_compiling" = yes; then
 	*-*-cygwin*)
 		_host_cpu=
 		;;
+	*-*-vxworks*)
+		_host_cpu=$host_cpu
+		;;
 	*)
 		# for now, limit cross builds to known configurations
 		MACHDEP="unknown"
@@ -507,6 +513,11 @@ case $ac_sys_system/$ac_sys_release in
   QNX/6.3.2)
     define_xopen_source=no
     ;;
+  # On VxWorks, defining _XOPEN_SOURCE causes compile failures
+  # in network headers still using system V types.
+  VxWorks/*)
+    define_xopen_source=no
+    ;;
 
 esac
 
@@ -829,6 +840,8 @@ cat >> conftest.c <<EOF
         i386-gnu
 #elif defined(__APPLE__)
         darwin
+#elif defined(__VXWORKS__)
+        vxworks
 #else
 # error unknown platform triplet
 #endif
@@ -2555,7 +2568,7 @@ then
 			BLDSHARED="$LDSHARED"
 		fi
 		;;
-	Linux*|GNU*|QNX*)
+	Linux*|GNU*|QNX*|VxWorks*)
 		LDSHARED='$(CC) -shared'
 		LDCXXSHARED='$(CXX) -shared';;
 	FreeBSD*)
@@ -2634,6 +2647,8 @@ then
 		then CCSHARED="-fPIC"
 		else CCSHARED="-Kpic -belf"
 		fi;;
+	VxWorks*)
+		CCSHARED="-fpic -D__SO_PICABILINUX__  -ftls-model=global-dynamic"
 	esac
 fi
 AC_MSG_RESULT($CCSHARED)
@@ -2690,6 +2705,8 @@ then
 		# to 2048 kilobytes so that the stack doesn't overflow
 		# when running test_compile.py.
 		LINKFORSHARED='-Wl,-E -N 2048K';;
+	VxWorks*)
+		LINKFORSHARED='--export-dynamic';;		
 	esac
 fi
 AC_MSG_RESULT($LINKFORSHARED)
@@ -4578,7 +4595,7 @@ AC_MSG_RESULT($SOABI)
 
 AC_SUBST(EXT_SUFFIX)
 case $ac_sys_system in
-    Linux*|GNU*|Darwin)
+    Linux*|GNU*|Darwin|VxWorks)
 	EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX};;
     *)
 	EXT_SUFFIX=${SHLIB_SUFFIX};;
diff --git a/setup.py b/setup.py
index 33106549458c..b04208602f3b 100644
--- a/setup.py
+++ b/setup.py
@@ -44,6 +44,8 @@ def get_platform():
     return sys.platform
 host_platform = get_platform()
 
+VXWORKS = ('vxworks' in host_platform)
+
 # Were we compiled --with-pydebug or with #define Py_DEBUG?
 COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
 
@@ -509,13 +511,14 @@ def add_multiarch_paths(self):
         finally:
             os.unlink(tmpfile)
 
-    def add_gcc_paths(self):
-        gcc = sysconfig.get_config_var('CC')
-        tmpfile = os.path.join(self.build_temp, 'gccpaths')
+    def add_cross_compiling_paths(self):
+        cc = sysconfig.get_config_var('CC')
+        tmpfile = os.path.join(self.build_temp, 'ccpaths')
         if not os.path.exists(self.build_temp):
             os.makedirs(self.build_temp)
-        ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
+        ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile))
         is_gcc = False
+        is_clang = False
         in_incdirs = False
         inc_dirs = []
         lib_dirs = []
@@ -525,17 +528,19 @@ def add_gcc_paths(self):
                     for line in fp.readlines():
                         if line.startswith("gcc version"):
                             is_gcc = True
+                        elif line.startswith("clang version"):
+                            is_clang = True
                         elif line.startswith("#include <...>"):
                             in_incdirs = True
                         elif line.startswith("End of search list"):
                             in_incdirs = False
-                        elif is_gcc and line.startswith("LIBRARY_PATH"):
+                        elif (is_gcc or is_clang) and line.startswith("LIBRARY_PATH"):
                             for d in line.strip().split("=")[1].split(":"):
                                 d = os.path.normpath(d)
                                 if '/gcc/' not in d:
                                     add_dir_to_list(self.compiler.library_dirs,
                                                     d)
-                        elif is_gcc and in_incdirs and '/gcc/' not in line:
+                        elif (is_gcc or is_clang) and in_incdirs and '/gcc/' not in line and '/clang/' not in line:
                             add_dir_to_list(self.compiler.include_dirs,
                                             line.strip())
         finally:
@@ -550,7 +555,7 @@ def detect_modules(self):
             add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
         # only change this for cross builds for 3.3, issues on Mageia
         if cross_compiling:
-            self.add_gcc_paths()
+            self.add_cross_compiling_paths()
         self.add_multiarch_paths()
 
         # Add paths specified in the environment variables LDFLAGS and
@@ -722,7 +727,8 @@ def detect_modules(self):
         # pwd(3)
         exts.append( Extension('pwd', ['pwdmodule.c']) )
         # grp(3)
-        exts.append( Extension('grp', ['grpmodule.c']) )
+        if not VXWORKS:
+            exts.append( Extension('grp', ['grpmodule.c']) )
         # spwd, shadow passwords
         if (config_h_vars.get('HAVE_GETSPNAM', False) or
                 config_h_vars.get('HAVE_GETSPENT', False)):
@@ -859,7 +865,12 @@ def detect_modules(self):
             libs = ['crypt']
         else:
             libs = []
-        exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) )
+
+        if not VXWORKS:
+            exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) )
+        elif self.compiler.find_library_file(lib_dirs, 'OPENSSL'):
+            libs = ['OPENSSL']
+            exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) )
 
         # CSV files
         exts.append( Extension('_csv', ['_csv.c']) )
@@ -868,8 +879,14 @@ def detect_modules(self):
         exts.append( Extension('_posixsubprocess', ['_posixsubprocess.c']) )
 
         # socket(2)
-        exts.append( Extension('_socket', ['socketmodule.c'],
-                               depends = ['socketmodule.h']) )
+        if not VXWORKS:
+            exts.append( Extension('_socket', ['socketmodule.c'],
+                                   depends = ['socketmodule.h']) )
+        elif self.compiler.find_library_file(lib_dirs, 'net'):
+            libs = ['net']
+            exts.append( Extension('_socket', ['socketmodule.c'],
+                                   depends = ['socketmodule.h'], libraries=libs) )
+
         # Detect SSL support for the socket module (via _ssl)
         ssl_ext, hashlib_ext = self._detect_openssl(inc_dirs, lib_dirs)
         if ssl_ext is not None:
@@ -1319,9 +1336,10 @@ class db_found(Exception): pass
 
         # Unix-only modules
         if host_platform != 'win32':
-            # Steen Lumholt's termios module
-            exts.append( Extension('termios', ['termios.c']) )
-            # Jeremy Hylton's rlimit interface
+            if not VXWORKS:
+                # Steen Lumholt's termios module
+                exts.append( Extension('termios', ['termios.c']) )
+                # Jeremy Hylton's rlimit interface
             exts.append( Extension('resource', ['resource.c']) )
         else:
             missing.extend(['resource', 'termios'])



More information about the Python-checkins mailing list