在 AIX 7.1 上从源代码编译 Ruby

Compile Ruby from source on AIX 7.1

我正在尝试在 AIX 7.1 上使用 gcc 编译器从源代码编译 Ruby 2.4.5。配置工作正常,但 make 失败并给出错误 C is not a recognized flag。有人遇到同样的问题并设法在 AIX 7.1 上编译 ruby 吗?

Steps followed:

1) ./configure --disable-install-doc CC="gcc" CFLAGS="-maix64 -mminimal-toc" CXX="g++" CXXFLAGS="-maix64 -mminimal-toc" NM="nm -X64" AR="ar -X64" LDFLAGS="-maix64" EXTLDFLAGS=" -- works perfectly fine

2) make - fails with the below error

    make: Not a recognized flag: C
    usage: make [-einqrst] [-k|-S] [-d[A|adg[1|2]mstv]] [-D variable] [-f makefile] [-j [jobs]] [variable=value ...] [target ...]
    make: 1254-004 The error code from the last command is 2.
    Stop.
    make: 1254-004 The error code from the last command is 2.
    Stop.
    make: 1254-004 The error code from the last command is 2.

更新:

切换到 GNU make 出现以下错误:

Making all in man
make[5]: Entering directory '/test/ruby-2.4.5/tst/ext/fiddle/libffi-3.2.1/man'
make[5]: Nothing to be done for 'all'.
make[5]: Leaving directory '/test/ruby-2.4.5/tst/ext/fiddle/libffi-3.2.1/man'
make[5]: Entering directory '/test/ruby-2.4.5/tst/ext/fiddle/libffi-3.2.1'
  CC       src/prep_cif.lo
  CC       src/types.lo
  CC       src/raw_api.lo
  CC       src/java_raw_api.lo
  CC       src/closures.lo
  CC       src/powerpc/ffi_darwin.lo
../../../../ext/fiddle/libffi-3.2.1/src/powerpc/ffi_darwin.c: In function 'ffi_p                                                                                                                                                             rep_args':
../../../../ext/fiddle/libffi-3.2.1/src/powerpc/ffi_darwin.c:112:17: warning: un                                                                                                                                                             used variable 'abi' [-Wunused-variable]
   const ffi_abi abi = ecif->cif->abi;
                 ^
  CPPAS    src/powerpc/aix.lo
libtool: compile: unable to infer tagged configuration
libtool: compile: specify a tag with `--tag'
Makefile:1335: recipe for target 'src/powerpc/aix.lo' failed
make[5]: *** [src/powerpc/aix.lo] Error 1
make[5]: Leaving directory '/test/ruby-2.4.5/tst/ext/fiddle/libffi-3.2.1'
Makefile:1596: recipe for target 'all-recursive' failed
make[4]: *** [all-recursive] Error 1
make[4]: Leaving directory '/test/ruby-2.4.5/tst/ext/fiddle/libffi-3.2.1'
Makefile:730: recipe for target 'all' failed
make[3]: *** [all] Error 2
make[3]: Leaving directory '/test/ruby-2.4.5/tst/ext/fiddle/libffi-3.2.1'
Makefile:370: recipe for target 'libffi-3.2.1/.libs/libffi_convenience.a' failed
make[2]: *** [libffi-3.2.1/.libs/libffi_convenience.a] Error 2
make[2]: Leaving directory '/test/ruby-2.4.5/tst/ext/fiddle'
exts.mk:212: recipe for target 'ext/fiddle/all' failed
make[1]: *** [ext/fiddle/all] Error 2
make[1]: Leaving directory '/test/ruby-2.4.5/tst'
uncommon.mk:220: recipe for target 'build-ext' failed
make: *** [build-ext] Error 2

问题是您使用的是 AIX 的内置 make 副本,它不支持命令行选项 -C。该选项在 GNU make.

中可用

如果您 运行 make -v 没有看到如下输出,那么您没有使用 GNU make:

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.

运行 命令 which make 它将 return /usr/bin/make/opt/freeware/bin/make (或 /usr/bin 之外的类似路径) :

  • 如果它 returns /usr/bin/make 那么你的系统上没有安装 GNU make,需要按照 one of several 教程来安装它AIX.

  • 如果它 returns /opt/freeware/bin/make 那么你确实安装了 GNU make,但它没有反映在 $PATH 中。您可以在编译 Ruby 时通过 运行 宁 export PATH=/opt/freeware/bin:$PATH 在 运行 make 命令之前将其临时添加到您的路径中。

更新:

我鼓励您针对当前的构建问题提出一个单独的问题,因为最初的问题是关于 make-C 标志在 AIX 上不工作,现在您有一个单独的问题关于 运行ning GNU make 的问题具有一组完全不同的问题和可能的解决方案。

就是说,您可能可以通过重新开始并 运行 宁 ./configure LIBTOOL='/usr/bin/libtool --tag=CC'(或您通往 libtool 的任何路径)来解决您的问题。这是基于以下消息:

libtool: compile: unable to infer tagged configuration
libtool: compile: specify a tag with `--tag'

如果这不起作用,那么您可能必须通过查找 libtool 的那些特定调用来编辑 Makefile,然后将 --tag=CC 逐一附加到它们,直到你能够超越这些错误。

两种解决方案都假设唯一被编译的代码是 C。据我所知,MRI 中需要编译的所有内容都是用 C 编写的,但是如果任何东西都是用 C++ 编写的,那么 libtool 调用需要 --tag=CXX。您可以阅读有关标签的更多信息 here.