Erlang-China

erlang 中文社区

cean的另类改造及erlang的手动安装


今天试了试 ESDL (相当于 Erlang 的 OpenGL port?) 出现了诡异的 beam_load.c 错误:

=ERROR REPORT==== 17-May-2007::11:43:31 ===
beam/beam_load.c(1097): Error loading module erlyweb:
  use of opcode 125; this emulator supports only up to 115

没见过吧。我也没见过。不过,通过万能的 google 可以知道,这个错误的原因是 erlang beam 的版本不一致导致的。用 r11b 编译的 beam 用在 r10b 上,就会无一例外的报告这个错误。

似乎除了从新下载一个 37.6M 的 r11b 之外,似乎别无他法?

我忽然想起,cean早已升级到 r11b 了。它也在我的机器上躺着呢。何不利用之?于是开始捣鼓。

在 windows 下,使用 cean 的标准方式是 cean_base 下的 start.bat 。这其实就是一个简单的批处理:

@echo off
set ERL_MAX_PORTS=32000
set CEAN_SERVER=http://cean.process-one.net
rem set HTTP_PROXY=your.proxy.host:port

cd erlang\erts-5.5.4\windows\bin
start werl.exe

这个 bat 有两个主要功能:
1,设置 CEAN_SERVER=http://cean.erlang-china.org
2,启动 erl shell
*注,至于 set erl_max_ports=32000 这里不用关心

这个启动方式的有一个让人抓狂的问题,那就是——他使用了当前路径。如果你用过 windows 下超级好用的 cmd here 的话,你就知道我在说什么了。右键就能打开一个cmd窗口,然后从 path 中运行 erl ,比如,erl -make 或者 erl -run yaws 这是很爽的事情。而 start.bat 的实现方式显然让我丧失了这种乐趣。

怎么办?研究一下 erlang r10b 的 bin 目录,能够发现一个 erl.ini 文件,它是干什么的呢?

[erlang]
Bindir=C:\\app\\etc\\erlang\\R10b_10\\erts-5.4.13\\bin
Progname=erl
Rootdir=C:\\app\\etc\\erlang\\R10b_10

很眼熟,不是么?多象 java 的 properties 文件!隐隐的觉得了点什么,不是么?再看看 cean 的 erl.ini

[erlang]
Bindir=.
Progname=erl
Rootdir=../../..

bingo! 他就是用来设置 erlang 路径的。cean/start.bat之所以要改变当前路径,就是因为在 erl.ini 文件中配置的路径是相对路径。我们来改进之,通过 cean 构建一个可通过 path 来启动的 erlangshell 。

首先,在 cean/bin 目录建立一个 erl.ini 依样画葫芦,写成这样:

[erlang]
Bindir=C:\\app\\etc\\erlang\\cean\\erlang\\erts-5.5.4\\windows\\bin
Progname=erl
Rootdir=C:\\app\\etc\\erlang\\cean\\erlang

然后再把 cean/erlang/erts-5.5.4/windows/bin 下的 erl.exe werl.exe erlc.exe 拷贝到 cean/bin 目录下。(注意,cean/erlang/erts-5.5.4/windows/bin 下的 erl.ini 可以不改,这样,通过 start.bat 启动的 cean 就不受影响)

ok,大功告成。在把 PATH 中加上 %ERL_HOME%\bin ,就可以在任何目录启动 erlang shell 了。

enjoy!

等等! cean_server 呢?别忘了哦。是。你可以照旧用你的 start.bat ,或者象这样启动 erl ,那就可以完全一样的继续享受 cean 的 online update 了。

C:\home\erlq>erl -CEAN_SERVER http://cean.erlang-china.org
Eshell V5.5.4  (abort with ^G)
1> cean:installed().
["cean",
 "compiler",
 "crypto",
 "erlife",
 "esdl",
 "hipe",
 "inets",
 "kernel",
 "stdlib",
 "tools",
 "yaws"]
2> cean:install(erl_img).
+ erl_img md5=<<178,196,48,48,19,31,40,221,65,65,138,16,7,252,155,152>>
ok
3>

enjoy, again!

btw. ESDL 仍然没有测试通过,它提示 Driver Failed {error,driver_incorrect_version} 我晕。







Write a Comment

Note: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>