tools: ynl: don't skip regeneration from make targets

Commit 2b7ac0c87d ("tools: ynl-gen: don't touch the output file if
content is the same") is working too well. It was added so that
ynl-regen -f doesn't make us rebuild half of the kernel, if there
are no actual changes in any generated code.

When ynl-gen-c is called by make, however, we're better off trusting
make's tracking and overwrite the file. Otherwise if output is identical
we won't update file timestamps and make will retry code gen on every
invocation.

Link: https://lore.kernel.org/r/20231129193622.2912353-5-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2023-11-29 11:36:22 -08:00
parent 9cf9b57082
commit a115b9279f
2 changed files with 10 additions and 6 deletions

View file

@ -1164,8 +1164,9 @@ class RenderInfo:
class CodeWriter: class CodeWriter:
def __init__(self, nlib, out_file=None): def __init__(self, nlib, out_file=None, overwrite=True):
self.nlib = nlib self.nlib = nlib
self._overwrite = overwrite
self._nl = False self._nl = False
self._block_end = False self._block_end = False
@ -1186,8 +1187,9 @@ class CodeWriter:
return return
# Avoid modifying the file if contents didn't change # Avoid modifying the file if contents didn't change
self._out.flush() self._out.flush()
if os.path.isfile(self._out_file) and filecmp.cmp(self._out.name, self._out_file, shallow=False): if not self._overwrite and os.path.isfile(self._out_file):
return if filecmp.cmp(self._out.name, self._out_file, shallow=False):
return
with open(self._out_file, 'w+') as out_file: with open(self._out_file, 'w+') as out_file:
self._out.seek(0) self._out.seek(0)
shutil.copyfileobj(self._out, out_file) shutil.copyfileobj(self._out, out_file)
@ -2516,6 +2518,8 @@ def main():
parser.add_argument('--header', dest='header', action='store_true', default=None) parser.add_argument('--header', dest='header', action='store_true', default=None)
parser.add_argument('--source', dest='header', action='store_false') parser.add_argument('--source', dest='header', action='store_false')
parser.add_argument('--user-header', nargs='+', default=[]) parser.add_argument('--user-header', nargs='+', default=[])
parser.add_argument('--cmp-out', action='store_true', default=None,
help='Do not overwrite the output file if the new output is identical to the old')
parser.add_argument('--exclude-op', action='append', default=[]) parser.add_argument('--exclude-op', action='append', default=[])
parser.add_argument('-o', dest='out_file', type=str, default=None) parser.add_argument('-o', dest='out_file', type=str, default=None)
args = parser.parse_args() args = parser.parse_args()
@ -2543,7 +2547,7 @@ def main():
print(f'Message enum-model {parsed.msg_id_model} not supported for {args.mode} generation') print(f'Message enum-model {parsed.msg_id_model} not supported for {args.mode} generation')
os.sys.exit(1) os.sys.exit(1)
cw = CodeWriter(BaseNlLib(), args.out_file) cw = CodeWriter(BaseNlLib(), args.out_file, overwrite=(not args.cmp_out))
_, spec_kernel = find_kernel_root(args.spec) _, spec_kernel = find_kernel_root(args.spec)
if args.mode == 'uapi' or args.header: if args.mode == 'uapi' or args.header:

View file

@ -30,8 +30,8 @@ for f in $files; do
fi fi
echo -e "\tGEN ${params[2]}\t$f" echo -e "\tGEN ${params[2]}\t$f"
$TOOL --mode ${params[2]} --${params[3]} --spec $KDIR/${params[0]} \ $TOOL --cmp-out --mode ${params[2]} --${params[3]} \
$args -o $f --spec $KDIR/${params[0]} $args -o $f
done done
popd >>/dev/null popd >>/dev/null