在切换到目录之前,在目录中寻找依赖项?

时间:2011-04-06 13:05:11

标签: makefile

我尝试编写此格式的make规则:

lib%.so: computations/%.h
        make -C computations/ -f makefile $<

输出:

make -C computations/ -f makefile computations/test.h
make[1]: Entering directory `/home/shai/csm/csm2/src/computations'
make[1]: *** No rule to make target `computations/test.h'.  Stop.
make[1]: Leaving directory `/home/shai/csm/csm2/src/computations'
make: *** [libtest.so] Error 2

好吧,它似乎在切换库后查找%.h。没什么大不了的,我只想尝试删除

lib%.so: %.h
        make -C computations/ -f makefile $<

但现在根本不承认这条规则!

输出:

shai@ubuntu:~/csm/csm2/src$ make libtest.so
`make: *** No rule to make target `libtest.so'.  Stop.

make在玩我的想法吗?如何更改依赖关系会使其停止识别目标

3 个答案:

答案 0 :(得分:2)

  

如何更改依赖关系使其停止识别目标?

最有可能的原因是它无法找到符合依赖关系模式的文件,因为test.h位于另一个目录中。您可以使用VPATH让它搜索其他目录中的文件。

修改:但这仍然无法完全解决您的问题,因为$<将被computations/test.h替换,而computations目录中找不到$(notdir $<)。你得到的第一个错误)。您可以尝试{{1}},但我认为这是一个丑陋的黑客(如果它有效;我还没有尝试过)。这是因为makefile和项目结构的设计。

答案 1 :(得分:2)

你正在使用make。

Make的设计实际上相当简单:你告诉它

  1. 如何创建目标(规则的主体)。
  2. 目标需要首先创建(依赖列表)。
  3. 然后创建topological sorts依赖项信息,以便按正确的顺序执行主体。

    您的$<规则(扩展到依赖项列表)意味着您告诉调用的make创建依赖项%.h而不是目标lib%.so。 规则必须创建目标。如果需要创建依赖关系,则需要告诉make如何使用另一个单独的规则执行此操作,而不是尝试确保它在此规则中是最新的。

    当您尝试跨目录进行协调时,我会推荐论文Recursive make considered harmful,这通常是组织事物的好方法,但不是唯一可行的方法。

答案 2 :(得分:0)

它可能只是你复制/粘贴它的方式,但你错过了第二种形式的标签。