#makefile #gnu #autotools #configure #autoconf
#makefile #gnu #autotools #настройка #автоконфигурация
Вопрос:
При выполнении «./configure, make и install » в стиле GNU — с определенными параметрами, флагами и т.д… Как вы все знаете, иногда это может быть черным искусством .. и то, что работает для одной части программного обеспечения, может не сработать для любой другой…
Теперь представьте, что вы успешно создали какой-то пакет XYZ.app с некоторыми опциями, такими как…
% ./configure --with-1=2 USFLAG="-3 four" OBSCURE_LIB=l/lib/doihave
и пошел дальше и использовал это. Отлично. На более позднем этапе вы понимаете, что вам нужен ранее опущенный параметр времени компиляции, или, возможно, вы решили проблему с зависимостями и т.д…По какой-либо причине вы хотите перекомпилировать этот совершенно хороший двоичный файл.
Теперь… как вы можете «вспомнить» ВСЕ параметры, которые вы передали в ./ configure, дословно, чтобы использовать те же параметры, возможно, добавляя или вычитая некоторые на этот раз?
Я уверен, что этот материал скрыт где-то во всех этих файлах config.xxxx или AClocal или Makefile.xx, но, хоть убейте, я не смог найти в Google ни одного прямого ответа.
% file /usr/bin/$1 --> Mach-O 64-bit executable x86_64
% ld /usr/bin/$1 --> -macosx_version_min not specificed, assuming 10.6
% make -d --> * 20 pages of Makefile nonsense.... *
% ./config.log --> * shows some history, but nothing interesting. *
% ./config.status --> * does a strange sequence oddly similar to a "clean" *
% ./configure -h --> * 500 options, none of which is "show-me=your-shit" *
glibtoolize, otool, autoconf, automake, pkg-config… похоже, все не желают помогать.
Похоже, что одним из завершающих вызовов является содержимое файла XYZ.pc, созданного pkg-config..
prefix=/usr/local exec_prefix=${prefix} libdir=${exec_prefix}/lib
includedir=${prefix}/include Libs: -L${libdir} -lxyz-base
Cflags: -I${includedir} -I${includedir}/xyz
Однако они просто кажутся переменными среды, а не аргументами из фактического вызова конфигурации…
Мне надоело гадать… каков реальный способ выяснить исходные аргументы сборки, чтобы вы могли использовать их снова, по желанию …?
Ответ №1:
Невероятно, но каким-то образом все остальные пропустили канонический способ сделать это, который существовал за 2 года до начала этого потока.
Я задавался тем же вопросом, что и OP, и был разочарован отсутствием надлежащих (не уродливых) способов сделать это, когда я прочитал эту тему.
Несколько дней спустя, лениво просматривая примечания к выпуску Autoconf, я добрался до примечаний к выпуску Autoconf 2.65. И вы бы в это поверили?
Основные изменения в Autoconf 2.65 (2009-11-21) [стабильный]
[…]
config.status теперь предоставляет параметр —config для создания конфигурации.
Итак, простой запуск ./config.status --config
выполняет именно то, о чем просил OP.
Вот соответствующая ссылка в документации: 17 вызов config.status и цитата:
--config
Распечатайте параметры конфигурации повторно используемым способом, в кавычках для командной строки, и завершите работу. Например, для отладочной сборки, которая в противном случае повторно использует конфигурацию из другого каталога сборки build-dir пакета в src-dir, вы могли бы использовать следующее:
args=`build-dir/config.status --config` eval src-dir/configure "$args" CFLAGS=-g --srcdir=src-dir
Комментарии:
1. Я думаю, что это должен быть правильный ответ. Перейдем прямо к тому, о чем спрашивает OP.
2.
./config-status
также поддерживается--help
опция, описывающая другие опции, которые, возможно, стоит упомянуть.
Ответ №2:
config.status
содержит параметры в нем; ./config.status --recheck
перезапускается configure
с исходными параметрами. Вы могли бы прервать это и повторно выполнить команду (которую она покажет вам перед ее запуском), или вы могли бы отредактировать config.status
и добавить в $ac_configure_extra_args
свои новые параметры.
Я бы хотел, чтобы они упростили это выполнение. Когда-то давно head config.status
это дало бы вам исходную configure
команду. ./config.status --rerun extra args here
было бы неплохо.
Комментарии:
1. я открыл случайный
config.status
файл на своей машине… это было 2600 строк — и 84 325 символов виртуальной галиматьи. я верю вам, информация, вероятно, там… но где? я хочу знать, что я делал раньше, что работало … и не менять ничего, что мне не нужно, противоречить предыдущей настройке и т.д. кстати, и я не хочу отвлекаться, но кто такие они на самом деле (о которых вы упомянули)? не заглядывая в него, «люди» gnu существуют исключительно в моем представлении как некие квазимифологические, защищенные от оперативной памяти старейшины, которые отказываются прекращать использовать Netscape 3.0 и т.д.2. Откройте его в своем любимом редакторе и найдите второе вхождение строки
./configure
; эта строка и настройкаac_configure_extra_args
непосредственно перед ней (2 строки в примерах, которые я удобно разместил здесь) являются местом, где находятся настройки. (Однако они будут перемещаться в зависимости отautoconf
используемой версии. Очень старые будут воспроизводитьconfigure
командную строку в комментарии в нескольких верхних строках скрипта.) Что касается «они», страница проектаautoconf
GNU документирует основных сопровождающих и участников.
Ответ №3:
Я не могу поверить, что никто не упомянул config.log — это дает вам именно то, что вы ищете:
Этот файл содержит любые сообщения, созданные компиляторами во время выполнения configure, чтобы облегчить отладку, если configure допустит ошибку.
Он был создан с помощью configure, которая была сгенерирована GNU Autoconf 2.69. Командная строка вызова была
$ ./configure —prefix /usr/local/syslog-ng/ —enable-linux-caps —enable-spoof-source
Ответ №4:
Если у вас все еще есть дерево сборки, запустите ./config.status --recheck
, затем быстро нажмите CTRL-C
, поскольку оно распечатывает то, что будет запущено перед повторным запуском configure
.
Комментарии:
1. Это довольно хорошо. Например, я получил…
./config.status --recheck
—>running CONFIG_SHELL=/bin/sh /bin/sh ./configure --with-mysql --with-ffmpeg --with-php=/usr/local/sbin/php-fpm --with-wwwuser=_www --with-wwwgroup=_www CFLAGS=-arch x86_64 -g -Os -pipe -no-cpp-precomp LDFLAGS=-arch x86_64 -bind_at_load --no-create --no-recursion
при попадании в случайную папку сборки. Все это звучит знакомо, и это определенно то, что я хотел знать.. Теперь, почему, вы думаете , они так затруднили доступ к нему … и не заслуживают упоминания ни в одной из вышеупомянутых документации?2. @alex gray: Я думаю, вероятно, потому, что не ожидается, что пользователи действительно будут его использовать. Единственная причина, по которой я знал об этом, заключается в том, что я видел правила перестройки для configure, отключающие это.