jww*_*jww 5 autoconf autotools unix-ar
我正在 OS X 上进行测试。我们有一个configure.ac和Makefile.am. 自动工具选择了错误AR,并ARFLAGS为平台。它发生在(和没有)AM_PROG_ARin Makefile.am:
$ egrep 'AR =|ARFLAGS =' Makefile
AMTAR = $${TAR-tar}
AR = ar
ac_ct_AR = ar
Run Code Online (Sandbox Code Playgroud)
Autoconf 应该使用 Apple 的libtool(不要与 Autotools' 混淆libtool)和libtool's 标志。Applelibtool正确处理胖库和交叉编译。它应该是这样的:
AR = /usr/bin/libtool
ARFLAGS = -static -o
Run Code Online (Sandbox Code Playgroud)
Apple 的Porting UNIX/Linux Applications to OS X没有讨论这个话题,我在 Autoconf 文档中也找不到它。Autoconf 文档也缺少一个AC_PROG_AR(或类似的)。请参阅Autoconf 手册中的5.2.1 特定程序检查。
我们如何告诉 Autoconf 使用 Apple 的平台构建工具,而不是 Linux 构建工具?
$ autoconf --version
autoconf (GNU Autoconf) 2.69
$ automake --version
automake (GNU automake) 1.15.1
Run Code Online (Sandbox Code Playgroud)
Autotools 选择了错误的
AR和ARFLAGS平台。AM_PROG_AR它发生在(和没有)Makefile.am: [...] Autoconf 应该使用 Apple 的libtool
我了解您希望 configure选择并使用 OS Xlibtool来创建档案,这样做会给您带来一些优势。POSIXar甚至可能不是适合您特定工作的工具,但我拒绝认为该/usr/bin/ar工具不适合该平台的说法。Apple 在 OS X 中提供了该工具,并且它按照广告中的方式工作,即使广告中的行为比您想要或需要的更受限制。
它应该是这样的:
Run Code Online (Sandbox Code Playgroud)AR = /usr/bin/libtool ARFLAGS = -static -o
或许。尽管 Maclibtool可以执行与 相同的功能ar,但它并不是直接替代品。这就是configure当您在命令行上指定这些变量时所抱怨的(但仅当您也有时AM_PROG_AR)。特别是,如果您检查该脚本,您可能会发现它使用如下命令configure来测试指定工具的行为:AR
$AR cru libconftest.a conftest.$ac_objext >&5
Run Code Online (Sandbox Code Playgroud)
它还将有一个由微软lib实用程序提供的界面的后备。这两者都与宏相关AM_PROG_AR。
请注意,测试对主要选项使用硬编码标志,而不是任何$ARFLAGS可能已指定的标志。它专门测试程序的命令行界面,Maclibtool不提供可识别的界面。
您有多种选择:
让构建系统继续使用,并为Mac提供模仿POSIX传统命令行界面的AM_PROG_AR包装脚本。针对 Mac 进行配置时,请将包装器脚本指定为变量 的值。libtoolarconfigureAR
./configure AR=my-mac-libtool-wrapper
Run Code Online (Sandbox Code Playgroud)如果构建系统不使用AM_PROG_AR,则默认情况下AR和ARFLAGS变量将毫无意义configure,但您可以直接指定它们make:
make AR=/usr/bin/libtool ARFLAGS="-static -o"
Run Code Online (Sandbox Code Playgroud)或者,如果构建系统不使用AM_PROG_AR,那么您可以添加自己的代码来处理configure和AR变量ARFLAGS。在不执行任何实际测试的情况下识别它们并将它们传递给 Makefile的最低限度configure可能是:
AC_ARG_VAR([AR], [Specifies the archiver to use])
AC_ARG_VAR([ARFLAGS], [Specifies the archiver flags to use])
Run Code Online (Sandbox Code Playgroud)