vak: (Default)
[personal profile] vak
При работе с программными пакетами внешних поставщиков, особенно в корпоративное среде, часто возникает необходимость оперативно настраивать переменные окружения под определённую версию пакетов. Массу головной боли вызывают такие переменные как 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".
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org