mirror of
https://github.com/servo/servo.git
synced 2025-07-25 08:10:21 +01:00
WebIDL codegen: Replace cmake with a single Python script
When playing around with Cargo’s new timing visualization: https://internals.rust-lang.org/t/exploring-crate-graph-build-times-with-cargo-build-ztimings/10975/21 … I was surprised to see the `script` crate’s build script take 76 seconds. I did not expect WebIDL bindings generation to be *that* computationally intensive. It turns out almost all of this time is overhead. The build script uses CMake to generate bindings for each WebIDL file in parallel, but that causes a lot of work to be repeated 366 times: * Starting up a Python VM * Importing (parts of) the Python standard library * Importing ~16k lines of our Python code * Recompiling the latter to bytecode, since we used `python -B` to disable writing `.pyc` file * Deserializing with `cPickle` and recreating in memory the results of parsing all WebIDL files ---- This commit remove the use of CMake and cPickle for the `script` crate. Instead, all WebIDL bindings generation is done sequentially in a single Python process. This takes 2 to 3 seconds.
This commit is contained in:
parent
049527872e
commit
5c60023cb8
9 changed files with 177 additions and 457 deletions
|
@ -54,32 +54,6 @@ RUST_KEYWORDS = {"abstract", "alignof", "as", "become", "box", "break", "const",
|
|||
"use", "virtual", "where", "while", "yield"}
|
||||
|
||||
|
||||
def replaceFileIfChanged(filename, newContents):
|
||||
"""
|
||||
Read a copy of the old file, so that we don't touch it if it hasn't changed.
|
||||
Returns True if the file was updated, false otherwise.
|
||||
"""
|
||||
# XXXjdm This doesn't play well with make right now.
|
||||
# Force the file to always be updated, or else changing CodegenRust.py
|
||||
# will cause many autogenerated bindings to be regenerated perpetually
|
||||
# until the result is actually different.
|
||||
|
||||
# oldFileContents = ""
|
||||
# try:
|
||||
# with open(filename, 'rb') as oldFile:
|
||||
# oldFileContents = ''.join(oldFile.readlines())
|
||||
# except:
|
||||
# pass
|
||||
|
||||
# if newContents == oldFileContents:
|
||||
# return False
|
||||
|
||||
with open(filename, 'wb') as f:
|
||||
f.write(newContents)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def toStringBool(arg):
|
||||
return str(not not arg).lower()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue