使用 GNU Make 同时构建调试和发布目标(扩展)

Yan*_*euc 4 c gcc makefile gnu-make

我想跟进这个问题及其答案...现在我可以构建两个不同的可执行文件,我想根据变量在不同的目录中构建可执行文件。

我想从这样的事情开始:

EXEDIR     = bin/release/
EXE        = $(EXEDIR)AmiModRadio
SOURCES    = $(wildcard *.c)
OBJECTSDIR = o/release/
OBJECTS    = $(addprefix $(OBJECTSDIR), $(SOURCES:.c=.o))

CC = vbcc:bin/vc
LD = vbcc:bin/vc

release : $(EXE) 
$(OBJECTS) : $(OBJECTSDIR)%.o : %.c
    $(CC) $(shell vbccprefs) -c $< -o $@
$(EXE) : $(OBJECTS)
    $(LD) $(shell vbccprefs) -o $(EXE) $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)

像这样的东西:

EXE        = $(EXEDIR)AmiModRadio
SOURCES    = $(wildcard *.c)
OBJECTS    = $(addprefix $(OBJECTSDIR), $(SOURCES:.c=.o))

CC = vbcc:bin/vc
LD = vbcc:bin/vc

release : EXEDIR = bin/release/
release : OBJECTSDIR = o/release/
release : $(EXE) 

release : EXEDIR = bin/debug/
release : OBJECTSDIR = o/debug/
release : $(EXE) 

$(OBJECTS) : $(OBJECTSDIR)%.o : %.c
    $(CC) $(shell vbccprefs) -c $< -o $@
$(EXE) : $(OBJECTS)
    $(LD) $(shell vbccprefs) -o $(EXE) $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)

上面的最后一个 makefile 不起作用,因为据我了解,在规则中设置变量EXEDIR和为时已晚。OBJECTSDIRreleasedebug

那么,我在这里错过了一些简单的事情吗?有没有办法拥有这两个规则releasedebug使用相同的规则,但在两组不同的目录中生成文件,包括作为主要目标的可执行文件?

Zif*_*ion 5

您可以调用以下 Makefile:

make release
make debug
Run Code Online (Sandbox Code Playgroud)

- 或者 -

make BUILD=release
make BUILD=debug
Run Code Online (Sandbox Code Playgroud)

生成文件

ifneq ($(BUILD),release)
    BUILD = debug
endif

EXEDIR      = bin/$(BUILD)/
OBJDIR      = o/$(BUILD)/

EXE         = $(EXEDIR)AmiModRadio
SOURCES     = $(wildcard *.c)
OBJECTS     = $(addprefix $(OBJDIR), $(SOURCES:.c=.o))

CC = vbcc:bin/vc
LD = vbcc:bin/vc

CFLAGS  = $(shell vbccprefs)
LDFLAGS = $(shell vbccprefs)

all : $(EXE)

.PHONY : release debug    
release debug :
    $(MAKE) BUILD=$@

$(EXE) : $(OBJECTS)
    $(LD) $(LDFLAGS) -o $@ $^

$(OBJDIR)%.o : %.c
    $(CC) $(CFLAGS) -o $@ -c $<
Run Code Online (Sandbox Code Playgroud)