# An alternative is to slurp in the tables at runtime.
 .PHONY: nltvals
 nltvals:
-       $(abs_srcdir)/common/gennltvals.py --cpp "$(CPP)" --output nltvals.def --srcroot $(srcroot)
-       $(SHELL) $(srcroot)/move-if-change nltvals.def $(abs_srcdir)/common/nltvals.def
+       $(srcdir)/common/gennltvals.py --cpp "$(CPP)"
 
 pkginclude_HEADERS = \
        $(srcroot)/include/sim/callback.h \
 
 # An alternative is to slurp in the tables at runtime.
 .PHONY: nltvals
 nltvals:
-       $(abs_srcdir)/common/gennltvals.py --cpp "$(CPP)" --output nltvals.def --srcroot $(srcroot)
-       $(SHELL) $(srcroot)/move-if-change nltvals.def $(abs_srcdir)/common/nltvals.def
+       $(srcdir)/common/gennltvals.py --cpp "$(CPP)"
 
 common/version.c: common/version.c-stamp ; @true
 common/version.c-stamp: $(srcroot)/gdb/version.in $(srcroot)/bfd/version.h $(srcdir)/common/create-version.sh
 
         formatter_class=argparse.RawDescriptionHelpFormatter)
     parser.add_argument(
         '-o', '--output', type=Path,
-        help='write to the specified file instead of stdout')
+        help='write to the specified directory')
     parser.add_argument(
         '--cpp', type=str, default='cpp',
         help='the preprocessor to use')
     parser = get_parser()
     opts = parser.parse_args(argv)
 
+    if opts.output is None:
+        # Default to where the script lives.
+        opts.output = Path(__file__).resolve().parent
+
     if opts.srcroot is None:
         opts.srcroot = Path(__file__).resolve().parent.parent.parent
+    else:
+        opts.srcroot = opts.srcroot.resolve()
 
     if opts.newlib is None:
         # Try to find newlib relative to our source tree.
     """The main entry point for scripts."""
     opts = parse_args(argv)
 
-    if opts.output is not None:
-        output = open(opts.output, 'w', encoding='utf-8')
-    else:
-        output = sys.stdout
+    output = (opts.output / 'nltvals.def').open('w', encoding='utf-8')
 
     gen(output, opts.newlib, opts.cpp)
     return 0