Makefile Make和VPATH。为什么我的源文件放在我不知道的地方';你不想要吗?

Makefile Make和VPATH。为什么我的源文件放在我不知道的地方';你不想要吗?,makefile,vpath,Makefile,Vpath,我正在尝试用make编译。我有两个目录中的源代码,src和altsrc。我想先在altsrc中查找源文件,然后再在src中查找。我希望对象进入目录obs。我的Makefile的相关部分如下所示: VPATH=altsrc:src:obj $(A_OUT): $(OBS) $(FORTRAN) -o $(A_OUT) $(OBS) $(LFLAGS) obs/%.o: %.f $(FORTRAN) $(FFLAGS) $< -o $@ $(A_OUT):$(OBS) $(

我正在尝试用make编译。我有两个目录中的源代码,src和altsrc。我想先在altsrc中查找源文件,然后再在src中查找。我希望对象进入目录obs。我的Makefile的相关部分如下所示: VPATH=altsrc:src:obj

$(A_OUT): $(OBS)
    $(FORTRAN) -o $(A_OUT) $(OBS) $(LFLAGS)

obs/%.o: %.f
    $(FORTRAN) $(FFLAGS) $< -o $@
$(A_OUT):$(OBS)
$(FORTRAN)-o$(A_OUT)$(OBS)$(LFLAGS)
obs/%.o:%.f
$(FORTRAN)$(FFLAGS)$<-o$@

这个Makefile实际上可以编译代码,但它有一个非常讨厌的副作用:它找到每个源文件(还有很多),并将它们从altsrc或src复制到运行make的目录中。这真的很烦人,以后会导致一大堆混乱。我在任何地方都没有找到任何说明这应该是VPATH宏的结果的文档。有人能告诉我怎么解决这个问题吗?谢谢。

问题在于Make精通RCS,并且会检查源文件(例如
td.f
)是否可以并且应该从RCS更新。是的,Make知道如何使用
co
。如果源文件不在这样的存档中(例如
altsrc
中的源文件),那么耸耸肩继续工作

最快、最脏的解决方案是使用
make-r
。这将禁用内置规则,这将很好地解决问题。。。除非您依赖其他地方的内置规则


如果不能这样做,你可以用你自己的无规则规则来重写那个特定规则,或者用一个规则来真正地更新源,或者你可以通过代码>触碰源,这样就不会考虑它们过时,或者把RCS文件放在一个看不见的地方。或者两个或三个其他选择。

您没有给我们太多的选择。我建议您尝试
make obs/foo.o
,查看make实际执行的命令,验证它是否符合您的预期,然后从命令行尝试相同的命令,查看它是否提交了错误(即将
foo.f
复制到当前目录)。确定。谢谢你的主意。“makeobs/foo.o”完成了它应该做的一切——找到正确的源代码,编译它,将foo.o放入obs中——并且不复制foo.f。这是好事还是坏事?再次感谢。它增加了我们对这个问题的认识,这是很好的。现在尝试
make
(这会将大量源代码复制到当前目录中),但要保存输出(通过管道将其传输到文件或其他内容)。然后选择一个复制的源,比如
bar.f
,然后筛选
bar
的输出。查看
条是否发生了任何意外。任何事情都可以
。好的,这很奇怪。但我打赌你知道我会这么说。无论如何,这里有一个几乎所有文件的例子:
pgf90-ctd.f-oobs/td.o;co src/RCS/td.f,v td.f;src/RCS/td.g,v-->td.f
所以,是的,我使用RCS进行版本控制。但我根本没有提到ci、co或Makefile中的内容。如果我从另一个还没有设置RCS的目录(比如altsrc)中提取一个文件,那么一切正常,没有拷贝。所以现在我想问题是为什么Make觉得有必要潜入RCS?我能停下来吗?好的,我在:Make有一个隐式规则,告诉它如何使用co从RCS目录获取文件。例如,如果当前目录中没有Makefile,并且您在命令行上调用make时没有目标名称,make将自动尝试使用co命令获取Makefile。另外,如果make需要一个.c或.cc文件来构建一个.o或可执行文件,它会自动尝试使用co来获取它。“好吧,我觉得自己很笨,但我以前从未听说过这个。有人知道如何阻止它吗?链接没有说。谢谢。“触摸”选项或类似的东西工作得很好。”make-r“让我有点紧张。我试着写我自己的空白规则,
.f,v.o:
.f,v.f:
,但他们无法阻止make发挥它的魔力。如果你知道正确的方法,我会很高兴看到它。非常感谢你的帮助!