yum install openssl-devel
yum install perl
yum install cpio
yum install expat-devel
yum install gettext-devel
接下来,如果你已经安装过Curl了,那么跳过这一步,没有的话,就装一下.
tar xzvf curl-7.18.0.tar.gz
cd curl-7.18.0
./configure --prefix=/usr/local/curl
make
make install
确定一下ld.so.conf文件里有/usr/local/lib,这个是为git-http-push准备的.
#插入下面的代码
/usr/local/lib
最好,我们下载Git并安装它
tar xzvf git-latest.tar.gz
cd git-{date}
autoconf
./configure --with-curl=/usr/local
make
make install
由于最终部署的生产环境是Centos,所以我需要在Centos中安装Erlang B13R04 ,第一次做这件事情破费周折,主要是对Erlang依赖的库不熟悉,总是编译不过;这里梳理一下安装过程中的细节:
Ncurses development libraries
OpenSSL development libraries (如果使用mysql必须安装)
安装了这些库之后,必须要重新执行configure命令,configure之后会有提示哪些依赖的库没有安装,可以根据你的需要放弃安装一些库;上面的操作可以使用下面的命令实现:
> wget http://www.erlang.org/download/otp_src_R13B04.tar.gz
> tar xfvz otp_src_R13B04.tar.gz
> cd otp_src_R13B04/
> ./configure --with-ssl
> sudo make install
注意,如果你遇到下面的错误:
{load_failed,
"Failed to load NIF library: '/usr/local/lib/erlang/lib/crypto-2.0/priv/lib/crypto.so: undefined symbol: enif_make_new_binary'"}}
那么极有可能是两个原因:
你安装了多版本的Erlang,R14A和R13B04冲突造成的,删除erlang相关的文件夹,重新安装即可
rebar是一个开源的erlang应用自动构建工具。basho的tuncer开发。它实际上是一个erlang脚本(escript)的工具,因此在不同平台间迁移起来比较方便。
Bash代码
git clone git://github.com/basho/rebar.git
Bash代码
cd rebar
make
把编译好的rebar放到系统目录中完成安装:
Bash代码
sudo cp rebar /usr/local/bin
查看rebar的版本检查一下安装:
Bash代码
$ rebar -V
也有现成的稳定rebar下载:
Bash代码
curl -o rebar http://cloud.github.com/downloads/basho/rebar/rebar
2. 使用
有段rebar作者的rebar使用介绍视频, fxxk墙浏览。
Bash代码 source $rebar_home/priv/shell-completion/bash/rebar
以后在命令行窗口中输入rebar命令连按两次tab键会自动列出可用的rebar子命令。当然也可以通过rebar -c 查看每个子命令的详细解释。
Rebar.config代码 {pre_hooks, [{clean, "./prepare_package_files.sh"},
{compile, "escript generate_headers"}]}.
escript generate_headers脚本。
录分别放置编译好的lib库共享文件(或可执行文件)和beam文件(和其他文件例如app文件),这两个目录由rebar自动生成并清理,不要把重要的代码放在
这两个目录下,虽然不会被rebar clean自动删掉,(不过编译好的beam文件都会删掉),但是也影响不好哈。
在这两个目录下。
骨架代码,rebar通过模板帮我们省下了这些重复工作,我们只管往里面填应用的逻辑代码就行了。
相应的,这些模板都有一个约定的控制变量,分别是srvid, fsmid和appid
下面做些实验看看
可以试试创建一个application:
Bash代码 $ rebar create template=simpleapp
Bash代码 $ rebar create template=simplefsm
Bash代码 $ rebar create template=simplesrv
然后在src查看这些自动生成的代码就能理解所谓的rebar 自动生成模板是怎么回事了。
类的缺省名字。
A) simplefsm.template模板
Simplefsm.template代码 {variables, [{fsmid, "myfsm"}]}.
{template, "simplefsm.erl", "src/`fsmid`.erl"}.
这说明fsm模板提供了一个fsmid的变量控制着fsm模块的生成,自定义一个:
Bash代码 rebar create template=simplefsm fsmid=cat
就在src下创建了一个fsm的cat模块
Simplemod.tempalte代码 {variables, [{modid, "mymod"}]}.
{template, "simplemod.erl", "src/`modid`.erl"}.
{template, "simplemod_tests.erl", "test/`modid`_tests.erl"}.
可以通过这个模板创建一个普通的erlang模块,同时它会自动生成该模块的单元测试代码:
该模板提供的控制变量是modid
Bash代码 rebar create template=simplemod modid=fish
C)basicnif.template模板
Basicnif.template代码 {variables, [{module, "mymodule"}]}.
{template, "basicnif.erl", "src/`module`.erl"}.
{template, "basicnif.c", "c_src/`module`.c"}.
这个模板是用来生成nif模块的,它提供了一个叫module的控制变量
试着生成一个叫dragon的nif模块看看:
Bash代码 rebar create template=basicnif module=dragon
nif的c代码和erl代码分别放在c_src和src目录下了。
Simpleapp.template代码 {variables, [{appid, "myapp"}]}.
{template, "simpleapp.app.src", "src/`appid`.app.src"}.
{template, "simpleapp_app.erl", "src/`appid`_app.erl"}.
{template, "simpleapp_sup.erl", "src/`appid`_sup.erl"}.
这说明simpleapp模板提供了一个叫appid的变量,
下面自定义一个叫anmial的应用:
Bash代码 rebar create template=simpleapp appid=anmial
Bash代码 rebar create-app appid=anmial
下面是以上例子创建了的文件:
Bash代码 find .
./c_src
./c_src/dragon.c
./src
./src/anmial_app.erl
./src/cat.erl
./src/anmial_sup.erl
./src/anmial.app.src
./src/fish.erl
./src/myfsm.erl
./src/dragon.erl
./test
./test/fish_tests.erl
用rebar自动编译一下:
Bash代码 rebar compile
自动编译好了,而且对linux,mac 等自动跨平台支持。所有这些编译都由rebar compile一个命令搞定了。
Bash代码 rebar compile -v
器指定相关链接参数
Bash代码 rebar create-app appid=animal
些参数,有编译的也有链接的。
Bash代码 gcc -std=c99 -fPIC -shared -o gdal_nifs.so gdal_nifs.c -I$ERL_HOME/usr/include -lgdal
Bash代码 gcc -std=c99 -fPIC -bundle -undefined suppress -flat_namespace -o gdal_nifs.so gdal_nifs.c -I$ERL_HOME/usr/include -lgdal
rebar已经考虑了跨平台编译链接的不同参数问题,我还需要定制以下两个参数:
1) 指定 c99 标准编译; -std=c99
2) 指定gdal动态库的链接: -lgdal
Rebar.config代码 {port_envs, [
{"CFLAGS", "$CFLAGS -std=c99"},
{"LDFLAGS", "$LDFLAGS -lgdal"}
]}.
以后就可以通过rebar compile跨各种平台编译了。
清理编译好的文件:
Bash代码 rebar clean
模板,模板格式自己看一下例子,简单的说就是模板变量的字符串替换,也没啥高深的。
要是觉得自己的模板不错也可以提交上去有可能会成为官方模板哦。
rebar有着erlang的并行处理能力,缺省情况下每个子命令有3个job worker并行处理,可以通过-j参数控制并行处理的worker数量。
Barh代码 rebar clean; rebar compile
Bash代码 rebar clean
rebar compile
静态分析,实际上最新的rebar已经不再有这个子命令了。
每个nif模块都有自己对应的so.在rebar.config.sample中找到这几行代码:
Rebar.config.sample代码 %% so_specs - useful for building multiple *.so files
%% from one or more object files
{so_specs, [{"priv/so_name.so", ["c_src/object_file_name.o"]}]}.