aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2020-03-08 14:04:48 +0200
committerGitHub <noreply@github.com>2020-03-08 14:04:48 +0200
commit7234316dc7784667443d358b0d2c3e2ff561b474 (patch)
treefbf0413aaa221acd2a8437b75cf5dd349471563c /mesonbuild
parenta16db4e9185fcf060ea3e336cbffbe16018be934 (diff)
parent654f427759d5aa3be55d8929b18c17a2b8fcac69 (diff)
downloadmeson-7234316dc7784667443d358b0d2c3e2ff561b474.zip
meson-7234316dc7784667443d358b0d2c3e2ff561b474.tar.gz
meson-7234316dc7784667443d358b0d2c3e2ff561b474.tar.bz2
Merge pull request #6688 from dcbaker/emcc-linker-bugs
Emcc linker bugs and improvments
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/compilers/c.py4
-rw-r--r--mesonbuild/compilers/cpp.py4
-rw-r--r--mesonbuild/compilers/mixins/emscripten.py29
-rw-r--r--mesonbuild/compilers/mixins/islinker.py9
-rw-r--r--mesonbuild/environment.py12
-rw-r--r--mesonbuild/linkers.py29
6 files changed, 71 insertions, 16 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py
index a9ad585..f98316b 100644
--- a/mesonbuild/compilers/c.py
+++ b/mesonbuild/compilers/c.py
@@ -27,7 +27,7 @@ from .mixins.intel import IntelGnuLikeCompiler, IntelVisualStudioLikeCompiler
from .mixins.clang import ClangCompiler
from .mixins.elbrus import ElbrusCompiler
from .mixins.pgi import PGICompiler
-from .mixins.islinker import BasicLinkerIsCompilerMixin, LinkerEnvVarsMixin
+from .mixins.islinker import LinkerEnvVarsMixin
from .mixins.emscripten import EmscriptenMixin
from .compilers import (
gnu_winlibs,
@@ -139,7 +139,7 @@ class AppleClangCCompiler(ClangCCompiler):
_C18_VERSION = '>=11.0.0'
-class EmscriptenCCompiler(LinkerEnvVarsMixin, EmscriptenMixin, BasicLinkerIsCompilerMixin, ClangCCompiler):
+class EmscriptenCCompiler(EmscriptenMixin, LinkerEnvVarsMixin, ClangCCompiler):
def __init__(self, exelist, version, for_machine: MachineChoice,
is_cross: bool, info: 'MachineInfo', exe_wrapper=None, **kwargs):
if not is_cross:
diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py
index 26b34e3..2470bd5 100644
--- a/mesonbuild/compilers/cpp.py
+++ b/mesonbuild/compilers/cpp.py
@@ -36,7 +36,7 @@ from .mixins.intel import IntelGnuLikeCompiler, IntelVisualStudioLikeCompiler
from .mixins.clang import ClangCompiler
from .mixins.elbrus import ElbrusCompiler
from .mixins.pgi import PGICompiler
-from .mixins.islinker import BasicLinkerIsCompilerMixin, LinkerEnvVarsMixin
+from .mixins.islinker import LinkerEnvVarsMixin
from .mixins.emscripten import EmscriptenMixin
if T.TYPE_CHECKING:
@@ -207,7 +207,7 @@ class AppleClangCPPCompiler(ClangCPPCompiler):
pass
-class EmscriptenCPPCompiler(LinkerEnvVarsMixin, EmscriptenMixin, BasicLinkerIsCompilerMixin, ClangCPPCompiler):
+class EmscriptenCPPCompiler(EmscriptenMixin, LinkerEnvVarsMixin, ClangCPPCompiler):
def __init__(self, exelist, version, for_machine: MachineChoice,
is_cross: bool, info: 'MachineInfo', exe_wrapper=None, **kwargs):
if not is_cross:
diff --git a/mesonbuild/compilers/mixins/emscripten.py b/mesonbuild/compilers/mixins/emscripten.py
index 945a67d..10f4b25 100644
--- a/mesonbuild/compilers/mixins/emscripten.py
+++ b/mesonbuild/compilers/mixins/emscripten.py
@@ -17,20 +17,13 @@
import os.path
import typing as T
-from ...mesonlib import MesonException
+from ... import coredata
-class EmscriptenMixin:
- def get_option_link_args(self, options):
- return []
-
- def get_soname_args(self, *args, **kwargs):
- raise MesonException('Emscripten does not support shared libraries.')
+if T.TYPE_CHECKING:
+ from ..environment import Environment
- def get_allow_undefined_link_args(self) -> T.List[str]:
- return ['-s', 'ERROR_ON_UNDEFINED_SYMBOLS=0']
- def get_linker_output_args(self, output: str) -> T.List[str]:
- return ['-o', output]
+class EmscriptenMixin:
def _get_compile_output(self, dirname, mode):
# In pre-processor mode, the output is sent to stdout and discarded
@@ -44,3 +37,17 @@ class EmscriptenMixin:
else:
suffix = 'wasm'
return os.path.join(dirname, 'output.' + suffix)
+
+ def thread_flags(self, env: 'Environment') -> T.List[str]:
+ return ['-s', 'USE_PTHREADS=1']
+
+ def get_options(self):
+ opts = super().get_options()
+ opts.update({
+ '{}_thread_count'.format(self.language): coredata.UserIntegerOption(
+ 'Number of threads to use in web assembly, set to 0 to disable',
+ (0, None, 4), # Default was picked at random
+ ),
+ })
+
+ return opts
diff --git a/mesonbuild/compilers/mixins/islinker.py b/mesonbuild/compilers/mixins/islinker.py
index 4e0af88..3092395 100644
--- a/mesonbuild/compilers/mixins/islinker.py
+++ b/mesonbuild/compilers/mixins/islinker.py
@@ -130,3 +130,12 @@ class BasicLinkerIsCompilerMixin:
def get_buildtype_linker_args(self, buildtype: str) -> T.List[str]:
return []
+
+ def get_link_debugfile_name(self, target: str) -> str:
+ return ''
+
+ def thread_flags(self, env: 'Environment') -> T.List[str]:
+ return []
+
+ def thread_link_flags(self, env: 'Environment') -> T.List[str]:
+ return []
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index 5e60294..7fda3be 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -58,6 +58,7 @@ from .linkers import (
XilinkDynamicLinker,
CudaLinker,
VisualStudioLikeLinkerMixin,
+ WASMDynamicLinker,
)
from functools import lru_cache
from .compilers import (
@@ -963,9 +964,18 @@ class Environment:
if 'Emscripten' in out:
cls = EmscriptenCCompiler if lang == 'c' else EmscriptenCPPCompiler
self.coredata.add_lang_args(cls.language, cls, for_machine, self)
+ # emcc cannot be queried to get the version out of it (it
+ # ignores -Wl,--version and doesn't have an alternative).
+ # Further, wasm-id *is* lld and will return `LLD X.Y.Z` if you
+ # call `wasm-ld --version`, but a special version of lld that
+ # takes different options.
+ p, o, _ = Popen_safe(['wasm-ld', '--version'])
+ linker = WASMDynamicLinker(
+ compiler, for_machine, cls.LINKER_PREFIX,
+ [], version=search_version(o))
return cls(
ccache + compiler, version, for_machine, is_cross, info,
- exe_wrap, full_version=full_version)
+ exe_wrap, linker=linker, full_version=full_version)
if 'armclang' in out:
# The compiler version is not present in the first line of output,
diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py
index 489525b..73cdeef 100644
--- a/mesonbuild/linkers.py
+++ b/mesonbuild/linkers.py
@@ -693,6 +693,35 @@ class LLVMDynamicLinker(GnuLikeDynamicLinkerMixin, PosixDynamicLinkerMixin, Dyna
return []
+class WASMDynamicLinker(GnuLikeDynamicLinkerMixin, PosixDynamicLinkerMixin, DynamicLinker):
+
+ """Emscripten's wasm-ld."""
+
+ def __init__(self, *args, **kwargs):
+ super().__init__('ld.wasm', *args, **kwargs)
+
+ def thread_link_flags(self, env: 'Environment') -> T.List[str]:
+ args = ['-s', 'USE_PTHREADS=1']
+ count = env.coredata.compiler_options[self.for_machine]['{}_thread_count'.format(self.language)].value # type: int
+ if count:
+ args.extend(['-s', 'PTHREAD_POOL_SIZE={}'.format(count)])
+ return args
+
+ def get_allow_undefined_args(self) -> T.List[str]:
+ return ['-s', 'ERROR_ON_UNDEFINED_SYMBOLS=0']
+
+ def no_undefined_args(self) -> T.List[str]:
+ return ['-s', 'ERROR_ON_UNDEFINED_SYMBOLS=1']
+
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str],
+ is_shared_module: bool) -> T.List[str]:
+ raise mesonlib.MesonException('{} does not support shared libraries.'.format(self.id))
+
+ def get_asneeded_args(self) -> T.List[str]:
+ return []
+
+
class CcrxDynamicLinker(DynamicLinker):
"""Linker for Renesis CCrx compiler."""