pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/doc/guide/files Added a subsection called "Quoting gui...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/b2365922c502
branches:  trunk
changeset: 493755:b2365922c502
user:      rillig <rillig%pkgsrc.org@localhost>
date:      Sat May 14 03:23:20 2005 +0000

description:
Added a subsection called "Quoting guideline", which describes some of the
common quoting errors.

diffstat:

 doc/guide/files/makefile.xml |  96 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 93 insertions(+), 3 deletions(-)

diffs (120 lines):

diff -r 21c187482861 -r b2365922c502 doc/guide/files/makefile.xml
--- a/doc/guide/files/makefile.xml      Sat May 14 02:26:50 2005 +0000
+++ b/doc/guide/files/makefile.xml      Sat May 14 03:23:20 2005 +0000
@@ -1,4 +1,4 @@
-<!-- $NetBSD: makefile.xml,v 1.8 2005/05/13 23:28:08 rillig Exp $ -->
+<!-- $NetBSD: makefile.xml,v 1.9 2005/05/14 03:23:20 rillig Exp $ -->
 
 <!-- based on:
 pkgsrc/bootstrap/bmake/for.c 1.1.1.1
@@ -104,12 +104,12 @@
 
       <itemizedlist>
 
-        <listitem><para>All variable names starting with an underscore
+       <listitem><para>All variable names starting with an underscore
        are reserved for use by the pkgsrc infrastructure. They shall
        not be used by package
        <filename>Makefile</filename>s.</para></listitem>
 
-        <listitem><para>In <!-- FIXME --><varname>.for</varname> loops
+       <listitem><para>In <!-- FIXME --><varname>.for</varname> loops
        you should use lowercase variable names for the iteration
        variables.</para></listitem>
 
@@ -211,5 +211,95 @@
       no example for it.</para>
 
     </sect2>
+
+    <sect2>
+      <title>Quoting guideline</title>
+
+      <para>There are many possible sources of wrongly quoted variables.
+      This section lists some of the commonly known ones.</para>
+
+      <itemizedlist>
+
+       <listitem><para>Whenever you use the value of a list, think
+       about what happens to leading or trailing whitespace. If the
+       list is a well-formed shell expression you can apply the
+       <varname>:M*</varname> modifier to strip leading and trailing
+       whitespace from each word. The <varname>:M</varname> operator
+       first splits its argument according to the rules of the shell,
+       and then creates a new list consisting of all words that match
+       the shell glob expression <varname>*</varname>, that is: all.
+       One class of situations where this is needed is when adding a
+       variable like <varname>CPPFLAGS</varname> to
+       <varname>CONFIGURE_ARGS</varname>. If the configure script
+       invokes other configure scripts it strips the leading and
+       trailing whitespace from the variable and then passes it to the
+       other configure scripts. But these configure scripts expect the
+       (child) <varname>CPPFLAGS</varname> variable to be the same as
+       the parent <varname>CPPFLAGS</varname>. That's why we better
+       pass the <varname>CPPFLAGS</varname> value properly trimmed. And
+       here is how we do it:</para>
+
+       <programlisting>
+CPPFLAGS=              # empty
+CPPFLAGS+=             -Wundef -DPREFIX=\"${PREFIX:Q}\"
+CPPFLAGS+=             ${MY_CPPFLAGS}
+
+CONFIGURE_ARGS+=       CPPFLAGS=${CPPFLAGS:M*:Q}
+
+all:
+       echo x${CPPFLAGS:Q}x            # leading and trailing whitespace
+       echo x${CONFIGURE_ARGS}x        # properly trimmed
+       </programlisting></listitem>
+
+       <listitem><para>The example above contains one bug: The
+       <varname>${PREFIX}</varname> is a properly quoted shell
+       expression, but there is the C compiler after it, which also
+       expects a properly quoted string (this time in C syntax). The
+       version above is therefore only correct if
+       <varname>${PREFIX}</varname> does not have embedded backslashes
+       or double quotes. If you want to allow these, you have to add
+       another layer of quoting to each variable that is used as a C
+       string literal. You cannot use the <varname>:Q</varname>
+       operator for it, as this operator only works for the
+       shell.</para></listitem>
+
+       <listitem><para>Whenever a variable can be empty the
+       <varname>:Q</varname> operator can have surprising results. Here
+       are two completely different cases which can be solved with the
+       same trick.</para>
+
+       <programlisting>
+EMPTY=                 # empty
+empty_test:
+       for i in a ${EMPTY:Q} c; do \
+               echo "$$i"; \
+       done
+
+for_test:
+.for i in a:\ a:\test.txt
+       echo ${i:Q}
+       echo "."
+.endfor
+       </programlisting>
+
+       <para>The first example will only print two of the three lines
+       we might have expected. This is because
+       <varname>${EMPTY:Q}</varname> expands to the empty string, which
+       the shell cannot see. The workaround is to write
+       <varname>${EMPTY:Q}""</varname>. This pattern can be often found
+       as <varname>${TEST} -z ${VAR:Q}</varname> or as <varname>${TEST}
+       -f ${FNAME:Q}</varname> (both of these are wrong).</para>
+
+       <para>The second example will only print three lines instead of
+       four. The first line looks like <varname>a:\ echo .</varname>.
+       This is because the backslash of the value
+       <varname>a:\</varname> is interpreted as a line-continuation by
+       &man.make.1;, which makes the second line the arguments of the
+       &man.echo.1; command from the first line. To avoid this, write
+       <varname>${i:Q}""</varname>.</para></listitem>
+
+      </itemizedlist>
+    </sect2>
+
   </sect1>
 </chapter>



Home | Main Index | Thread Index | Old Index