libtool被'make distclean'删除

时间:2009-09-17 04:49:50

标签: autotools autoconf automake libtool

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

我尝试将EXTRA_DIST = libtool放在Makefile.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

2 个答案:

答案 0 :(得分: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”再次清理。

答案 1 :(得分: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的项目。

在很大程度上,脚本的名称是时尚和风格的问题。这并不是完全肤浅的,因为现代风格的一部分是在剧本结束时不再运行configurebootstrap是较新的名称,因此名为的脚本不太可能在最后运行configureChapter 8 of the Autobook意味着情况也是如此,但我遇到了反例。 (即,带有autogen.sh脚本且不调用configure的项目,以及带有bootstrap脚本的项目。)

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

您几乎肯定必须根据项目的需要自定义此脚本。离开的最重要的事情是操作的顺序。 Autotools对此非常敏感。您可能必须更改给定命令的标志;例如,-I config命令上的aclocal不是通用的。您甚至更有可能需要在流程中添加步骤,或者围绕这些常见步骤,或者甚至可能与它们交错。

至于the autoreconf option,我还没有成为粉丝。我发现它的内置假设在某种程度上打破了我的所有项目。如果你的项目是一个标准的GNU风格的项目,它可能适合你。

顺便说一下,AC_PROG_LIBTOOL宏是obsolete。您应该使用LT_INIT代替。