2009-09-17 66 views
1

我已经将libtool复制到我的程序的源代码树中,以便与程序一起分发它。但是当我运行'make distclean'时,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 

回答

3

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

#!/bin/sh 
aclocal -I config && 
    libtoolize --force --copy && 
    autoheader && 
    automake --add-missing --copy --foreign && 
    autoconf && 
    ./configure -C "[email protected]" 

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

在很大程度上,脚本的名称是一个时尚和风格的问题。这并不完全肤浅,因为现代风格的一部分是从脚本末尾运行configurebootstrap是较新的名称,因此名为该脚本的脚本最终不太可能运行configureChapter 8 of the Autobook暗示也是这种情况,但我碰到了反例。 (也就是说,与autogen.sh脚本,不叫configure项目,并与bootstrap脚本,做的项目。)

在我脑海中,是否包括configure步末回落到怎样的典型问题你的项目的用例是。如果几乎每个需要引导项目构建树的人都会接受引导脚本中定义的标准configure标志,或者可能添加一个或两个简单标志,那么可以自动运行configure。如果很多人需要大量定制,最好将其作为一个单独的手动步骤。一个例子是当你的许多用户是你的项目的cross-compiling。要求configure这样做的方法是众所周知的,而有些人则需要阅读引导脚本的代码以了解如何将选项传递给嵌入式configure命令。

您几乎可以肯定必须根据您的项目需求定制此脚本。现在离开的最重要的事情是操作顺序。 Autotools对此非常敏感。你可能不得不改变给定命令的标志;例如,aclocal命令中的-I config命令不是通用的。您甚至可能需要为流程添加步骤,既可以包含这些常见步骤,也可以与它们交错。

至于the autoreconf option,我还没有成为粉丝。不管怎样,我发现其内置的假设在我所有的项目中都有分解。如果你的项目是一个沼泽标准的GNU风格的项目,它可能适合你。

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

+1

'bootstrap'通常用于执行一切* * configure.ac 'autogen.sh'的脚本通常做'bootstrap'所做的一切,再加上configure。 – 2009-11-03 23:21:42

+0

我认为$ *应该改为$ @,当然这些变量中的任何一个都必须按照下面的规定引用:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF2 – lanoxx 2012-09-14 18:44:14

+1

永远不会少于由ndim给出的解决方案绝对是首选,因为autoreconf也知道调用这些命令的正确顺序。 – lanoxx 2012-09-14 18:45:58

7

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

只需拨打

$ autoreconf -i 

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

我通常会添加一些详细信息(-v),而不是仅仅复制文件,而是将它们符号化,导致我的

$ autoreconf -vis 

标准调用由产生的“libtool的”文件“配置”运行特定于系统配置运行发生了,因此当然可以通过“make distclean命令”再次清洗。

+0

这是正确的答案。 – Daeden 2013-04-27 01:05:03