build_info_gen.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import subprocess
  2. import os
  3. import sys
  4. import re
  5. indent = " "
  6. def escape_special_symbols(strval):
  7. retval = ""
  8. for c in strval:
  9. if c in ("\\", "\""):
  10. retval += "\\" + c
  11. elif ord(c) < 0x20:
  12. retval += c.encode("string_escape")
  13. else:
  14. retval += c
  15. return retval
  16. def escape_line_feed(strval):
  17. return re.sub(r'\\n', r'\\n"\\\n' + indent + '"', strval)
  18. def escaped_define(strkey, strval):
  19. return "#define " + strkey + " \"" + escape_line_feed(escape_special_symbols(strval)) + "\""
  20. def get_build_info(compiler, flags):
  21. build_info = "Build info:\n"
  22. build_info += indent + "Compiler: " + compiler + "\n"
  23. build_info += indent + "Compiler version: \n" + get_compiler_info(compiler) + "\n"
  24. build_info += indent + "Compile flags: " + (flags if flags else "no flags info")
  25. return build_info
  26. def get_compiler_info(compiler):
  27. compiler_binary = os.path.basename(compiler).lower()
  28. if len(compiler.split(' ')) > 1 or compiler_binary == "ymake" or compiler_binary == "ymake.exe":
  29. compiler_ver_out = "Build by wrapper. No useful info here."
  30. else:
  31. compiler_ver_cmd = [compiler]
  32. if compiler_binary not in ("cl", "cl.exe"):
  33. compiler_ver_cmd.append('--version')
  34. compiler_ver_out = subprocess.Popen(compiler_ver_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.read()
  35. return "\n".join(['{}{}'.format(indent * 2, line.strip()) for line in compiler_ver_out.splitlines() if line.strip()])
  36. def main():
  37. if len(sys.argv) != 4:
  38. print >>sys.stderr, "Usage: build_info_gen.py <output file> <CXX compiler> <CXX flags>"
  39. sys.exit(1)
  40. cxx_compiler = sys.argv[2]
  41. cxx_flags = sys.argv[3]
  42. with open(sys.argv[1], 'w') as result:
  43. print >> result, "#pragma once\n"
  44. print >> result, escaped_define("BUILD_INFO", get_build_info(cxx_compiler, cxx_flags))
  45. print >> result, escaped_define("BUILD_COMPILER", cxx_compiler)
  46. print >> result, escaped_define("BUILD_COMPILER_VERSION", get_compiler_info(cxx_compiler))
  47. print >> result, escaped_define("BUILD_COMPILER_FLAGS", cxx_flags)
  48. if __name__ == "__main__":
  49. main()