При работе с программными пакетами внешних поставщиков, особенно в корпоративное среде, часто возникает необходимость оперативно настраивать переменные окружения под определённую версию пакетов. Массу головной боли вызывают такие переменные как PATH, LD_LIBRARY_PATH, PYTHONPATH и другие. Скажем, у нас на фирме для сборки продукта (ядра MIPS) надо выставить пути для дюжины конкретных версий внешних пакетов. Для сборки другого ядра MIPS - другие версии и слегка другой набор пакетов. Чтобы упростить процесс настройки окружения, используется
утилита module.
Установка на Ubuntu:
$ sudo apt install environment-modules
После установки пакета надо перелогиниться. В вашем шелле появится алиас или функция module. Для bash это выглядит так:
$ declare -f module
module ()
{
_moduleraw "$*" 2>&1
}
Изначально при входе в систему список загруженных модулей пустой:
$ module list
No Modulefiles Currently Loaded.
Если он непустой, можно его очистить командой:
$ module purge
Краткий список доступных для загрузки модулей можно просмотреть командой:
$ module avail
-------------------- /etc/environment-modules/modules --------------------
ise/14.7 modelsim/17.0 quartus/16.1 systemc/2.2.0 vivado/2016.2
modelsim/16.0 modelsim/18.0 quartus/17.0 systemc/2.3.0 vivado/2017.2
modelsim/16.1 quartus/16.0 quartus/18.0 systemc/2.3.1 vivado/2018.2
--------------------- /usr/share/modules/modulefiles ---------------------
dot module-git module-info modules null use.own
Первая половина списка - модули, которые я создавал сам. Ниже покажу подробнее. Вторая половина - стандартные модули для специальных целей. Чуть более подробную информацию про модули можно получить командой:
$ module whatis
-------------------- /etc/environment-modules/modules --------------------
ise/14.7: Xilinx ISE, Version 14.7
modelsim/16.0: Altera Modelsim, Version 16.0
modelsim/16.1: Altera Modelsim, Version 16.1
modelsim/17.0: Altera Modelsim, Version 17.0
modelsim/18.0: Altera Modelsim, Version 18.0
quartus/16.0: Altera Quartus, Version 16.0
quartus/16.1: Altera Quartus, Version 16.1
quartus/17.0: Altera Quartus, Version 17.0
quartus/18.0: Altera Quartus, Version 18.0
systemc/2.2.0: SystemC, Version 2.2.0
systemc/2.3.0: SystemC, Version 2.3.0
systemc/2.3.1: SystemC, Version 2.3.1
vivado/2016.2: Xilinx Vivado, Version 2016.2
vivado/2017.2: Xilinx Vivado, Version 2017.2
vivado/2018.2: Xilinx Vivado, Version 2018.2
--------------------- /usr/share/modules/modulefiles ---------------------
dot: adds `.' to your PATH environment variable
module-git: get last version of the module sources from GitHub
module-info: returns all various module-info values
modules: loads the modules environment
null: does absolutely nothing
use.own: adds your own modulefiles directory to MODULEPATH
Для примера загрузим несколько модулей:
$ module load modelsim/18.0
$ module load vivado/2018.2
$ module load systemc/2.3.1
Проверим результат:
$ echo $PATH
/opt/Xilinx/Vivado/2018.2/bin:/opt/Altera/18.0/modelsim_ase/linuxaloem:/usr/local/bin:/usr/bin:/bin
$ echo $LD_LIBRARY_PATH
/opt/SystemC/systemc-2.3.1/lib-linux64
$ env | grep SYSTEMC
SYSTEMC=/opt/SystemC/systemc-2.3.1
SYSTEMC_INCLUDE=/opt/SystemC/systemc-2.3.1/include
SYSTEMC_LIBDIR=/opt/SystemC/systemc-2.3.1/lib-linux64
SYSTEMC_HOME=/opt/SystemC/systemc-2.3.1
Как мы видим, Vivado и Modelsim находятся в пути PATH, и установлены переменные для SystemC. Ненужные модули нетрудно выгрузить, и загрузить другие:
$ module unload vivado
$ module load ise/14.7
$ echo $PATH
/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64:/opt/Altera/18.0/modelsim_ase/linuxaloem:/usr/local/bin:/usr/bin:/bin
Чтобы создать свой модуль, надо добавить файл описания модуля в каталог /etc/environment-modules/modules. Фактически это скрипт на языке Tcl. К примеру, вот скрипт для модуля systemc/2.3.1:
$ cat /etc/environment-modules/modules/systemc/2.3.1
#%Module1.0
set version [file tail [module-info name]]
set prefix "/opt/SystemC/systemc-$version"
set whatis "SystemC, Version $version"
proc ModulesHelp { } {
global version prefix whatis
puts stderr "$whatis"
puts stderr "\n\tThis adds environment variables SYSTEMC"
puts stderr "\tand SYSTEMC_HOME as $prefix."
}
module-whatis "$whatis"
setenv SYSTEMC "$prefix"
setenv SYSTEMC_HOME "$prefix"
setenv SYSTEMC_INCLUDE "$prefix/include"
setenv SYSTEMC_LIBDIR "$prefix/lib-linux64"
prepend-path LD_LIBRARY_PATH "$prefix/lib-linux64"
conflict "systemc"
Описание скрипта модуля можно просмотреть командой "
man modulefile".
Есть статья про утилиту module на английском: "
Environment Modules – A Great Tool for Clusters".