qapi: Touch generated files only when they change

A massive number of objects depends on QAPI-generated headers. In my
"build everything" tree, it's roughly 4800 out of 5100. This is
particularly annoying when only some of the generated files change,
say for a doc fix.

Improve qapi-gen.py to touch its output files only if they actually
change. Rebuild time for a QAPI doc fix drops from many minutes to a
few seconds. Rebuilds get faster for certain code changes, too. For
instance, adding a simple QMP event now recompiles less than 200
instead of 4800 objects. But adding a QAPI type is as bad as ever;
we've clearly got more work to do.

Backports commit 907b846653fb3757bf2ab98d6d66f92df34d875f from qemu
This commit is contained in:
Markus Armbruster 2018-03-09 08:51:12 -05:00 committed by Lioncash
parent 3b1d4defe3
commit d74daa8fce
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -1956,9 +1956,16 @@ class QAPIGen(object):
except os.error as e:
if e.errno != errno.EEXIST:
raise
f = open(os.path.join(output_dir, fname), 'w')
f.write(self._top(fname) + self._preamble + self._body
fd = os.open(os.path.join(output_dir, fname),
os.O_RDWR | os.O_CREAT, 0o666)
f = os.fdopen(fd, 'r+')
text = (self._top(fname) + self._preamble + self._body
+ self._bottom(fname))
oldtext = f.read(len(text) + 1)
if text != oldtext:
f.seek(0)
f.truncate(0)
f.write(text)
f.close()