On Fri, 2007-01-19 at 20:01 +0100, Dirk Heinrichs wrote:

> I'm using GNU make 3.81 (on Linux, if this is important) and see strange 
> behaviour in parallel builds with the following Makefile:
> 
> file1.txt file2.txt: file.in
>       cat $< >file1.txt|tee file2.txt
> 
> test: file1.txt file2.txt
>       cat $^ >$@
> 
> In a normal build, make does the right thing:
> 
> % make test
> cat file.in >file1.txt|tee file2.txt
> cat file1.txt file2.txt >test
> 
> In case of a parallel build, the "cat ... | tee ..." command for file[12].txt 
> is executed twice, which should not happen:
> 
> % make -j 2 test
> cat file.in >file1.txt|tee file2.txt
> cat file.in >file1.txt|tee file2.txt
> cat file1.txt file2.txt >test

Make is behaving correctly here.  Multiple targets in a single rule does
not mean "all these targets are built from one invocation of the rule".
It means that each of these targets has the same prerequisites and rule,
and will be built one at a time by running the rule.  IOW, this:

    a b c : d e f ; command

is identical to writing this:

    a : d e f ; command
    b : d e f ; command
    c : d e f ; command

See the GNU make manual for details.

You can use pattern rules:

        %1.txt %2.txt : %.in
                ...

which do work as you expect.  Or you have to use a sentinel file.

-- 
-------------------------------------------------------------------------------
 Paul D. Smith <[EMAIL PROTECTED]>          Find some GNU make tips at:
 http://www.gnu.org                      http://make.paulandlesley.org
 "Please remain calm...I may be mad, but I am a professional." --Mad Scientist


_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to