Erlang/OTP 无法在 Solaris 11 11/11 上编译

Posted

技术标签:

【中文标题】Erlang/OTP 无法在 Solaris 11 11/11 上编译【英文标题】:Erlang/OTP fails to compile on Solaris 11 11/11 【发布时间】:2012-03-06 18:29:00 【问题描述】:

从 Solaris 11 Express 升级到 Solaris 11 (11/11) 后,我不再能够编译 Erlang/OTP(为了构建 couchdb),与在 VirtualBox 中全新安装 Solaris 11 64 位相同。

./configure 之后,gmake 因一些汇编程序问题而失败。我尝试了 Erlang OTP R14B03、R14B04 和 R15B,但没有成功。

gcc -g -O2 -I/home/admin/Workarea/otp_src_R14B03/erts/i386-pc-solaris2.11 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fno-tree-copyrename -DERTS_SMP -DHAVE_CONFIG_H -Wall -Wstrict-prototypes -Wmissing-prototypes -Wdeclaration-after-statement -DUSE_THREADS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS -D_POSIX_PTHREAD_SEMANTICS -Ii386-pc-solaris2.11/opt/smp -Ibeam -Isys/unix -Isys/common -Ii386-pc-solaris2.11 -Izlib -Ipcre -Ihipe -I../include -I../include/i386-pc-solaris2.11 -I../include/internal -I../include/internal/i386-pc-solaris2.11 -c hipe/hipe_x86_glue.S -o obj/i386-pc-solaris2.11/opt/smp/hipe_x86_glue.o 汇编器: “/var/tmp//ccH5a4cn.s”,第 1 行:语法错误 近线:“.section”.text“” gmake[3]: * [obj/i386-pc-solaris2.11/opt/smp/hipe_x86_glue.o] 错误 1 gmake[3]: 离开目录`/home/admin/Workarea/otp/erts/emulator'

有什么想法吗?也许我需要禁用./configure 中的某些功能,或者我缺少所需的包?我尝试使用 Oracle 提供的 gcc-45 和 OpenCSW 提供的 gcc 4.6.2 进行编译。

【问题讨论】:

我尝试了 ./configure --enable-m32-build 导致不同的错误:hipe/hipe_process.h:72:12: error: 'ERTS_ALC_T_HIPE' undeclared (first use in this function) Erlang 安装在所有 Solaris 版本/平台上都很麻烦。我建议,你应该试试 Erlang 邮件列表来解决这个问题。 【参考方案1】:

使 OTP R14B04 编译。首先,您需要删除一些导致构建失败的东西(另请参阅:http://www.dev-eth0.de/couchdb-on-opensolaris-part-1-erlang/)。

vim erts/emulator/drivers/common/inet_drv.c

搜索SIOCGIFHWADDR 并删除#ifdef SIOCGIFHWADDR#elif defined(SIOCGENADDR) 之间的所有内容:

之前 (erts/emulator/drivers/common/inet_drv.c):

...
#ifdef SIOCGIFHWADDR
    if (ioctl(desc->s, SIOCGIFHWADDR, (char *)&ifreq) < 0)
        break;
    buf_check(sptr, s_end, 1+2+IFHWADDRLEN);
    *sptr++ = INET_IFOPT_HWADDR;
    put_int16(IFHWADDRLEN, sptr); sptr += 2;
    /* raw memcpy (fix include autoconf later) */
    sys_memcpy(sptr, (char*)(&ifreq.ifr_hwaddr.sa_data), IFHWADDRLEN);
    sptr += IFHWADDRLEN;
#elif defined(SIOCGENADDR)
...

之后(erts/emulator/drivers/common/inet_drv.c):

...
#ifdef SIOCGIFHWADDR
#elif defined(SIOCGENADDR)
...

然后运行:

./configure --enable-m32-build --disable-hipe
gmake
sudo gmake install

警告:我正在尝试在 Solaris 11 上构建 couchdb,当从浏览器中的测试套件 (basics.js) 中的构建运行第一个测试时,couchdb 崩溃.不知道到底是什么原因,可能是erlang?将调查...

【讨论】:

以上是关于Erlang/OTP 无法在 Solaris 11 11/11 上编译的主要内容,如果未能解决你的问题,请参考以下文章

您如何设计基于 Erlang/OTP 的分布式容错多核系统的架构?

如何在 Erlang/OTP 中将主管的孩子 pid 共享给另一个孩子

Erlang/OTP 消息可靠吗?消息可以复制吗?

如何安装特定版本的 Erlang/OTP?

运行守护程序的 Erlang/OTP 应用程序的行业标准?

何时在 Erlang/OTP 应用程序中使用 gen_server