我正在尝试参数化我的makefile目标。目前,它有一个
TARGET = main
靠近顶部的声明。它从中导出了SRC
列表以及许多其他内容。
我已经改变了我的C代码,因此我有多个不同的顶级.c文件,基本上可以获得变体版本。所以我想要做的就是基本上做
make target1
或
make target2
并改变makefile中设置TARGET
的内容。我很困惑如何实现这一目标。我想我可能会添加像
target1: all
TARGET=target1
但这似乎并没有太好用。人们如何做到这一点有一般模式吗?
答案 0 :(得分:9)
我建议您简单地将目标拼写为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的一般模式,可以产生不同的结果。
答案 1 :(得分:4)
参数化变量名和目标特定变量可以做你想要的,因为特定于目标的变量的值通常由该目标的先决条件“继承”(假设你使用的是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
答案 2 :(得分:0)
嗯...使用 pmake 我们可以做到这一点:(如果使用 gmake 我们可以将 $(.THINGS) 替换为 equivalanet $@ $< 等等...
.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)