From 32f5fdd7f4213743fe2f6eedd0fe2108f3157021 Mon Sep 17 00:00:00 2001 From: pxinwr Date: Wed, 27 Feb 2019 19:09:28 +0800 Subject: [PATCH] bpo-31904: Add cross-build support for VxWorks RTOS (GH-11968) --- Include/osdefs.h | 4 ++ .../2019-02-21-14-48-31.bpo-31904.J82jY2.rst | 1 + configure | 21 ++++++++- configure.ac | 21 ++++++++- setup.py | 46 +++++++++++++------ 5 files changed, 75 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2019-02-21-14-48-31.bpo-31904.J82jY2.rst diff --git a/Include/osdefs.h b/Include/osdefs.h index bd84c1c12c1..3243944a148 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 00000000000..1292193b729 --- /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 d98d14ab63f..d0ef8a601b2 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 <&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 c7380caa196..73ee71c6d24 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 <%s 1>/dev/null' % (gcc, tmpfile)) + ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) is_gcc = False + is_clang = False in_incdirs = False inc_dirs = [] lib_dirs = [] @@ -525,17 +528,19 @@ class PyBuildExt(build_ext): 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 @@ class PyBuildExt(build_ext): 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 @@ class PyBuildExt(build_ext): # 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 @@ class PyBuildExt(build_ext): 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 @@ class PyBuildExt(build_ext): 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 PyBuildExt(build_ext): # 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'])