>From 0abcb8dec4bc9284ce7ff03ac14c5cf7e33b3788 Mon Sep 17 00:00:00 2001
Message-Id:
In-Reply-To:
References:
From: Nikolai Weibull
Date: Wed, 16 May 2012 18:16:41 +0200
Subject: [PATCH 2/2] ylwrap: preserve subdirectories in "#line" munging
If Automake is used in non-recursive mode and one of the inputs is a
yacc file, for example, "src/grammar.y", ylwrap will remove too many
directories from the output file when it adjusts the paths in it.
This results in #line directives referring to "grammar.y" instead of
"src/grammar.y".
This is a result of $input_rx simply taking all the directory
components of the absolute input path and removing them.
One solution is to store the path passed to ylwrap and replace
$input_rx with it. This is what we do.
Suggestion and initial patch (without tests) by Nikolai Weibull:
Final patch by Stefano Lattarini.
* lib/ylwrap ($input_sub_rx): New.
When munging the #line directives, substitute '$input_rx' with it,
instead of stripping it altogether.
Adjust comments.
* t/yacc-line.sh: Adjust and extend.
* NEWS, THANKS: Update.
Copyright-paperwork-exempt: yes
Co-authored-by: Stefano Lattarini
Signed-off-by: Stefano Lattarini
---
NEWS | 9 +++++++++
THANKS | 1 +
lib/ylwrap | 12 +++++-------
t/yacc-line.sh | 27 +++++++++++++++++++--------
4 files changed, 34 insertions(+), 15 deletions(-)
diff --git a/NEWS b/NEWS
index d0575e6..944f7f9 100644
--- a/NEWS
+++ b/NEWS
@@ -103,6 +103,15 @@ Bugs fixed in 1.12.1:
- Several inefficiencies and poor performances in the implementation
of the parallel-tests 'check' and 'recheck' targets have been fixed.
+ - The post-processing of output "#line" directives done the ylwrap
+ script is more faithful w.r.t. files in a subdirectory; for example,
+ if the processed file is "src/grammar.y", ylwrap will correctly
+ produce directives like:
+ #line 7 "src/grammar.y"
+ rather than like
+ #line 7 "grammar.y"
+ as it did before.
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
New in 1.12:
diff --git a/THANKS b/THANKS
index b98b2b7..0824c4f 100644
--- a/THANKS
+++ b/THANKS
@@ -269,6 +269,7 @@ Nicolas Joly address@hidden
Nicolas Thiery address@hidden
NightStrike address@hidden
Nik A. Melchior address@hidden
+Nikolai Weibull address@hidden
NISHIDA Keisuke address@hidden
Noah Friedman address@hidden
Norman Gray address@hidden
diff --git a/lib/ylwrap b/lib/ylwrap
index 8a20288..6879d8d 100755
--- a/lib/ylwrap
+++ b/lib/ylwrap
@@ -79,6 +79,8 @@ quote_for_sed ()
# The input.
input="$1"
shift
+# We'll later need for a correct munging of "#line" directives.
+input_sub_rx=`get_dirname "$input" | quote_for_sed`
case "$input" in
[\\/]* | ?:[\\/]*)
# Absolute path; do nothing.
@@ -170,15 +172,11 @@ if test $ret -eq 0; then
realtarget="$target"
target="tmp-`echo $target | sed s/.*[\\/]//g`"
fi
- # Edit out '#line' or '#' directives.
- #
+ # Munge "#line" or "#" directives.
# We don't want the resulting debug information to point at
- # an absolute srcdir; it is better for it to just mention the
- # .y file with no path.
- #
+ # an absolute srcdir.
# We want to use the real output file name, not yy.lex.c for
# instance.
- #
# We want the include guards to be adjusted too.
FROM=`echo "$from" | sed \
-e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
@@ -187,7 +185,7 @@ if test $ret -eq 0; then
-e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
-e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
- sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \
+ sed -e "/^#/!b" -e "s,$input_rx,$input_sub_rx," -e "s,$from,$2," \
-e "s,$FROM,$TARGET," "$from" >"$target" || ret=$?
# Check whether header files must be updated.
diff --git a/t/yacc-line.sh b/t/yacc-line.sh
index 090b72b..62e19e4 100755
--- a/t/yacc-line.sh
+++ b/t/yacc-line.sh
@@ -94,18 +94,29 @@ for vpath in : false; do
# For debugging,
ls -l . sub sub/dir
- $FGREP '.y' $c_outputs
+ $EGREP 'line|\.y' $c_outputs
# Adjusted "#line" should not contain reference to the builddir.
- $EGREP '#.*line.*(build|\.\.).*\.y' $c_outputs && Exit 1
+ grep '#.*line.*build.*\.y' $c_outputs && Exit 1
+ # Adjusted "#line" should not contain reference to the absolute
+ # srcdir.
+ $EGREP '#.*line *"?/.*\.y' $c_outputs && Exit 1
# Adjusted "#line" should not contain reference to the default
# output file names, e.g., 'y.tab.c' and 'y.tab.h'.
- $EGREP '#.*line.*y\.tab\.' $c_outputs && Exit 1
- # Don't be excessively strict in grepping, to avoid spurious failures.
- grep '#.*line.*zardoz\.y' zardoz.c
- grep '#.*line.*quux\.y' bar-quux.c
- grep '#.*line.*zardoz\.y' sub/foo-zardoz.c
- grep '#.*line.*quux\.y' sub/dir/quux.c
+ grep '#.*line.*y\.tab\.' $c_outputs && Exit 1
+ # Look out for a silly regression.
+ grep "#.*\.y.*\.y" $c_outputs && Exit 1
+ if $vpath; then
+ grep '#.*line.*"\.\./zardoz\.y"' zardoz.c
+ grep '#.*line.*"\.\./dir/quux\.y"' bar-quux.c
+ grep '#.*line.*"\.\./\.\./sub/zardoz\.y"' sub/foo-zardoz.c
+ grep '#.*line.*"\.\./\.\./sub/dir/quux\.y"' sub/dir/quux.c
+ else
+ grep '#.*line.*"zardoz\.y"' zardoz.c
+ grep '#.*line.*"dir/quux\.y"' bar-quux.c
+ grep '#.*line.*"zardoz\.y"' sub/foo-zardoz.c
+ grep '#.*line.*"dir/quux\.y"' sub/dir/quux.c
+ fi
cd $srcdir
done
--
1.7.9.5