libtool удален командой 'make distclean' - PullRequest
1 голос
/ 17 сентября 2009

Я скопировал 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 ]

7 голосов
/ 13 октября 2009

На самом деле, вам не нужно вызывать все, что aclocal и libtoolize и autoheader и ...

Просто позвоните

$ autoreconf -i

и autoreconf запустит aclocal, libtoolize (если в configure.ac есть макросы libtool), automake (если configure.ac включает automake) и autoconf Все соответствующие файлы, которые необходимо добавить в дерево исходных текстов, будут скопированы туда, в том числе ltmain.sh.2

Я обычно добавляю некоторые подробности (-v), и вместо того, чтобы просто копировать файлы, я символическую ссылку на них, в результате чего мой стандартный вызов

$ autoreconf -vis

Файл "libtool", сгенерированный прогоном configure, специфичен для системы, в которой выполнялся прогон configure, и поэтому, конечно, будет снова очищен "make distclean".

3 голосов
/ 17 сентября 2009

Вы не должны копировать 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 в конце. Глава 8 Autobook подразумевает, что это тоже так, но я наткнулся на контрпримеры. (То есть проекты с autogen.sh сценарием, который не вызывает configure, и проекты с bootstrap сценарием, которые это делают.)

На мой взгляд, вопрос о том, включать ли в конце шаг configure, сводится к тому, насколько типичны варианты использования вашего проекта. Если почти каждый, кто нуждается в начальной загрузке дерева сборки вашего проекта, примет стандартные флаги configure, определенные в сценарии начальной загрузки, или, возможно, добавит один или два простых флага, то можно автоматически запустить configure. Лучше всего сделать это отдельным ручным шагом, если многим людям потребуется выполнить тяжелую настройку. Например, когда многие ваши пользователи кросс-компилируют ваш проект. Способы запроса configure сделать это хорошо известны, в то время как кто-то должен прочитать код вашего сценария начальной загрузки, чтобы выяснить, как передать параметры встроенной команде configure.

Вам почти наверняка придется настроить этот скрипт в соответствии с потребностями вашего проекта. Самое важное, что нужно оставить как есть, это порядок операций. Автоинструменты чувствительны к этому. Возможно, вам придется изменить флаги с учетом команд; например, -I config в команде aclocal не является универсальным. Скорее всего, вам потребуется добавить шаги к процессу, окружив эти общие шаги или, возможно, даже чередуя их.

Что касается опции autoreconf , я еще не стал фанатом. Я нахожу, что его встроенные предположения так или иначе нарушают все мои проекты. Если ваш проект является стандартным проектом в стиле GNU, он может работать на вас.

Кстати, макрос AC_PROG_LIBTOOL устарел . Вы должны использовать LT_INIT вместо.

...