为什么这个makefile不构建依赖,而只在使用变量时才构建



我有一个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规则,显示新的更新值。

最新更新