jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.3KB

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. # DragoonX6 2018
  4. """
  5. Common routines for cross_clang.py and cross_clangxx.py
  6. """
  7. from waflib.Configure import conf
  8. import waflib.Context
  9. def normalize_target_triple(target_triple):
  10. target_triple = target_triple[:-1]
  11. normalized_triple = target_triple.replace('--', '-unknown-')
  12. if normalized_triple.startswith('-'):
  13. normalized_triple = 'unknown' + normalized_triple
  14. if normalized_triple.endswith('-'):
  15. normalized_triple += 'unknown'
  16. # Normalize MinGW builds to *arch*-w64-mingw32
  17. if normalized_triple.endswith('windows-gnu'):
  18. normalized_triple = normalized_triple[:normalized_triple.index('-')] + '-w64-mingw32'
  19. # Strip the vendor when doing msvc builds, since it's unused anyway.
  20. if normalized_triple.endswith('windows-msvc'):
  21. normalized_triple = normalized_triple[:normalized_triple.index('-')] + '-windows-msvc'
  22. return normalized_triple.replace('-', '_')
  23. @conf
  24. def clang_modifier_msvc(conf):
  25. import os
  26. """
  27. Really basic setup to use clang in msvc mode.
  28. We actually don't really want to do a lot, even though clang is msvc compatible
  29. in this mode, that doesn't mean we're actually using msvc.
  30. It's probably the best to leave it to the user, we can assume msvc mode if the user
  31. uses the clang-cl frontend, but this module only concerns itself with the gcc-like frontend.
  32. """
  33. v = conf.env
  34. v.cprogram_PATTERN = '%s.exe'
  35. v.cshlib_PATTERN = '%s.dll'
  36. v.implib_PATTERN = '%s.lib'
  37. v.IMPLIB_ST = '-Wl,-IMPLIB:%s'
  38. v.SHLIB_MARKER = []
  39. v.CFLAGS_cshlib = []
  40. v.LINKFLAGS_cshlib = ['-Wl,-DLL']
  41. v.cstlib_PATTERN = '%s.lib'
  42. v.STLIB_MARKER = []
  43. del(v.AR)
  44. conf.find_program(['llvm-lib', 'lib'], var='AR')
  45. v.ARFLAGS = ['-nologo']
  46. v.AR_TGT_F = ['-out:']
  47. # Default to the linker supplied with llvm instead of link.exe or ld
  48. v.LINK_CC = v.CC + ['-fuse-ld=lld', '-nostdlib']
  49. v.CCLNK_TGT_F = ['-o']
  50. v.def_PATTERN = '-Wl,-def:%s'
  51. v.LINKFLAGS = []
  52. v.LIB_ST = '-l%s'
  53. v.LIBPATH_ST = '-Wl,-LIBPATH:%s'
  54. v.STLIB_ST = '-l%s'
  55. v.STLIBPATH_ST = '-Wl,-LIBPATH:%s'
  56. CFLAGS_CRT_COMMON = [
  57. '-Xclang', '--dependent-lib=oldnames',
  58. '-Xclang', '-fno-rtti-data',
  59. '-D_MT'
  60. ]
  61. v.CFLAGS_CRT_MULTITHREADED = CFLAGS_CRT_COMMON + [
  62. '-Xclang', '-flto-visibility-public-std',
  63. '-Xclang', '--dependent-lib=libcmt',
  64. ]
  65. v.CXXFLAGS_CRT_MULTITHREADED = v.CFLAGS_CRT_MULTITHREADED
  66. v.CFLAGS_CRT_MULTITHREADED_DBG = CFLAGS_CRT_COMMON + [
  67. '-D_DEBUG',
  68. '-Xclang', '-flto-visibility-public-std',
  69. '-Xclang', '--dependent-lib=libcmtd',
  70. ]
  71. v.CXXFLAGS_CRT_MULTITHREADED_DBG = v.CFLAGS_CRT_MULTITHREADED_DBG
  72. v.CFLAGS_CRT_MULTITHREADED_DLL = CFLAGS_CRT_COMMON + [
  73. '-D_DLL',
  74. '-Xclang', '--dependent-lib=msvcrt'
  75. ]
  76. v.CXXFLAGS_CRT_MULTITHREADED_DLL = v.CFLAGS_CRT_MULTITHREADED_DLL
  77. v.CFLAGS_CRT_MULTITHREADED_DLL_DBG = CFLAGS_CRT_COMMON + [
  78. '-D_DLL',
  79. '-D_DEBUG',
  80. '-Xclang', '--dependent-lib=msvcrtd',
  81. ]
  82. v.CXXFLAGS_CRT_MULTITHREADED_DLL_DBG = v.CFLAGS_CRT_MULTITHREADED_DLL_DBG
  83. @conf
  84. def clang_modifier_target_triple(conf, cpp=False):
  85. compiler = conf.env.CXX if cpp else conf.env.CC
  86. output = conf.cmd_and_log(compiler + ['-dumpmachine'], output=waflib.Context.STDOUT)
  87. modifier = ('clangxx' if cpp else 'clang') + '_modifier_'
  88. clang_modifier_func = getattr(conf, modifier + normalize_target_triple(output), None)
  89. if clang_modifier_func:
  90. clang_modifier_func()