我想写一个(GNU)make规则,它依赖于子目录中某个文件(任意文件)的存在。在我的特定情况下,该子目录是一个git子模块。
这就是我所拥有的:
DEP = submod/.git
$(DEP):
git submodule update --init $(@D)
submod/%: | $(DEP)
@ # why do I need this?
install: submod/junk.c
echo installing
如果我然后键入make install
,则运行git命令(将其更改为mkdir -p $(@D); touch $@
以进行非git特定的测试),make不会抱怨。
我有两个问题。主要是submod/%
我应该关注的虚拟配方有任何副作用吗?其次,更有趣的是,为什么我需要这个食谱呢?如果我将其删除,请输出错误:
make: *** No rule to make target 'submod/junk.c', needed by 'install'. Stop.
我唯一的假设是make正在根据启动时存在的文件进行一些优化,并且使用无配方版本,它认为它可以只是期望文件在需要时存在,但是有任何配方那里,它无法进行优化,并在需要时重新评估。如果这是真的,它是一个错误,还是应该改变的东西?