123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #!/usr/bin/env python3
- import json
- import os
- import sys
- import shutil
- from pathlib import Path
- SRC_DIR = Path(__file__).resolve().parents[3]
- sys.path.append(os.path.join(SRC_DIR, 'third_party/electron_node/tools'))
- import install
- class LoadPythonDictionaryError(Exception):
- """Custom exception for errors in LoadPythonDictionary."""
- def LoadPythonDictionary(path):
- with open(path, 'r', encoding='utf-8') as f:
- file_string = f.read()
- try:
- file_data = eval(file_string, {'__builtins__': None}, None)
- except SyntaxError as e:
- e.filename = path
- raise
- except Exception as e:
- err_msg = f"Unexpected error while reading {path}: {str(e)}"
- raise LoadPythonDictionaryError(err_msg) from e
- if not isinstance(file_data, dict):
- raise LoadPythonDictionaryError(
- f"{path} does not eval to a dictionary"
- )
- return file_data
- def get_out_dir():
- out_dir = 'Testing'
- override = os.environ.get('ELECTRON_OUT_DIR')
- if override is not None:
- out_dir = override
- return os.path.join(SRC_DIR, 'out', out_dir)
- if __name__ == '__main__':
- node_root_dir = os.path.join(SRC_DIR, 'third_party/electron_node')
- out = {}
- out['headers'] = []
- def add_headers(_, files, dest_dir):
- if 'src/node.h' in files:
- files = [
- f for f in files
- if f.endswith('.h') and f != 'src/node_version.h'
- ]
- if files:
- dir_index = next(
- (i for i, d in enumerate(out['headers'])
- if d['dest_dir'] == dest_dir),
- -1
- )
- if dir_index != -1:
- out['headers'][dir_index]['files'] += sorted(files)
- else:
- hs = {'files': sorted(files), 'dest_dir': dest_dir}
- out['headers'].append(hs)
- root_gen_dir = os.path.join(get_out_dir(), 'gen')
- config_gypi_path = os.path.join(root_gen_dir, 'config.gypi')
- node_headers_dir = os.path.join(root_gen_dir, 'node_headers')
- options = install.parse_options([
- 'install',
- '--root-dir', node_root_dir,
- '--v8-dir', os.path.join(SRC_DIR, 'v8'),
- '--config-gypi-path', config_gypi_path,
- '--headers-only'
- ])
- options.variables['node_use_openssl'] = 'false'
- options.variables['node_shared_libuv'] = 'false'
- # We generate zlib headers in Electron's BUILD.gn.
- options.variables['node_shared_zlib'] = ''
- install.headers(options, add_headers)
- header_groups = []
- for header_group in out['headers']:
- sources = [
- os.path.join(node_root_dir, file)
- for file in header_group['files']
- ]
- outputs = [
- os.path.join(
- node_headers_dir, header_group['dest_dir'],
- os.path.basename(file)
- )
- for file in sources
- ]
- for src, dest in zip(sources, outputs):
- os.makedirs(os.path.dirname(dest), exist_ok=True)
- if os.path.exists(dest):
- if os.path.samefile(src, dest):
- continue
- os.remove(dest)
- shutil.copyfile(src, dest)
- node_header_file = os.path.join(root_gen_dir, 'node_headers.json')
- with open(node_header_file, 'w', encoding='utf-8') as nhf:
- json_data = json.dumps(
- out, sort_keys=True, indent=2, separators=(',', ': ')
- )
- nhf.write(json_data)
|