summaryrefslogtreecommitdiff
path: root/js/pbjs_hack.py
blob: 19b7c169121c5a254e92f2c73df55bc23ee88ff9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python
"""
gn can only run python scripts.

Generates protobufjs code.
"""
import subprocess
import sys
import os
# TODO(ry) Ideally protobufjs output files should be written into
# target_gen_dir, but its difficult to get this working in a way that parcel can
# resolve their location. (Parcel does not support NODE_PATH.) Therefore this
# hack: write the generated msg.pb.js and msg.pb.d.ts outputs into the js/
# folder, and we check them into the repo. Hopefully this hack can be removed at
# some point. If msg.proto is changed, commit changes to the generated JS
# files.

js_path = os.path.dirname(os.path.realpath(__file__))
pbjs_path = os.path.join(js_path, "node_modules", "protobufjs", "bin")
pbjs_bin = os.path.join(pbjs_path, "pbjs")
pbts_bin = os.path.join(pbjs_path, "pbts")
msg_pbjs_out = os.path.join(js_path, "msg.pb.js")
msg_pbts_out = os.path.join(js_path, "msg.pb.d.ts")
assert os.path.exists(pbjs_bin)
assert os.path.exists(pbts_bin)

proto_in = sys.argv[1]
stamp_file = sys.argv[2]


def touch(fname):
    if os.path.exists(fname):
        os.utime(fname, None)
    else:
        open(fname, 'a').close()


subprocess.check_call([
    "node", pbjs_bin, "--target=static-module", "--wrapper=commonjs",
    "--out=" + msg_pbjs_out, proto_in
])
assert os.path.exists(msg_pbjs_out)

subprocess.check_call(
    ["node", pbts_bin, "--out=" + msg_pbts_out, msg_pbjs_out])
assert os.path.exists(msg_pbts_out)

touch(stamp_file)