我正在编写一个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
答案 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 $@ =========
但是,发布的规则未考虑到: