waf

FORK: waf with some random patches
git clone https://git.neptards.moe/neptards/waf.git
Log | Files | Refs | README

c_emscripten.py (2528B)


      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'])