Autotools - 需要一个示例

3
我希望你能为我提供一些关于基于automake的工具包构建(编译)程序的最佳实践方面的帮助。我正在编写一个工具包,其中包括几个外部和几个内部库以及演示工具。到目前为止,我一直在使用自己的makefile脚本进行编译,但现在我想切换到autotools,也就是说,我想从我那些糟糕的脚本转向更加标准化的方案。所以我需要一些帮助,比如一个最小的示例,可以让我学习。这个最小的示例应该符合“良好实践”的原则,并保留以下树形结构:
toolkit/src/libint/ 
    libinternal.cpp libinternal.hpp 
toolkit/src/libext/ 
    externallib/ 
toolkit/bin/ 
    my binaries 
toolkit/demo/tool1/ 
    tool1.cpp tool1.hpp 
toolkit/demo/tool2/ 
    tool2.cpp tool2.hpp 
toolkit/lib/ 
    libinternal.a libexternal.a 
toolkit/include/libint/ 
    libinternal.hpp 
toolkit/include/libext/ 
    libexternal.hpp 

通常,我的演示工具位于单独子文件夹下的演示文件夹中,并使用来自include和lib文件夹的头文件和库进行编译。这意味着在构建工具包时,我通常首先将库编译到include和lib文件夹中,然后编译演示工具。
请问能否提供所需configure.ac和Makefile.am文件的最小示例以满足上述树形源结构(欢迎有关源树的任何建议)。
谢谢。

libext/externallib/是什么?如果它是外部的,为什么需要在lib/中复制一份?Autotools使用构建目录,旨在将库、头文件、程序安装在由./configure --help指定的目录中。 - Brett Hale
我只是想更好地了解外部依赖项与您想要安装的内容之间的区别。例如,您可能不希望安装演示程序,而只是用于测试等。不幸的是,autotools 的学习曲线相当陡峭;与此同时,这个 可能是我见过的最好的教程。 - Brett Hale
外部依赖是系统中不包含的库,其中一些库无法安装(旧库),如果移动到不同的操作系统,则需要重新编译。这就是为什么我有一个externallib/目录。但如果这会使事情变得复杂,并且由于我正在寻找一个学习示例,可以忽略这一点。也许可以提供一个使用boost的示例。谢谢。 - user8060
1个回答

2

首先需要决定的是您的库是否独立安装,还是链接到二进制文件中作为便捷库。

在这两种情况下,您都需要使用autoconf、automake和libtool。我将忽略configure.ac文件,重点关注Makefile.am。目录应该如下所示:

  ./
    lib/
       Makefile.am 
       ...
    bin/
    ...
    Makefile.am 

在顶层的Makefile.am文件中,您应该有以下内容:
 $ cat Makefile.am 
 SUBDIRS = . lib  # note the "." which means that the current directory is executed first 

在lib Makefile.am 文件中。
 $ cat lib/Makefile.am
 noinst_LTLIBRARIES        = libexternal.a
 libexternal_a_SOURCES     = source.c source.h
 libexternal_a_LIBADD      = -lm

如果您希望独立安装该库,请将noinst替换为lib

因此,lib Makefile.am看起来像:

 $ cat lib/Makefile.am
 lib_LTLIBRARIES           = libexternal.a
 libexternal_a_SOURCES     = source.c source.h
 libexternal_a_LIBADD      = -lm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接