Makefile 使用automake的递归行为异常
我有一个autotools设置,它与一个传统的Makefile共存于一个存储库中。为了避免覆盖./Makefile,我将configure.ac设置为将Makefile.In复制到Makefile.test中 有一个子目录由生成的Makefile.test管理。当我跑的时候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
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-filesGNUmakefile
、makefile
和makefile
因此,显而易见的选择是使用GNUmakefile
作为autotools生成文件
只要您没有运行/configure
,您的文件系统树就会如下所示:
Makefile
GNUmakefile.in
GNUmakefile.am
configure
[...]
因此,运行make
将调用默认(遗留)makefile。
配置运行后,路径中还会有一个GNUmakefile
,并且make
将自动拾取新的闪亮自动工具Makefile
我已经成功地使用它来维护两个基于
make
的并行构建系统。使用名称GNUmakefile
的问题是,它仅在用户使用gnu make时才起作用。但是,简单地使用名称makefile
(小写m
)应该可以。@williampersellmakefile
(小写)的问题是,它会给不区分大小写的文件系统(W32和OSX上的默认设置)带来大麻烦。另一个选项是makefile,v
(构建一个makefile并使用RCSci
构建makefile,v
)顺便说一句,如果有人正在使用GNU自动工具
他们也在使用GNU make
@williampersell你能详细介绍一下makefile,v
?现在大多数系统都没有安装rcs
,我也不知道有任何make
实现使用makefile,v
…或者你是指什么还有别的吗?