Commit a115b927 authored by Jakub Kicinski's avatar Jakub Kicinski

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

Commit 2b7ac0c8 ("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.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 9cf9b570
...@@ -1164,8 +1164,9 @@ class RenderInfo: ...@@ -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,7 +1187,8 @@ class CodeWriter: ...@@ -1186,7 +1187,8 @@ 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):
if filecmp.cmp(self._out.name, self._out_file, shallow=False):
return 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)
...@@ -2516,6 +2518,8 @@ def main(): ...@@ -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(): ...@@ -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:
......
...@@ -30,8 +30,8 @@ for f in $files; do ...@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment