[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>