Wie kann ich einen geänderten PATH für eine nicht interaktive POSIX-Shell ohne Anmeldung festlegen, die von Scons unter Cygwin aufgerufen wird?

Wie kann ich einen geänderten PATH für eine nicht interaktive POSIX-Shell ohne Anmeldung festlegen, die von Scons unter Cygwin aufgerufen wird?

Da ich an mehreren separaten Projekten arbeite (von denen jedes einen anderen Compiler verwendet), möchte ich nicht, dass in meinem PATH der Pfad zu einem bestimmten Compiler festgelegt ist.

Jetzt bin ich einem anderen Projekt beigetreten, bei dem es offenbar üblich ist, den Pfad zum Compiler als Teil des Standardsystempfads zu haben, und ich würde dies gerne umgehen, habe aber Schwierigkeiten.

Ich arbeite unter Windows 7 SP1 (64 Bit) mit Cygwin.

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

Das neue Projekt verwendet Scons als Build-Umgebung:

$ 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

Ich habe ein Skript, das ich ausführen kann (bevor ich versuche, das neue Projekt zu erstellen), das alle erforderlichen Umgebungsvariablen entsprechend einstellt (im Grunde ist es nur eine lange Liste von „export PATH=...“, „export INCLUDE=...“, „export LIB=...“ und „export LIBPATH=...“). Ich kann dieses Skript aus jeder der Startdateien beziehen, und obwohl der Pfad in meiner interaktiven Bash-Sitzung festgelegt wird

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

wenn ich es versuche

$ scons -u

Ich bekomme (irgendwann)

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.

Im Hintergrund ist /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.

das sollte kein Problem sein, da Bash, so wie ich es verstehe, beim Aufruf als /bin/sh versucht, eine POSIX-Shell zu emulieren; aus Sicht von Scons wahrscheinlich das gewünschte Verhalten.

Das Problem besteht darin, dass ich keinen Weg finde, die erforderlichen Umgebungsvariablen in die nicht interaktive POSIX-Shell-Umgebung ohne Anmeldung zu bekommen. Kann mir bitte jemand sagen, wie das geht?

Antwort1

Ich habe den falschen Ansatz gewählt. Der einfache (aber hässliche) Weg, dies zu tun, besteht darin, die SConstruct-Datei so zu ändern, dass es einen Trigger gibt, der die Umgebung programmgesteuert ändert, bevor die Shell aufgerufen wird.

Als Proof of Concept habe ich meinen Benutzernamen als Auslöser verwendet:

import getpass

und später

    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;')

Das scheint zu funktionieren.

verwandte Informationen