ecFlow学习笔记01 —— 编译ecFlow
编译说明v3
本文内容已不适用于最新的ecFlow版本,可以参考perillaroc/ecflow-docker中的编译方法。
编译说明v2
在 Ubuntu 中安装 ecFlow 4.0.9,详细安装说明参见官方文档:
https://software.ecmwf.int/wiki/display/ECFLOW/Installation
依赖包
编译 ecFlow 需要的依赖软件:
- cmake
- g++
- python
- Xlib X11 XMotif
建立编译环境
ecFlow 需要两个安装包:
- ecFlow-4.0.9-Source.tar.gz
- boost_1_53_0.tar.gz
第一个从 ecFlow 的官网上下载,第二个可以从 boost 库的官方网站下载。
创建编译需要的目录
windroc@ubuntu:~/app/ecmwf/ecflow$ mkdir ecflow_build
拷贝上面两个压缩包到该目录,并解压
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build$ ls
boost_1_53_0.tar.gz ecFlow-4.0.9-Source.tar.gz
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build$ tar zxf ecFlow-4.0.9-Source.tar.gz
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build$ tar zxf boost_1_53_0.tar.gz
可以看到两个目录
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build$ ls
boost_1_53_0 boost_1_53_0.tar.gz ecFlow-4.0.9-Source ecFlow-4.0.9-Source.tar.gz
创建两个环境变量,某些脚本需要用到
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build$ export WK=/home/windroc/app/ecmwf/ecflow/ecflow_build/ecFlow-4.0.9-Source
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build$ export BOOST_ROOT=/home/windroc/app/ecmwf/ecflow/ecflow_build/boost_1_53_0
编译BOOST
Boost 使用 bjam 编译 boost 库。我们需要首先编译bjam
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build$ cd $BOOST_ROOT
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/boost_1_53_0$ ./bootstrap.sh
ecFlow 使用 boost 中一些需要编译的库。下面的脚本将编译这些需要的库,包括debug和release版本,并根据你的平台配置boost编译。
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/boost_1_53_0$ cd $BOOST_ROOT
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/boost_1_53_0$ $WK/build_scripts/boost_1_53_fix.sh
Nothing to fix
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/boost_1_53_0$ $WK/build_scripts/boost_build.sh
注:如果不需要ecflow的python接口,可以通过下面的设置避免编译boost的python库,在调用$WK/build_scripts/boost_build.sh前设置
export ECF_NO_PYTHON=1
编译
提供两种编译方式:
- boost-build/bjam
- cmake
推荐使用cmake编译,因为boost-build/bjam将被废弃。
使用CMake生成Makefile
目录切换到编译 ecflow 的临时目录,用户需要设置自己的选项运行 CMake。该命令反馈哪些需求已经满足,以及还需要哪些软件。下面的表格给出不同配置参数的概览。默认(不使用任何参数)将只编译共享库(share library),并安装到 /usr/local/ 。
<td>
说明
</td>
<td>
默认值
</td>
</tr>
<tr>
<td>
<p lang="en-US">
CMAKE_INSTALL_PREFIX
</p>
</td>
<td>
<span lang="zh-CN">安装</span><span lang="en-US">ecFlow</span><span lang="zh-CN">的位置</span>
</td>
<td>
<p lang="en-US">
/usr/local
</p>
</td>
</tr>
<tr>
<td>
<p lang="en-US">
CMAKE_BUILD_TYPE
</p>
</td>
<td>
选项:</p>
<p lang="en-US">
Debug
</p>
<p lang="en-US">
RelWithDebInfo
</p>
<p>
<span lang="en-US">Release </span><span lang="zh-CN">(使用最全面的编译优化选项)</span>
</p>
<p lang="en-US">
Production
</p>
</td>
<td>
<p lang="en-US">
Release
</p>
</td>
</tr>
<tr>
<td>
<p lang="en-US">
CMAKE_CXX_FLAGS
</p>
</td>
<td>
<span lang="zh-CN">为</span><span lang="en-US">C++</span><span lang="zh-CN">编译器设置更多编译标志</span>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p lang="en-US">
ENABLE_PYTHON
</p>
</td>
<td>
<span lang="zh-CN">使用</span><span lang="en-US"> python </span><span lang="zh-CN">接口</span>
</td>
<td>
<p lang="en-US">
on
</p>
</td>
</tr>
<tr>
<td>
<p lang="en-US">
ENABLE_GUI
</p>
</td>
<td>
<span lang="zh-CN">启用</span><span lang="en-US"> ecflowview </span><span lang="zh-CN">的编译</span>
</td>
<td>
<p lang="en-US">
on
</p>
</td>
</tr>
<tr>
<td>
<p lang="en-US">
ENABLE_ALL_TESTS
</p>
</td>
<td>
启用测试
</td>
<td>
<p lang="en-US">
off
</p>
</td>
</tr>
<tr>
<td>
<p lang="en-US">
BOOST_ROOT
</p>
</td>
<td>
<span lang="en-US">boost</span><span lang="zh-CN">库位置(如果使用非标准安装过程)</span><span lang="zh-CN">如果不设置,</span><span lang="en-US">cmake</span><span lang="zh-CN">会寻找同名的环境变量</span>
</td>
<td>
</td>
</tr>
CMake 会选择 C++ 编译器。(可以通过在执行 CMake 命令前设置 CXX 环境变量,执行特定的编译器)
使用 CMAKE_CXX_FLAGS 可以设定优化或调试用的编译标志。
编译过程:
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/ecFlow-4.0.9-Source$ cd $WK
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/ecFlow-4.0.9-Source$mkdir build; cd build;
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/ecFlow-4.0.9-Source/build$ cmake ..
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/ecFlow-4.0.9-Source/build$ CPUS=$(lscpu -p | grep -v '#' | wc -l)
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/ecFlow-4.0.9-Source/build$ echo $CPUS
4
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/ecFlow-4.0.9-Source/build$ make -j${CPUS}
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/ecFlow-4.0.9-Source/build$ make check
windroc@ubuntu:~/app/ecmwf/ecflow/ecflow_build/ecFlow-4.0.9-Source/build$ sudo make install
注意
为使用 ecFlow 的 Python 接口,需要添加或修改 PYTHONPATH 环境变量
export PYTHONPATH=$PYTHONPATH:/4.0.9/lib/python2.7/site-packages/ecflow
# If you used the default's then =/usr/local
# otherwise you should use whatever you entered for -DCMAKE_INSTALL_PREFIX, hence in the examples above we would have:
export PYTHONPATH=$PYTHONPATH:/usr/local/apps/ecflow/4.0.9/lib/python2.7/site-packages/ecflow
或者可以在 dist-package 中添加 .pth 文件,指向 Python 接口安装的目录
windroc@ubuntu:/usr/lib/python2.7/dist-packages$ sudo vim ecflow.pth
文本文件内容为
/usr/local/lib/python2.7/site-packages/ecflow
使用bjam编译
boost-build/bjam
略
ecflowview
ecflowview 默认的 server 和 ecflowview.menu 文件放在
<ECFLOW_INSTALL_DIR>/share/ecflow
目录。可以使用 ECFLOWVIEW_HOME 脚本变量覆盖设置
<ECFLOW_INSTALL_DIR>/share/ecflow/server 文件定义希望在 ecflowview 中看到的所有服务器列表,格式简单,为每个服务器添加下面一行:
<server_name> <machine_name>
ECFLOWRC 变量可以为用户的ecflowview选项文件设置使用另外的目录(默认是 $HOME/.ecflowrc)
ecflowview 也会读取 ECFLOWRC 中的配置文件,比如 servers 等
编译说明v1
以下是 ecFlow 4.0.7 的编译方法,写于 2015年4月16日
参照官方文档编译ecflow
https://software.ecmwf.int/wiki/display/ECFLOW/Installation
准备
下载 ecflow 源码和 boost 1.53.0 源码
编译
设置两个环境变量,分别表示 ecflow 源码路径和 Boost 源码路径。
export WK=/tmp/ecflow_build/ecflow_4_0_7
export BOOST_ROOT=/tmp/ecflow_build/boost_1_53_0
编译Boost
首先生成 Boost 编译需要的编译工具
cd $BOOST_ROOT
./bootstrap.sh
按照 ecflow 的需求编译 Boost 模块。
cd $BOOST_ROOT
$WK/build/boost_1_53_fix.sh # fix for boost, only for some platforms
$WK/build/boost_build.sh # compile boost libs used by ecFlow
修改
直接编译会提示错误信息
/usr/bin/ld: ../Client/liblibclient.a(ClientEnvironment.cpp.o): relocation R_X86_64_32S against `std::basic_string<char, std::char_traits, std::allocator >::_Rep::_S_empty_rep_storage' can not be used when making a shared object; recompile with -fPIC
../Client/liblibclient.a: could not read symbols: Bad value
需要加入 -fPIC 编译选项,修改 ecflow 源码根目录下的 CMakeLists.txt 文件,添加如下一行
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
编译
按照官方文档编译
cd $WK
./configure.sh /usr/local/apps/ecflow
make
make install