在Makefile中设置变量的规则未按预期工作

时间:2015-03-27 16:09:36

标签: c makefile

我正在编写一个makefile,可以根据使用的规则编译不同的项目。为此,我需要设置某些变量来设置路径并生成正确的输出文件。

这是目前无效的部分:

bubblesort: OUTPROG = bubblesort
bubblesort: APP_PATH    = $(SRCS)/bubblesort
bubblesort: OBJS    = ../programs/bubblesort/bubblesort.o
bubblesort: $(COMMON_OBJS) $(OBJS)
    @ echo "<-------------------- Making Bubblesort -------------------->"
    @ echo "<-------------------- Linking files -------------------->"
    $(LD) $(COMMON_OBJS) $(OBJS) $(LDFLAGS)
    @ echo "<-------------------- ELF to Binary File -------------------->"
    $(OC) $(OCFLAGS) $(TARGET) $(BINOUT)
    @ echo "<-------------------- Binary to Verilog Conversion -------------------->"
    $(R2V) $(R2VPARAMS) 


# This is the rule to transform any c code to object file via compilation.
%.o : %.c
    @ echo "<-------------------- Compiling C Source Files -------------------->"
    $(CC) $(CFLAGS_APP) $< -o $@

从未调用生成.o的c源代码编译(%.o:%。c规则)。然而,这有效:

OBJS        = ../programs/bubblesort/bubblesort.o
bubblesort: OUTPROG = bubblesort
bubblesort: APP_PATH    = $(SRCS)/bubblesort
bubblesort: $(COMMON_OBJS) $(OBJS)
    @ echo "<-------------------- Making Bubblesort -------------------->"
    @ echo "<-------------------- Linking files -------------------->"
    $(LD) $(COMMON_OBJS) $(OBJS) $(LDFLAGS)
    @ echo "<-------------------- ELF to Binary File -------------------->"
    $(OC) $(OCFLAGS) $(TARGET) $(BINOUT)
    @ echo "<-------------------- Binary to Verilog Conversion -------------------->"
    $(R2V) $(R2VPARAMS) 

我的问题只是为什么?我很感激任何意见。

编辑:

另外,如何使先决条件取决于所调用的规则?

编辑2:

根据Etan Raiser的建议,我修改了我的代码:

bubblesort: OUTPROG = bubblesort
bubblesort: APP_PATH    = $(SRCS)/bubblesort
bubblesort: $(COMMON_OBJS) ../programs/bubblesort/bubblesort.o creation

creation: $^
    @ echo "<-------------------- Making in general -------------------->"
    @ echo "<-------------------- Linking files -------------------->"
    $(LD) $^ $(LDFLAGS)
    @ echo "<-------------------- ELF to Binary File -------------------->"
    $(OC) $(OCFLAGS) $(TARGET) $(BINOUT)
    @ echo "<-------------------- Binary to Verilog Conversion -------------------->"
    $(R2V) $(R2VPARAMS) 
    @ echo "<-------------------- Creating Obj Dump -------------------->"
    $(OD) $(ODFLAGS) $(TARGET) > $(APP_PATH)/$(OUTPROG)_DUMP.txt

2 个答案:

答案 0 :(得分:2)

这是一个可变扩展时间的问题。 (见How make Reads a Makefile。)

目标行bubblesort: $(COMMON_OBJS) $(OBJS)会立即展开。

目标特定变量行bubblesort: OBJS = ../programs/bubblesort/bubblesort.o未执行&#34;执行&#34; (实际进行分配)直到bubblesort目标正在运行。

而不是这个(它不起作用):

bubblesort: OUTPROG = bubblesort
bubblesort: APP_PATH    = $(SRCS)/bubblesort
bubblesort: OBJS    = ../programs/bubblesort/bubblesort.o
bubblesort: $(COMMON_OBJS) $(OBJS)
    @ echo "<-------------------- Making Bubblesort -------------------->"
    @ echo "<-------------------- Linking files -------------------->"
    $(LD) $(COMMON_OBJS) $(OBJS) $(LDFLAGS)
    @ echo "<-------------------- ELF to Binary File -------------------->"
    $(OC) $(OCFLAGS) $(TARGET) $(BINOUT)
    @ echo "<-------------------- Binary to Verilog Conversion -------------------->"
    $(R2V) $(R2VPARAMS) 

需要$(OBJ)调用的$(LD)变量。

您可以使用:

bubblesort: OUTPROG = bubblesort
bubblesort: APP_PATH    = $(SRCS)/bubblesort
bubblesort: $(COMMON_OBJS) ../programs/bubblesort/bubblesort.o
    @ echo "<-------------------- Making Bubblesort -------------------->"
    @ echo "<-------------------- Linking files -------------------->"
    $(LD) $^ $(LDFLAGS)
    @ echo "<-------------------- ELF to Binary File -------------------->"
    $(OC) $(OCFLAGS) $(TARGET) $(BINOUT)
    @ echo "<-------------------- Binary to Verilog Conversion -------------------->"
    $(R2V) $(R2VPARAMS)

它可以使用内置的$^自动变量来实现其预期目的。

答案 1 :(得分:0)

编写宏时,如OBJS,使用':='     所以宏创建只会执行一次     而不是在每次调用宏时重复。

第一个单词,在':'之前是目标名称。     ':'右侧的所有内容都是该目标的依赖项     制作没有失败,我有点惊讶     由于多个重复目标。

编写这些规则的更好方法是:

# when invoking 'make', use 'target=bubblesort'
# so the same makefile can be used for several targets:

APP_PATH    := $(SRC_PATH)/$(target)/
SRCS        := $(wildcard $(APP_PATH)*.c)
OBJS        := ../programs/$(target)/$(basename:$(SRCS):.c=.o)
$(target)   : $(COMMON_OBJS) $(OBJS)
    # 
    # ========= LINKING ${target} ==============
    $(LD) $(LDFLAGS) $(COMMON_OBJS) $(OBJS) -o $(target) 
    #<-------------------- ELF to Binary File -------------------->"
    $(OC) $(OCFLAGS) $(TARGET) $(BINOUT)
    #<-------------------- Binary to Verilog Conversion ---------->"
    $(R2V) $(R2VPARAMS) 
    # ========= finished ${target} =============


# This is the rule to transform any c code to object file via compilation.
%.o : %.c
    # ========= COMPILING $< TO $@ =========
    $(CC) $(CCFLAGS_APP) -c $< -o $@  
    # ========= END $< TO $@ =========

但是,发布的规则未考虑到:

  1. 源代码#include dependencies
  2. 需要为每个.c文件生成依赖项列表
  3. 需要扩展适当的依赖列表    在'%o。%c'行
  4. 依赖列表需要通过路径引用    以“-Ipath”参数
  5. 的形式在'$ {CC}'行中
  6. 如果没有生成/使用依赖关系列表,那么    头文件中的更改将无法强制执行    重新编译/重新链接等