Вопрос

Я скопировал 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
Это было полезно?

Решение

Вы не должны копировать 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 является

Другие советы

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

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

$ autoreconf -i

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

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

$ autoreconf -vis

" libtool " файл, сгенерированный с помощью «configure» run относится к системе, в которой выполнялся запуск configure, и, конечно, будет снова очищен с помощью команды "make distclean".

scroll top