Wie kann ich einen modifizierten PATH für eine nicht interaktive POSIX-Shell ohne Login festlegen, die von Scons auf Cygwin aufgerufen wird?

362
Peter Du

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

Jetzt bin ich einem anderen Projekt beigetreten, bei dem es anscheinend üblich ist, den Pfad zum Compiler als Teil des Standardsystems PATH zu haben, und ich möchte das gerne umgehen, aber ich habe 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 Buildumgebung:

$ 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 setzt (im Grunde ist es nur eine lange Liste von "export PATH = ...", "export INCLUDE = ..." "," export LIB = ... "und" export LIBPATH = ... "). Ich kann dieses Skript aus einer beliebigen Startdatei beziehen und der Pfad wird in meiner interaktiven Bash-Sitzung festgelegt

$ 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. 

Unter der Decke 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. 

was kein Problem sein sollte, da ich es verstehe, wenn es als / bin / sh aufgerufen wird, und bash versucht, eine POSIX-Shell zu emulieren; wahrscheinlich das gewünschte Verhalten aus Sicht von Scons.

Die Schwierigkeit besteht darin, dass ich keinen Weg finden kann, die erforderlichen Umgebungsvariablen in die nicht-interaktive POSIX-Shell-Umgebung ohne Login zu bekommen. Kann mir jemand bitte sagen, wie es geht?

0

1 Antwort auf die Frage

0
Peter Du

Ich habe falsch gehandelt. Der einfache (aber hässliche) Weg besteht darin, die SConstruct-Datei so zu ändern, dass es einen Trigger gibt, der die Umgebung programmgesteuert ändert, bevor die Shell aufgerufen wird.

Als Beweis für das Konzept 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.