forked from emscripten-core/emscripten
-
Notifications
You must be signed in to change notification settings - Fork 0
/
emcmake.py
executable file
·65 lines (53 loc) · 2.29 KB
/
emcmake.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python3
# Copyright 2016 The Emscripten Authors. All rights reserved.
# Emscripten is available under two separate licenses, the MIT license and the
# University of Illinois/NCSA Open Source License. Both these licenses can be
# found in the LICENSE file.
import os
import sys
from tools import shared
from tools import config
from tools import utils
from subprocess import CalledProcessError
#
# Main run() function
#
def run():
if len(sys.argv) < 2 or sys.argv[1] in ('--version', '--help'):
print('''\
emcmake is a helper for cmake, setting various environment
variables so that emcc etc. are used. Typical usage:
emcmake cmake [FLAGS]
''', file=sys.stderr)
return 1
args = sys.argv[1:]
def has_substr(args, substr):
return any(substr in s for s in args)
# Append the Emscripten toolchain file if the user didn't specify one.
if not has_substr(args, '-DCMAKE_TOOLCHAIN_FILE') and 'CMAKE_TOOLCHAIN_FILE' not in os.environ:
args.append('-DCMAKE_TOOLCHAIN_FILE=' + utils.path_from_root('cmake/Modules/Platform/Emscripten.cmake'))
if not has_substr(args, '-DCMAKE_CROSSCOMPILING_EMULATOR'):
node_js = config.NODE_JS[0]
# In order to allow cmake to run code built with pthreads we need to pass some extra flags to node.
# Note that we also need --experimental-wasm-bulk-memory which is true by default and hence not added here
# See https://github.com/emscripten-core/emscripten/issues/15522
args.append(f'-DCMAKE_CROSSCOMPILING_EMULATOR={node_js};--experimental-wasm-threads')
# On Windows specify MinGW Makefiles or ninja if we have them and no other
# toolchain was specified, to keep CMake from pulling in a native Visual
# Studio, or Unix Makefiles.
if utils.WINDOWS and not any(arg.startswith('-G') for arg in args):
if utils.which('mingw32-make'):
args += ['-G', 'MinGW Makefiles']
elif utils.which('ninja'):
args += ['-G', 'Ninja']
else:
print('emcmake: no compatible cmake generator found; Please install ninja or mingw32-make, or specify a generator explicitly using -G', file=sys.stderr)
return 1
print('configure: ' + shared.shlex_join(args), file=sys.stderr)
try:
shared.check_call(args)
return 0
except CalledProcessError as e:
return e.returncode
if __name__ == '__main__':
sys.exit(run())