2011-04-06 68 views
0

我试着写这种形式的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切换后库。没有biggie,我只是尝试删除

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

但现在它根本不承认规则!

输出:

[email protected]:~/csm/csm2/src$ make libtest.so 
`make: *** No rule to make target `libtest.so'. Stop. 

make用脑子玩?如何改变依赖关系使其停止识别目标

+1

顺便说一下,我只是注意到这是一个奇怪的规则。它更新依赖项,而不是目标。这不是“make”应该如何使用的。 – eriktous 2011-04-06 14:19:38

回答

0

它可能就是您复制/粘贴它的方式,但是您在第二种形式中缺少选项卡。

+0

是的,这是一个粘贴问题 – 2011-04-06 13:14:34

+0

然后,我不知道。我和你一样困惑。 – 2011-04-06 13:21:32

2

如何改变依赖性使其停止识别目标?

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

编辑:但这仍无法完全解决您的问题,因为$<computations/test.h取代,这将不会在目录computations中找到(如在你得到的第一个错误)。你可以尝试$(notdir $<),但我认为这是一个丑陋的黑客(如果它的工作,我没有尝试过)。这是你的makefile和项目结构设计的结果。

2

您正在使用造成错误。

制作的设计其实是相当简单的心脏:你告诉它

  1. 如何创建目标(该规则的机构)。
  2. 它需要创建第一个(依赖列表)。

然后制作topological sorts依赖性信息,以便它以正确的顺序执行主体。

您的规则使用$<(将其展开为依赖关系列表)表示您正在告诉调用的创建依赖关系%.h而不是目标lib%.so。 该规则必须创建目标。如果需要创建依赖关系,则需要通过另一个单独的规则告知如何执行此操作,而不是尝试确保它在此规则中处于最新状态。

正如你试图协调各个目录,我会推荐纸Recursive make considered harmful,这通常是一个很好的方式来组织事情,但不是唯一可能的方式来做事情。