Search code examples
makefileposixgnu-make

Pattern rules work but suffix rules don't


Pattern rules work:

$ ls
Makefile   hello.txt  world.txt
$ cat Makefile
all: hello.out world.out

%.out: %.txt
        cp $< $@

$ make
cp hello.txt hello.out
cp world.txt world.out

However, when I try to replace them with what I think is the exact equivalent suffix rules, they don't work:

$ ls
Makefile   hello.txt  world.txt
$ cat Makefile
.POSIX:
.SUFFIXES:
.SUFFIXES:.txt.out

all: hello.out world.out

.txt.out:
        cp $< $@

$ make
make: *** No rule to make target 'hello.out', needed by 'all'.  Stop.

I don't understand why.


Solution

  • This line is the problem:

    .SUFFIXES: .txt.out
    

    It declares a single suffix, .txt.out, not two of them. You can change it to this:

    .SUFFIXES: .txt .out