third_party/waf: upgrade to waf 2.0.8
[samba.git] / third_party / waf / waflib / extras / c_emscripten.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 vi:ts=4:noexpandtab
3
4 import subprocess, shlex, sys
5
6 from waflib.Tools import ccroot, gcc, gxx
7 from waflib.Configure import conf
8 from waflib.TaskGen import after_method, feature
9
10 from waflib.Tools.compiler_c import c_compiler
11 from waflib.Tools.compiler_cxx import cxx_compiler
12
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')
16
17
18 @conf
19 def get_emscripten_version(conf, cc):
20         """
21         Emscripten doesn't support processing '-' like clang/gcc
22         """
23
24         dummy = conf.cachedir.parent.make_node("waf-emscripten.c")
25         dummy.write("")
26         cmd = cc + ['-dM', '-E', '-x', 'c', dummy.abspath()]
27         env = conf.env.env or None
28         try:
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))
33
34         if not isinstance(out, str):
35                 out = out.decode(sys.stdout.encoding or 'latin-1')
36
37         k = {}
38         out = out.splitlines()
39         for line in out:
40                 lst = shlex.split(line)
41                 if len(lst)>2:
42                         key = lst[1]
43                         val = lst[2]
44                         k[key] = val
45
46         if not ('__clang__' in k and 'EMSCRIPTEN' in k):
47                 conf.fatal('Could not determine the emscripten compiler version.')
48
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__'])
53         return k
54
55 @conf
56 def find_emscripten(conf):
57         cc = conf.find_program(['emcc'], var='CC')
58         conf.get_emscripten_version(cc)
59         conf.env.CC = cc
60         conf.env.CC_NAME = 'emscripten'
61         cxx = conf.find_program(['em++'], var='CXX')
62         conf.env.CXX = cxx
63         conf.env.CXX_NAME = 'emscripten'
64         conf.find_program(['emar'], var='AR')
65
66 def configure(conf):
67         conf.find_emscripten()
68         conf.find_ar()
69         conf.gcc_common_flags()
70         conf.gxx_common_flags()
71         conf.cc_load_tools()
72         conf.cc_add_flags()
73         conf.cxx_load_tools()
74         conf.cxx_add_flags()
75         conf.link_add_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'])