Skip to content

Commit 412b101

Browse files
joyeecheungtargos
authored andcommitted
build: pass directory instead of list of files to js2c.py
On Windows there is a limit to the length of commands, so there will be an error once the lengths of the JS file names combined exceed that limit. This patch modifies js2c.py so that it now takes a --directory argument to glob for .js and .mjs files in addition to the list of files passed directly. We still pass the additional files we include from deps/ directly through the command line, as we only includes some of them so we cannot simply glob, but those are limited so listing them out should be fine. Refs: https://docs.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/command-line-string-limitation PR-URL: #39069 Refs: #38971 Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent c158888 commit 412b101

4 files changed

Lines changed: 63 additions & 247 deletions

File tree

‎node.gyp‎

Lines changed: 19 additions & 246 deletions
Original file line numberDiff line numberDiff line change
@@ -27,251 +27,15 @@
2727
'node_lib_target_name%': 'libnode',
2828
'node_intermediate_lib_type%': 'static_library',
2929
'node_builtin_modules_path%': '',
30+
# We list the deps/ files out instead of globbing them in js2c.py since we
31+
# only include a subset of all the files under these directories.
32+
# The lengths of their file names combined should not exceed the
33+
# Windows command length limit or there would be an error.
34+
# See https://docs.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/command-line-string-limitation
3035
'library_files': [
31-
'lib/internal/bootstrap/environment.js',
32-
'lib/internal/bootstrap/loaders.js',
33-
'lib/internal/bootstrap/node.js',
34-
'lib/internal/bootstrap/pre_execution.js',
35-
'lib/internal/bootstrap/switches/does_own_process_state.js',
36-
'lib/internal/bootstrap/switches/does_not_own_process_state.js',
37-
'lib/internal/bootstrap/switches/is_main_thread.js',
38-
'lib/internal/bootstrap/switches/is_not_main_thread.js',
39-
'lib/internal/per_context/primordials.js',
40-
'lib/internal/per_context/domexception.js',
41-
'lib/internal/per_context/messageport.js',
42-
'lib/async_hooks.js',
43-
'lib/assert.js',
44-
'lib/assert/strict.js',
45-
'lib/buffer.js',
46-
'lib/child_process.js',
47-
'lib/console.js',
48-
'lib/constants.js',
49-
'lib/crypto.js',
50-
'lib/cluster.js',
51-
'lib/diagnostics_channel.js',
52-
'lib/dgram.js',
53-
'lib/dns.js',
54-
'lib/dns/promises.js',
55-
'lib/domain.js',
56-
'lib/events.js',
57-
'lib/fs.js',
58-
'lib/fs/promises.js',
59-
'lib/http.js',
60-
'lib/http2.js',
61-
'lib/_http_agent.js',
62-
'lib/_http_client.js',
63-
'lib/_http_common.js',
64-
'lib/_http_incoming.js',
65-
'lib/_http_outgoing.js',
66-
'lib/_http_server.js',
67-
'lib/https.js',
68-
'lib/inspector.js',
69-
'lib/module.js',
70-
'lib/net.js',
71-
'lib/os.js',
72-
'lib/path.js',
73-
'lib/path/posix.js',
74-
'lib/path/win32.js',
75-
'lib/perf_hooks.js',
76-
'lib/process.js',
77-
'lib/punycode.js',
78-
'lib/querystring.js',
79-
'lib/readline.js',
80-
'lib/repl.js',
81-
'lib/stream.js',
82-
'lib/stream/promises.js',
83-
'lib/_stream_readable.js',
84-
'lib/_stream_writable.js',
85-
'lib/_stream_duplex.js',
86-
'lib/_stream_transform.js',
87-
'lib/_stream_passthrough.js',
88-
'lib/_stream_wrap.js',
89-
'lib/string_decoder.js',
90-
'lib/sys.js',
91-
'lib/timers/promises.js',
92-
'lib/timers.js',
93-
'lib/tls.js',
94-
'lib/_tls_common.js',
95-
'lib/_tls_wrap.js',
96-
'lib/trace_events.js',
97-
'lib/tty.js',
98-
'lib/url.js',
99-
'lib/util.js',
100-
'lib/util/types.js',
101-
'lib/v8.js',
102-
'lib/vm.js',
103-
'lib/wasi.js',
104-
'lib/worker_threads.js',
105-
'lib/zlib.js',
106-
'lib/internal/abort_controller.js',
107-
'lib/internal/assert.js',
108-
'lib/internal/assert/assertion_error.js',
109-
'lib/internal/assert/calltracker.js',
110-
'lib/internal/async_hooks.js',
111-
'lib/internal/blob.js',
112-
'lib/internal/blocklist.js',
113-
'lib/internal/buffer.js',
114-
'lib/internal/cli_table.js',
115-
'lib/internal/child_process.js',
116-
'lib/internal/child_process/serialization.js',
117-
'lib/internal/cluster/child.js',
118-
'lib/internal/cluster/primary.js',
119-
'lib/internal/cluster/round_robin_handle.js',
120-
'lib/internal/cluster/shared_handle.js',
121-
'lib/internal/cluster/utils.js',
122-
'lib/internal/cluster/worker.js',
123-
'lib/internal/console/constructor.js',
124-
'lib/internal/console/global.js',
125-
'lib/internal/crypto/aes.js',
126-
'lib/internal/crypto/certificate.js',
127-
'lib/internal/crypto/cipher.js',
128-
'lib/internal/crypto/diffiehellman.js',
129-
'lib/internal/crypto/dsa.js',
130-
'lib/internal/crypto/ec.js',
131-
'lib/internal/crypto/hash.js',
132-
'lib/internal/crypto/hashnames.js',
133-
'lib/internal/crypto/hkdf.js',
134-
'lib/internal/crypto/keygen.js',
135-
'lib/internal/crypto/keys.js',
136-
'lib/internal/crypto/mac.js',
137-
'lib/internal/crypto/pbkdf2.js',
138-
'lib/internal/crypto/random.js',
139-
'lib/internal/crypto/rsa.js',
140-
'lib/internal/crypto/scrypt.js',
141-
'lib/internal/crypto/sig.js',
142-
'lib/internal/crypto/util.js',
143-
'lib/internal/crypto/webcrypto.js',
144-
'lib/internal/crypto/x509.js',
145-
'lib/internal/constants.js',
146-
'lib/internal/debugger/_inspect.js',
147-
'lib/internal/debugger/inspect_client.js',
148-
'lib/internal/debugger/inspect_repl.js',
149-
'lib/internal/dgram.js',
150-
'lib/internal/dns/promises.js',
151-
'lib/internal/dns/utils.js',
152-
'lib/internal/dtrace.js',
153-
'lib/internal/encoding.js',
154-
'lib/internal/errors.js',
155-
'lib/internal/error_serdes.js',
156-
'lib/internal/event_target.js',
157-
'lib/internal/fixed_queue.js',
158-
'lib/internal/freelist.js',
159-
'lib/internal/freeze_intrinsics.js',
160-
'lib/internal/fs/dir.js',
161-
'lib/internal/fs/promises.js',
162-
'lib/internal/fs/read_file_context.js',
163-
'lib/internal/fs/rimraf.js',
164-
'lib/internal/fs/streams.js',
165-
'lib/internal/fs/sync_write_stream.js',
166-
'lib/internal/fs/utils.js',
167-
'lib/internal/fs/watchers.js',
168-
'lib/internal/http.js',
169-
'lib/internal/heap_utils.js',
170-
'lib/internal/histogram.js',
171-
'lib/internal/idna.js',
172-
'lib/internal/inspector_async_hook.js',
173-
'lib/internal/js_stream_socket.js',
174-
'lib/internal/legacy/processbinding.js',
175-
'lib/internal/linkedlist.js',
176-
'lib/internal/main/check_syntax.js',
177-
'lib/internal/main/eval_string.js',
178-
'lib/internal/main/eval_stdin.js',
179-
'lib/internal/main/inspect.js',
180-
'lib/internal/main/print_help.js',
181-
'lib/internal/main/prof_process.js',
182-
'lib/internal/main/repl.js',
183-
'lib/internal/main/run_main_module.js',
184-
'lib/internal/main/worker_thread.js',
185-
'lib/internal/modules/run_main.js',
186-
'lib/internal/modules/package_json_reader.js',
187-
'lib/internal/modules/cjs/helpers.js',
188-
'lib/internal/modules/cjs/loader.js',
189-
'lib/internal/modules/esm/loader.js',
190-
'lib/internal/modules/esm/create_dynamic_module.js',
191-
'lib/internal/modules/esm/get_format.js',
192-
'lib/internal/modules/esm/get_source.js',
193-
'lib/internal/modules/esm/module_job.js',
194-
'lib/internal/modules/esm/module_map.js',
195-
'lib/internal/modules/esm/resolve.js',
196-
'lib/internal/modules/esm/transform_source.js',
197-
'lib/internal/modules/esm/translators.js',
198-
'lib/internal/net.js',
199-
'lib/internal/options.js',
200-
'lib/internal/perf/perf.js',
201-
'lib/internal/perf/nodetiming.js',
202-
'lib/internal/perf/usertiming.js',
203-
'lib/internal/perf/observe.js',
204-
'lib/internal/perf/event_loop_delay.js',
205-
'lib/internal/perf/event_loop_utilization.js',
206-
'lib/internal/perf/timerify.js',
207-
'lib/internal/policy/manifest.js',
208-
'lib/internal/policy/sri.js',
209-
'lib/internal/priority_queue.js',
210-
'lib/internal/process/esm_loader.js',
211-
'lib/internal/process/execution.js',
212-
'lib/internal/process/per_thread.js',
213-
'lib/internal/process/policy.js',
214-
'lib/internal/process/promises.js',
215-
'lib/internal/process/warning.js',
216-
'lib/internal/process/worker_thread_only.js',
217-
'lib/internal/process/report.js',
218-
'lib/internal/process/signal.js',
219-
'lib/internal/process/task_queues.js',
220-
'lib/internal/querystring.js',
221-
'lib/internal/readline/callbacks.js',
222-
'lib/internal/readline/emitKeypressEvents.js',
223-
'lib/internal/readline/utils.js',
224-
'lib/internal/repl.js',
225-
'lib/internal/repl/await.js',
226-
'lib/internal/repl/history.js',
227-
'lib/internal/repl/utils.js',
228-
'lib/internal/socketaddress.js',
229-
'lib/internal/socket_list.js',
230-
'lib/internal/source_map/prepare_stack_trace.js',
231-
'lib/internal/source_map/source_map.js',
232-
'lib/internal/source_map/source_map_cache.js',
233-
'lib/internal/test/binding.js',
234-
'lib/internal/test/transfer.js',
235-
'lib/internal/timers.js',
236-
'lib/internal/tls.js',
237-
'lib/internal/trace_events_async_hooks.js',
238-
'lib/internal/tty.js',
239-
'lib/internal/url.js',
240-
'lib/internal/util.js',
241-
'lib/internal/util/comparisons.js',
242-
'lib/internal/util/debuglog.js',
243-
'lib/internal/util/inspect.js',
244-
'lib/internal/util/inspector.js',
245-
'lib/internal/util/iterable_weak_map.js',
246-
'lib/internal/util/types.js',
247-
'lib/internal/http2/core.js',
248-
'lib/internal/http2/compat.js',
249-
'lib/internal/http2/util.js',
250-
'lib/internal/v8_prof_polyfill.js',
251-
'lib/internal/v8_prof_processor.js',
252-
'lib/internal/validators.js',
253-
'lib/internal/stream_base_commons.js',
254-
'lib/internal/vm/module.js',
255-
'lib/internal/worker.js',
256-
'lib/internal/worker/io.js',
257-
'lib/internal/worker/js_transferable.js',
258-
'lib/internal/watchdog.js',
259-
'lib/internal/streams/lazy_transform.js',
260-
'lib/internal/streams/add-abort-signal.js',
261-
'lib/internal/streams/buffer_list.js',
262-
'lib/internal/streams/duplexpair.js',
263-
'lib/internal/streams/from.js',
264-
'lib/internal/streams/legacy.js',
265-
'lib/internal/streams/readable.js',
266-
'lib/internal/streams/writable.js',
267-
'lib/internal/streams/duplex.js',
268-
'lib/internal/streams/passthrough.js',
269-
'lib/internal/streams/transform.js',
270-
'lib/internal/streams/destroy.js',
271-
'lib/internal/streams/state.js',
272-
'lib/internal/streams/pipeline.js',
273-
'lib/internal/streams/end-of-stream.js',
274-
'lib/internal/streams/utils.js',
36+
'<!@(python tools/search_files.py --ext js lib)',
37+
],
38+
'deps_files': [
27539
'deps/v8/tools/splaytree.mjs',
27640
'deps/v8/tools/codemap.mjs',
27741
'deps/v8/tools/consarray.mjs',
@@ -794,6 +558,7 @@
794558
'deps/v8/include/v8.h',
795559
# javascript files to make for an even more pleasant IDE experience
796560
'<@(library_files)',
561+
'<@(deps_files)',
797562
# node.gyp is added by default, common.gypi is added for change detection
798563
'common.gypi',
799564
],
@@ -1047,14 +812,21 @@
1047812
# Put the code first so it's a dependency and can be used for invocation.
1048813
'tools/js2c.py',
1049814
'<@(library_files)',
815+
'<@(deps_files)',
1050816
'config.gypi'
1051817
],
1052818
'outputs': [
1053819
'<(SHARED_INTERMEDIATE_DIR)/node_javascript.cc',
1054820
],
1055821
'action': [
1056-
'python', '<@(_inputs)',
1057-
'--target', '<@(_outputs)',
822+
'python',
823+
'tools/js2c.py',
824+
'--directory',
825+
'lib',
826+
'--target',
827+
'<@(_outputs)',
828+
'config.gypi',
829+
'<@(deps_files)',
1058830
],
1059831
},
1060832
],
@@ -1598,6 +1370,7 @@
15981370
],
15991371
'sources': [
16001372
'<@(library_files)',
1373+
'<@(deps_files)',
16011374
'common.gypi',
16021375
],
16031376
'direct_dependent_settings': {

‎tools/js2c.py‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
importre
3737
importfunctools
3838
importcodecs
39+
importutils
3940

4041
defReadFile(filename):
4142
ifis_verbose:
@@ -204,12 +205,23 @@ def main():
204205
fromfile_prefix_chars='@'
205206
)
206207
parser.add_argument('--target', help='output file')
208+
parser.add_argument(
209+
'--directory',
210+
default=None,
211+
help='input file directory')
207212
parser.add_argument('--verbose', action='store_true', help='output file')
208213
parser.add_argument('sources', nargs='*', help='input files')
209214
options=parser.parse_args()
210215
globalis_verbose
211216
is_verbose=options.verbose
212-
source_files=functools.reduce(SourceFileByExt, options.sources, {})
217+
sources=options.sources
218+
ifoptions.directoryisnotNone:
219+
js_files=utils.SearchFiles(options.directory, 'js')
220+
mjs_files=utils.SearchFiles(options.directory, 'mjs')
221+
sources=js_files+mjs_files+options.sources
222+
223+
source_files=functools.reduce(SourceFileByExt, sources, {})
224+
213225
# Should have exactly 3 types: `.js`, `.mjs` and `.gypi`
214226
assertlen(source_files) ==3
215227
# Currently config.gypi is the only `.gypi` file allowed

‎tools/search_files.py‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
This is a utility for recursively searching files under
5+
a specified directory
6+
"""
7+
8+
importargparse
9+
importutils
10+
11+
defmain():
12+
parser=argparse.ArgumentParser(
13+
description='Search files with a specific extension under a directory',
14+
fromfile_prefix_chars='@'
15+
)
16+
parser.add_argument('--ext', required=True, help='extension to search for')
17+
parser.add_argument('directory', help='input directory')
18+
options=parser.parse_args()
19+
print('\n'.join(utils.SearchFiles(options.directory, options.ext)))
20+
21+
if__name__=="__main__":
22+
main()

‎tools/utils.py‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2727

2828

29+
importglob
2930
importplatform
3031
importre
32+
importsys
3133

3234

3335
# Reads a .list file into an array of strings
@@ -106,3 +108,10 @@ def GuessArchitecture():
106108

107109
defIsWindows():
108110
returnGuessOS() =='win32'
111+
112+
113+
defSearchFiles(dir, ext):
114+
list=glob.glob(dir+'/**/*.'+ext, recursive=True)
115+
ifsys.platform=='win32':
116+
list= [ x.replace('\\', '/')forxinlist]
117+
returnlist

0 commit comments

Comments
 (0)