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 的分布式容错多核系统的架构?