Make:设置具有不同目标的目标特定变量

use*_*077 3 makefile

我正在构建一个将用于构建发布或调试目标库的 makefile。我想根据请求的 makefile 目标将对象和自动生成的依赖文件放入调试或发布目录结构中。我不想指定可测试的 make 命令行参数(即 DBG=1),但更喜欢分别运行 make -f Makefile 或 make -f Makefiel dbg 来实现发布和调试目标目标。把那部分下来。我知道我无法分配包含对象目录名称(发布或调试)的特定于目标的变量,该变量可用作规则中目标规范的一部分,就像我在下面显示的示例中所做的那样。在这个例子中,OBJDIR 是我想根据构建目标设置的特定于目标的变量。出于这个原因,在这个例子中,$(OBJDIR) 在目标规则 $(OBJDIR)/%.o 中为空。关于如何很好地执行建议步骤的任何建议?(显示的示例只是一个未经验证的复制/粘贴示例......语法未经验证......事实上,我无法正确显示选项卡......我希望得到一些实现想法)。(此外,$(OBJDIR) 未设置在干净的目标中,如图所示......因为它不在 dbg/all 目标依赖层次结构中......想法?)提前致谢。

生成文件:

OBJS    := a.o b.o c.o  
SRCS    := $(OBJS:.o=.c)  

-- Set up the release and the debug directory paths and object filenames  
RELEASE_DIR := ./release  
RELEASE_OBJ := $(OBJS:%=$(RELEASE_DIR)/%)  
DEBUG_DIR   := ./debug  
DEBUG_OBJ   := $(OBJS:%=$(DEBUG_DIR)/%)  

.PHONY : all dbg 

all: CFLAGS = -O3  
all: OBJDIR := RELEASE_DIR  
all: df     := $(RELEASE_DIR)/$(*F)  
all: init_release lib1.so  

dbg: CFLAGS = -g -O0  
dbg: OBJDIR := DEBUG_DIR  
dbg: df     := $(DEBUG_DIR)/$(*F)  
dbg: init_debug lib1.so  

Lib1.so: $(OBJ)  

init_release:  
    -@mkdir -p $(RELEASE_DIR)  

init_debug:  
    -@mkdir -p $(DEBUG_DIR)  

lib1.so: $(OBJ)  
    @echo '--------------------------------------------------------------'
    @echo linking $@  
    @gcc -shared -o lib1.so $(OBJ)  

-Compile including advance dependancy generation alg, per Tom Tromey:
    # http://make.paulandlesley.org/autodep.html  
$(OBJDIR)/%.o: %.c  
    echo $@    
    echo $(OBJDIR)  
    echo compiling $@  
    $(COMPILE.c) -MD -o $@ $<  
    cp $(df).d $(df).P; \  
    sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \  
             -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \  
    rm -f $(df)/$*.d  

# If the goal is "clean", don't include these to avoid trying to build them
ifneq($(MAKECMDGOALS),clean)  
-include $(SRCS:%.c=$(OBJDIR)/%.P)
endif  

clean:  
    -@rm -f    $(OBJDIR)/*.[Pdo] lib1.so  
Run Code Online (Sandbox Code Playgroud)

bob*_*ogo 5

目标特定变量可能很棘手。改用间接。Make 有很多语法可以减少样板文本。.SECONDEXPANSION通常是好的。草图:

.SECONDEXPANSION:
${DEBUG_OBJ} ${RELEASE_OBJ}: $$(patsubst %.o,%.c,$${@F})
    gcc ${copts-${@D}} -c $< -o $@
Run Code Online (Sandbox Code Playgroud)

在这里我们告诉 make 这./release/a.o取决于a.c. 当 make 决定构建时,./release/a.o它会扩展 shell 线。这样做${@D}是很自然的release,所以 make 会继续并扩展${copts-release}您已经定义的有用的内容。

同样,在生成./debug/a.omake时,会扩展${copts-debug}.

大量使用$(warning [blah]),$(error [blah blah])和必填项--warn-undefined-variables将帮助您正确地做到这一点。