9

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

TARGET = main

靠近顶部的声明。它从中派生SRC列表以及做许多其他事情。

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

make target1

或者

make target2

并改变TARGETmakefile中设置的内容。我很困惑如何做到这一点。我想我可以添加类似的东西

target1: all
    TARGET=target1

不过,这似乎并没有很好地工作。是否有一个如何做到这一点的一般模式?

4

3 回答 3

19

我建议简单地将您的目标拼写为 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 产生不同结果的一般模式。

于 2012-12-18T11:52:50.280 回答
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 target1or make target2,例如:

$ make target1
123 456
$ make target2
abc def
于 2012-12-17T18:05:55.473 回答
0

好吧...使用 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)
于 2021-07-13T13:43:22.157 回答