¿Cómo puedo configurar una RUTA modificada para un shell POSIX no interactivo y sin inicio de sesión invocado por Scons en Cygwin?

¿Cómo puedo configurar una RUTA modificada para un shell POSIX no interactivo y sin inicio de sesión invocado por Scons en Cygwin?

Debido a que trabajo en varios proyectos separados (cada uno de los cuales usa un compilador diferente), no me gusta tener la ruta a ningún compilador establecido en mi RUTA.

Ahora me he unido a otro proyecto donde parece que la costumbre es tener la ruta al compilador como parte de la RUTA predeterminada del sistema, y ​​me gustaría solucionar este problema, pero tengo dificultades.

Trabajo en Windows 7 SP1 (64 bits) usando Cygwin.

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

El nuevo proyecto utiliza Scons como entorno de construcción:

$ 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

Tengo un script que puedo ejecutar (antes de intentar construir el nuevo proyecto) que configurará adecuadamente todas las variables de entorno requeridas (básicamente es solo una larga lista de "exportar PATH=...", "exportar INCLUDE=... ", "exportar LIB=..." y "exportar LIBPATH=..."). Puedo obtener este script desde cualquiera de los archivos de inicio y, aunque la ruta se establecerá en mi sesión interactiva de Bash

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

cuando lo intento

$ scons -u

consigo (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.

Debajo de las sábanas, /bin/sh es 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.

lo cual no debería ser un problema porque, según tengo entendido, cuando se invoca como /bin/sh bash intenta emular un shell POSIX; Probablemente el comportamiento deseado desde el punto de vista de Scons.

La dificultad es que no puedo encontrar una manera de obtener las variables de entorno requeridas en el entorno de shell POSIX no interactivo y sin inicio de sesión. ¿Alguien puede decirme cómo hacerlo?

Respuesta1

Estaba adoptando el enfoque equivocado. La manera fácil (pero fea) de hacer esto es modificar el archivo SConstruct para que haya algún disparador que modifique el entorno mediante programación antes de invocar el Shell.

Para una prueba de concepto, utilicé mi nombre de usuario como activador:

import getpass

y más 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;')

Esto parece funcionar.

información relacionada