build.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/usr/bin/env python3
  2. from collections import OrderedDict
  3. import json
  4. import os
  5. import sys
  6. dir_path = os.path.dirname(os.path.realpath(__file__))
  7. SENTINEL = "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX"
  8. TEMPLATE_H = """
  9. #ifndef ELECTRON_FUSES_H_
  10. #define ELECTRON_FUSES_H_
  11. #if defined(WIN32)
  12. #define FUSE_EXPORT __declspec(dllexport)
  13. #else
  14. #define FUSE_EXPORT __attribute__((visibility("default")))
  15. #endif
  16. namespace electron::fuses {
  17. extern const volatile char kFuseWire[];
  18. {getters}
  19. } // namespace electron::fuses
  20. #endif // ELECTRON_FUSES_H_
  21. """
  22. TEMPLATE_CC = """
  23. #include "electron/fuses.h"
  24. namespace electron::fuses {
  25. const volatile char kFuseWire[] = { /* sentinel */ {sentinel}, /* fuse_version */ {fuse_version}, /* fuse_wire_length */ {fuse_wire_length}, /* fuse_wire */ {initial_config}};
  26. {getters}
  27. } // namespace electron:fuses
  28. """
  29. with open(os.path.join(dir_path, "fuses.json5"), 'r') as f:
  30. fuse_defaults = json.loads(''.join(line for line in f.readlines() if not line.strip()[0] == "/"), object_pairs_hook=OrderedDict)
  31. fuse_version = fuse_defaults['_version']
  32. del fuse_defaults['_version']
  33. del fuse_defaults['_schema']
  34. del fuse_defaults['_comment']
  35. if fuse_version >= pow(2, 8):
  36. raise Exception("Fuse version can not exceed one byte in size")
  37. fuses = fuse_defaults.keys()
  38. initial_config = ""
  39. getters_h = ""
  40. getters_cc = ""
  41. index = len(SENTINEL) + 1
  42. for fuse in fuses:
  43. index += 1
  44. initial_config += fuse_defaults[fuse]
  45. name = ''.join(word.title() for word in fuse.split('_'))
  46. getters_h += "FUSE_EXPORT bool Is{name}Enabled();\n".replace("{name}", name)
  47. getters_cc += """
  48. bool Is{name}Enabled() {
  49. return kFuseWire[{index}] == '1';
  50. }
  51. """.replace("{name}", name).replace("{index}", str(index))
  52. def c_hex(n):
  53. s = hex(n)[2:]
  54. return "0x" + s.rjust(2, '0')
  55. def hex_arr(s):
  56. arr = []
  57. for char in s:
  58. arr.append(c_hex(ord(char)))
  59. return ",".join(arr)
  60. header = TEMPLATE_H.replace("{getters}", getters_h.strip())
  61. impl = TEMPLATE_CC.replace("{sentinel}", hex_arr(SENTINEL))
  62. impl = impl.replace("{fuse_version}", c_hex(fuse_version))
  63. impl = impl.replace("{fuse_wire_length}", c_hex(len(fuses)))
  64. impl = impl.replace("{initial_config}", hex_arr(initial_config))
  65. impl = impl.replace("{getters}", getters_cc.strip())
  66. with open(sys.argv[1], 'w') as f:
  67. f.write(header)
  68. with open(sys.argv[2], 'w') as f:
  69. f.write(impl)