1

我最近在 CMU 的操作系统设计课程中浏览了包含这些代码行的 makefile。

$(TEST_PROGS) tests/verify_test: %: %.o libtraceback.a
    $(CC) -o $@ $@.o -L. libtraceback.a $(CFLAGS) $(LDFLAGS) $(LIBS) -static
    python ./symtabgen.py $@

我不明白“%:”在这里可能意味着什么。TEST_PROGS 变量包含列表 traceback/traceback_globals.o traceback/traceback.o

制作 libtraceback.a 时需要 traceback/traceback_globals.o traceback/traceback.o

我什至玩弄删除 %.o。这样做会阻止 TEST_PROGS 对象编译

删除 %: 但保留 %.o 给出了几个警告并且没有编译。

我希望有人可以在这里对makefile的语法有所了解。快速谷歌搜索显示 %: 与二次扩展有关。但是在我正在查看的这段代码中,未定义特殊目标 .SECONDEPANSION 。

请帮忙,这段代码让我的大脑受伤了......

4

2 回答 2

4

规范的地方是Make 手册

无论如何,这是一个静态模式规则的例子。它使用通配符来指定每个目标与类似名称的先决条件之间的关系。

于 2013-01-10T06:12:43.013 回答
1

这是一个静态模式。

这就是它的意思:

您的目标是 $(TEST_PROGS) 或 test/verify_test 描述的任何文件

您需要构建目标的是第二部分:%.o libtraceback.a

将替换 % 符号的字符串正是您要构建的文件的名称。

因此,例如,执行 make test/verify_test 会将 % 设置为“test/verify_test”,并且需要 test/verify_test.o 和 libtraceback.a

于 2014-09-04T23:28:12.280 回答