gnu使每个目标成为多个目标

时间:2013-10-07 15:17:52

标签: gnu-make

我有一个旧项目,我正在尝试为目录中的每个对象创建一个多个二进制文件。我不能为我的生活弄清楚如何以这种方式处理多个目标。以下是有效的,但在我看来,我应该能够有一条规则将它们全部联系起来,可以这么说,

 # compile objects, no problem
 %.o: %.c
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

 bin: bin.o
     $(CC) -o $@ $< ../lib/libfoo.a -lm $(ARCH)

 bar: bar.o
    $(CC) -o $@ $< ../lib/libfoo.a -lm $(ARCH)

我开始工作的一种方法是从目标名称中删除后缀,并在一步中编译和链接,但感觉有点hackish,

 %.o: %.c
    $(CC) $(CFLAGS) $(CPPFLAGS) $< ../lib/libfoo.a -lm -o $(*F)

免责声明:我鄙视制作

更新1:这就是我最终的结果

 EXECS = bin bar ...

 all: $(EXECS)

 %: %.c
      @echo "Building $@ from $<"
      $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@.o
      $(CC) $(CFLAGS) $(CPPFLAGS) $@.o ../lib/libfoo.a -lm -o $@

1 个答案:

答案 0 :(得分:2)

惯例是在Makefile的顶部有这样的东西:

.PHONY: all
all: bin bar

因此make allbinbar,并将其置于顶部,它是make无参数的默认目标。 .PHONY:将此文档记录为“metatarget”,但也指示Make运行它,即使恰好有一个名为all的文件带有新的日期戳。

%: %.o
     $(CC) -o $@ $< ../lib/libfoo.a -lm $(ARCH)

这告诉Make如何制作它们。