Makefile 使用automake的递归行为异常

Makefile 使用automake的递归行为异常,makefile,autotools,autoconf,automake,Makefile,Autotools,Autoconf,Automake,我有一个autotools设置,它与一个传统的Makefile共存于一个存储库中。为了避免覆盖./Makefile,我将configure.ac设置为将Makefile.In复制到Makefile.test中 有一个子目录由生成的Makefile.test管理。当我跑的时候 make -f Makefile.test clean 脚本正确地进入测试目录,干净地运行,然后跳出目录。然而,当返回到根目录时,它尝试调用clean am,使用一个看似普通的命令 make clean-am

我有一个autotools设置,它与一个传统的Makefile共存于一个存储库中。为了避免覆盖./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

对于如何解决此问题的任何帮助,我们都将不胜感激。

将您的静态生成文件重命名为不同的名称,并像使用自动工具一样生成生成生成文件,输出生成文件或生成文件,而不是makefile.test

解决这个问题的方法是,除了一种公认的文件名模式之外,不要将自动生成的makefile命名为任何其他名称,“makefile”(全部小写)是第一个也是最可移植的。我刚刚尝试了同样的方法,它所做的就是
$(MAKE)$(AM_MAKEFLAGS)all recursive
,它为我扩展为
MAKE all recursive

换句话说,Automake无法处理具有备用文件名的makefile的概念,主要是因为为了生成正确的代码,它需要了解它们。因为它没有(也可能不能),所以它被迫采用默认的makefile文件名

重命名输入/输出文件名的功能可能并不适用于此。由于DOS对8.3文件名的限制,如果您可以从手册的示例中推断原因,那么它是创建的;config.h.in不是有效的文件名,因此必须将生成config.h的输入文件映射到config.hin。使用它来重命名由makefile.in或您使用的任何文件名生成的makefile显然不起作用


我希望这会有所帮助。

您最好的选择可能是为Makefile使用一个文件名,它满足以下条件:

  • 自动拾取get(因此不需要指定
    -f
    标志)

  • 覆盖默认的生成文件

  • Makefile
    不冲突(因此您可以保留另一个Makefile)

阅读
manmake
你会得到:

make
执行
makefile
中的命令,以更新一个或多个目标
名称
,其中
name
通常是一个程序。如果不存在-f选项,
make
将按该顺序查找make-files
GNUmakefile
makefile
makefile

因此,显而易见的选择是使用
GNUmakefile
作为autotools生成文件

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

 Makefile
 GNUmakefile.in
 GNUmakefile.am
 configure
 [...]
因此,运行
make
将调用默认(遗留)makefile。 配置运行后,路径中还会有一个
GNUmakefile
,并且
make
将自动拾取新的闪亮自动工具Makefile


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

使用名称
GNUmakefile
的问题是,它仅在用户使用gnu make时才起作用。但是,简单地使用名称
makefile
(小写
m
)应该可以。@williampersell
makefile
(小写)的问题是,它会给不区分大小写的文件系统(W32和OSX上的默认设置)带来大麻烦。另一个选项是
makefile,v
(构建一个makefile并使用RCS
ci
构建
makefile,v
)顺便说一句,如果有人正在使用
GNU自动工具
他们也在使用
GNU make
@williampersell你能详细介绍一下
makefile,v
?现在大多数系统都没有安装
rcs
,我也不知道有任何
make
实现使用
makefile,v
…或者你是指什么还有别的吗?