c_emscripten.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 vi:ts=4:noexpandtab
  3. import shlex
  4. from waflib import Errors
  5. from waflib.Tools import ccroot, gcc, gxx
  6. from waflib.Configure import conf
  7. from waflib.Tools.compiler_c import c_compiler
  8. from waflib.Tools.compiler_cxx import cxx_compiler
  9. for supported_os in ('linux', 'darwin', 'gnu', 'aix'):
  10. c_compiler[supported_os].append('c_emscripten')
  11. cxx_compiler[supported_os].append('c_emscripten')
  12. @conf
  13. def get_emscripten_version(conf, cc):
  14. """
  15. Emscripten doesn't support processing '-' like clang/gcc
  16. """
  17. dummy = conf.cachedir.parent.make_node("waf-emscripten.c")
  18. dummy.write("")
  19. cmd = cc + ['-dM', '-E', '-x', 'c', dummy.abspath()]
  20. env = conf.env.env or None
  21. try:
  22. out, err = conf.cmd_and_log(cmd, output=0, env=env)
  23. except Errors.WafError as e:
  24. conf.fatal('Could not determine the emscripten version %r: %s' % (cmd, e))
  25. k = {}
  26. out = out.splitlines()
  27. for line in out:
  28. lst = shlex.split(line)
  29. if len(lst)>2:
  30. key = lst[1]
  31. val = lst[2]
  32. k[key] = val
  33. if not ('__clang__' in k and 'EMSCRIPTEN' in k):
  34. conf.fatal('Could not determine the emscripten compiler version.')
  35. conf.env.DEST_OS = 'generic'
  36. conf.env.DEST_BINFMT = 'elf'
  37. conf.env.DEST_CPU = 'asm-js'
  38. conf.env.CC_VERSION = (k['__clang_major__'], k['__clang_minor__'], k['__clang_patchlevel__'])
  39. return k
  40. @conf
  41. def find_emscripten(conf):
  42. cc = conf.find_program(['emcc'], var='CC')
  43. conf.get_emscripten_version(cc)
  44. conf.env.CC = cc
  45. conf.env.CC_NAME = 'emscripten'
  46. cxx = conf.find_program(['em++'], var='CXX')
  47. conf.env.CXX = cxx
  48. conf.env.CXX_NAME = 'emscripten'
  49. conf.find_program(['emar'], var='AR')
  50. def configure(conf):
  51. conf.find_emscripten()
  52. conf.find_ar()
  53. conf.gcc_common_flags()
  54. conf.gxx_common_flags()
  55. conf.cc_load_tools()
  56. conf.cc_add_flags()
  57. conf.cxx_load_tools()
  58. conf.cxx_add_flags()
  59. conf.link_add_flags()
  60. conf.env.ARFLAGS = ['rcs']
  61. conf.env.cshlib_PATTERN = '%s.js'
  62. conf.env.cxxshlib_PATTERN = '%s.js'
  63. conf.env.cstlib_PATTERN = '%s.a'
  64. conf.env.cxxstlib_PATTERN = '%s.a'
  65. conf.env.cprogram_PATTERN = '%s.html'
  66. conf.env.cxxprogram_PATTERN = '%s.html'
  67. conf.env.CXX_TGT_F = ['-c', '-o', '']
  68. conf.env.CC_TGT_F = ['-c', '-o', '']
  69. conf.env.CXXLNK_TGT_F = ['-o', '']
  70. conf.env.CCLNK_TGT_F = ['-o', '']
  71. conf.env.append_value('LINKFLAGS',['-Wl,--enable-auto-import'])