mirror of https://github.com/python/cpython
bpo-40280: Skip socket, fork, subprocess tests on Emscripten (GH-31986)
- Add requires_fork and requires_subprocess to more tests - Skip extension import tests if dlopen is not available - Don't assume that _testcapi is a shared extension - Skip a lot of socket tests that don't work on Emscripten - Skip mmap tests, mmap emulation is incomplete - venv does not work yet - Cannot get libc from executable The "entire" test suite is now passing on Emscripten with EMSDK from git head (91 suites are skipped).
This commit is contained in:
parent
a25a985535
commit
deeaac49e2
|
@ -15,7 +15,7 @@ from test import support
|
||||||
from test.support import threading_helper
|
from test.support import threading_helper
|
||||||
|
|
||||||
|
|
||||||
requires_fork = unittest.skipUnless(hasattr(os, 'fork'),
|
requires_fork = unittest.skipUnless(support.has_fork_support,
|
||||||
"platform doesn't support fork "
|
"platform doesn't support fork "
|
||||||
"(no _at_fork_reinit method)")
|
"(no _at_fork_reinit method)")
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import errno
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
|
import unittest
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
|
|
||||||
|
@ -615,7 +616,7 @@ def collect_resource(info_add):
|
||||||
def collect_test_socket(info_add):
|
def collect_test_socket(info_add):
|
||||||
try:
|
try:
|
||||||
from test import test_socket
|
from test import test_socket
|
||||||
except ImportError:
|
except (ImportError, unittest.SkipTest):
|
||||||
return
|
return
|
||||||
|
|
||||||
# all check attributes like HAVE_SOCKET_CAN
|
# all check attributes like HAVE_SOCKET_CAN
|
||||||
|
|
|
@ -42,6 +42,7 @@ __all__ = [
|
||||||
"requires_IEEE_754", "requires_zlib",
|
"requires_IEEE_754", "requires_zlib",
|
||||||
"has_fork_support", "requires_fork",
|
"has_fork_support", "requires_fork",
|
||||||
"has_subprocess_support", "requires_subprocess",
|
"has_subprocess_support", "requires_subprocess",
|
||||||
|
"has_socket_support", "requires_working_socket",
|
||||||
"anticipate_failure", "load_package_tests", "detect_api_mismatch",
|
"anticipate_failure", "load_package_tests", "detect_api_mismatch",
|
||||||
"check__all__", "skip_if_buggy_ucrt_strfptime",
|
"check__all__", "skip_if_buggy_ucrt_strfptime",
|
||||||
"check_disallow_instantiation", "check_sanitizer", "skip_if_sanitizer",
|
"check_disallow_instantiation", "check_sanitizer", "skip_if_sanitizer",
|
||||||
|
@ -520,6 +521,21 @@ def requires_subprocess():
|
||||||
"""Used for subprocess, os.spawn calls, fd inheritance"""
|
"""Used for subprocess, os.spawn calls, fd inheritance"""
|
||||||
return unittest.skipUnless(has_subprocess_support, "requires subprocess support")
|
return unittest.skipUnless(has_subprocess_support, "requires subprocess support")
|
||||||
|
|
||||||
|
# Emscripten's socket emulation has limitation. WASI doesn't have sockets yet.
|
||||||
|
has_socket_support = not is_emscripten and not is_wasi
|
||||||
|
|
||||||
|
def requires_working_socket(*, module=False):
|
||||||
|
"""Skip tests or modules that require working sockets
|
||||||
|
|
||||||
|
Can be used as a function/class decorator or to skip an entire module.
|
||||||
|
"""
|
||||||
|
msg = "requires socket support"
|
||||||
|
if module:
|
||||||
|
if not has_socket_support:
|
||||||
|
raise unittest.SkipTest(msg)
|
||||||
|
else:
|
||||||
|
return unittest.skipUnless(has_socket_support, msg)
|
||||||
|
|
||||||
# Does strftime() support glibc extension like '%4Y'?
|
# Does strftime() support glibc extension like '%4Y'?
|
||||||
has_strftime_extensions = False
|
has_strftime_extensions = False
|
||||||
if sys.platform != "win32":
|
if sys.platform != "win32":
|
||||||
|
|
|
@ -4,10 +4,12 @@ import unittest
|
||||||
import contextlib
|
import contextlib
|
||||||
|
|
||||||
from test.support.import_helper import import_module
|
from test.support.import_helper import import_module
|
||||||
from test.support import gc_collect
|
from test.support import gc_collect, requires_working_socket
|
||||||
asyncio = import_module("asyncio")
|
asyncio = import_module("asyncio")
|
||||||
|
|
||||||
|
|
||||||
|
requires_working_socket(module=True)
|
||||||
|
|
||||||
_no_default = object()
|
_no_default = object()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,8 @@ with warnings.catch_warnings():
|
||||||
import asynchat
|
import asynchat
|
||||||
import asyncore
|
import asyncore
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
HOST = socket_helper.HOST
|
HOST = socket_helper.HOST
|
||||||
SERVER_QUIT = b'QUIT\n'
|
SERVER_QUIT = b'QUIT\n'
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
import os
|
import os
|
||||||
|
from test import support
|
||||||
from test.support import load_package_tests
|
from test.support import load_package_tests
|
||||||
from test.support import import_helper
|
from test.support import import_helper
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
# Skip tests if we don't have concurrent.futures.
|
# Skip tests if we don't have concurrent.futures.
|
||||||
import_helper.import_module('concurrent.futures')
|
import_helper.import_module('concurrent.futures')
|
||||||
|
|
|
@ -18,6 +18,8 @@ from io import BytesIO
|
||||||
if support.PGO:
|
if support.PGO:
|
||||||
raise unittest.SkipTest("test is not helpful for PGO")
|
raise unittest.SkipTest("test is not helpful for PGO")
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
import warnings
|
import warnings
|
||||||
with warnings.catch_warnings():
|
with warnings.catch_warnings():
|
||||||
warnings.simplefilter('ignore', DeprecationWarning)
|
warnings.simplefilter('ignore', DeprecationWarning)
|
||||||
|
|
|
@ -8,6 +8,7 @@ import unittest
|
||||||
|
|
||||||
from test.test_contextlib import TestBaseExitStack
|
from test.test_contextlib import TestBaseExitStack
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
def _async_test(func):
|
def _async_test(func):
|
||||||
"""Decorator to turn an async function into a test case."""
|
"""Decorator to turn an async function into a test case."""
|
||||||
|
|
|
@ -18,6 +18,11 @@ import shutil
|
||||||
import types
|
import types
|
||||||
import contextlib
|
import contextlib
|
||||||
|
|
||||||
|
|
||||||
|
if not support.has_subprocess_support:
|
||||||
|
raise unittest.SkipTest("test_CLI requires subprocess support.")
|
||||||
|
|
||||||
|
|
||||||
# NOTE: There are some additional tests relating to interaction with
|
# NOTE: There are some additional tests relating to interaction with
|
||||||
# zipimport in the test_zipimport_support test module.
|
# zipimport in the test_zipimport_support test module.
|
||||||
|
|
||||||
|
@ -455,7 +460,7 @@ We'll simulate a __file__ attr that ends in pyc:
|
||||||
>>> tests = finder.find(sample_func)
|
>>> tests = finder.find(sample_func)
|
||||||
|
|
||||||
>>> print(tests) # doctest: +ELLIPSIS
|
>>> print(tests) # doctest: +ELLIPSIS
|
||||||
[<DocTest sample_func from test_doctest.py:28 (1 example)>]
|
[<DocTest sample_func from test_doctest.py:33 (1 example)>]
|
||||||
|
|
||||||
The exact name depends on how test_doctest was invoked, so allow for
|
The exact name depends on how test_doctest was invoked, so allow for
|
||||||
leading path components.
|
leading path components.
|
||||||
|
|
|
@ -4,6 +4,9 @@ import re
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
import unittest
|
import unittest
|
||||||
|
from test import support
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
def make_request_and_skipIf(condition, reason):
|
def make_request_and_skipIf(condition, reason):
|
||||||
# If we skip the test, we have to make a request because
|
# If we skip the test, we have to make a request because
|
||||||
|
|
|
@ -29,6 +29,7 @@ with warnings.catch_warnings():
|
||||||
import asyncore
|
import asyncore
|
||||||
import asynchat
|
import asynchat
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
TIMEOUT = support.LOOPBACK_TIMEOUT
|
TIMEOUT = support.LOOPBACK_TIMEOUT
|
||||||
DEFAULT_ENCODING = 'utf-8'
|
DEFAULT_ENCODING = 'utf-8'
|
||||||
|
|
|
@ -19,6 +19,7 @@ from test.support import os_helper
|
||||||
from test.support import socket_helper
|
from test.support import socket_helper
|
||||||
from test.support import warnings_helper
|
from test.support import warnings_helper
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
here = os.path.dirname(__file__)
|
here = os.path.dirname(__file__)
|
||||||
# Self-signed cert file for 'localhost'
|
# Self-signed cert file for 'localhost'
|
||||||
|
|
|
@ -33,6 +33,7 @@ from test import support
|
||||||
from test.support import os_helper
|
from test.support import os_helper
|
||||||
from test.support import threading_helper
|
from test.support import threading_helper
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
class NoLogRequestHandler:
|
class NoLogRequestHandler:
|
||||||
def log_message(self, *args):
|
def log_message(self, *args):
|
||||||
|
|
|
@ -11,7 +11,8 @@ import threading
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
from test.support import (verbose,
|
from test.support import (verbose,
|
||||||
run_with_tz, run_with_locale, cpython_only)
|
run_with_tz, run_with_locale, cpython_only,
|
||||||
|
requires_working_socket)
|
||||||
from test.support import hashlib_helper
|
from test.support import hashlib_helper
|
||||||
from test.support import threading_helper
|
from test.support import threading_helper
|
||||||
from test.support import warnings_helper
|
from test.support import warnings_helper
|
||||||
|
@ -23,6 +24,8 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
ssl = None
|
ssl = None
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "keycert3.pem")
|
CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "keycert3.pem")
|
||||||
CAFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "pycacert.pem")
|
CAFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "pycacert.pem")
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ from unittest import mock
|
||||||
|
|
||||||
from test.support import os_helper
|
from test.support import os_helper
|
||||||
from test.support import (
|
from test.support import (
|
||||||
STDLIB_DIR, is_jython, swap_attr, swap_item, cpython_only)
|
STDLIB_DIR, is_jython, swap_attr, swap_item, cpython_only, is_emscripten)
|
||||||
from test.support.import_helper import (
|
from test.support.import_helper import (
|
||||||
forget, make_legacy_pyc, unlink, unload, DirsOnSysPath, CleanImport)
|
forget, make_legacy_pyc, unlink, unload, DirsOnSysPath, CleanImport)
|
||||||
from test.support.os_helper import (
|
from test.support.os_helper import (
|
||||||
|
@ -101,8 +101,17 @@ class ImportTests(unittest.TestCase):
|
||||||
with self.assertRaises(ImportError) as cm:
|
with self.assertRaises(ImportError) as cm:
|
||||||
from _testcapi import i_dont_exist
|
from _testcapi import i_dont_exist
|
||||||
self.assertEqual(cm.exception.name, '_testcapi')
|
self.assertEqual(cm.exception.name, '_testcapi')
|
||||||
self.assertEqual(cm.exception.path, _testcapi.__file__)
|
if hasattr(_testcapi, "__file__"):
|
||||||
self.assertRegex(str(cm.exception), r"cannot import name 'i_dont_exist' from '_testcapi' \(.*\.(so|pyd)\)")
|
self.assertEqual(cm.exception.path, _testcapi.__file__)
|
||||||
|
self.assertRegex(
|
||||||
|
str(cm.exception),
|
||||||
|
r"cannot import name 'i_dont_exist' from '_testcapi' \(.*\.(so|pyd)\)"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.assertEqual(
|
||||||
|
str(cm.exception),
|
||||||
|
"cannot import name 'i_dont_exist' from '_testcapi' (unknown location)"
|
||||||
|
)
|
||||||
|
|
||||||
def test_from_import_missing_attr_has_name(self):
|
def test_from_import_missing_attr_has_name(self):
|
||||||
with self.assertRaises(ImportError) as cm:
|
with self.assertRaises(ImportError) as cm:
|
||||||
|
@ -525,6 +534,7 @@ class FilePermissionTests(unittest.TestCase):
|
||||||
|
|
||||||
@unittest.skipUnless(os.name == 'posix',
|
@unittest.skipUnless(os.name == 'posix',
|
||||||
"test meaningful only on posix systems")
|
"test meaningful only on posix systems")
|
||||||
|
@unittest.skipIf(is_emscripten, "Emscripten's umask is a stub.")
|
||||||
def test_creation_mode(self):
|
def test_creation_mode(self):
|
||||||
mask = 0o022
|
mask = 0o022
|
||||||
with temp_umask(mask), _ready_to_import() as (name, path):
|
with temp_umask(mask), _ready_to_import() as (name, path):
|
||||||
|
|
|
@ -10,6 +10,10 @@ class FinderTests(abc.FinderTests):
|
||||||
|
|
||||||
"""Test the finder for extension modules."""
|
"""Test the finder for extension modules."""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
if not self.machinery.EXTENSION_SUFFIXES:
|
||||||
|
raise unittest.SkipTest("Requires dynamic loading support.")
|
||||||
|
|
||||||
def find_spec(self, fullname):
|
def find_spec(self, fullname):
|
||||||
importer = self.machinery.FileFinder(util.EXTENSIONS.path,
|
importer = self.machinery.FileFinder(util.EXTENSIONS.path,
|
||||||
(self.machinery.ExtensionFileLoader,
|
(self.machinery.ExtensionFileLoader,
|
||||||
|
|
|
@ -12,11 +12,14 @@ import importlib.util
|
||||||
import importlib
|
import importlib
|
||||||
from test.support.script_helper import assert_python_failure
|
from test.support.script_helper import assert_python_failure
|
||||||
|
|
||||||
|
|
||||||
class LoaderTests(abc.LoaderTests):
|
class LoaderTests(abc.LoaderTests):
|
||||||
|
|
||||||
"""Test load_module() for extension modules."""
|
"""Test load_module() for extension modules."""
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
if not self.machinery.EXTENSION_SUFFIXES:
|
||||||
|
raise unittest.SkipTest("Requires dynamic loading support.")
|
||||||
self.loader = self.machinery.ExtensionFileLoader(util.EXTENSIONS.name,
|
self.loader = self.machinery.ExtensionFileLoader(util.EXTENSIONS.name,
|
||||||
util.EXTENSIONS.file_path)
|
util.EXTENSIONS.file_path)
|
||||||
|
|
||||||
|
@ -91,6 +94,8 @@ class MultiPhaseExtensionModuleTests(abc.LoaderTests):
|
||||||
# Test loading extension modules with multi-phase initialization (PEP 489).
|
# Test loading extension modules with multi-phase initialization (PEP 489).
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
if not self.machinery.EXTENSION_SUFFIXES:
|
||||||
|
raise unittest.SkipTest("Requires dynamic loading support.")
|
||||||
self.name = '_testmultiphase'
|
self.name = '_testmultiphase'
|
||||||
finder = self.machinery.FileFinder(None)
|
finder = self.machinery.FileFinder(None)
|
||||||
self.spec = importlib.util.find_spec(self.name)
|
self.spec = importlib.util.find_spec(self.name)
|
||||||
|
|
|
@ -10,6 +10,7 @@ from test.support import os_helper
|
||||||
from test.support.script_helper import assert_python_ok
|
from test.support.script_helper import assert_python_ok
|
||||||
|
|
||||||
|
|
||||||
|
@support.requires_subprocess()
|
||||||
class TestTool(unittest.TestCase):
|
class TestTool(unittest.TestCase):
|
||||||
data = """
|
data = """
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BaseTest(unittest.TestCase):
|
class BaseTest(unittest.TestCase):
|
||||||
|
|
||||||
"""Base class for logging tests."""
|
"""Base class for logging tests."""
|
||||||
|
@ -626,6 +627,9 @@ class HandlerTest(BaseTest):
|
||||||
os.unlink(fn)
|
os.unlink(fn)
|
||||||
|
|
||||||
@unittest.skipIf(os.name == 'nt', 'WatchedFileHandler not appropriate for Windows.')
|
@unittest.skipIf(os.name == 'nt', 'WatchedFileHandler not appropriate for Windows.')
|
||||||
|
@unittest.skipIf(
|
||||||
|
support.is_emscripten, "Emscripten cannot fstat unlinked files."
|
||||||
|
)
|
||||||
def test_race(self):
|
def test_race(self):
|
||||||
# Issue #14632 refers.
|
# Issue #14632 refers.
|
||||||
def remove_loop(fname, tries):
|
def remove_loop(fname, tries):
|
||||||
|
@ -1058,6 +1062,7 @@ if hasattr(socket, "AF_UNIX"):
|
||||||
|
|
||||||
# - end of server_helper section
|
# - end of server_helper section
|
||||||
|
|
||||||
|
@support.requires_working_socket()
|
||||||
class SMTPHandlerTest(BaseTest):
|
class SMTPHandlerTest(BaseTest):
|
||||||
# bpo-14314, bpo-19665, bpo-34092: don't wait forever
|
# bpo-14314, bpo-19665, bpo-34092: don't wait forever
|
||||||
TIMEOUT = support.LONG_TIMEOUT
|
TIMEOUT = support.LONG_TIMEOUT
|
||||||
|
@ -1681,6 +1686,7 @@ class ConfigFileTest(BaseTest):
|
||||||
os.unlink(fn)
|
os.unlink(fn)
|
||||||
|
|
||||||
|
|
||||||
|
@support.requires_working_socket()
|
||||||
class SocketHandlerTest(BaseTest):
|
class SocketHandlerTest(BaseTest):
|
||||||
|
|
||||||
"""Test for SocketHandler objects."""
|
"""Test for SocketHandler objects."""
|
||||||
|
@ -1795,6 +1801,7 @@ class UnixSocketHandlerTest(SocketHandlerTest):
|
||||||
SocketHandlerTest.tearDown(self)
|
SocketHandlerTest.tearDown(self)
|
||||||
os_helper.unlink(self.address)
|
os_helper.unlink(self.address)
|
||||||
|
|
||||||
|
@support.requires_working_socket()
|
||||||
class DatagramHandlerTest(BaseTest):
|
class DatagramHandlerTest(BaseTest):
|
||||||
|
|
||||||
"""Test for DatagramHandler."""
|
"""Test for DatagramHandler."""
|
||||||
|
@ -1876,6 +1883,7 @@ class UnixDatagramHandlerTest(DatagramHandlerTest):
|
||||||
DatagramHandlerTest.tearDown(self)
|
DatagramHandlerTest.tearDown(self)
|
||||||
os_helper.unlink(self.address)
|
os_helper.unlink(self.address)
|
||||||
|
|
||||||
|
@support.requires_working_socket()
|
||||||
class SysLogHandlerTest(BaseTest):
|
class SysLogHandlerTest(BaseTest):
|
||||||
|
|
||||||
"""Test for SysLogHandler using UDP."""
|
"""Test for SysLogHandler using UDP."""
|
||||||
|
@ -1985,6 +1993,7 @@ class IPv6SysLogHandlerTest(SysLogHandlerTest):
|
||||||
self.server_class.address_family = socket.AF_INET
|
self.server_class.address_family = socket.AF_INET
|
||||||
super(IPv6SysLogHandlerTest, self).tearDown()
|
super(IPv6SysLogHandlerTest, self).tearDown()
|
||||||
|
|
||||||
|
@support.requires_working_socket()
|
||||||
class HTTPHandlerTest(BaseTest):
|
class HTTPHandlerTest(BaseTest):
|
||||||
"""Test for HTTPHandler."""
|
"""Test for HTTPHandler."""
|
||||||
|
|
||||||
|
@ -3261,6 +3270,7 @@ class ConfigDictTest(BaseTest):
|
||||||
logging.config.stopListening()
|
logging.config.stopListening()
|
||||||
threading_helper.join_thread(t)
|
threading_helper.join_thread(t)
|
||||||
|
|
||||||
|
@support.requires_working_socket()
|
||||||
def test_listen_config_10_ok(self):
|
def test_listen_config_10_ok(self):
|
||||||
with support.captured_stdout() as output:
|
with support.captured_stdout() as output:
|
||||||
self.setup_via_listener(json.dumps(self.config10))
|
self.setup_via_listener(json.dumps(self.config10))
|
||||||
|
@ -3280,6 +3290,7 @@ class ConfigDictTest(BaseTest):
|
||||||
('ERROR', '4'),
|
('ERROR', '4'),
|
||||||
], stream=output)
|
], stream=output)
|
||||||
|
|
||||||
|
@support.requires_working_socket()
|
||||||
def test_listen_config_1_ok(self):
|
def test_listen_config_1_ok(self):
|
||||||
with support.captured_stdout() as output:
|
with support.captured_stdout() as output:
|
||||||
self.setup_via_listener(textwrap.dedent(ConfigFileTest.config1))
|
self.setup_via_listener(textwrap.dedent(ConfigFileTest.config1))
|
||||||
|
@ -3294,6 +3305,7 @@ class ConfigDictTest(BaseTest):
|
||||||
# Original logger output is empty.
|
# Original logger output is empty.
|
||||||
self.assert_log_lines([])
|
self.assert_log_lines([])
|
||||||
|
|
||||||
|
@support.requires_working_socket()
|
||||||
def test_listen_verify(self):
|
def test_listen_verify(self):
|
||||||
|
|
||||||
def verify_fail(stuff):
|
def verify_fail(stuff):
|
||||||
|
|
|
@ -1061,7 +1061,7 @@ class _TestMboxMMDF(_TestSingleFile):
|
||||||
self.assertEqual(contents, f.read())
|
self.assertEqual(contents, f.read())
|
||||||
self._box = self._factory(self._path)
|
self._box = self._factory(self._path)
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(os, 'fork'), "Test needs fork().")
|
@support.requires_fork()
|
||||||
@unittest.skipUnless(hasattr(socket, 'socketpair'), "Test needs socketpair().")
|
@unittest.skipUnless(hasattr(socket, 'socketpair'), "Test needs socketpair().")
|
||||||
def test_lock_conflict(self):
|
def test_lock_conflict(self):
|
||||||
# Fork off a child process that will lock the mailbox temporarily,
|
# Fork off a child process that will lock the mailbox temporarily,
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
from test.support import (requires, _2G, _4G, gc_collect, cpython_only)
|
from test.support import (
|
||||||
|
requires, _2G, _4G, gc_collect, cpython_only, is_emscripten
|
||||||
|
)
|
||||||
from test.support.import_helper import import_module
|
from test.support.import_helper import import_module
|
||||||
from test.support.os_helper import TESTFN, unlink
|
from test.support.os_helper import TESTFN, unlink
|
||||||
import unittest
|
import unittest
|
||||||
|
@ -21,6 +23,12 @@ def random_tagname(length=10):
|
||||||
suffix = ''.join(random.choices(string.ascii_uppercase, k=length))
|
suffix = ''.join(random.choices(string.ascii_uppercase, k=length))
|
||||||
return f'{tagname_prefix}_{suffix}'
|
return f'{tagname_prefix}_{suffix}'
|
||||||
|
|
||||||
|
# Python's mmap module dup()s the file descriptor. Emscripten's FS layer
|
||||||
|
# does not materialize file changes through a dupped fd to a new mmap.
|
||||||
|
if is_emscripten:
|
||||||
|
raise unittest.SkipTest("incompatible with Emscripten's mmap emulation.")
|
||||||
|
|
||||||
|
|
||||||
class MmapTests(unittest.TestCase):
|
class MmapTests(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
|
@ -13,6 +13,7 @@ import linecache
|
||||||
|
|
||||||
from contextlib import ExitStack, redirect_stdout
|
from contextlib import ExitStack, redirect_stdout
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
from test import support
|
||||||
from test.support import os_helper
|
from test.support import os_helper
|
||||||
# This little helper class is essential for testing pdb under doctest.
|
# This little helper class is essential for testing pdb under doctest.
|
||||||
from test.test_doctest import _FakeInput
|
from test.test_doctest import _FakeInput
|
||||||
|
@ -1363,6 +1364,7 @@ def test_pdb_issue_43318():
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@support.requires_subprocess()
|
||||||
class PdbTestCase(unittest.TestCase):
|
class PdbTestCase(unittest.TestCase):
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
os_helper.unlink(os_helper.TESTFN)
|
os_helper.unlink(os_helper.TESTFN)
|
||||||
|
|
|
@ -70,6 +70,7 @@ unittest.main()
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@support.requires_subprocess()
|
||||||
class TestCParser(unittest.TestCase):
|
class TestCParser(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self._backup_config_vars = dict(sysconfig._CONFIG_VARS)
|
self._backup_config_vars = dict(sysconfig._CONFIG_VARS)
|
||||||
|
|
|
@ -364,6 +364,7 @@ class PlatformTest(unittest.TestCase):
|
||||||
# parent
|
# parent
|
||||||
support.wait_process(pid, exitcode=0)
|
support.wait_process(pid, exitcode=0)
|
||||||
|
|
||||||
|
@unittest.skipIf(support.is_emscripten, "Does not apply to Emscripten")
|
||||||
def test_libc_ver(self):
|
def test_libc_ver(self):
|
||||||
# check that libc_ver(executable) doesn't raise an exception
|
# check that libc_ver(executable) doesn't raise an exception
|
||||||
if os.path.isdir(sys.executable) and \
|
if os.path.isdir(sys.executable) and \
|
||||||
|
|
|
@ -7,7 +7,9 @@ import select
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
import unittest
|
import unittest
|
||||||
from test.support import cpython_only, requires_subprocess
|
from test.support import (
|
||||||
|
cpython_only, requires_subprocess, requires_working_socket
|
||||||
|
)
|
||||||
from test.support import threading_helper
|
from test.support import threading_helper
|
||||||
from test.support.os_helper import TESTFN
|
from test.support.os_helper import TESTFN
|
||||||
|
|
||||||
|
@ -17,6 +19,7 @@ try:
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
raise unittest.SkipTest("select.poll not defined")
|
raise unittest.SkipTest("select.poll not defined")
|
||||||
|
|
||||||
|
requires_working_socket(module=True)
|
||||||
|
|
||||||
def find_ready_matching(ready, flag):
|
def find_ready_matching(ready, flag):
|
||||||
match = []
|
match = []
|
||||||
|
|
|
@ -22,6 +22,8 @@ with warnings.catch_warnings():
|
||||||
import asynchat
|
import asynchat
|
||||||
import asyncore
|
import asyncore
|
||||||
|
|
||||||
|
test_support.requires_working_socket(module=True)
|
||||||
|
|
||||||
HOST = socket_helper.HOST
|
HOST = socket_helper.HOST
|
||||||
PORT = 0
|
PORT = 0
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ from test.support import os_helper
|
||||||
from test.support.script_helper import assert_python_ok, assert_python_failure
|
from test.support.script_helper import assert_python_ok, assert_python_failure
|
||||||
from test.support import threading_helper
|
from test.support import threading_helper
|
||||||
from test.support import (reap_children, captured_output, captured_stdout,
|
from test.support import (reap_children, captured_output, captured_stdout,
|
||||||
captured_stderr, requires_docstrings)
|
captured_stderr, is_emscripten, requires_docstrings)
|
||||||
from test.support.os_helper import (TESTFN, rmtree, unlink)
|
from test.support.os_helper import (TESTFN, rmtree, unlink)
|
||||||
from test import pydoc_mod
|
from test import pydoc_mod
|
||||||
|
|
||||||
|
@ -1339,6 +1339,7 @@ foo
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@unittest.skipIf(is_emscripten, "Socket server not available on Emscripten.")
|
||||||
class PydocServerTest(unittest.TestCase):
|
class PydocServerTest(unittest.TestCase):
|
||||||
"""Tests for pydoc._start_server"""
|
"""Tests for pydoc._start_server"""
|
||||||
|
|
||||||
|
|
|
@ -308,6 +308,9 @@ class RobotHandler(BaseHTTPRequestHandler):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@unittest.skipIf(
|
||||||
|
support.is_emscripten, "Socket server not available on Emscripten."
|
||||||
|
)
|
||||||
class PasswordProtectedSiteTestCase(unittest.TestCase):
|
class PasswordProtectedSiteTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
|
@ -7,6 +7,8 @@ import textwrap
|
||||||
import unittest
|
import unittest
|
||||||
from test import support
|
from test import support
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
@unittest.skipIf((sys.platform[:3]=='win'),
|
@unittest.skipIf((sys.platform[:3]=='win'),
|
||||||
"can't easily test on this system")
|
"can't easily test on this system")
|
||||||
class SelectTestCase(unittest.TestCase):
|
class SelectTestCase(unittest.TestCase):
|
||||||
|
|
|
@ -19,6 +19,10 @@ except ImportError:
|
||||||
resource = None
|
resource = None
|
||||||
|
|
||||||
|
|
||||||
|
if support.is_emscripten:
|
||||||
|
raise unittest.SkipTest("Cannot create socketpair on Emscripten.")
|
||||||
|
|
||||||
|
|
||||||
if hasattr(socket, 'socketpair'):
|
if hasattr(socket, 'socketpair'):
|
||||||
socketpair = socket.socketpair
|
socketpair = socket.socketpair
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -29,6 +29,8 @@ with warnings.catch_warnings():
|
||||||
import asyncore
|
import asyncore
|
||||||
import smtpd
|
import smtpd
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
HOST = socket_helper.HOST
|
HOST = socket_helper.HOST
|
||||||
|
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
|
|
|
@ -37,6 +37,8 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
fcntl = None
|
fcntl = None
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
HOST = socket_helper.HOST
|
HOST = socket_helper.HOST
|
||||||
# test unicode string and carriage return
|
# test unicode string and carriage return
|
||||||
MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
|
MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
|
||||||
|
|
|
@ -28,7 +28,7 @@ HOST = socket_helper.HOST
|
||||||
HAVE_UNIX_SOCKETS = hasattr(socket, "AF_UNIX")
|
HAVE_UNIX_SOCKETS = hasattr(socket, "AF_UNIX")
|
||||||
requires_unix_sockets = unittest.skipUnless(HAVE_UNIX_SOCKETS,
|
requires_unix_sockets = unittest.skipUnless(HAVE_UNIX_SOCKETS,
|
||||||
'requires Unix sockets')
|
'requires Unix sockets')
|
||||||
HAVE_FORKING = hasattr(os, "fork")
|
HAVE_FORKING = test.support.has_fork_support
|
||||||
requires_forking = unittest.skipUnless(HAVE_FORKING, 'requires forking')
|
requires_forking = unittest.skipUnless(HAVE_FORKING, 'requires forking')
|
||||||
|
|
||||||
def signal_alarm(n):
|
def signal_alarm(n):
|
||||||
|
|
|
@ -8,6 +8,7 @@ import gc
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
class tracecontext:
|
class tracecontext:
|
||||||
"""Context manager that traces its enter and exit."""
|
"""Context manager that traces its enter and exit."""
|
||||||
|
|
|
@ -8,6 +8,8 @@ from test import support
|
||||||
from test.support import socket_helper
|
from test.support import socket_helper
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
HOST = socket_helper.HOST
|
HOST = socket_helper.HOST
|
||||||
|
|
||||||
def server(evt, serv):
|
def server(evt, serv):
|
||||||
|
|
|
@ -13,6 +13,10 @@ if support.check_sanitizer(address=True, memory=True):
|
||||||
raise unittest.SkipTest("test too slow on ASAN/MSAN build")
|
raise unittest.SkipTest("test too slow on ASAN/MSAN build")
|
||||||
|
|
||||||
|
|
||||||
|
if not support.has_subprocess_support:
|
||||||
|
raise unittest.SkipTest("test module requires subprocess")
|
||||||
|
|
||||||
|
|
||||||
basepath = os.path.normpath(
|
basepath = os.path.normpath(
|
||||||
os.path.dirname( # <src/install dir>
|
os.path.dirname( # <src/install dir>
|
||||||
os.path.dirname( # Lib
|
os.path.dirname( # Lib
|
||||||
|
|
|
@ -24,6 +24,8 @@ from urllib.parse import urlparse
|
||||||
import urllib.error
|
import urllib.error
|
||||||
import http.client
|
import http.client
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
# XXX
|
# XXX
|
||||||
# Request
|
# Request
|
||||||
# CacheFTPHandler (hard to write)
|
# CacheFTPHandler (hard to write)
|
||||||
|
|
|
@ -8,6 +8,7 @@ import threading
|
||||||
import unittest
|
import unittest
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
|
from test import support
|
||||||
from test.support import hashlib_helper
|
from test.support import hashlib_helper
|
||||||
from test.support import threading_helper
|
from test.support import threading_helper
|
||||||
from test.support import warnings_helper
|
from test.support import warnings_helper
|
||||||
|
@ -17,6 +18,8 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
ssl = None
|
ssl = None
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
here = os.path.dirname(__file__)
|
here = os.path.dirname(__file__)
|
||||||
# Self-signed cert file for 'localhost'
|
# Self-signed cert file for 'localhost'
|
||||||
CERT_localhost = os.path.join(here, 'keycert.pem')
|
CERT_localhost = os.path.join(here, 'keycert.pem')
|
||||||
|
|
|
@ -16,7 +16,7 @@ import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
from test.support import (captured_stdout, captured_stderr, requires_zlib,
|
from test.support import (captured_stdout, captured_stderr, requires_zlib,
|
||||||
skip_if_broken_multiprocessing_synchronize, verbose,
|
skip_if_broken_multiprocessing_synchronize, verbose,
|
||||||
requires_subprocess)
|
requires_subprocess, is_emscripten)
|
||||||
from test.support.os_helper import (can_symlink, EnvironmentVarGuard, rmtree)
|
from test.support.os_helper import (can_symlink, EnvironmentVarGuard, rmtree)
|
||||||
import unittest
|
import unittest
|
||||||
import venv
|
import venv
|
||||||
|
@ -34,6 +34,9 @@ requireVenvCreate = unittest.skipUnless(
|
||||||
or sys._base_executable != sys.executable,
|
or sys._base_executable != sys.executable,
|
||||||
'cannot run venv.create from within a venv on this platform')
|
'cannot run venv.create from within a venv on this platform')
|
||||||
|
|
||||||
|
if is_emscripten:
|
||||||
|
raise unittest.SkipTest("venv is not available on Emscripten.")
|
||||||
|
|
||||||
@requires_subprocess()
|
@requires_subprocess()
|
||||||
def check_output(cmd, encoding=None):
|
def check_output(cmd, encoding=None):
|
||||||
p = subprocess.Popen(cmd,
|
p = subprocess.Popen(cmd,
|
||||||
|
|
|
@ -9,8 +9,8 @@ import unittest
|
||||||
from test.fork_wait import ForkWait
|
from test.fork_wait import ForkWait
|
||||||
from test import support
|
from test import support
|
||||||
|
|
||||||
if not hasattr(os, 'fork'):
|
if not support.has_fork_support:
|
||||||
raise unittest.SkipTest("os.fork not defined")
|
raise unittest.SkipTest("requires working os.fork()")
|
||||||
|
|
||||||
if not hasattr(os, 'wait3'):
|
if not hasattr(os, 'wait3'):
|
||||||
raise unittest.SkipTest("os.wait3 not defined")
|
raise unittest.SkipTest("os.wait3 not defined")
|
||||||
|
|
|
@ -9,7 +9,9 @@ from test.fork_wait import ForkWait
|
||||||
from test import support
|
from test import support
|
||||||
|
|
||||||
# If either of these do not exist, skip this test.
|
# If either of these do not exist, skip this test.
|
||||||
support.get_attribute(os, 'fork')
|
if not support.has_fork_support:
|
||||||
|
raise unittest.SkipTest("requires working os.fork()")
|
||||||
|
|
||||||
support.get_attribute(os, 'wait4')
|
support.get_attribute(os, 'wait4')
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,8 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
gzip = None
|
gzip = None
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
alist = [{'astring': 'foo@bar.baz.spam',
|
alist = [{'astring': 'foo@bar.baz.spam',
|
||||||
'afloat': 7283.43,
|
'afloat': 7283.43,
|
||||||
'anint': 2**20,
|
'anint': 2**20,
|
||||||
|
|
|
@ -11,7 +11,10 @@ def suite():
|
||||||
for fn in os.listdir(here):
|
for fn in os.listdir(here):
|
||||||
if fn.startswith("test") and fn.endswith(".py"):
|
if fn.startswith("test") and fn.endswith(".py"):
|
||||||
modname = "unittest.test." + fn[:-3]
|
modname = "unittest.test." + fn[:-3]
|
||||||
__import__(modname)
|
try:
|
||||||
|
__import__(modname)
|
||||||
|
except unittest.SkipTest:
|
||||||
|
continue
|
||||||
module = sys.modules[modname]
|
module = sys.modules[modname]
|
||||||
suite.addTest(loader.loadTestsFromModule(module))
|
suite.addTest(loader.loadTestsFromModule(module))
|
||||||
suite.addTest(loader.loadTestsFromName('unittest.test.testmock'))
|
suite.addTest(loader.loadTestsFromName('unittest.test.testmock'))
|
||||||
|
|
|
@ -3,6 +3,8 @@ import contextvars
|
||||||
import unittest
|
import unittest
|
||||||
from test import support
|
from test import support
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
|
|
||||||
class MyException(Exception):
|
class MyException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -196,6 +196,7 @@ class FakeRunner(object):
|
||||||
return RESULT
|
return RESULT
|
||||||
|
|
||||||
|
|
||||||
|
@support.requires_subprocess()
|
||||||
class TestCommandLineArgs(unittest.TestCase):
|
class TestCommandLineArgs(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
|
@ -3,6 +3,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import pickle
|
import pickle
|
||||||
import subprocess
|
import subprocess
|
||||||
|
from test import support
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
from unittest.case import _Outcome
|
from unittest.case import _Outcome
|
||||||
|
@ -1139,6 +1140,7 @@ class Test_TextTestRunner(unittest.TestCase):
|
||||||
expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
|
expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
|
||||||
self.assertEqual(runner._makeResult(), expectedresult)
|
self.assertEqual(runner._makeResult(), expectedresult)
|
||||||
|
|
||||||
|
@support.requires_subprocess()
|
||||||
def test_warnings(self):
|
def test_warnings(self):
|
||||||
"""
|
"""
|
||||||
Check that warnings argument of TextTestRunner correctly affects the
|
Check that warnings argument of TextTestRunner correctly affects the
|
||||||
|
|
|
@ -4,6 +4,9 @@ import inspect
|
||||||
import re
|
import re
|
||||||
import unittest
|
import unittest
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
from test import support
|
||||||
|
|
||||||
|
support.requires_working_socket(module=True)
|
||||||
|
|
||||||
from asyncio import run, iscoroutinefunction
|
from asyncio import run, iscoroutinefunction
|
||||||
from unittest import IsolatedAsyncioTestCase
|
from unittest import IsolatedAsyncioTestCase
|
||||||
|
|
|
@ -2352,7 +2352,7 @@ clean-retain-profile: pycremoval
|
||||||
-rm -f pybuilddir.txt
|
-rm -f pybuilddir.txt
|
||||||
-rm -f Lib/lib2to3/*Grammar*.pickle
|
-rm -f Lib/lib2to3/*Grammar*.pickle
|
||||||
-rm -f _bootstrap_python
|
-rm -f _bootstrap_python
|
||||||
-rm -f python.html python*.js python.data
|
-rm -f python.html python*.js python.data python*.symbols python*.map
|
||||||
-rm -rf $(WASM_STDLIB)
|
-rm -rf $(WASM_STDLIB)
|
||||||
-rm -f Programs/_testembed Programs/_freeze_module
|
-rm -f Programs/_testembed Programs/_freeze_module
|
||||||
-rm -f Python/deepfreeze/*.[co]
|
-rm -f Python/deepfreeze/*.[co]
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
The test suite is now passing on the Emscripten platform. All fork, socket,
|
||||||
|
and subprocess-based tests are skipped.
|
|
@ -7396,6 +7396,13 @@ $as_echo "$as_me: llvm-ar found via xcrun: ${LLVM_AR}" >&6;}
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
*emcc*)
|
||||||
|
if test "$Py_LTO_POLICY" != "default"; then
|
||||||
|
as_fn_error $? "emcc supports only default lto." "$LINENO" 5
|
||||||
|
fi
|
||||||
|
LTOFLAGS="-flto"
|
||||||
|
LTOCFLAGS="-flto"
|
||||||
|
;;
|
||||||
*gcc*)
|
*gcc*)
|
||||||
if test $Py_LTO_POLICY = thin
|
if test $Py_LTO_POLICY = thin
|
||||||
then
|
then
|
||||||
|
@ -7717,17 +7724,34 @@ then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# WASM flags
|
# WASM flags
|
||||||
|
# TODO: Add -s MAIN_MODULE=2 for dlopen() support.
|
||||||
|
# The option disables code elimination, which increases code size of main
|
||||||
|
# binary. All objects must be built with -fPIC.
|
||||||
case $ac_sys_system/$ac_sys_emscripten_target in #(
|
case $ac_sys_system/$ac_sys_emscripten_target in #(
|
||||||
Emscripten/browser) :
|
Emscripten/browser) :
|
||||||
|
|
||||||
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 --preload-file \$(WASM_ASSETS_DIR)"
|
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ALLOW_MEMORY_GROWTH=1"
|
||||||
|
LINKFORSHARED="--preload-file \$(WASM_ASSETS_DIR)"
|
||||||
WASM_ASSETS_DIR=".\$(prefix)"
|
WASM_ASSETS_DIR=".\$(prefix)"
|
||||||
WASM_STDLIB="\$(WASM_ASSETS_DIR)/local/lib/python\$(VERSION)/os.py"
|
WASM_STDLIB="\$(WASM_ASSETS_DIR)/local/lib/python\$(VERSION)/os.py"
|
||||||
|
if test "$Py_DEBUG" = 'true'; then
|
||||||
|
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ASSERTIONS=1"
|
||||||
|
LINKFORSHARED="$LINKFORSHARED -gsource-map --emit-symbol-map"
|
||||||
|
else
|
||||||
|
LINKFORSHARED="$LINKFORSHARED -O2 -g0"
|
||||||
|
fi
|
||||||
;; #(
|
;; #(
|
||||||
Emscripten/node) :
|
Emscripten/node) :
|
||||||
|
|
||||||
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 -s NODERAWFS=1 -s EXIT_RUNTIME=1 -s USE_PTHREADS -s PROXY_TO_PTHREAD"
|
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ALLOW_MEMORY_GROWTH=1 -s NODERAWFS=1 -s USE_PTHREADS=1"
|
||||||
|
LINKFORSHARED="-s PROXY_TO_PTHREAD=1 -s EXIT_RUNTIME=1"
|
||||||
CFLAGS_NODIST="$CFLAGS_NODIST -pthread"
|
CFLAGS_NODIST="$CFLAGS_NODIST -pthread"
|
||||||
|
if test "$Py_DEBUG" = 'true'; then
|
||||||
|
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ASSERTIONS=1"
|
||||||
|
LINKFORSHARED="$LINKFORSHARED -gseparate-dwarf --emit-symbol-map"
|
||||||
|
else
|
||||||
|
LINKFORSHARED="$LINKFORSHARED -O2 -gseparate-dwarf"
|
||||||
|
fi
|
||||||
;; #(
|
;; #(
|
||||||
WASI/*) :
|
WASI/*) :
|
||||||
|
|
||||||
|
@ -10403,6 +10427,10 @@ then
|
||||||
Linux*|GNU*|QNX*|VxWorks*|Haiku*)
|
Linux*|GNU*|QNX*|VxWorks*|Haiku*)
|
||||||
LDSHARED='$(CC) -shared'
|
LDSHARED='$(CC) -shared'
|
||||||
LDCXXSHARED='$(CXX) -shared';;
|
LDCXXSHARED='$(CXX) -shared';;
|
||||||
|
Emscripten*)
|
||||||
|
LDSHARED='$(CC) -shared -s SIDE_MODULE=1'
|
||||||
|
LDCXXSHARED='$(CXX) -shared -s SIDE_MODULE=1'
|
||||||
|
;;
|
||||||
FreeBSD*)
|
FreeBSD*)
|
||||||
if [ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]
|
if [ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]
|
||||||
then
|
then
|
||||||
|
@ -15063,6 +15091,10 @@ $as_echo "yes" >&6; }
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "$have_zlib" = "yes" -a "$ac_sys_system" = "Emscripten" -a "$ZLIB_LIBS" = "-lz"; then
|
||||||
|
ZLIB_LIBS="-s USE_ZLIB=1"
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$have_zlib" = xyes; then :
|
if test "x$have_zlib" = xyes; then :
|
||||||
|
|
||||||
BINASCII_CFLAGS="-DUSE_ZLIB_CRC32 $ZLIB_CFLAGS"
|
BINASCII_CFLAGS="-DUSE_ZLIB_CRC32 $ZLIB_CFLAGS"
|
||||||
|
@ -15292,6 +15324,11 @@ $as_echo "yes" >&6; }
|
||||||
have_bzip2=yes
|
have_bzip2=yes
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "$have_bzip2" = "yes" -a "$ac_sys_system" = "Emscripten" -a "$BZIP2_LIBS" = "-lbz2"; then
|
||||||
|
BZIP2_LIBS="-s USE_BZIP2=1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pkg_failed=no
|
pkg_failed=no
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBLZMA" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBLZMA" >&5
|
||||||
|
|
42
configure.ac
42
configure.ac
|
@ -1659,6 +1659,13 @@ if test "$Py_LTO" = 'true' ; then
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
*emcc*)
|
||||||
|
if test "$Py_LTO_POLICY" != "default"; then
|
||||||
|
AC_MSG_ERROR([emcc supports only default lto.])
|
||||||
|
fi
|
||||||
|
LTOFLAGS="-flto"
|
||||||
|
LTOCFLAGS="-flto"
|
||||||
|
;;
|
||||||
*gcc*)
|
*gcc*)
|
||||||
if test $Py_LTO_POLICY = thin
|
if test $Py_LTO_POLICY = thin
|
||||||
then
|
then
|
||||||
|
@ -1861,15 +1868,33 @@ then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# WASM flags
|
# WASM flags
|
||||||
|
# TODO: Add -s MAIN_MODULE=2 for dlopen() support.
|
||||||
|
# The option disables code elimination, which increases code size of main
|
||||||
|
# binary. All objects must be built with -fPIC.
|
||||||
AS_CASE([$ac_sys_system/$ac_sys_emscripten_target],
|
AS_CASE([$ac_sys_system/$ac_sys_emscripten_target],
|
||||||
[Emscripten/browser], [
|
[Emscripten/browser], [
|
||||||
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 --preload-file \$(WASM_ASSETS_DIR)"
|
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ALLOW_MEMORY_GROWTH=1"
|
||||||
|
LINKFORSHARED="--preload-file \$(WASM_ASSETS_DIR)"
|
||||||
WASM_ASSETS_DIR=".\$(prefix)"
|
WASM_ASSETS_DIR=".\$(prefix)"
|
||||||
WASM_STDLIB="\$(WASM_ASSETS_DIR)/local/lib/python\$(VERSION)/os.py"
|
WASM_STDLIB="\$(WASM_ASSETS_DIR)/local/lib/python\$(VERSION)/os.py"
|
||||||
|
dnl separate-dwarf does not seem to work in Chrome DevTools Support.
|
||||||
|
if test "$Py_DEBUG" = 'true'; then
|
||||||
|
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ASSERTIONS=1"
|
||||||
|
LINKFORSHARED="$LINKFORSHARED -gsource-map --emit-symbol-map"
|
||||||
|
else
|
||||||
|
LINKFORSHARED="$LINKFORSHARED -O2 -g0"
|
||||||
|
fi
|
||||||
],
|
],
|
||||||
[Emscripten/node], [
|
[Emscripten/node], [
|
||||||
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 -s NODERAWFS=1 -s EXIT_RUNTIME=1 -s USE_PTHREADS -s PROXY_TO_PTHREAD"
|
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ALLOW_MEMORY_GROWTH=1 -s NODERAWFS=1 -s USE_PTHREADS=1"
|
||||||
|
LINKFORSHARED="-s PROXY_TO_PTHREAD=1 -s EXIT_RUNTIME=1"
|
||||||
CFLAGS_NODIST="$CFLAGS_NODIST -pthread"
|
CFLAGS_NODIST="$CFLAGS_NODIST -pthread"
|
||||||
|
if test "$Py_DEBUG" = 'true'; then
|
||||||
|
LDFLAGS_NODIST="$LDFLAGS_NODIST -s ASSERTIONS=1"
|
||||||
|
LINKFORSHARED="$LINKFORSHARED -gseparate-dwarf --emit-symbol-map"
|
||||||
|
else
|
||||||
|
LINKFORSHARED="$LINKFORSHARED -O2 -gseparate-dwarf"
|
||||||
|
fi
|
||||||
],
|
],
|
||||||
[WASI/*], [
|
[WASI/*], [
|
||||||
AC_DEFINE([_WASI_EMULATED_SIGNAL], [1], [Define to 1 if you want to emulate signals on WASI])
|
AC_DEFINE([_WASI_EMULATED_SIGNAL], [1], [Define to 1 if you want to emulate signals on WASI])
|
||||||
|
@ -2880,6 +2905,10 @@ then
|
||||||
Linux*|GNU*|QNX*|VxWorks*|Haiku*)
|
Linux*|GNU*|QNX*|VxWorks*|Haiku*)
|
||||||
LDSHARED='$(CC) -shared'
|
LDSHARED='$(CC) -shared'
|
||||||
LDCXXSHARED='$(CXX) -shared';;
|
LDCXXSHARED='$(CXX) -shared';;
|
||||||
|
Emscripten*)
|
||||||
|
LDSHARED='$(CC) -shared -s SIDE_MODULE=1'
|
||||||
|
LDCXXSHARED='$(CXX) -shared -s SIDE_MODULE=1'
|
||||||
|
;;
|
||||||
FreeBSD*)
|
FreeBSD*)
|
||||||
if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
|
if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
|
||||||
then
|
then
|
||||||
|
@ -4354,6 +4383,10 @@ PKG_CHECK_MODULES([ZLIB], [zlib >= 1.2.0], [
|
||||||
], [have_zlib=no])
|
], [have_zlib=no])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
if test "$have_zlib" = "yes" -a "$ac_sys_system" = "Emscripten" -a "$ZLIB_LIBS" = "-lz"; then
|
||||||
|
ZLIB_LIBS="-s USE_ZLIB=1"
|
||||||
|
fi
|
||||||
|
|
||||||
dnl binascii can use zlib for optimized crc32.
|
dnl binascii can use zlib for optimized crc32.
|
||||||
AS_VAR_IF([have_zlib], [yes], [
|
AS_VAR_IF([have_zlib], [yes], [
|
||||||
BINASCII_CFLAGS="-DUSE_ZLIB_CRC32 $ZLIB_CFLAGS"
|
BINASCII_CFLAGS="-DUSE_ZLIB_CRC32 $ZLIB_CFLAGS"
|
||||||
|
@ -4372,6 +4405,11 @@ PKG_CHECK_MODULES([BZIP2], [bzip2], [have_bzip2=yes], [
|
||||||
], [have_bzip2=no])
|
], [have_bzip2=no])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
if test "$have_bzip2" = "yes" -a "$ac_sys_system" = "Emscripten" -a "$BZIP2_LIBS" = "-lbz2"; then
|
||||||
|
BZIP2_LIBS="-s USE_BZIP2=1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES([LIBLZMA], [liblzma], [have_liblzma=yes], [
|
PKG_CHECK_MODULES([LIBLZMA], [liblzma], [have_liblzma=yes], [
|
||||||
AC_CHECK_HEADERS([lzma.h], [
|
AC_CHECK_HEADERS([lzma.h], [
|
||||||
WITH_SAVE_ENV([
|
WITH_SAVE_ENV([
|
||||||
|
|
5
setup.py
5
setup.py
|
@ -84,10 +84,15 @@ CYGWIN = (HOST_PLATFORM == 'cygwin')
|
||||||
MACOS = (HOST_PLATFORM == 'darwin')
|
MACOS = (HOST_PLATFORM == 'darwin')
|
||||||
AIX = (HOST_PLATFORM.startswith('aix'))
|
AIX = (HOST_PLATFORM.startswith('aix'))
|
||||||
VXWORKS = ('vxworks' in HOST_PLATFORM)
|
VXWORKS = ('vxworks' in HOST_PLATFORM)
|
||||||
|
EMSCRIPTEN = HOST_PLATFORM == 'emscripten-wasm32'
|
||||||
CC = os.environ.get("CC")
|
CC = os.environ.get("CC")
|
||||||
if not CC:
|
if not CC:
|
||||||
CC = sysconfig.get_config_var("CC")
|
CC = sysconfig.get_config_var("CC")
|
||||||
|
|
||||||
|
if EMSCRIPTEN:
|
||||||
|
# emcc is a Python script from a different Python interpreter.
|
||||||
|
os.environ.pop("PYTHONPATH", None)
|
||||||
|
|
||||||
|
|
||||||
SUMMARY = """
|
SUMMARY = """
|
||||||
Python is an interpreted, interactive, object-oriented programming
|
Python is an interpreted, interactive, object-oriented programming
|
||||||
|
|
Loading…
Reference in New Issue