mirror of https://github.com/pyodide/pyodide.git
Merge pull request #231 from rth/skip-c-extension-build-target
Fix Skip building C extensions for the target env
This commit is contained in:
commit
a954de100e
|
@ -90,6 +90,17 @@ source tree (the expanded tarball).
|
||||||
|
|
||||||
### `build`
|
### `build`
|
||||||
|
|
||||||
|
#### `build/skip_host`
|
||||||
|
|
||||||
|
Skip building C extensions for the host environment. Default: `True`.
|
||||||
|
|
||||||
|
Setting this to `False` will result in ~2x slower builds for packages that
|
||||||
|
include C extensions. It should only be needed when a package is a build
|
||||||
|
time dependency for other packages. For instance, numpy is imported during
|
||||||
|
installation of matplotlib, importing numpy also imports included C extensions,
|
||||||
|
therefore it is built both for host and target.
|
||||||
|
|
||||||
|
|
||||||
#### `build/cflags`
|
#### `build/cflags`
|
||||||
|
|
||||||
Extra arguments to pass to the compiler when building for WebAssembly.
|
Extra arguments to pass to the compiler when building for WebAssembly.
|
||||||
|
|
|
@ -18,6 +18,7 @@ source:
|
||||||
- patches/fix-install-with-skip-build.patch
|
- patches/fix-install-with-skip-build.patch
|
||||||
|
|
||||||
build:
|
build:
|
||||||
|
skip_host: False
|
||||||
cflags: -include math.h -I../../config
|
cflags: -include math.h -I../../config
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,10 @@ def compile(path, srcpath, pkg, args):
|
||||||
|
|
||||||
orig_dir = Path.cwd()
|
orig_dir = Path.cwd()
|
||||||
os.chdir(srcpath)
|
os.chdir(srcpath)
|
||||||
|
env = dict(os.environ)
|
||||||
|
if pkg.get('build', {}).get('skip_host', True):
|
||||||
|
env['SKIP_HOST'] = ''
|
||||||
|
|
||||||
try:
|
try:
|
||||||
subprocess.run([
|
subprocess.run([
|
||||||
str(Path(args.host) / 'bin' / 'python3'),
|
str(Path(args.host) / 'bin' / 'python3'),
|
||||||
|
@ -93,7 +97,7 @@ def compile(path, srcpath, pkg, args):
|
||||||
args.ldflags + ' ' +
|
args.ldflags + ' ' +
|
||||||
pkg.get('build', {}).get('ldflags', ''),
|
pkg.get('build', {}).get('ldflags', ''),
|
||||||
'--host', args.host,
|
'--host', args.host,
|
||||||
'--target', args.target], check=True)
|
'--target', args.target], env=env, check=True)
|
||||||
finally:
|
finally:
|
||||||
os.chdir(orig_dir)
|
os.chdir(orig_dir)
|
||||||
|
|
||||||
|
|
|
@ -60,10 +60,37 @@ def collect_args(basename):
|
||||||
path = path.replace(str(ROOTDIR) + ':', '')
|
path = path.replace(str(ROOTDIR) + ':', '')
|
||||||
env['PATH'] = path
|
env['PATH'] = path
|
||||||
|
|
||||||
|
skip_host = 'SKIP_HOST' in os.environ
|
||||||
|
|
||||||
|
# Skip compilations of C/Fortran extensions for the target environement.
|
||||||
|
# We still need to generate the output files for distutils to continue
|
||||||
|
# the build.
|
||||||
|
# TODO: This may need slight tuning for new projects. In particular,
|
||||||
|
# currently ar is not skipped, so a known failure would happen when
|
||||||
|
# we create some object files (that are empty as gcc is skipped), on
|
||||||
|
# which we run the actual ar command.
|
||||||
|
skip = False
|
||||||
|
if (basename in ['gcc', 'cc', 'c++', 'gfortran', 'ld']
|
||||||
|
and '-o' in sys.argv[1:]
|
||||||
|
# do not skip numpy as it is needed as build time
|
||||||
|
# dependency by other packages (e.g. matplotlib)
|
||||||
|
and skip_host):
|
||||||
|
out_idx = sys.argv.index('-o')
|
||||||
|
if (out_idx + 1) < len(sys.argv):
|
||||||
|
# get the index of the output file path
|
||||||
|
out_idx += 1
|
||||||
|
with open(sys.argv[out_idx], 'wb') as fh:
|
||||||
|
fh.write(b'')
|
||||||
|
skip = True
|
||||||
|
|
||||||
with open('build.log', 'a') as fd:
|
with open('build.log', 'a') as fd:
|
||||||
|
# TODO: store skip status in the build.log
|
||||||
json.dump([basename] + sys.argv[1:], fd)
|
json.dump([basename] + sys.argv[1:], fd)
|
||||||
fd.write('\n')
|
fd.write('\n')
|
||||||
|
|
||||||
|
if skip:
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
sys.exit(
|
sys.exit(
|
||||||
subprocess.run(
|
subprocess.run(
|
||||||
[basename] + sys.argv[1:],
|
[basename] + sys.argv[1:],
|
||||||
|
|
|
@ -27,6 +27,18 @@ UNSUPPORTED_PACKAGES = {'chrome': ['pandas'],
|
||||||
'firefox': []}
|
'firefox': []}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('name', registered_packages())
|
||||||
|
def test_parse_package(name):
|
||||||
|
# check that we can parse the meta.yaml
|
||||||
|
meta = parse_package(PKG_DIR / name / 'meta.yaml')
|
||||||
|
|
||||||
|
skip_host = meta.get('build', {}).get('skip_host', True)
|
||||||
|
if name == 'numpy':
|
||||||
|
assert skip_host is False
|
||||||
|
elif name == 'pandas':
|
||||||
|
assert skip_host is True
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('name', registered_packages())
|
@pytest.mark.parametrize('name', registered_packages())
|
||||||
def test_import(name, selenium_standalone):
|
def test_import(name, selenium_standalone):
|
||||||
# check that we can parse the meta.yaml
|
# check that we can parse the meta.yaml
|
||||||
|
|
Loading…
Reference in New Issue