【发布时间】:2011-09-18 09:24:39
【问题描述】:
我有一个代码生成器(生成 C++ 的 Python 脚本),它接受一个包含简单位图字体字形的文本文件,并生成带有字体参数和数据的 .h 和 .cc 文件。发电机的实际工作正常;它正在向 GNU make 解释这种安排,这给我带来了麻烦。
目录结构如下:
project_dir/
app/
Foo/
Makefile
... application source files ...
gcc/
... all object files ...
lib/
LCD/
Font_ProFont_10.txt
... library source files ...
我的 make 规则如下所示:
Font_%.cc Font_%.h: Font_%.txt $(GENFONT)
@if [ 'x${VERBOSE}' = x ]; then echo "FONT(F) $<"; else \
echo $(GENFONT) $<; fi
@$(GENFONT) $<
从一个干净的构建开始(这很重要),make 将在源代码上正常运行,直到它遇到一个字体,该字体会随着:
FONT(F) ../../lib/LCD/Font_ProFont_10.txt
CXX Font_ProFont_10.cc
arm-eabi-g++: Font_ProFont_10.cc: No such file or directory
arm-eabi-g++: no input files
make: *** [gcc/Font_ProFont_10.o] Error 1
重新运行make 将掩盖这个问题,因为make 会找到它真正所在的源文件:
CXX ../../lib/LCD/Font_ProFont_10.cc
由于在构建开始时Font_ProFont_10.cc 不存在,make 认为它将生成到当前目录 (project_dir/app/Foo/) 而不是库目录(这是规则所说的位置)会的,除非我遗漏了什么)。
我的关键问题是:如何更改 make 规则以使 make 不会混淆?
原则上我不想将生成的文件与分发的文件放在一起,但我也希望make 在一组干净的文件上成功完成。
我不想使用递归来执行此操作,因为需要将应用程序级别的配置传递给库。所以我将所有对象生成到应用程序目录中的一个目录中。
编辑:更改为以下内容:
VPATH += ../../lib/LCD
LCD = ../../lib/LCD
# ...
$(LCD)/Font_%.cc $(LCD)/Font_%.h: Font_%.txt $(GENFONT)
# ...
没有解决问题:
make: *** No rule to make target `gcc/Font_Atmel_16.o',
needed by `gcc/RTOSDemo.axf'. Stop.
在这里,make 不知何故不知道您可以使用$(OBJDIR)/%.o: %.c 规则从../../lib/LCD/Font_Atmel_16.cc 生成gcc/Font_Atmel_16.o,因为../../lib/LCD 在$(VPATH) 中。它甚至不运行$(LCD)/Font_%.cc 规则。
【问题讨论】: