【发布时间】:2011-03-09 08:12:13
【问题描述】:
例如:
# Some stuff
all: some dependencies
@$(CC) -o foo.o foo.c
@true foo.o
@some other operation
'true foo.o' 行的用途是什么?
【问题讨论】:
标签: makefile
例如:
# Some stuff
all: some dependencies
@$(CC) -o foo.o foo.c
@true foo.o
@some other operation
'true foo.o' 行的用途是什么?
【问题讨论】:
标签: makefile
通常这是来自 Makefile 生成器的输出,例如 automake。 true 将在需要它的平台上替换为实际命令。最常见的情况是不自动维护静态归档索引的平台;代码看起来像
foo.a: foo.o bar.o baz.o ...
ar rv foo.a foo.o bar.o baz.o ...
true foo.a
但在某些平台上(没有 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
之所以不简单地删除它,是因为在m4 和其他宏处理器中替换一行中的文本比有条件地删除该行要容易得多。 (可以做到,但已知高级的m4hackery 会导致精神错乱。:)
【讨论】:
@RANLIB@ 到ranlib(或true)之类的变量替换通常不是由m4 完成的,而是由config.status 完成,awk 驱动的shell 脚本由configure 在完成时创建它的运行。通过替换很难删除行(automake 的条件是通过定义扩展为空字符串或 # 的替换来实现的,注释掉该行)。把@RANLIB@换成#一般来说是不安全的,所以换成true。
config.status 实际上为此使用了sed;我实际上在考虑automake 从Makefile.am 创建Makefile.in,如果它使用m4 或sed,我不会拒绝。 (我使用的示例无疑更适合config.status。)