mirror of https://github.com/electron/electron
108 lines
3.5 KiB
Python
Executable File
108 lines
3.5 KiB
Python
Executable File
#!/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)
|