build-singleheader.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. const fs = require('fs')
  2. function read_file(name) {
  3. return fs
  4. .readFileSync(name)
  5. .toString('utf-8')
  6. .trim()
  7. }
  8. function include_enet(src) {
  9. return src
  10. .split('\n')
  11. .map(line => {
  12. // include enet header files for header
  13. if (line.indexOf('#include "enet/') !== -1) {
  14. return read_file('include/' + line.slice(10, -1))
  15. }
  16. return line
  17. })
  18. .join('\n')
  19. }
  20. function filter_libs(src, unqiue_lib_list) {
  21. return src
  22. .split('\n')
  23. .map((line, i) => {
  24. // remove references to enet across all file
  25. if (line.indexOf('#include "enet/') !== -1) {
  26. return ''
  27. }
  28. // reduce amount of includes to get rid of dublications
  29. if (line.indexOf('#include <') !== -1) {
  30. if (!unqiue_lib_list[line.slice(10, -1)]) {
  31. unqiue_lib_list[line.slice(10, -1)] = 1;
  32. return line
  33. } else {
  34. unqiue_lib_list[line.slice(10, -1)]++
  35. return ''
  36. }
  37. }
  38. return line
  39. .replace(/\s*$/, '') /* remove trailing spaces */
  40. .replace(/^\s{3}(\w)/, ' $1') /* make sure all tabulated lines have minumun 4 spaces */
  41. })
  42. .join('\n')
  43. }
  44. function attach_src(src, unqiue_lib_list, sources_list, scr_template) {
  45. let files = sources_list
  46. .map(file => {
  47. return '\n// @from_file: ' + file + '\n' +
  48. filter_libs(read_file(file), unqiue_lib_list)
  49. })
  50. .join('\n')
  51. // add 4 spaces in front
  52. files = files
  53. .split('\n')
  54. .map(line => line !== '' ? " " + line : line)
  55. .join('\n')
  56. src = src.replace('#endif /* __ENET_ENET_H__ */', '')
  57. src = src + scr_template[0] + files + scr_template[1]
  58. return src
  59. }
  60. let sources = [
  61. 'src/callbacks.c',
  62. 'src/compress.c',
  63. 'src/host.c',
  64. 'src/list.c',
  65. 'src/packet.c',
  66. 'src/peer.c',
  67. 'src/protocol.c',
  68. 'src/unix.c',
  69. 'src/win32.c',
  70. ]
  71. let scr_template = [
  72. `
  73. #if defined(ENET_IMPLEMENTATION) && !defined(ENET_IMPLEMENTATION_DONE)
  74. #define ENET_IMPLEMENTATION_DONE
  75. #ifdef __cplusplus
  76. extern "C"
  77. {
  78. #endif
  79. `,
  80. // code there
  81. `
  82. #ifdef __cplusplus
  83. }
  84. #endif
  85. #endif
  86. #endif /* __ENET_ENET_H__ */
  87. `];
  88. let prefix =
  89. `/**
  90. * include/enet.h - a Single-Header auto-generated variant of enet.h library.
  91. *
  92. * Usage:
  93. * #define ENET_IMPLEMENTATION exactly in ONE source file right BEFORE including the library, like:
  94. *
  95. * #define ENET_IMPLEMENTATION
  96. * #include <enet.h>
  97. *
  98. */
  99. #ifdef ENET_IMPLEMENTATION
  100. #define ENET_BUILDING_LIB 1
  101. #endif
  102. `;
  103. (function main() {
  104. let list = {};
  105. let src = read_file('include/enet/enet.h')
  106. src = include_enet(src)
  107. src = filter_libs(src, list)
  108. src = attach_src(src, list, sources, scr_template)
  109. console.log(list)
  110. // console.log('all included libs:\n', Object.keys(list).sort())
  111. fs.writeFileSync('include/enet.h', prefix + src)
  112. })();