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

时间:2012-12-17 18:00:44

标签: c makefile

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

TARGET = main

靠近顶部的声明。它从中导出了SRC列表以及许多其他内容。

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

make target1

make target2

并改变makefile中设置TARGET的内容。我很困惑如何实现这一目标。我想我可能会添加像

这样的东西
target1: all
    TARGET=target1

但这似乎并没有太好用。人们如何做到这一点有一般模式吗?

3 个答案:

答案 0 :(得分:9)

我建议您简单地将目标拼写为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“以某种可能的高科技方式从[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 target1make 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)