При работе с программными пакетами внешних поставщиков, особенно в корпоративное среде, часто возникает необходимость оперативно настраивать переменные окружения под определённую версию пакетов. Массу головной боли вызывают такие переменные как PATH, LD_LIBRARY_PATH, PYTHONPATH и другие. Скажем, у нас на фирме для сборки продукта (ядра MIPS) надо выставить пути для дюжины конкретных версий внешних пакетов. Для сборки другого ядра MIPS - другие версии и слегка другой набор пакетов. Чтобы упростить процесс настройки окружения, используется утилита module.
Установка на Ubuntu:
Есть статья про утилиту module на английском: "Environment Modules – A Great Tool for Clusters".
Установка на Ubuntu:
После установки пакета надо перелогиниться. В вашем шелле появится алиас или функция module. Для bash это выглядит так:$ sudo apt install environment-modules
$ 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
Как мы видим, Vivado и Modelsim находятся в пути PATH, и установлены переменные для SystemC. Ненужные модули нетрудно выгрузить, и загрузить другие:$ 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
Чтобы создать свой модуль, надо добавить файл описания модуля в каталог /etc/environment-modules/modules. Фактически это скрипт на языке Tcl. К примеру, вот скрипт для модуля systemc/2.3.1:$ 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
$ 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".

no subject
Date: 2019-01-06 04:02 (UTC)env A=Bи так далее, все это локально. А глобально у меня чистая система для чтениялентыдокументации в chromium-browser.no subject
Date: 2019-01-06 04:15 (UTC)no subject
Date: 2019-01-06 16:45 (UTC)Lmod поддерживает все функции Tmod, и добавляет много дополнительных вкусностей (http://www.admin-magazine.com/HPC/Articles/Lmod-Alternative-Environment-Modules). Для нас важным была поддержка многоуровневых иерархий (компилятор -> MPI -> дополнительные библиотеки) и директива "family". До того были частые случаи, когда пользователи загружали пару-тройку разных компиляторов и MPI библиотек одновременно, и получались дикие непредсказуемо работающие бинарники :)