2 # -*- coding: utf-8 vi:ts=4:noexpandtab
4 import subprocess
, shlex
, sys
6 from waflib
.Tools
import ccroot
, gcc
, gxx
7 from waflib
.Configure
import conf
8 from waflib
.TaskGen
import after_method
, feature
10 from waflib
.Tools
.compiler_c
import c_compiler
11 from waflib
.Tools
.compiler_cxx
import cxx_compiler
13 for supported_os
in ('linux', 'darwin', 'gnu', 'aix'):
14 c_compiler
[supported_os
].append('c_emscripten')
15 cxx_compiler
[supported_os
].append('c_emscripten')
19 def get_emscripten_version(conf
, cc
):
21 Emscripten doesn't support processing '-' like clang/gcc
24 dummy
= conf
.cachedir
.parent
.make_node("waf-emscripten.c")
26 cmd
= cc
+ ['-dM', '-E', '-x', 'c', dummy
.abspath()]
27 env
= conf
.env
.env
or None
29 p
= subprocess
.Popen(cmd
, stdout
=subprocess
.PIPE
, stderr
=subprocess
.PIPE
, env
=env
)
30 out
= p
.communicate()[0]
31 except Exception as e
:
32 conf
.fatal('Could not determine emscripten version %r: %s' % (cmd
, e
))
34 if not isinstance(out
, str):
35 out
= out
.decode(sys
.stdout
.encoding
or 'latin-1')
38 out
= out
.splitlines()
40 lst
= shlex
.split(line
)
46 if not ('__clang__' in k
and 'EMSCRIPTEN' in k
):
47 conf
.fatal('Could not determine the emscripten compiler version.')
49 conf
.env
.DEST_OS
= 'generic'
50 conf
.env
.DEST_BINFMT
= 'elf'
51 conf
.env
.DEST_CPU
= 'asm-js'
52 conf
.env
.CC_VERSION
= (k
['__clang_major__'], k
['__clang_minor__'], k
['__clang_patchlevel__'])
56 def find_emscripten(conf
):
57 cc
= conf
.find_program(['emcc'], var
='CC')
58 conf
.get_emscripten_version(cc
)
60 conf
.env
.CC_NAME
= 'emscripten'
61 cxx
= conf
.find_program(['em++'], var
='CXX')
63 conf
.env
.CXX_NAME
= 'emscripten'
64 conf
.find_program(['emar'], var
='AR')
67 conf
.find_emscripten()
69 conf
.gcc_common_flags()
70 conf
.gxx_common_flags()
76 conf
.env
.ARFLAGS
= ['rcs']
77 conf
.env
.cshlib_PATTERN
= '%s.js'
78 conf
.env
.cxxshlib_PATTERN
= '%s.js'
79 conf
.env
.cstlib_PATTERN
= '%s.a'
80 conf
.env
.cxxstlib_PATTERN
= '%s.a'
81 conf
.env
.cprogram_PATTERN
= '%s.html'
82 conf
.env
.cxxprogram_PATTERN
= '%s.html'
83 conf
.env
.CXX_TGT_F
= ['-c', '-o', '']
84 conf
.env
.CC_TGT_F
= ['-c', '-o', '']
85 conf
.env
.CXXLNK_TGT_F
= ['-o', '']
86 conf
.env
.CCLNK_TGT_F
= ['-o', '']
87 conf
.env
.append_value('LINKFLAGS',['-Wl,--enable-auto-import'])