2012-08-13 34 views
0

我想make在目录中创建所有.cpp与跟踪标头更改。我试图通过先使GCC输出的目标具有相关性与-MM选项来做到这一点,然后追加身体这个目标,将实际调用编译:GNU使意想不到的行为

OPTIONS = -std=c++11 -Wall 

export 

all : $(patsubst %.cpp, %.o, $(wildcard *.cpp)) 


%.o : %.mkt 
    make -f $*.mkt 

%.mkt : %.cpp 
    gcc $(OPTIONS) -MM $*.cpp > $&.mkt1 
    echo gcc $(OPTIONS) -c %.cpp > $*.mkt2 
    cat $*.mkt1 $*.mkt2 > $*.mkt 

然而,不知何故该脚本股形式

的电话
g++ -c -o something.o something.cpp 

每个.cpp文件在目录中。未创建临时文件.mkt1,.mkt2.mkt。为什么会发生?我如何达到所需的行为?我正在用mingw在windows上做这个。

+0

如果您在'patsubst'调用中的逗号后面取出空格,它有帮助吗? – tripleee 2012-08-13 13:02:23

+0

无论如何,如果您打算将它们用作Makefiles,那么'mkt'文件是否应该有缩进标签? – tripleee 2012-08-13 13:03:46

+0

@tripleee移除空格不起作用。 '.mkt'文件确实应该有标签,我的不好,但是在这里他们甚至没有创建。 – 2012-08-13 13:06:27

回答

2

您已经提供了两种模式规则链(%.cpp - >%.mkt%.mkt - >%.o),但让已经有一个隐含规则(%.cpp - >%.o),它会首先发现,一种方式搜索时建立something.o

解决问题的最简单方法是使用make -r(或make --no-builtin-rules),它将禁用内置的隐式规则。

+0

[用户定义的规则覆盖内置规则](http://www.gnu.org/software/make/manual/make.html#Canceling-Rules)。不要认为这是正确的答案。 – 2012-08-13 14:22:51

+0

@MaximYegorushkin,用户定义的*规则*覆盖内置的*规则*。但OP没有为'%.o:%.cpp'定义一个规则。当Make寻找一种构建'something.o'的方法时,它会找到内置的规则(并且没有用户定义的规则),并且看起来没有更多。如果禁用了内置规则,Make会进一步查找,找到链并使用它。我已经用GNU Make 3.81测试过了,但如果你能告诉我我错了,我将不胜感激。 – Beta 2012-08-13 16:07:57

+0

'-MM'标志导致gcc以'x.o:x.cpp'的形式生成行。我想作者的意图是为这种依赖添加一个配方,但是他错过了'%.mkt'配方第二行中的选项卡。 – 2012-08-13 16:27:22