FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Environmental-Modulesを止めてLmodに移行した

ツールチェインとかコンパイラの環境を変更するために、Environmental-Modulesというツールを使用している。

Environmental-Modulesは、使用するツールチェインに応じてPATHや環境変数を変えるためのツールだ。 ソフトウェア界隈ではあまり知られていないと思う。ハードウェア界隈でも知られていないと思うけど。 GCCのバージョンを変えたり、ツールを切り替えるのに便利なので重宝している。

しかし、Modulesは設定ファイルをtclで記述しなければならないなど、若干古臭いと思う(ここ最近でもバージョンアップを繰り返しているのでそうではないだろうが)。 一方でLmodはLuaを使って記述することができる(Lua自体はメジャーでは無いと思うが、tclよりかはマシか)。

Lmod: A New Environment Module System — Lmod 7.0 documentation

という訳で、Lmodを導入してみる。使用したのはUbuntu 18.04 LTSだ。

まずはLuaを導入する。

$ sudo apt install liblua5.1-0-dev lua5.1

次に、lua-posixを導入する。Ubuntu 18.04 LTSにはlua-posixのパッケージが存在しない?ので、ソースをダウンロードしてインストールした。

$ cd /tmp
$ curl -L https://github.com/luaposix/luaposix/archive/v34.0.4.tar.gz | tar xz
$ cd luaposix-34.0.4/
$ sudo apt install luarocks
$ sudo luarocks install luaposix-34.0.4-1.rockspec

次に、Lmodを導入する。こちらもソースをダウンロードしてインストールする。

$ cd /tmp
$ curl -L https://github.com/TACC/Lmod/archive/7.8.8.tar.gz | tar xz
$ cd Lmod-7.8.8/
$ ./configure
$ sudo make install

最後に、Bash用の設定をシンボリックリンクしておく。

$ sudo ln -s /usr/local/lmod/lmod/init/profile        /etc/profile.d/z00_lmod.sh

インストールできたか確認する。以下のコマンドをたたいて、moduleが有効かどうか確認しよう。

$ type module
module is a function
module ()
{
    eval $($LMOD_CMD bash "$@") && eval $(${LMOD_SETTARG_CMD:-:} -s sh)
}

Environmental-ModulesからLmodの設定移行

ModulesとLmodのコマンド系列は全く同じだ。 見た感じだと、Environmental-Modulesの設定ファイル(tclで書いてある)もLmodで食わせることができる様だ。

しかし、せっかくなのでLuaで設定を書き直したい。

どのようにして変更するのか調査した。

  • Environmental-Modulesの設定ファイル (riscv64)
#%Module1.0
##
proc ModulesHelp { } {
    puts stderr "RISC-V 64-bit Toolchain\n"
}

module-whatis   "RISC-V 64-bit Toolchain"

# append pathes
setenv       RISCV           $::env(HOME)/riscv64/
prepend-path PATH            $::env(HOME)/riscv64/bin
prepend-path LD_LIBRARY_PATH $::env(HOME)/riscv64/lib
  • Lmodの設定ファイル(riscv64.lua)
help([[
The TACC modulefile defines ...
]])

whatis("Keywords: System, Utility")
whatis("URL: https://github.com/riscv/riscv-tools")
whatis("Description: RISC-V Environment for BOOMv2")

setenv(       "RISCV"          , os.getenv("HOME").."/riscv64/"   )
prepend_path( "PATH"           , os.getenv("HOME").."/riscv64/bin")
prepend_path( "LD_LIBRARY_PATH", os.getenv("HOME").."/riscv64/lib")
  • setenvはそのまま書き換えられる。
  • prepend-pathprepend_pathに置き換える。
  • module-whatiswhatisに置き換える。
  • proc ModulesHelphelpに置き換えられる。
  • 環境変数の読み込みはos.getenv()で実行できる。

という訳で移植完了である。 快適、というか、使い心地は変わらないけれども。。。

$ module avail riscv

----------------------------- /home/msyksphinz/modules ------------------------------
   riscv/riscv32           riscv/riscv64_latest    riscv/riscv64 (L,D)
   riscv/riscv64_boomv2    riscv/riscv64_linux
   riscv/riscv64_fpga      riscv/riscv64_local

  Where:
   L:  Module is loaded
   D:  Default Module

Use "module spider" to find all possible modules.
Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys".

$ module load riscv/riscv64

The following have been reloaded with a version change:
  1) riscv/riscv64_fpga => riscv/riscv64
f:id:msyksphinz:20181103180608p:plain