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

pkgsrc/doc/guide/files/makefile.xml: 1.21 -> 1.22



以下のページの更新をしました。ツッコミをお願いします。

pkgsrc/doc/guide/files/makefile.xml: 1.21 -> 1.22
> revision 1.22
> date: 2007/03/08 16:00:16;  author: rillig;  state: Exp;  lines: +39 -1
> Added a caveat in the Makefiles section that I just stumbled upon.
> 
> Added some questions regarding the tools framework.

月曜日までに異議がなければ、 commit します。

以下、訳と原文それぞれの新旧の差分です。

--- makefile.xml.orig	2007-03-09 20:55:21.000000000 +0900
+++ makefile.xml	2007-03-09 20:55:21.000000000 +0900
@@ -1,6 +1,6 @@
-<!-- $NetBSD: makefile.xml,v 1.21 2006/06/29 13:37:46 rillig Exp $ -->
+<!-- $NetBSD: makefile.xml,v 1.22 2007/03/08 16:00:16 rillig Exp $ -->
 <!-- Based on english version: -->
-<!-- NetBSD: makefile.xml,v 1.21 2006/06/29 13:37:46 rillig Exp   -->
+<!-- NetBSD: makefile.xml,v 1.22 2007/03/08 16:00:16 rillig Exp   -->
 
 <chapter id="makefile"> <?dbhtml filename="makefile.html"?>
   <title><filename>Makefile</filename> におけるプログラミング</title>
@@ -21,6 +21,48 @@
   で頻出するいくつかのパターンと、
   それらに伴う落とし穴を説明します。</para>
 
+  <sect1 id="makefile.style">
+  <title>警告</title>
+
+    <itemizedlist><listitem><para>ルールのターゲットとしてファイルを作る場合、
+    常に、データをまず一時ファイルに書き込んでから、
+    最後にファイル名を変えるようにしてください。
+    そうしておかないと、ファイルの生成の途中にエラーが起きた場合、
+    利用者が &man.make.1; を 2 回目に実行したときに、
+    前回のファイルが存在したままとなり、ファイルが正しく再生成されません。
+    たとえば、</para>
+
+<programlisting>
+    wrong:
+            @echo "line 1" > ${.TARGET}
+            @echo "line 2" >> ${.TARGET}
+            @false
+
+    correct:
+            @echo "line 1" > ${.TARGET}.tmp
+            @echo "line 2" >> ${.TARGET}.tmp
+            @false
+            @mv ${.TARGET}.tmp ${.TARGET}
+</programlisting>
+
+    <para><command>make wrong</command> を 2 回実行したときに、
+    1 回目の実行でエラーメッセージが出ますが、
+    ファイル <filename>wrong</filename> は作られた状態になります。
+    一方、<command>make
+    correct</command> を実行すると、エラーメッセージが 2 回出るという、
+    期待どおりの動作となります。</para>
+    
+    <para>エラーの場合には &man.make.1; が <literal>${.TARGET}</literal>
+    を削除することがあるということをご存知かもしれませんが、
+    この削除は、たとえば <literal>^C</literal> を押すなど、
+    割り込みがあった場合にのみおこなわれます。コマンドのどれかが
+    (上の例の &man.false.1; のように) 失敗した場合には、
+    削除は<emphasis>おこなわれません</emphasis>。</para>
+    
+    </listitem>
+    </itemizedlist>
+  </sect1>
+
   <sect1 id="makefile.variables">
     <title><filename>Makefile</filename> 変数</title>
 
Index: makefile.xml
===================================================================
RCS file: /cvsroot/pkgsrc/doc/guide/files/makefile.xml,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- makefile.xml	29 Jun 2006 13:37:46 -0000	1.21
+++ makefile.xml	8 Mar 2007 16:00:16 -0000	1.22
@@ -1,4 +1,4 @@
-<!-- $NetBSD: makefile.xml,v 1.21 2006/06/29 13:37:46 rillig Exp $ -->
+<!-- $NetBSD: makefile.xml,v 1.22 2007/03/08 16:00:16 rillig Exp $ -->
 
 <chapter id="makefile"> <?dbhtml filename="makefile.html"?>
   <title>Programming in <filename>Makefile</filename>s</title>
@@ -20,6 +20,44 @@
   <filename>Makefile</filename>s, including the pitfalls that come along
   with them.</para>
 
+  <sect1 id="makefile.style">
+  <title>Caveats</title>
+
+    <itemizedlist><listitem><para>When you are creating a file as a
+    target of a rule, always write the data to a temporary file first
+    and finally rename that file. Otherwise there might occur an error
+    in the middle of generating the file, and when the user runs
+    &man.make.1; for the second time, the file exists and will not be
+    regenerated properly. Example:</para>
+
+<programlisting>
+    wrong:
+            @echo "line 1" > ${.TARGET}
+            @echo "line 2" >> ${.TARGET}
+            @false
+
+    correct:
+            @echo "line 1" > ${.TARGET}.tmp
+            @echo "line 2" >> ${.TARGET}.tmp
+            @false
+            @mv ${.TARGET}.tmp ${.TARGET}
+</programlisting>
+
+    <para>When you run <command>make wrong</command> twice, the file
+    <filename>wrong</filename> will exist, although there was an error
+    message in the first run. On the other hand, running <command>make
+    correct</command> gives an error message twice, as expected.</para>
+    
+    <para>You might remember that &man.make.1; sometimes removes
+    <literal>${.TARGET}</literal> in case of error, but this only
+    happens when it is interrupted, for example by pressing
+    <literal>^C</literal>. This does <emphasis>not</emphasis> happen
+    when one of the commands fails (like &man.false.1; above).</para>
+    
+    </listitem>
+    </itemizedlist>
+  </sect1>
+
   <sect1 id="makefile.variables">
     <title><filename>Makefile</filename> variables</title>