如何在源目录中“回显”最后一次configure/make编译选项?

31

当你使用GNU风格的“./configure, make和install”命令,并使用特定的选项、标志等时,你知道有时候这可能是个黑魔法...... 对于一些软件来说有效的操作在其他软件中可能无效。

现在,想象一下,你已经成功地构建了一个带有一些选项的软件包XYZ.app,并使用了它。很好。后来,由于某种原因,比如你需要添加之前省略的编译时选项,或者你已经解决了依赖问题等等,你想重新编译这个二进制文件。

那么...现在的问题是如何“回忆起”你之前输入的所有选项,以便重新使用这些相同的选项,同时也可以删除或添加一些选项呢?

我相信这些信息都埋藏在诸如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似乎都不愿意提供帮助。看起来,唯一可行的方法是查看pkg-config创建的XYZ.pc文件的内容。

prefix=/usr/local  \  exec_prefix=${prefix}  \  libdir=${exec_prefix}/lib
includedir=${prefix}/include  \  Libs: -L${libdir} -lxyz-base 
Cflags: -I${includedir} -I${includedir}/xyz

然而,这些似乎只是环境变量,而不是来自实际配置调用的参数...

我已经猜了很多次...有没有真正的方法可以找出原始的构建参数,以便您随意再次使用它们...
4个回答

29
令人惊讶的是,不知何故其他所有人都错过了这个典范的方法,而这个方法早已存在于此线程开始2年前。 :-)
我和楼主想到了同样的事情,但当我看到这个帖子时,我对没有适当(非丑陋)的方法感到失望。
几天后,我闲逛自动配置发布说明时,我看到了 Autoconf 2.65 的发布说明。你能相信吗?
引用
Autoconf 2.65 (2009-11-21) [stable] 中的重大更改
[...]
config.status 现在提供 --config 选项以生成配置。
所以,只需运行 ./config.status --config 就可以完全满足楼主的要求。
以下是文档中的相关参考资料:17 config.status invocation,并引用如下:

--config

Print the configuration settings in reusable way, quoted for the shell, and exit. For example, for a debugging build that otherwise reuses the configuration from a different build directory build-dir of a package in src-dir, you could use the following:

args=`build-dir/config.status --config`
eval src-dir/configure "$args" CFLAGS=-g --srcdir=src-dir

3
我认为这应该是正确答案。直接回答OP提出的问题。 - rph
1
./config-status 还支持一个 --help 选项,该选项描述了其他选项,这可能值得一提。 - MattArmstrong

14

config.status中包含了选项;./config.status --recheck会使用原始选项重新运行configure。你可以中断它并重新发出命令(在运行之前它会向你显示命令),也可以编辑config.status并将新参数添加到$ac_configure_extra_args中。

我有点希望他们能更容易地做到这一点。以前,head config.status可以让你得到原始的configure命令。./config.status --rerun extra args here会更好。


2
我在我的机器上打开了一个随机的config.status文件...它有2600行 - 和84325个字符的虚拟胡言乱语。我相信你,信息可能就在那里...但是在哪里呢?我想知道我之前做过什么,有用的东西...而且不改变任何我不必改变的东西,不与以前的设置相矛盾等等。顺便说一下,我不是要离题,但是你提到的“他们”是谁?没有查找,GNU“人”在我的脑海中存在,就像一些准神话般的、养羊的老人,拒绝停止使用Netscape 3.0等等。 - Alex Gray
3
在您喜欢的编辑器中打开它,然后搜索字符串"./configure"的第二次出现。这一行以及在其之前紧接着设置的“ac_configure_extra_args”(在我方便找到的示例中为2行),就是设置所在的地方(它们将根据使用的autoconf版本而移动位置,很旧的版本将在脚本的前几行中的注释中重现“configure”命令行)。至于“they”,GNU autoconf 项目页面记录了主要的维护者和贡献者。 - geekosaur

7

我无法相信没有人提到config.log - 它会准确地给出你所需要的信息:

这个文件包含编译器在运行configure时产生的所有消息,以帮助调试如果configure出现错误。

它是由configure创建的,configure是由GNU Autoconf 2.69生成的。调用命令行为:

$ ./configure --prefix /usr/local/syslog-ng/ --enable-linux-caps --enable-spoof-source


3
如果您仍然有构建树,请运行./config.status --recheck,然后在重新运行configure之前快速按下CTRL-C,以便打印出它将运行的内容。

这很不错。例如,我得到了 ./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。这听起来很熟悉,绝对是我想要知道的。现在问题是,为什么 你认为 他们让它如此难以实现,并且在前面提到的任何文档中都没有提及? - Alex Gray
@alex gray:可能是因为没有预料到用户会真正使用它。我知道它的唯一原因是因为我看过重新构建配置规则时启动了它。 - Jack Kelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接