Restrições de / etc / profile no Gnome

2

Eu tenho um problema que me incomoda há muito tempo. Eu estou usando o compilador Intel C ++ que inclui scripts de shell para configurar variáveis de ambiente para caminhos de biblioteca, incluir caminhos e muito mais. Sourcing estes scripts em .bashrc funcionam como um encanto para o terminal. Infelizmente, também preciso das variáveis de ambiente em Mathematica e NetBeans C ++ , o que me leva à questão de como obter os scripts da Intel para que eles sejam conhecidos pelos programas GUI Eu começo.

Eu procurei na internet com cuidado e acho que rastreei o problema, embora não tenha uma explicação. Uma maneira de configurar variáveis de ambiente para o Gnome parece ser a criação de um script *.sh em /etc/profile.d/ , que é então executado por /etc/profile .

Embora, com relação a esta informação , o /etc/profile não seja recomendado, observe que eu tenho um script de shell que precisa ser originado e não apenas algumas configurações de export VAR=blub .

Se eu fizer isso com o mklvars.sh script, parece que não o arquivo completo é originado. Deixe-me dar um recorte do arquivo para mostrar o que quero dizer

#! /bin/sh
#
# Copyright (C) 
# ...lot of boring stuff

CPRO_PATH=/opt/intel/composer_xe_2013_sp1.0.080
export MKLROOT=${CPRO_PATH}/mkl

SCRIPT_NAME=$0
MOD_NAME=mod

# .... some more code here ...

if [ -z "${MKL_TARGET_ARCH}" ] ; then

    echo
    echo "ERROR: architecture is not defined. Accepted values: ia32, intel64, mic"
    mkl_help

    else

    if [ -n "${LD_LIBRARY_PATH}" ] ; then OLD_LD_LIBRARY_PATH=":${LD_LIBRARY_PATH}"; fi
    export LD_LIBRARY_PATH="${CPRO_PATH}/compiler/lib/${MKL_TARGET_ARCH}: #.....

Quando faço logout / login novamente, a variável MKLROOT é definida, mas LD_LIBRARY_PATH não foi ajustado. Parece algo que é um pouco mais complexo do que um simples export VAR é ignorado ao obter o .profile .

Pergunta: Existe uma maneira conveniente de obter os scripts da variável do compilador para uma X-Session (no meu caso, o Gnome)? Alguém sabe o que está errado aqui?

O truque óbvio em torno deste problema é usar as definições de variáveis finais depois de obter os scripts manualmente e colocá-los no global profile . Isso tem a desvantagem de fazer isso repetidamente a cada nova atualização do compilador.

Passo a passo

Deixe-me dar uma demonstração passo-a-passo para você ver que não sou completamente maluco. Para isso eu coloquei o Script de Biblioteca de Kernel Matemático no pastebin e começo com a seguinte situação:

  • Eu não criei o script em nenhum bashrc , profile ou outro arquivo.
  • Eu fiz o logout e fiz o login novamente

Para o teste, analisamos os $MKLROOT e $LD_LIBRARY_PATH , que devem ser alterados pelo script. Atualmente, eles não são definidos quando eu verifico seus valores por

echo $LD_LIBRARY_PATH
echo $MKLROOT

Quando obtenho o arquivo manualmente, recebo:

source /opt/intel/composer_xe_2013_sp1.0.080/mkl/bin/mklvars.sh intel64
echo $MKLROOT
echo $LD_LIBRARY_PATH

# Output:
# /opt/intel/composer_xe_2013_sp1.0.080/mkl
# opt/intel/composer_xe_2013_sp1.0.080/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.0.080/mkl/lib/intel64

Quando coloco a linha source no meu ~/.bashrc e abro um novo terminal, as duas variáveis são definidas corretamente, como mostrado acima. Agora, eu removo a linha source de ~/.bashrc e coloco em /etc/profile.d/intelCC.sh , salve e faça logoff / on.

Após o login, nenhuma das variáveis está definida, mas eu tenho uma mensagem de erro no meu ~/.xsession-errors dizendo:

/usr/sbin/lightdm-session: 1: /etc/profile.d/intelCC.sh: source: not found

Agora substituo source por um simples . , de modo que /etc/profile.d/intelCC.sh contenha agora

. /opt/intel/composer_xe_2013_sp1.0.080/mkl/bin/mklvars.sh intel64

O mesmo novamente: Salve, faça logoff e faça logon. Agora parece não haver erros em .xsession-errors relacionados a isso e, finalmente:

echo $MKLROOT
# /opt/intel/composer_xe_2013_sp1.0.080/mkl

echo $LD_LIBRARY_PATH
# empty
    
por halirutan 29.10.2013 / 13:41

1 resposta

1

Confirme que MKL_TARGET_ARCH está definido

Quando você adiciona isso às probabilidades do diretório /etc/profile.d , a variável $MKL_TARGET_ARCH não está definida ou ainda não foi definida, portanto, todo o bloco if/else é essencialmente ignorado.

Você pode testar essa teoria definindo temporariamente a $MKL_TARGET_ARCH logo acima da instrução if/else e tente fazer login novamente para ver se funcionou.

MKL_TARGET_ARCH="..something.."
if [ -z "${MKL_TARGET_ARCH}" ] ; then

Instalando compiladores Intel

Eu não possuo este compilador, então não posso dar detalhes exatos, mas lidei com a instalação de aplicativos de engenharia por 15 anos, então estou familiarizado com o domínio.

Em qualquer caso, quando você instala esses tipos de ferramentas, geralmente é necessário criar seu próprio arquivo de ambiente ou um é fornecido. Eu encontrei este post sobre o compilador Fortran da Intel, mas eu ficaria surpreso se os produtos fossem diferentes.

Se você observar essa postagem, verá uma etapa após a instalação ( install.sh ), em que um arquivo é copiado para /etc/profile.d . Este arquivo contém a configuração do ambiente que precisa ocorrer.

cp /opt/intel/Compiler/11.1/056/bin/ia32/iccvars_ia32.sh /etc/profile.d/

Seria minha suspeita que uma etapa semelhante a isso também precisasse ocorrer para este produto. Verifique novamente se sua instalação foi feita usando etapas específicas da distribuição nesta página:

Solução Eventual

if . works but source doesn't then you might be dealing with Bourne shell and not Bash. Bash supports both whereas Bourne shell (/bin/sh) does not.

Se você tiver um olhar neste documento então você vê que isso parece ser exatamente onde reside o problema.

Ubuntu 12.0x changed the link for /bin/sh from /bin/bash to /bin/dash. Intel installation scripts for 13.0.0.079 reference /bin/sh BUT assume/require this is bourne or bash (sh or bash) but are NOT compatible with dash.

    
por 29.10.2013 / 15:46