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