TravisCIでIntel MKLを利用したFortranプログラムをCIする

## はじめに
　Intel MKL[^mkl]を利用したFortranプログラムをTravisCI[^travis]で継続的インテグレーション(CI : continuous integration)する方法を述べる．本テストで用いたリポジトリは[toya42/test_travisci](https://github.com/toya42/test_travisci)である．
　
[^mkl]: Intel® Math Kernel Library, webサイト: https://software.intel.com/en-us/mkl , EULA: https://software.intel.com/en-us/articles/end-user-license-agreement

[^travis]: Travis CI - Test and Deploy Your Code with Confidence: https://travis-ci.org/ 

## 設定ファイル(.travis.yml)
　`.travis.yml`をそのまま示す．TravisCIを使い慣れている方ならこれで十分かもしれないが，注意が必要な箇所についてはあとで述べる．

```yml:.travis.yml
os:
   - linux

matrix:
   include: 
      - dist: xenial
      - dist: bionic
sudo: required
addons:
   apt:
      packages:
      - gfortran
install:
   - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
   - mkdir ${DEPS_DIR} 
   - cd ${DEPS_DIR}
   - travis_retry wget https://github.com/Kitware/CMake/releases/download/v3.15.3/cmake-3.15.3.tar.gz  
   - tar -xzvf cmake-3.15.3.tar.gz >log1
   - mv cmake-3.15.3 cmake_install
   - cd cmake_install
   - ./configure >log2
   - make >log3
   - sudo make install >log4
   - PATH=${DEPS_DIR}/cmake_install:${DEPS_DIR}/cmake_install/bin:$PATH
   - cd ${TRAVIS_BUILD_DIR}

before_script:
   - wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
   - sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
   - sudo wget https://apt.repos.intel.com/setup/intelproducts.list -O /etc/apt/sources.list.d/intelproducts.list 
   - sudo apt-get update
   - sudo apt-get install intel-mkl-2019.4-070 --allow-unauthenticated
   - source /opt/intel/mkl/bin/mklvars.sh intel64 lp64

script:
    - bash compile.sh
    - bash execute.sh
```

```bash:compile.sh
#!/bin/bash
mkdir build
cd build
cmake -D CMAKE_Fortran_COMPILER=gfortran -D CMAKE_BUILD_TYPE=debug ../
make
```
```bash:execute.sh
#!/bin/sh
ulimit -s unlimited
mkdir run
cd run
mkdir output
ln -s ../build/2dvorticity_psm.exe ./
./2dvorticity_psm.exe
```

## 利用の際に引っかかった事，注意する事

### OSのversion

使用言語`language`をFortranにすると`dist`で定義されたOSおよびバージョンにならない場合がある．例えば以下のような設定ファイルを書いても，ubuntu14.04で実行される．(bionicはubuntu18.04を意味する)

```yml
dist: bionic 
language: Fortran
#~~~~~~~~~~~~~~~~~~#
```
よって，`language`は記述せず，デフォルトのRubyのままで良い．また`sudo`を許可することも明記する．さらに，ubuntuの現行LTS2種をCIに用いたいので，`matrix`を使って次のように書く

```yml
os:
   - linux
matrix:
   include: 
      - dist: xenial
      - dist: bionic
sudo: required
```

### TravisCIでFortran

[TravisCIでFortranをCIする](https://qiita.com/kyusque/items/ea9eaa5fdfd39df53f9d)
より，**`apt-get`でコンパイラをインストールできるなら利用できる**．という訳で，`gfortran`が使える

```yml
addons:
   apt:
      packages:
      - gfortran
```

### CMake

デフォルトのCMakeは古い場合があるので，次のページに従って新しいバージョンを用いる
[Configure Travis CI with newest CMake](https://riptutorial.com/en/cmake/example/4723)
画面出力が多すぎてうるさかったので`log`ファイルに書き込ませている． 

```yml
install:
   - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
   - mkdir ${DEPS_DIR} 
   - cd ${DEPS_DIR}
   - travis_retry wget https://github.com/Kitware/CMake/releases/download/v3.15.3/cmake-3.15.3.tar.gz  
   - tar -xzvf cmake-3.15.3.tar.gz >log1
   - mv cmake-3.15.3 cmake_install
   - cd cmake_install
   - ./configure >log2
   - make >log3
   - sudo make install >log4
   - PATH=${DEPS_DIR}/cmake_install:${DEPS_DIR}/cmake_install/bin:$PATH
   - cd ${TRAVIS_BUILD_DIR}
```

### Intel MKL

[Intel MKLをAPTでインストールする](https://qiita.com/ymzkd/items/55a9c936df60394572fc)
より，コマンドライン(apt)でIntel MKLをインストールできる．注意する点は，下から二行目のオプション`--allow-unauthenticated`をつけること．

```yml
before_script:
   - wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
   - sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
   - sudo wget https://apt.repos.intel.com/setup/intelproducts.list -O /etc/apt/sources.list.d/intelproducts.list 
   - sudo apt-get update
   - sudo apt-get install intel-mkl-2019.4-070 --allow-unauthenticated
   - source /opt/intel/mkl/bin/mklvars.sh intel64 lp64
```

## 終わりに
　初めてGithubにリポジトリを作り，初めてTravisCIでCIをした．色々拙い点があると思う．間違っていることなどあれば，遠慮なくご指摘いただきたい