ツールチェインとかコンパイラの環境を変更するために、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
$ 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-path
はprepend_path
に置き換える。module-whatis
はwhatis
に置き換える。proc ModulesHelp
はhelp
に置き換えられる。- 環境変数の読み込みは
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