2019-01-05

vak: (Default)
Интервью с Северо Орнштейном (PDF), инженером, создавшим первый в мире роутер (IMP, Interface Message Processor) и компьютер Xerox Dorado. Именно демонстрация графического интерфейса Dorado вдохновила Стива Джобса на создание Макинтоша.

На видео Северо представляет первую интерактивную программу для музыкантов, Mockingbird.

vak: (Default)
При работе с программными пакетами внешних поставщиков, особенно в корпоративное среде, часто возникает необходимость оперативно настраивать переменные окружения под определённую версию пакетов. Массу головной боли вызывают такие переменные как 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".