我有一个makefile从一个yaml文件生成一些头文件和cpp文件。
../api/%.h ../api/%.cpp : ../idl/%.yml
$(info Generating api files from $<)
$(IDL_TO_CPP_EXE) --input $< --output $(basename $@)
IDL_HEADERS=$(IDL_INPUTS:../idl/%.yml=../api/%.h)
IDL_CPPS=$(IDL_INPUTS:../idl/%.yml=../api/%.cpp)
all: $(IDL_HEADERS) $(IDL_CPPS)
$(info The dependencies are $(IDL_HEADERS) $(IDL_CPPS))
IDL_INPUTS +=../idl/common_api/CommonTypes.yml
当我运行它时,它输出以下内容,但没有生成.h和.cpp文件。我已经检查了它们不在那里,所以这不是时间戳问题。
The dependencies are ../api/common_api/CommonTypes.h ../api/common_api/CommonTypes.cpp
make: Nothing to be done for 'all'.
如果我手动将变量展开如下,那么它突然开始工作!日志记录的控制台输出完全相同,并且我已经小心地避免了隐藏字符之类的东西。
all: ../api/common_api/CommonTypes.h ../api/common_api/CommonTypes.cpp
$(info The dependencies are $(IDL_HEADERS) $(IDL_CPPS))
为什么这个makefile使用显式依赖关系,而不是变量?
更新:
all: $(IDL_HEADERS) $(IDL_CPPS)
$(info The dependencies are $^)
$(info The dependencies should be $(IDL_HEADERS) $(IDL_CPPS))
输出:
The dependencies are
The dependencies should be ../api/common_api/CommonTypes.h ../api/common_api/CommonTypes.cpp
make: Nothing to be done for 'all'.
这原来是一个排序问题。在解析all
规则时,我没有设置IDL_INPUTS
变量。设置IDL_INPUTS
后,运行all
规则,显示新的更新值。