![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
При работе с программными пакетами внешних поставщиков, особенно в корпоративное среде, часто возникает необходимость оперативно настраивать переменные окружения под определённую версию пакетов. Массу головной боли вызывают такие переменные как 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
Описание скрипта модуля можно просмотреть командой "man modulefile".$ 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"
Есть статья про утилиту module на английском: "Environment Modules – A Great Tool for Clusters".