Как вы «повторяете» последнюю настройку / make build —options в исходном каталоге?

#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, отключающие это.