为什么makefile有时会将'true <filename>'作为构建脚本的一部分?

Bri*_*erg 4 makefile

例如:

# Some stuff

all: some dependencies
    @$(CC) -o foo.o foo.c
    @true foo.o
    @some other operation
Run Code Online (Sandbox Code Playgroud)

"真正的foo.o"系列的目的是什么?

gee*_*aur 6

通常,这是从Makefile生成器输出的,例如automake.该true会与需要它的平台的实际命令代替.最常见的情况是不自动维护静态归档索引的平台; 代码看起来像

foo.a: foo.o bar.o baz.o ...
        ar rv foo.a foo.o bar.o baz.o ...
        true foo.a
Run Code Online (Sandbox Code Playgroud)

但是在某些平台上(那些没有System V或GNU的平台ar)它将改为

foo.a: foo.o bar.o baz.o ...
        ar rv foo.a foo.o bar.o baz.o ...
        ranlib foo.a
Run Code Online (Sandbox Code Playgroud)

它不是简单地删除的原因是,m4在一条线上替换文本比在条件删除线上更容易和其他宏处理器.(它可以做到,但m4已知先进的hackery导致精神错乱.:)