Como posso definir um PATH modificado para um shell POSIX não-interativo não-login invocado pelo Scons no Cygwin?

0

Como trabalho em vários projetos separados (cada um deles usa um compilador diferente), não gosto de ter o caminho para nenhum compilador no meu PATH.

Agora, juntei-me a outro projeto em que parece que o costume é ter o caminho para o compilador como parte do PATH padrão do sistema, e gostaria de resolver isso, mas estou tendo dificuldades.

Eu trabalho no Windows 7 SP1, (64 bits) usando o Cygwin.

$ uname -srv
CYGWIN_NT-6.1 1.7.32(0.274/5/3) 2014-08-13 23:06

O novo projeto usa o Scons como o ambiente de criação:

$ scons --version
SCons by Steven Knight et al.:
    script: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
    engine: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
    engine path: ['/usr/lib/scons-2.3.4/SCons']
Copyright (c) 2001 - 2014 The SCons Foundation

Eu tenho um script que eu posso executar (antes de tentar construir o novo projeto) que irá definir todas as variáveis de ambiente necessárias apropriadamente (basicamente é apenas uma longa lista de "export PATH = ...", "export INCLUDE = ... "," export LIB = ... "e" export LIBPATH = ... "). Eu posso fonte este script de qualquer um dos arquivos de inicialização e, embora o caminho será definido na minha sessão de Bash interativo

$ which cl
/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/BIN/cl

quando tento

$ scons -u

recebo (eventualmente)

Compiling C++    ... Application/Infrastructure/DataManager/BitFieldDataItem/BitFieldDataItem.cpp
/bin/sh: cl: command not found
scons: *** [Build/DataManagerUnitTestWin32_Win32/Application/Infrastructure/DataManager/BitFieldDataItem/BitFieldDataItem.obj] Error 127
scons: building terminated because of errors.

Nas capas, / bin / sh é bash

$ /bin/sh --version
GNU bash, version 4.1.16(8)-release (x86_64-unknown-cygwin)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

que não deve ser um problema, porque eu o entendo quando invocado como / bin / sh bash tenta emular um shell POSIX; provavelmente o comportamento desejado do ponto de vista do Scons.

A dificuldade é que não consigo encontrar uma maneira de obter as variáveis de ambiente necessárias no ambiente de shell POSIX não interativo e não-login. Alguém pode me dizer como fazer isso?

    
por Peter Du 24.06.2016 / 00:09

1 resposta

0

Eu estava tomando a abordagem errada. A maneira fácil (mas feia) de fazer isso é modificar o arquivo SConstruct para que haja algum disparador que modificará o ambiente programaticamente antes de o Shell ser chamado.

Para uma prova de conceito, usei meu nome de usuário como o acionador:

import getpass

e mais tarde

    msvcEnv = MSVCCompiler.CreateEnvironment(baseEnv)
    if getpass.getuser() == 'peterd':
        msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft SDKs/Windows/v8.1A/bin/NETFX 4.5.1 Tools/')
        msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Windows Kits/8.1/bin/x86/')
        msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/Team Tools/Performance Tools/')
        msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/VCPackages/')
        msvcEnv.PrependENVPath('PATH', '/cygdrive/c/windows/Microsoft.NET/Framework/v4.0.30319/')
        msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/Tools/')
        msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/BIN/')
        msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/')
        msvcEnv.PrependENVPath('PATH', '/cygdrive/c/Program Files (x86)/MSBuild/12.0/bin/')
        # INCLUDE and LIBPATH are for the compiler; header files for the former, type libraries and .NET assemblies etc for the latter
        msvcEnv.PrependENVPath('INCLUDE', 'C:\Program Files (x86)\Windows Kits\8.1\include\winrt;C:\Program Files (x86)\Windows Kits\8.1\include\um;C:\Program Files (x86)\Windows Kits\8.1\include\shared;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include;')
        msvcEnv.PrependENVPath('LIBPATH', 'C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1\ExtensionSDKs\Microsoft.VCLibs\12.0\References\CommonConfiguration\neutral;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\lib;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib;C:\windows\Microsoft.NET\Framework\v4.0.30319;')
        # Apparently the linker still doesn't understand paths with spaces...
        msvcEnv.PrependENVPath('LIB', 'C:\PROGRA~2\WI3CF2~1\8.1\Lib\winv6.3\um\x86;C:\PROGRA~2\MICROS~2.0\VC\atlmfc\lib;C:\PROGRA~2\MICROS~2.0\VC\lib;')

Isso parece funcionar.

    
por 24.06.2016 / 02:21