在 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.
我正在尝试在 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.