我在一个存储库中有一个与传统Makefile共存的autotools设置。为了避免覆盖./Makefile,我已将configure.ac设置为将Makefile.in复制到Makefile.test中。
有一个由生成的Makefile.test管理的子目录。我跑的时候
make -f Makefile.test clean
脚本正确进入测试目录,运行干净,并退出目录。但是,在返回根目录时,它会尝试使用看似普通的
来调用clean-am make clean-am
这会调用错误的make文件,我收到以下错误。
rm -f *.lo
make[2]: Leaving directory `/home/somedude/work_repos/some-repo/test'
make[2]: Entering directory `/home/somedude/work_repos/some-repo'
make[2]: *** No rule to make target `clean-am'. Stop.
make[2]: Leaving directory `/home/somedude/work_repos/some-rep'
make[1]: *** [clean-recursive] Error 1
make[1]: Leaving directory `/home/somedude/work_repos/some-repo'
make: *** [clean] Error 2
非常感谢任何有关如何解决此问题的帮助。
答案 0 :(得分:1)
将静态makefile重命名为不同的东西,并像往常一样使用Autotools生成makefile,输出makefile或Makefile,而不是Makefile.test。
这可以通过不将Automake生成的makefile命名为除了一个已识别的文件名模式之外的任何内容来解决,“makefile”(全部小写)是第一个也是最便携的。我只是尝试了同样的事情,它所做的只是$(MAKE) $(AM_MAKEFLAGS) all-recursive
,它会扩展为make all-recursive
。
换句话说,Automake无法处理带有备用文件名的makefile的概念,主要是因为为了生成正确的代码,需要了解它们。由于它没有(也可能不能),因此强制它采用默认的makefile文件名。
重命名输入/输出文件名的能力可能不适用于此。如果你可以从手册的例子中推断出原因,那是因为8.3文件名的DOS限制; config.h.in不是有效的文件名,因此您必须将生成config.h的输入文件映射到config.hin。使用它来重命名从Makefile.in生成的makefile或你使用的任何文件名显然不起作用。
我希望这会有所帮助。
答案 1 :(得分:1)
你最好的选择可能是使用Makefile的文件名,它满足以下条件:
自动选择(因此您无需指定-f
标志)
覆盖默认的makefile
不会与Makefile
发生冲突(因此您可以保留其他makefile)
阅读man make
:
make
执行makefile
中的命令以更新一个或多个目标names
,其中name
通常是一个程序。如果不存在 -f 选项,则make
将按顺序查找生成文件GNUmakefile
,makefile
和Makefile
。
所以显而易见的选择是使用GNUmakefile
作为你的autotools makefile。
只要您没有运行./configure
,您的文件系统树将如下所示:
Makefile
GNUmakefile.in
GNUmakefile.am
configure
[...]
因此,运行make
将调用默认(旧版)makefile。
在configure-run之后,路径中也会有GNUmakefile
,而make
会自动选择新的闪亮的autotools Makefile。
我已成功使用它来维护两个基于make
的并行构建系统。