third_party:waf: update to upstream 2.0.4 release
[samba.git] / third_party / waf / waflib / extras / c_emscripten.py
1 #! /usr/bin/env python
2 # encoding: utf-8
3 # WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file
4
5 #!/usr/bin/env python
6 # -*- coding: utf-8 vi:ts=4:noexpandtab
7
8 import subprocess, shlex, sys
9
10 from waflib.Tools import ccroot, gcc, gxx
11 from waflib.Configure import conf
12 from waflib.TaskGen import after_method, feature
13
14 from waflib.Tools.compiler_c import c_compiler
15 from waflib.Tools.compiler_cxx import cxx_compiler
16
17 for supported_os in ('linux', 'darwin', 'gnu', 'aix'):
18         c_compiler[supported_os].append('c_emscripten')
19         cxx_compiler[supported_os].append('c_emscripten')
20
21
22 @conf
23 def get_emscripten_version(conf, cc):
24         """
25         Emscripten doesn't support processing '-' like clang/gcc
26         """
27
28         dummy = conf.cachedir.parent.make_node("waf-emscripten.c")
29         dummy.write("")
30         cmd = cc + ['-dM', '-E', '-x', 'c', dummy.abspath()]
31         env = conf.env.env or None
32         try:
33                 p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
34                 out = p.communicate()[0]
35         except Exception as e:
36                 conf.fatal('Could not determine emscripten version %r: %s' % (cmd, e))
37
38         if not isinstance(out, str):
39                 out = out.decode(sys.stdout.encoding or 'latin-1')
40
41         k = {}
42         out = out.splitlines()
43         for line in out:
44                 lst = shlex.split(line)
45                 if len(lst)>2:
46                         key = lst[1]
47                         val = lst[2]
48                         k[key] = val
49
50         if not ('__clang__' in k and 'EMSCRIPTEN' in k):
51                 conf.fatal('Could not determine the emscripten compiler version.')
52
53         conf.env.DEST_OS = 'generic'
54         conf.env.DEST_BINFMT = 'elf'
55         conf.env.DEST_CPU = 'asm-js'
56         conf.env.CC_VERSION = (k['__clang_major__'], k['__clang_minor__'], k['__clang_patchlevel__'])
57         return k
58
59 @conf
60 def find_emscripten(conf):
61         cc = conf.find_program(['emcc'], var='CC')
62         conf.get_emscripten_version(cc)
63         conf.env.CC = cc
64         conf.env.CC_NAME = 'emscripten'
65         cxx = conf.find_program(['em++'], var='CXX')
66         conf.env.CXX = cxx
67         conf.env.CXX_NAME = 'emscripten'
68         conf.find_program(['emar'], var='AR')
69
70 def configure(conf):
71         conf.find_emscripten()
72         conf.find_ar()
73         conf.gcc_common_flags()
74         conf.gxx_common_flags()
75         conf.cc_load_tools()
76         conf.cc_add_flags()
77         conf.cxx_load_tools()
78         conf.cxx_add_flags()
79         conf.link_add_flags()
80         conf.env.ARFLAGS = ['rcs']
81         conf.env.cshlib_PATTERN = '%s.js'
82         conf.env.cxxshlib_PATTERN = '%s.js'
83         conf.env.cstlib_PATTERN = '%s.a'
84         conf.env.cxxstlib_PATTERN = '%s.a'
85         conf.env.cprogram_PATTERN = '%s.html'
86         conf.env.cxxprogram_PATTERN = '%s.html'
87         conf.env.CXX_TGT_F           = ['-c', '-o', '']
88         conf.env.CC_TGT_F            = ['-c', '-o', '']
89         conf.env.CXXLNK_TGT_F        = ['-o', '']
90         conf.env.CCLNK_TGT_F         = ['-o', '']
91         conf.env.append_value('LINKFLAGS',['-Wl,--enable-auto-import'])