使用automake的递归意外地表现出来

时间:2014-01-19 08:14:53

标签: makefile autotools autoconf automake

我在一个存储库中有一个与传统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

非常感谢任何有关如何解决此问题的帮助。

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将按顺序查找生成文件GNUmakefilemakefileMakefile

所以显而易见的选择是使用GNUmakefile作为你的autotools makefile。

只要您没有运行./configure,您的文件系统树将如下所示:

 Makefile
 GNUmakefile.in
 GNUmakefile.am
 configure
 [...]

因此,运行make将调用默认(旧版)makefile。 在configure-run之后,路径中也会有GNUmakefile,而make会自动选择新的闪亮的autotools Makefile。

我已成功使用它来维护两个基于make的并行构建系统。