扩展 GNU make 隐式规则

Extending a GNU make implicit rule

我正在使用 GNU make implicit rule 将我的二进制文件链接在一起,如下所示:

foo : foo.o bar.o

但是,我还希望能够在之后用 UPX(通过调用 upx ultra-brute foo)编译生成的二进制文件 foo。我当然可以这样做:

foo : foo.o bar.o
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
    upx --ultra-brute $@

然而,这基本上是在迫使我重复隐式规则,而我真正想做的只是在它已经完成的事情之后调用 upx ultra-brute。有没有办法得到我想要的东西,而基本上不必手动将隐式规则写入配方?

调用 upx 会就地修改文件,这意味着如果它失败或被中断,make 将无法再次 运行 它。一般来说,你应该避免像那样编写 Makefile 规则。

如果我们把它分开,就变得容易了:

foo.fat: foo.o bar.o
foo: foo.fat
    upx --ultra-brute -o $@ $<