我有一个中等的 C++ 项目。我正在尝试使用自动工具,但发现复杂性不堪重负。
什么时候使用自动工具以及什么时候可以不用它?什么是(简单的)替代品?
我想使用 autotools 的主要原因是它的全面make install
支持。有没有更简单的选择?
理想情况下,我想要 Eclipse CDT 支持的东西。
对于make install
支持,您只需要automake
. 一个简单的Makefile.am
文件很容易制作:
LIBS += -lsome-lib -lsome_other_lib
bin_PROGRAMS = hello
noinst_HEADERS = some.h header.h files.h
hello_SOURCES = hello.c some.c other.c source.c file.c
就是这样。
autoconf
如果您想让您的程序更加独立于平台,该工具很有用。您编写一个简单的脚本来测试您使用的系统头文件和系统库是否存在。如果没有找到,您要么给出错误,要么使用包裹中提供的副本。
对于琐碎的、自包含的(无依赖项,无需安装),最多包含 3 个源代码文件的项目,编写一个 Makefile:
.PHONY: all clean
all: program
clean:
rm -f *.o
program: sourceA.o sourceB.o
$(CXX) -o $@ $^ $(LDFLAGS)
您可以为 CPPFLAGS、CFLAGS、CXXFLAGS、LDFLAGS 定义变量,至少 GNU make 以预期的方式填充空白。
它当然没有解决依赖跟踪问题,也没有检查系统功能。非平凡项目的一个常见问题是与系统交互:确保某些库可用,以及安装/卸载。大多数工具都失败了。
这里有几个我有经验的例子:
它为不同的 IDE 生成一致的项目文件(如果您只需要构建代码,还可以生成 Makefile)。不做任何其他事情(没有安装目标,无法检查库的可用性)。仅当您需要为不使用的 IDE 提供项目文件时才有用(例如,您使用 Eclipse 并且其他人想在 Visual Studio 上编译它)。任何重要的事情都需要 LUA 脚本。
如果您只需要调用编译器来处理您的文件,这是可以接受的。对于几乎任何事情,您都必须记住(或复制/粘贴)低级宏序列(形成某种编程语言)。在系统上查找库是复杂而混乱的(有些库得到了创建者的祝福,并且有硬编码的测试来找到它们,所以你可能很幸运)。考虑到到目前为止我必须处理的损坏的 cmake 脚本的数量,我认为大多数人只是复制/粘贴宏而不试图理解它。可以安装,但不能卸载。对于某些 cmake 脚本,您可能必须多次运行 cmake,直到它生成正确的输出(例如 VTK)。
似乎 CMAKE 和 Premake 做得更好:没有宏,使用著名的编程语言 (Python) 来提供相当多的有用功能。在很多方面仍然失败;指定一个非硬编码的安装前缀需要不小的努力,因为它不是内置的。
远远超过上面提到的工具。其中大多数,方便。有健全的默认值;一些亮点:
AC_CHECK_LIB(foobar, function_to_check_linking)
- 这会找到一个名为 foobar 的库,并将其放入$LIBS
环境变量中。是的,检测库是一项重要的常见任务;如果您的工具不认为这是一流的用例,请放弃它。(不过使用 PKG_CHECK_MODULES 更方便。)
期间的每个操作都已./configure
登录config.log
,因此您实际上可以找出问题所在。对于大多数其他工具,充其量你会得到“Boost_dir-NOTFOUND”。
已经自带了make install
,make uninstall
(什么意思,你的工具可以在我的系统上放东西,但不能删除?),make check
(如果你指定了test_
程序),make dist-gzip
(将源文件打包成tar.gz),make distcheck
(创建一个 tar.gz 并确保一切都正确构建并且所有测试都通过)。更好的是,它与它配合得很好,checkinstall
因此您可以从中创建和分发 .rpms 和 .debs。
如果需要,您可以在 automake Makefiles 中混合使用旧的 Makefile 规则。
Autotools 文件和源文件一样被跟踪,因此如果需要,只需调用make
.
是的,在我看来,学习起来“很难”,但只不过是学习在 CMAKE/SCons 中调用的所有特定宏/函数。项目的首字母Makefile.am
只是分配给变量的文件列表,首字母configure.ac
可以通过autoscan
; 我发现即使对于更琐碎的项目也很方便。
autobook是我所知道的学习它的最佳来源,但不幸的是它已经过时了(autoconf 会抱怨很多关于使用不推荐使用的宏)。
您可以选择要使用的自动工具部件。许多项目只使用autoconf
生成configure
脚本的 autotools 部分,如果您只想生成一个最终用户可配置Makefile
的install
目标,那么这可能就是您所需要的。
我不知道这是否离答案太远了,但我会考虑scons。开始需要一点时间,但是会自动完成很多很多事情,而这些事情必须通过 make 手动进行。