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

我尝试在Makefile.am中放入 EXTRA_DIST = libtool ,但这不起作用。

这基本上就是我的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
有帮助吗?

解决方案

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

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

此脚本传统上称为 bootstrap autogen.sh 。这些名称并不普遍,几乎就是这样。就在几天前,我遇到了一个使用 bootstrap.sh 的项目。

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

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

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

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

顺便说一句, AC_PROG_LIBTOOL 宏是过时。您应该使用 LT_INIT

其他提示

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

致电

$ autoreconf -i

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

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

$ autoreconf -vis

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top