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&lt;char, std::char_traits, std::allocator &gt;::_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