如何从一个Makefile构建多个目标

12
我正在尝试对我的makefile目标进行参数化。目前,它有一个。
TARGET = main

在顶部附近有一个声明。它从中派生出SRC列表,并执行许多其他操作。

不过,我已经更改了我的C代码,以便拥有多个不同的顶层.c文件来基本上获取变体构建。因此,我想要能够做到:

make target1

或者

make target2

要改变在makefile中设置的TARGET,我不知道该怎么做。我想我可以添加类似于以下内容:

And vary what TARGET is set to in the makefile. I'm confused how to accomplish this. I thought I might add something like

target1: all
    TARGET=target1

这似乎并不太有效。有没有一般的模式来完成这个操作?

3个回答

21

我建议在makefile中将您的目标分别拼写出来:

all: target1 target2

OTHER_OBJS = misca.o miscb.o miscc.o

target1: target1.o $(OTHER_OBJS)

target2: target2.o $(OTHER_OBJS)

然后使用makemake target1make target2等都会按照您的要求执行。

您说您的Makefile以某种高科技方式从$(TARGET)派生出SRC列表,但尝试以低技术方式明确列出对象文件可能很有趣,就像上面所示。使用不同的make目标可以说是Make生成不同结果的一般模式。


这太不可思议了,但是all:在哪里有文档记录呢?我在GNU Make手册的4.3节中看到了它的第一次使用,但没有讨论。 - young_souvlaki
1
其实这很普通...默认情况下,Make 会重建列出的第一个目标(例如,请参见 GNU Make §9.2),而 all 是该目标的传统名称。 - John Marshall

11

参数化变量名称和目标特定变量可能会达到您想要的效果,因为目标特定变量的值通常会被该目标的先决条件“继承”(假设您正在使用GNU make):

target1_SRC=123 456
target2_SRC=abc def

target1: TARGET=target1
target2: TARGET=target2

target1: all
target2: all

all: ; @echo $($(TARGET)_SRC)

然后你可以运行make target1make target2,例如:

$ make target1
123 456
$ make target2
abc def

3
好的... 我们可以使用 pmake 来完成这个任务:(如果使用 gmake,我们可以将 $(.THINGS) 替换为等效的 $@ $< ...
.PHONY: clean run

PROGRAMS = progrname_one progrname_two... and so

all: $(PROGRAMS)

$(PROGRAMS): $(PROGRAM=$(.TARGET))

CC = clang -I.

CFLAGS = -O0 -g -std=gnu11 

OBJS = 

LIBS = 

CPATH = .

$(PROGRAM): $(PROGRAM).c $(OBJS)
    $(CC) $(CFLAGS) -o $(.TARGET) $(.IMPSRC) $(OBJS) $(LIBS) 

$(PROGRAM).o: $(PROGRAM).c

clean:
    rm -f *~
    rm -f *.core
    rm -f $(PROGRAMS) $(PROGRAMS).o

run:
    ./$(PROGRAM)

dbg:
    lldb ./$(PROGRAM)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接