2014-11-01 116 views
0

我有一个Makefile使用以下行:的Makefile行`测试-f`

$(CXX) $(CXXFLAGS) $(INCL) -c -o [email protected] `test -f '$<' || echo '$(SRCDIR)/'`$< 

你能解释我这行做了什么?

注:Makefile文件就是从这里取:https://projects.coin-or.org/BuildTools/wiki/user-examples

该页面指定此:

通用编译规则(例如,.c.o)可能看起来有点复杂 。但是由此,Makefile也可以被在Cygwin下与MS编译器(例如cl)一起工作的人 使用,因为那些 编译器不理解UNIX类型的目录路径。在这样一个 的情况下,CYGPATH_W将被设置为“cygpath -w”, ,否则它只是“echo”。

我不打算使用MS编译器。

回答

3

test -f这是一个Unix-ism,如果指定的文件存在,它将返回true,否则返回false。 “$ <”是make规则的源文件。因此test -f '$<' || echo '$(SRCDIR)/'将检查源文件是否存在,如果存在而不是存在,则会回显$(SRCDIR)/后跟文件的名称。这将是实际编译器的输入。

它基本上是说:“如果文件X在本地目录中,然后编译它。否则,(这是||做什么),编译称为X位于目录$(SRCDIR)文件”。通过这种方式,您可以将所有源代码放入子目录中,然后通过将新副本放在与Makefile相同的目录中来覆盖某些文件。

+0

好吧,假设所有的源文件都位于Makefile所在的目录下,如果我理解的很好,我可以用'$(CXX)$(CXXFLAGS)$(INCL)-c -o $ @'$ <''。 – D1X 2014-11-01 15:14:26

+0

还有一个问题:是否有必要? – D1X 2014-11-01 15:16:39

+0

是的,你的两个问题都可以。反标告诉shell“执行这个命令,然后在这里插入结果(即命令中的stdout)。” – 2014-11-01 15:50:02