Как преодолеть предупреждение «aclocal-1.15 отсутствует в вашей системе»?

85

Я пытаюсь запустить программу на C ++ на github. (доступно по следующей ссылке https://github.com/mortehu/text-classifier )

У меня есть Mac, и я пытаюсь запустить его в терминале. Я думаю, что скачал autoconf и automake, но не уверен. Чтобы запустить программу, я перехожу в правильную папку в терминале, затем запускаю

./configure && make 

Но я получаю ошибку:

ВНИМАНИЕ: в вашей системе отсутствует aclocal-1.15. Он понадобится вам, только если вы изменили файлы acinclude.m4, configure.ac или m4, включенные в configure.ac. Программа aclocal является частью пакета GNU Automake: http://www.gnu.org/software/automake. Для работы также требуются GNU Autoconf, GNU m4 и Perl: http://www.gnu.org / software / autoconf http://www.gnu.org/software/m4/ http://www.perl.org/ make: *** [aclocal.m4] Ошибка 127

У меня есть xcode и g ++ и все необходимое для запуска программ на c, но, как это, вероятно, очевидно, я понятия не имею, что я делаю.

Какой самый простой и простой способ запустить программу по указанной выше ссылке? Я понимаю, что он поставляется с файлом readme и примером использования, но я не могу заставить его работать.

Лиам Флинн
источник
1
Вы можете получить автоинструменты по адресу
Маддури
1
«все, что требуется для запуска с программами» - вам нужно все вещи , чтобы составить программу, которая в данном случае включает в себя пакеты automake, autoconf, m4, и perl, как сообщение совершенно четко сказано ... «Я думаю , что я скачал Autoconf и automake, но я не уверен »- я почти уверен, что вы, по крайней мере , не установили его должным образом. ;-)
DevSolar

Ответы:

168

Перед бегом ./configureпопробуйте запуститьautoreconf -f -i . Программа autoreconf автоматически запускает autoheader, aclocal, automake, autopoint и libtoolize по мере необходимости.

Редактировать для добавления: обычно это вызвано извлечением кода из Git вместо его извлечения из архива .zipили .tar.gz. Чтобы инициировать перестройку при изменении файлов, Git не сохраняет временные метки файлов, поэтому configureсценарий может показаться устаревшим. Как уже упоминали другие, есть способы обойти это, если у вас нет достаточно последней версии autoreconf.

Другое редактирование: эта ошибка также может быть вызвана копированием исходной папки, извлеченной из архива с помощью scp, на другой компьютер. Отметки времени могут быть обновлены, предполагая, что необходима перестройка. Чтобы этого не произошло, скопируйте архив и распакуйте его на место.

мортеху
источник
Спасибо, Мортеху! Но затем я получаю сообщение об ошибке: В файле, включенном из base / columnfile.cc: 1: ./base/columnfile.h:8:10: фатальная ошибка: файл 'kj / debug.h' не найден #include <kj / debug .h> Мне не хватает файла?
Лиам Флинн,
1
Да, вам не хватает libkj, который является частью проекта Cap'n Proto. Вам также понадобится libsnappy.
mortehu
Хорошо, у меня наконец есть все необходимые инструменты для настройки, сборки и установки. Вроде все работает, а куда девается исполняемый файл? Не уверен, что это важно или актуально, но я получаю следующее сообщение (как часть гораздо большего сообщения), когда делаю установку: # Не цель: install: # Цель командной строки. # Неявный поиск правил не производился. # Время модификации никогда не проверялось. # Файл не обновлен. Означает ли это, что выходной файл не создается?
Лиам Флинн,
Программа должна заканчиваться как tools/text-classifier/text-classifier. Не знаю, почему make installне работает.
mortehu
это может произойти, если вы запустите ./configure в своем проекте, а затем обновите automakeпакет
Алек Истомин
52

Часто вам не нужны никакие auto*инструменты и самое простое решение , чтобы просто запустить touch aclocal.m4 configureв соответствующей папке (а также работать touchна Makefile.amи Makefile.inесли они существуют). Это обновит метку времени aclocal.m4и напомнит системе, что aclocal.m4она актуальна и не требует восстановления. После этого, вероятно, лучше всего очистить buildкаталог и перезапустить его configureс нуля. Я регулярно сталкиваюсь с этой проблемой. Для меня основная причина в том, что я копирую библиотеку (например, mpfrкод для gcc) из другой папки, и временные метки меняются.

Конечно, этот прием недействителен, если вам действительно нужно регенерировать эти файлы, возможно, потому, что вы изменили их вручную. Но есть надежда, что разработчики пакета распространяют файлы в актуальном состоянии.


И конечно, если вы все-таки хотите установить automakeи дружить, то используйте соответствующий пакет-менеджер для вашего дистрибутива.


Установите aclocal, который поставляется с automake:

brew install automake          # for Mac
apt-get install automake       # for Ubuntu

Попробуйте снова:

./configure && make 
Emlai
источник
После этого я получаю: configure.ac:25: error: Требуется Autoconf версии 2.69 или выше ... ВНИМАНИЕ: aclocal-1.15, вероятно, слишком стар. ... make: *** [aclocal.m4] Ошибка 63
Лиам Флинн
а затем после установки autoconf v2.69 я получаю: libtool: ошибка несоответствия версии. Это libtool 2.4.2 Debian-2.4.2-1.11, но определение этого LT_INIT в libtool: взято из libtool 2.4.4. libtool: вам следует воссоздать aclocal.m4 с макросами из libtool 2.4.2 Debian-2.4.2-1.11 libtool: и снова запустить autoconf.
Лиам Флинн,
Убедитесь, что вы сделали brew install libtool, затем бегите aclocal, затем бегите autoconf.
emlai
Я обновил libtool, но теперь получаю: libtool: Ошибка несоответствия версии. Это libtool 2.4.2 Debian-2.4.2-1.11, но определение этого LT_INIT в libtool: взято из libtool 2.4.6. libtool: вам следует воссоздать aclocal.m4 с макросами из libtool 2.4.2 Debian-2.4.2-1.11 libtool: и снова запустить autoconf.
Лиам Флинн,
Это решает проблему. Но в этом нет необходимости, так как для этого требуется многое другое (привилегии root, сетевое соединение, больше места для нового программного обеспечения и т. Д.). Решение от Droopycon, приведенное ниже, является (близким к) правильным ответом, поскольку в сообщении об ошибке четко указано, что «оно понадобится вам только в том случае, если вы изменили файлы acinclude.m4 или configure.ac или m4, включенные в configure.ac». .
harihardik
11

Вы можете легко установить нужную вам версию:

Сначала получите исходный код:

$ wget https://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz

Распаковать:

$ tar -xzvf automake-1.15.tar.gz

Сборка и установка:

$ cd automake-1.15
$ ./configure  --prefix=/opt/aclocal-1.15
$ make
$ sudo mkdir -p /opt
$ sudo make install

Используй это:

$ export PATH=/opt/aclocal-1.15/bin:$PATH
$ aclocal --version

aclocal (GNU automake) 1.15

Теперь, когда вызывается aclocal, вы получаете нужную версию.

Фредерик Оллингер
источник
Это установило для меня "aclocal". Я установил его через установщик пользовательского интерфейса CygWin, выполнив поиск по запросу «automake» и выбрав версию 11-1.
justdan23
8

Общий ответ, который может или не относиться к этому конкретному случаю:

Как указано в сообщении об ошибке, aclocal-1.15 требуется только в том случае, если вы изменили файлы, которые использовались для создания aclocal.m4.

Если вы не изменяете ни один из этих файлов (включая configure.ac), вам не потребуется aclocal-1.15.

В моем случае проблема заключалась не в том, что какой-либо из этих файлов был изменен, а в том, что временная метка в configure.ac была на 6 минут позже, чем в aclocal.m4.

Я не понял почему, но чистый клон моего репозитория git решил проблему для меня. Может быть, что-то связано с git и с тем, как он вообще создавал файлы.

Вместо того, чтобы повторно запускать autoconf и друзей, я бы просто попытался получить чистый клон и повторить попытку .

Также возможно, что кто-то внес изменения в configure.ac, но не восстановил aclocal.m4, и в этом случае вам действительно придется повторно запустить automake и друзей.

Droopycom
источник
1
Более подходящий ответ. Я получил аналогичную ошибку, потому что я не извлекал исходные файлы из tar, который предоставляется squid. Вместо этого я скопировал уже извлеченную папку, и мой порядок копирования файла был другим, что вызвало ошибку. Я просто повторно извлек его из tar, и он начал работать. Я бы отметил решение Droopycon как правильный ответ, если бы была возможность.
harihardik
Гениально! Я привык rsyncкопировать уже извлеченные файлы с одного сервера на другой (вместо копирования сжатых исходных архивов) без сохранения временных меток. Когда я вместо этого скопировал исходные архивы и распаковал их на целевой машине, проблемы не возникло. Спасибо!
Бен Джонсон
Действительно, очень часто ответ - «Оформить свежее репо». Фантастический ответ и щедрость!
Fattie
6

Вся суть Autotools заключается в том, чтобы предоставить загадочный язык на основе макросов M4, который в конечном итоге компилируется в сценарий оболочки, называемый ./configure. Вы можете отправить этот скомпилированный сценарий оболочки с исходным кодом, и этот сценарий должен делать все для обнаружения среды и подготовки программы к сборке. Автоинструменты должны потребоваться только тем, кто хочет настроить тесты и обновить этот сценарий оболочки.

Это побеждает смысл Autotools, если в системе должны быть установлены GNU This и GNU That, чтобы они работали. Первоначально он был изобретен для упрощения переноса программ на различные системы Unix, на которые нельзя было рассчитывать, что в них что-то будет. Даже конструкции, используемые сгенерированным кодом оболочки, ./configureдолжны были быть очень тщательно отобраны, чтобы гарантировать, что они будут работать на каждой сломанной старой оболочке практически везде.

Проблема, с которой вы столкнулись, связана с некоторыми неработающими шагами Makefile, изобретенными людьми, которые просто не понимают, для чего нужны Autotools и роль финального ./configureскрипта.

В качестве обходного пути вы можете зайти в Makefile и внести некоторые изменения, чтобы избавиться от этого. В качестве примера я создаю Git-заголовок GNU Awk и сталкиваюсь с той же проблемой. Однако я применил этот патч Makefile.inи успешно могу make gawk:

diff --git a / Makefile.in b / Makefile.in

index 5585046..b8b8588 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -312,12 +312,12 @@ distcleancheck_listfiles = find . -type f -print

 # Directory for gawk's data files. Automake supplies datadir.
 pkgdatadir = $(datadir)/awk
-ACLOCAL = @ACLOCAL@
+ACLOCAL = true
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
+AUTOCONF = true
+AUTOHEADER = true
+AUTOMAKE = true
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@

По сути, я изменил все так, чтобы безобидная trueкоманда оболочки заменяла все программы автозаполнения.

Фактические шаги сборки для Gawk не нуждаются в автозаполнении! Он задействован только в некоторых правилах, которые вызываются, если части автозаполнения изменились и требуют повторной обработки. Однако Makefile структурирован таким образом, что при отсутствии инструментов он не работает.

Перед патчем выше:

$ ./configure
[...]
$ make gawk
CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash /home/kaz/gawk/missing aclocal-1.15 -I m4
/home/kaz/gawk/missing: line 81: aclocal-1.15: command not found
WARNING: 'aclocal-1.15' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [aclocal.m4] Error 127

После патча:

$ ./configure
[...]
$ make gawk
CDPATH="${ZSH_VERSION+.}:" && cd . && true -I m4
CDPATH="${ZSH_VERSION+.}:" && cd . && true
gcc -std=gnu99 -DDEFPATH='".:/usr/local/share/awk"' -DDEFLIBPATH="\"/usr/local/lib/gawk\"" -DSHLIBEXT="\"so"\" -DHAVE_CONFIG_H -DGAWK -DLOCALEDIR='"/usr/local/share/locale"' -I.     -g -O2 -DNDEBUG -MT array.o -MD -MP -MF .deps/array.Tpo -c -o array.o array.c 
[...]
gcc -std=gnu99  -g -O2 -DNDEBUG  -Wl,-export-dynamic -o gawk array.o awkgram.o builtin.o cint_array.o command.o debug.o dfa.o eval.o ext.o field.o floatcomp.o gawkapi.o gawkmisc.o getopt.o getopt1.o int_array.o io.o main.o mpfr.o msg.o node.o profile.o random.o re.o regex.o replace.o str_array.o symbol.o version.o      -ldl -lm
$ ./gawk --version
GNU Awk 4.1.60, API: 1.2
Copyright (C) 1989, 1991-2015 Free Software Foundation.
[...]

Вот и все. Как видите, CDPATH=командные строки находятся там, где вызывается Автозаполнение, где вы видите trueкоманды. Они сообщают об успешном завершении, поэтому он просто проваливается через этот мусор, чтобы выполнить проклятую сборку, которая идеально настроена.

Я сделал это, make gawkпотому что есть некоторые подкаталоги, которые создаются, но не работают; этот трюк нужно повторить для соответствующих файлов Makefile.

Если вы столкнетесь с подобными вещами с чистым официальным архивом программы от его разработчиков, то пожалейте. Его нужно просто распаковать, ./configureи makeвам не нужно ничего исправлять или устанавливать какие-либо материалы Automake или Autoconf.

В идеале, их Git-голова тоже должна вести себя таким же образом.

Каз
источник
Почему вы думаете, что файлы Makefile не работают? Как указано в ответе emlai, система сборки распознает, что зависимости для сгенерированных файлов устарели (что может быть только в случае испорченных временных меток, которые вы можете исправить, touchвставив их). Сказать, что люди, которые создали эту систему, не понимают, для чего она была создана (гарантируя, что вы строите правильно со всеми зависимостями - включая - auto*части, если они были изменены), и изменение Makefile, чтобы эффективно не делать этого полностью больше кажется ... неправильным.
Саймон Собиш 01
@SimonSobisch У вас возникла эта проблема и вы не можете использовать ответ?
Kaz
Спасибо за вопрос. Нет, у меня нет этой проблемы, но, прочитав ваш пост, я вижу нижнюю строку «эта ошибка возникает из-за того, что файлы Makefile сломаны, а не те, которые должны быть», - в то время как Makefiles делают именно то, что должны (восстанавливают файлы, которые нуждаются в объектный файл должен быть перестроен по тем же правилам из источника C). В большинстве случаев ошибка возникает из-за того, что люди используют пакеты non-dist без необходимых инструментов или временные метки из исходников не работают «пожаловаться автору».
Саймон Собиш 01
Я бы никогда не рекомендовал менять инструмент на true. Если вы действительно хотите исправить части, которые сломаны «только потому, что временные метки», лучше работать make --touchс ошибочными целями (если вы хотите собрать их, запустите, make --keep-goingчтобы получить список «сломанных» частей заранее).
Саймон Собиш 01
@SimonSobisch Отличные предложения; звучит так, как будто у вас есть начало отдельного ответа. В этом случае изменение инструментов на trueрационально оправдано тем фактом, что эти инструменты не нужны для сборки программы, а нужны только для пересборки configureскрипта, который уже доступен в готовой форме. Прикосновение к отметкам времени для подавления попыток запуска инструментов дает тот же эффект.
Kaz
4

Я думаю, что сенсорная команда - это правильный ответ, например, сделайте что-нибудь вроде

touch --date="`date`" aclocal.m4 Makefile.am configure Makefile.in

перед [./configure && make].

Боковая панель I. В противном случае я согласен с @kaz: добавление зависимостей для aclocal.m4 и / или configure, и / или Makefile.am, и / или Makefile.in делает предположения о целевой системе, которые могут быть недействительными. В частности, эти предположения

1) что все целевые системы имеют автоинструменты,

2) что все целевые системы имеют одну и ту же версию автоинструментов (например, в данном случае automake.1.15).

3) что, если (1) или (2) не верны для любого пользователя, что пользователь извлекает пакет из созданного сопровождающим форматом TAR или ZIP, который поддерживает временные метки соответствующих файлов, и в этом случае все autotool / configure Зависимости /Makefile.am/Makefile.in в Makefile, созданном с помощью configure, будут удовлетворены до того, как будет запущена команда make.

Второе предположение не работает на многих системах Mac, потому что automake.1.14 является "последним" для OSX (по крайней мере, это то, что я вижу в MacPorts, и, очевидно, то же самое верно и для brew).

Третье предположение совершенно не соответствует действительности в мире с Github. Эта неудача является примером мышления «все думают, что они нормативные»; в частности, сопровождающие, которые являются единственным классом пользователей, которым необходимо редактировать Makefile.am, теперь поместили всех в этот класс.

Возможно, в autowhatever есть опция, которая предотвращает добавление этих зависимостей в Makefile.in и / или Makefile.

Боковая панель II [Почему @kaz прав]: конечно, для меня и других знатоков очевидно, что нужно просто попробовать последовательность команд [touch], чтобы обмануть созданный configure Makefile от повторного запуска configure и автоинструментов. Но дело не в настройке; цель настройки - убедиться, что как можно больше пользователей в максимально возможном количестве различных систем могут просто выполнить [./configure && make] и двигаться дальше; большинство пользователей не заинтересованы в «бритье яка», например, в отладке ошибочных предположений разработчиков автоинструментов.

Боковая панель III: можно утверждать, что ./configure, теперь, когда autotools добавляет эти зависимости, является неправильным инструментом сборки для использования с пакетами, распространяемыми Github.

Боковая панель IV: возможно, репозитории Github на основе конфигурации должны поместить необходимую команду касания в свои readme, например https://github.com/drbitboy/Tycho2_SQLite_RTree .

Брайан Карчич
источник
4

2018, еще одно решение ...

https://github.com/apereo/mod_auth_cas/issues/97

в некоторых случаях просто работает

$ autoreconf -f -i

и больше ничего .... решает проблему.

Вы делаете это в каталоге /pcre2-10.30.

Какой кошмар.

(Обычно это не решало проблему в 2017 году, но теперь , похоже, решает проблему - они что-то исправили. Кроме того, похоже, что ваш Dockerfile теперь обычно должен начинаться с «FROM ibmcom / swift-ubuntu»; раньше вам приходилось указывать определенная версия / dev-build, чтобы он работал.)

Толстяк
источник
2

Проблема не в automakeпакете, а в репозитории

sudo apt-get install automake

Устанавливает версию aclocal-1.4, поэтому не можете найти 1.5(В Ubuntu 14,15)

Используйте этот сценарий для установки последней версии https://github.com/gp187/nginx-builder/blob/master/fix/aclocal.sh

Pian0_M4n
источник
0

2017 - Высокая Сьерра

Действительно сложно заставить autoconf 1.15 работать на Mac. Мы наняли эксперта, чтобы все заработало. Все прекрасно заработало.

Позже мне довелось обновить Mac до High Sierra.

Конвейер Docker перестал работать!

Несмотря на то, Autoconf 1,15 это работает отлично на Mac.

Как исправить,

Короткий ответ: я просто выбил локальное репо и снова проверил репо.

Это предложение отмечено в миксе на этой странице контроля качества и в других местах.

Тогда все работало нормально!

Вероятно, это как-то связано с aclocal.m4 и аналогичными файлами. . (Но кто знает на самом деле). Я бесконечно массировал эти файлы ... но ничего.

По какой-то неизвестной причине, если вы просто поцарапаете свое репо и снова получите репо: все работает!

Я часами пробовал каждую комбинацию касания / удаления и т.д. рассматриваемых файлов, но нет. Просто проверьте репо с нуля!

Толстяк
источник
Чтобы вернуть автоматическое репо в состояние проверки, вы можете сделать: «make distclean».
Фредерик
Технически это не команда git. Это для очистки репозитория после ./configure. Так что это часть автопроизводителя. Но он должен работать в любом репозитории git, который использует automake.
Фредерик
gotchya, это звучит как отличный совет.
Fattie 01
«Действительно сложно заставить autoconf 1.15 работать на Mac. Мы наняли Ultra-Expert, чтобы заставить его работать ...» - это говорит нам о том, насколько сломана эта инструментальная цепочка. И, к сожалению, за 20 с лишним лет это так и не было исправлено. Я возражаю против того, чтобы это исправить. Какой цели он служит, чтобы оставить его сломанным, чтобы люди не могли его использовать?
jww 03