create-node-headers.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/usr/bin/env python
  2. import argparse
  3. import os
  4. import shutil
  5. import sys
  6. import tarfile
  7. from lib.util import safe_mkdir, scoped_cwd
  8. SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
  9. DIST_DIR = os.path.join(SOURCE_ROOT, 'dist')
  10. NODE_DIR = os.path.join(SOURCE_ROOT, 'vendor', 'node')
  11. OUT_DIR = os.path.join(SOURCE_ROOT, 'out', 'R')
  12. HEADERS_SUFFIX = [
  13. '.h',
  14. '.gypi',
  15. ]
  16. HEADERS_DIRS = [
  17. 'src',
  18. 'deps/http_parser',
  19. 'deps/zlib',
  20. 'deps/uv',
  21. 'deps/npm',
  22. 'deps/mdb_v8',
  23. 'deps/v8/include'
  24. ]
  25. HEADERS_FILES = [
  26. 'common.gypi',
  27. 'config.gypi',
  28. ]
  29. def main():
  30. args = parse_args()
  31. safe_mkdir(args.directory)
  32. node_headers_dir = os.path.join(args.directory,
  33. 'node-{0}'.format(args.version))
  34. iojs_headers_dir = os.path.join(args.directory,
  35. 'iojs-{0}'.format(args.version))
  36. iojs2_headers_dir = os.path.join(args.directory,
  37. 'iojs-{0}-headers'.format(args.version))
  38. copy_headers(node_headers_dir)
  39. create_header_tarball(args.directory, node_headers_dir)
  40. copy_headers(iojs_headers_dir)
  41. create_header_tarball(args.directory, iojs_headers_dir)
  42. copy_headers(iojs2_headers_dir)
  43. create_header_tarball(args.directory, iojs2_headers_dir)
  44. def parse_args():
  45. parser = argparse.ArgumentParser(description='create node header tarballs')
  46. parser.add_argument('-v', '--version', help='Specify the version',
  47. required=True)
  48. parser.add_argument('-d', '--directory', help='Specify the output directory',
  49. default=DIST_DIR,
  50. required=False)
  51. return parser.parse_args()
  52. def copy_headers(dist_headers_dir):
  53. safe_mkdir(dist_headers_dir)
  54. # Copy standard node headers from node. repository.
  55. for include_path in HEADERS_DIRS:
  56. abs_path = os.path.join(NODE_DIR, include_path)
  57. for dirpath, _, filenames in os.walk(abs_path):
  58. for filename in filenames:
  59. extension = os.path.splitext(filename)[1]
  60. if extension not in HEADERS_SUFFIX:
  61. continue
  62. copy_source_file(os.path.join(dirpath, filename), NODE_DIR,
  63. dist_headers_dir)
  64. for other_file in HEADERS_FILES:
  65. copy_source_file(os.path.join(NODE_DIR, other_file), NODE_DIR,
  66. dist_headers_dir)
  67. # Copy V8 headers from chromium's repository.
  68. src = os.path.join(SOURCE_ROOT, 'vendor', 'download', 'libchromiumcontent',
  69. 'src')
  70. for dirpath, _, filenames in os.walk(os.path.join(src, 'v8')):
  71. for filename in filenames:
  72. extension = os.path.splitext(filename)[1]
  73. if extension not in HEADERS_SUFFIX:
  74. continue
  75. copy_source_file(os.path.join(dirpath, filename), src,
  76. os.path.join(dist_headers_dir, 'deps'))
  77. def create_header_tarball(directory, dist_headers_dir):
  78. target = dist_headers_dir + '.tar.gz'
  79. with scoped_cwd(directory):
  80. tarball = tarfile.open(name=target, mode='w:gz')
  81. tarball.add(os.path.relpath(dist_headers_dir))
  82. tarball.close()
  83. def copy_source_file(source, start, destination):
  84. relative = os.path.relpath(source, start=start)
  85. final_destination = os.path.join(destination, relative)
  86. safe_mkdir(os.path.dirname(final_destination))
  87. shutil.copy2(source, final_destination)
  88. if __name__ == '__main__':
  89. sys.exit(main())