使用 gnu make 3.82,如何将在 makefile 中动态创建的文件添加到依赖项变量中,以便将它们包含在编译和链接规则中?
如果我从以下文件开始:
wut.c:
#include "wut2.h"
int main()
{
wut2();
}
wut.Makefile:
OBJS := wut.o
all : create_new_files wut.elf
create_new_files :
@ echo "create_new_files"
echo "void wut2(void) {}\n" > wut2.c
echo "void wut2(void);" > wut2.h
%.o : %.c
@ echo "compile"
@ echo $@
@ echo $<
armcc --licretry --licensing=flex --cpu=Cortex-M0 -c -o $@ $<
wut.elf : $(OBJS)
@ echo "link"
@ echo $(OBJS)
armlink --licretry --licensing=flex -o wut.elf $(OBJS)
clean :
rm wut2*
rm *.o
我得到以下输出:
$ make -f wut.Makefile
create_new_files
echo "void wut2(void) {}\n" > wut2.c
echo "void wut2(void);" > wut2.h
compile
wut.o
wut.c
armcc --licretry --licensing=flex --cpu=Cortex-M0 -c -o wut.o wut.c
link
wut.o
armlink --licretry --licensing=flex -o wut.elf wut.o
Error: L6218E: Undefined symbol wut2 (referred from wut.o).
Finished: 0 information, 0 warning and 1 error messages.
make: *** [wut.elf] Error 1
出现此问题是因为动态创建的 wut2.c 未包含在您的构建的依赖项中。在 create_new_files 创建新文件后,GNU Make 不会自动更新 wut.elf 的依赖项。您需要在构建过程中明确包含这些新文件。
这是一个逐步解决方案:
动态生成并包含依赖项:创建wut2.c后,您需要将其添加到对象列表中并确保它被编译。 动态更新 OBJS 变量:使用二次扩展或在 create_new_files 之后显式更新 OBJS。 重新运行依赖关系步骤:添加一个步骤以确保 Make 在创建新文件后重新检查依赖关系。
这是更新后的 wut.Makefile:
# Initial object file
OBJS := wut.o
# Target to generate all
all : create_new_files compile_all wut.elf
# Rule to create new files
create_new_files :
@ echo "Creating new files"
@ echo "void wut2(void) {}\n" > wut2.c
@ echo "void wut2(void);" > wut2.h
# Update the OBJS variable dynamically
compile_all : create_new_files
@ echo "Updating object files"
@ OBJS="$(OBJS) wut2.o"; \
echo "compile"; \
echo $$OBJS; \
$(MAKE) $(OBJS)
# Rule to compile source files into object files
%.o : %.c
@ echo "Compiling $<"
armcc --licretry --licensing=flex --cpu=Cortex-M0 -c -o $@ $<
# Link all object files to create the final executable
wut.elf : $(OBJS)
@ echo "Linking $(OBJS)"
armlink --licretry --licensing=flex -o wut.elf $(OBJS)
# Clean up generated files
clean :
rm -f wut2* wut.elf *.o
主要变化: OBJS 的动态更新:在compile_all 中,更新OBJS 变量以包含wut2.o。 虚假目标:引入了compile_all步骤以确保重新评估依赖关系。 顺序依赖性处理:Make 确保 create_new_files 在编译和链接之前运行。
make -f wut.Makefile 的输出:
$ make -f wut.Makefile
Creating new files
Updating object files
Compiling wut.c
Compiling wut2.c
Linking wut.o wut2.o