我正在尝试使用autoconf / automake工具链创建一个非常简单的构建脚本(主要是作为学习练习。)
大多数示例似乎表明您在每个源目录中都需要单独的Makefile.am
,并且项目根目录中的Makefile.am
文件应该包含一个SUBDIRS
指令,该指令告诉autoconf到哪里寻找额外的Makefile。
我认为,对于一个非常简单的项目,可能在项目根目录中有一个Makefile.am
。但是,当我尝试执行此操作并运行生成的configure
脚本时 - 它会在项目根目录中创建一个空的(0字节)。
我不确定我在这里做错了什么。
所以,我的目录结构非常简单:
MyProject
---src
------myproject.cpp
---Makefile.am
---configure.ac
configure.ac
文件很小:
AC_INIT(myproject, 1.0)
AC_MSG_NOTICE([My Project])
AC_PROG_CXX
AC_LANG(C++)
AC_CHECK_HEADERS(iostream)
AC_CONFIG_SRCDIR(src/myproject.cpp)
AM_INIT_AUTOMAKE(MyProject, 1.0)
AC_OUTPUT(Makefile)
Makefile.am
也非常简单:
bin_PROGRAMS = myproject
myproject_SOURCES = src/myproject.cpp
myproject_CPPFLAGS = --std=c++11
我跑:
autoconf configure.ac > configure
当我运行configure脚本时,没有错误。
然后我看到它在项目根目录中生成了Makefile
:
# ls -lh | grep Make
-rw-r--r-- 1 root root 0 Nov 8 16:13 Makefile
-rw-r--r-- 1 root root 98 Nov 8 15:53 Makefile.am
-rw-r--r-- 1 root root 0 Nov 8 15:00 Makefile.in
你可以看到,它生成的Makefile完全是空的。
所以我显然误解了autoconf / automake应该如何运作的基本原理。我在这里做错了什么?
答案 0 :(得分:0)
我遇到了同样的问题 - automake会生成空的Makefile。我不知道它为什么会发生,但是我通过删除autoconf生成的所有文件来修复它,例如Makefile.in(零字节Makefile.in绝对不好)。
您还可以尝试autoreconf -if
答案 1 :(得分:0)
有趣的是,我试图重现你的情况,但我得到了不同的结果,尽管有预期的结果。
AM_INIT_AUTOMAKE
调用是obsolete,您应该写AM_INIT_AUTOMAKE([foreign])
。 foreign
告诉automake不要抱怨丢失README
,ChangeLog
等。您的Makefile.am
与源文件位于不同的文件夹中。虽然没关系,但新的automake应该抱怨它是前向不兼容的,我在输出上得到了这个(automake 1.15):
Makefile.am:2: warning: source file 'src/myproject.cpp' is in a subdirectory,
Makefile.am:2: but option 'subdir-objects' is disabled
automake: warning: possible forward-incompatibility.
automake: At least a source file is in a subdirectory, but the 'subdir-objects'
automake: automake option hasn't been enabled. For now, the corresponding output
...
这些只是警告。
无论如何,我没有只运行autoconf
,而是运行autoreconf -i
(或-i -f
以确保 - -f
选项会覆盖所有文件工具生成)。 Autoreconf会以正确的顺序为您运行autoconf
,automake
和其他工具。
autoreconf
完成后,我得到了一个按预期工作的配置脚本,运行后,我也得到了正确的Makefile。