我有一个温和的C ++项目。我正在尝试使用autotools,但发现复杂性太高了。
什么是何时使用自动工具的指导方针以及何时可以不使用它?什么是(简单)替代品?
我想使用autotools的主要原因是它支持全面make install
。有更简单的替代方案吗?
理想情况下,我喜欢Eclipse CDT支持的东西。
答案 0 :(得分:6)
对于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
工具非常有用。您编写了一个简单的脚本来测试您使用的系统头文件和系统库的存在。如果没有找到,您要么提出错误,要么使用包装中提供的副本。
答案 1 :(得分:3)
对于简单,自包含(无依赖,无需安装),具有最多3个源代码文件的项目,编写一个Makefile:
.PHONY: all clean
all: program
clean:
rm -f *.o
program: sourceA.o sourceB.o
$(CXX) -o $@ $^ $(LDFLAGS)
您可以为CPPFLAGS,CFLAGS,CXXFLAGS,LDFLAGS定义变量,至少GNU以预期的方式填充空白。
它当然没有解决依赖性跟踪问题,也没有检查系统功能。非平凡项目的一个常见问题是与系统交互:确保某些库可用,以及安装/卸载。大多数工具都失败了。
以下是我遇到的一些例子:
它为不同的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
(你的意思是什么,你的工具可以把东西放在我的系统上,但不能删除它们?),{{1} (如果您指定了make check
个程序),test_
(将源文件打包成tar.gz),make dist-gzip
(创建tar.gz并确保所有内容都正确构建并且所有测试通过)。更好的是,它与make distcheck
很好地配合,因此您可以从中创建和分发.rpms和.debs。
如果需要,您可以在automake Makefile中混合使用旧的Makefile规则。
跟踪Autotools文件以及源文件,只需调用checkinstall
即可在需要时再次生成帮助脚本和Makefile。
是的,学习起来很难,但仅仅是学习在CMAKE / SCons中调用的所有特定宏/函数。项目的初始make
只是分配给变量的文件列表,Makefile.am
可以生成初始configure.ac
;我发现即使对于更琐碎的项目也很方便。
autobook是我所知道的最好的资源来源,但遗憾的是它过时了(autoconf会抱怨使用已弃用的宏)。
答案 2 :(得分:1)
您可以选择要使用的自动工具部件。许多项目仅使用autoconf
,即生成configure
脚本的自动工具部分,如果您只想生成Makefile
目标可配置的install
目标最终用户,那可能就是你所需要的一切。
答案 3 :(得分:0)
我不知道答案是否过于遥远,但我会考虑scons。它需要一点时间才能开始,但是许多很多东西都是自动的,必须手工制作。