0

我已将 libtool 复制到我的程序的源代码树中,以便与程序一起分发它。但是当我运行“make distclean”时,libtool 会与其余生成的文件一起被删除。我该如何阻止这种情况发生?

我尝试放入EXTRA_DIST = libtoolMakefile.am 但这不起作用。

这基本上是我的 configure.ac 的样子。

AC_PREREQ(2.53)
AC_INIT( [program], [0.16], [program] )
AC_CONFIG_SRCDIR([src/c/program.c])
AC_CONFIG_HEADER([config.h])
AC_CONFIG_AUX_DIR(build-aux)
AM_INIT_AUTOMAKE( [-Wall -Werror foreign] )

m4_include(ax_pkg_swig.m4)

# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
AC_ENABLE_SHARED
AC_PROG_SWIG

# Checks for libraries.

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T

# Checks for library functions.
AC_REPLACE_FNMATCH
AC_FUNC_MALLOC
AC_FUNC_STAT
AC_CHECK_FUNCS([regcomp strdup strtoull])

AC_CONFIG_FILES([
    Makefile
    src/c/Makefile
    src/perl/Makefile
    src/verilog/Makefile
])
AC_OUTPUT
4

2 回答 2

7

实际上,您不需要调用所有的 aclocal 和 libtoolize 和 autoheader 和...

打电话

$ autoreconf -i

autoreconf 将运行 aclocal、libtoolize(如果 configure.ac 中有 libtool 宏)、automake(如果 configure.ac 涉及 automake)和 autoconf。需要添加到源代码树的所有相应文件都将复制到那里,其中包括 ltmain.sh.2

我通常会添加一些冗长(-v),而不是仅仅复制文件,我符号链接它们,导致我的标准调用

$ autoreconf -vis

“configure”运行生成的“libtool”文件特定于配置运行发生的系统,因此当然会被“make distclean”再次清理。

于 2009-10-13T14:28:49.210 回答
3

您不应该libtool手动复制到程序的目录中。你libtoolize在你的引导脚本中运行,它会为你处理这个。我想它不仅仅是为您复制 libtool,例如通知 automake 它不应该删除该文件。这是一个示例引导脚本:

#!/bin/sh
aclocal -I config &&
    libtoolize --force --copy &&
    autoheader &&
    automake --add-missing --copy --foreign &&
    autoconf &&
    ./configure -C "$@"

该脚本传统上称为bootstrapautogen.sh。这些名称不是通用的,几乎是通用的。就在几天前,我遇到了一个项目bootstrap.sh,例如使用 .

在很大程度上,剧本的名称与时尚和风格有关。这并不完全是肤浅的,因为现代风格的一部分是远离configure在脚本末尾运行的。bootstrap是较新的名称,因此命名的脚本不太可能configure在最后运行。Autobook 的第 8 章也暗示了这种情况,但我遇到了反例。(也就是说,项目的autogen.sh脚本不调用configure,而项目的bootstrap脚本调用。)

在我看来,是否在最后包含该configure步骤的问题归结为您的项目用例的典型程度。如果几乎每个需要引导项目构建树的人都会接受configure引导脚本中定义的标准标志,或者可能添加一两个简单的标志,那么configure自动运行就可以了。如果很多人需要进行大量定制,最好将其作为一个单独的手动步骤。一个例子是当你的很多用户在交叉编译你的项目时。要求configure执行此操作的方法是众所周知的,而有人必须阅读您的引导脚本的代码才能弄清楚如何将选项传递给嵌入式configure命令。

您几乎可以肯定必须根据项目的需要自定义此脚本。保持原样最重要的是操作顺序。Autotools 对此很敏感。给定命令,您可能必须更改标志;例如,-I configonaclocal命令不是通用的。您更有可能需要在流程中添加步骤,要么围绕这些常见步骤,要么甚至与它们交错。

至于选项autoreconf我还没有成为粉丝。我发现它的内置假设在我所有的项目中都以某种方式失效。如果你的项目是一个沼泽标准的 GNU 风格的项目,它可能适合你。

顺便说一句,AC_PROG_LIBTOOL宏已经过时了。你应该LT_INIT改用。

于 2009-09-17T15:37:45.937 回答