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

问题描述 投票:0回答:4

我正在尝试参数化我的 makefile 目标。目前,它有一个

TARGET = main

顶部附近的声明。它从中派生出

SRC
列表,并执行许多其他操作。

不过,我已经更改了我的 C 代码,因此我有多个不同的顶级 .c 文件来基本上获得变体构建。所以我想做的基本上就是做

make target1

make target2

并改变 makefile 中

TARGET
的设置。我很困惑如何实现这一点。我想我可以添加类似的东西

target1: all
    TARGET=target1

不过这似乎效果不太好。有没有通用的模式来指导如何做到这一点?

c makefile
4个回答
21
投票

我建议简单地将您的目标拼写为 makefile 中的单独目标:

all: target1 target2

OTHER_OBJS = misca.o miscb.o miscc.o

target1: target1.o $(OTHER_OBJS)

target2: target2.o $(OTHER_OBJS)

然后

make
make target1
make target2
等等都会做你想做的事。

您说您的makefile“以某种高科技方式从[

SRC
]派生了
$(TARGET)
列表”,但尝试以低技术方式明确列出目标文件可能会很有趣,如上所述。使用不同的 make 目标可以说是 Make 产生不同结果的一般模式。


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 target1
make target2
,例如:

$ make target1
123 456
$ make target2
abc def

3
投票

嗯...使用 pmake 我们可以做到这一点:(如果使用 gmake 我们可以将 $(.THINGS) 替换为等价的 $@ $< and so...

.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)

0
投票

添加 Eric Melskis 的评论,如果您还想让“make all”功能创建两个程序,那么也许这将是一个很好的替代品:

target1_SRC=123 456
target2_SRC=abc def

all: target1 target2

target1: TARGET=target1
target2: TARGET=target2

target1: ; @echo $($(TARGET)_SRC)
target2: ; @echo $($(TARGET)_SRC)

这里我还添加了默认规则,默认创建两个目标。

© www.soinside.com 2019 - 2024. All rights reserved.