1#!/usr/bin/env python
2# -*- coding: utf-8 vi:ts=4:noexpandtab
3
4import subprocess, shlex, sys
5
6from waflib.Tools import ccroot, gcc, gxx
7from waflib.Configure import conf
8from waflib.TaskGen import after_method, feature
9
10from waflib.Tools.compiler_c import c_compiler
11from waflib.Tools.compiler_cxx import cxx_compiler
12
13for 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
19def 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
56def 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
66def 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'])
88