bug-make
[Top][All Lists]
Advanced

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

undesirable .out rule


From: Bruno Haible
Subject: undesirable .out rule
Date: Mon, 12 Nov 2001 13:19:41 +0100 (CET)

Hi,

GNU make 3.79.1 apparently contains a pattern rule "%.out : % ; ..."
which has some undesirable side effects. You can observe it as follows:

- unpack ftp://alpha.gnu.org/gnu/gettext/gettext-0.11-pre1.tar.gz,
- make a VPATH build:
    $ cd gettext-0.11-pre1
    $ mkdir build
    $ cd build
    $ ../configure
    $ make
- make a distribution package:
    $ make dist

You will observe that the created distribution contains a tests/msguniq-1.out
file which differs from the one in the source. During the "make dist" a
dependency of 'distdir' on 'msguniq-1.out' has caused the following command
to be executed:
    cp ../../tests/msguniq-1 msguniq-1.out

Both 'msguniq-1' and 'msguniq-1.out' exist in the source directory ../../tests,
and 'msguniq-1.out' is older than 'msguniq-1'. This has apparently triggered
the implicit rule.

I'd like to ask to remove this misfeature rule from GNU make because

  1) It is undocumented. The "make" documentation (node "Catalogue of Implicit
     Rules") doesn't mention this pattern rule. It only mentions the .out
     suffix, but the tests/Makefile redefines the suffix list anyway.

  2) It cannot be turned off in a portable way. Node "Canceling Implicit Rules"
     recommends redefining the same pattern rule with no commands. But
     since pattern rules are not portable (see SUSV2 "make" documentation),
     I cannot do that in a portable Makefile.

  3) Compared to the rationale of the rule, namely the ability to write
     rules like

        .out.symlist :
                nm $< > $@

     which create 'foo,symlist' from 'foo', its implementation is gross:
     it copies the complete executable file. This is a case where pattern
     rules are needed.

Bruno



reply via email to

[Prev in Thread] Current Thread [Next in Thread]