我正在尝试参数化我的 makefile 目标。目前,它有一个
TARGET = main
顶部附近的声明。它从中派生出
SRC
列表,并执行许多其他操作。
不过,我已经更改了我的 C 代码,因此我有多个不同的顶级 .c 文件来基本上获得变体构建。所以我想做的基本上就是做
make target1
或
make target2
并改变 makefile 中
TARGET
的设置。我很困惑如何实现这一点。我想我可以添加类似的东西
target1: all
TARGET=target1
不过这似乎效果不太好。有没有通用的模式来指导如何做到这一点?
我建议简单地将您的目标拼写为 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 产生不同结果的一般模式。
参数化变量名和特定于目标的变量可以执行您想要的操作,因为特定于目标的变量的值通常由该目标的先决条件“继承”(假设您正在使用 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
嗯...使用 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)
添加 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)
这里我还添加了默认规则,默认创建两个目标。