Cygwin에서 Scons가 호출한 비대화형 비로그인 POSIX 쉘에 대해 수정된 PATH를 어떻게 설정할 수 있습니까?

Cygwin에서 Scons가 호출한 비대화형 비로그인 POSIX 쉘에 대해 수정된 PATH를 어떻게 설정할 수 있습니까?

나는 여러 개의 개별 프로젝트(각각 다른 컴파일러를 사용함)에서 작업하기 때문에 내 PATH에 하나의 컴파일러에 대한 경로를 설정하는 것을 좋아하지 않습니다.

이제 저는 기본 시스템 PATH의 일부로 컴파일러 경로를 갖는 것이 관례인 것처럼 보이는 또 다른 프로젝트에 참여했습니다. 이 문제를 해결하고 싶지만 어려움을 겪고 있습니다.

저는 Cygwin을 사용하여 Windows 7 SP1(64비트)에서 작업합니다.

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

새 프로젝트는 Scons를 빌드 환경으로 사용합니다.

$ 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

필요한 모든 환경 변수를 적절하게 설정하는(새 프로젝트를 빌드하기 전에) 실행할 수 있는 스크립트가 있습니다(기본적으로 "export PATH=...", "export INCLUDE=..."의 긴 목록일 뿐입니다). ", "LIB 내보내기=..." 및 "LIBPATH 내보내기=..."). 모든 시작 파일에서 이 스크립트를 소싱할 수 있으며 경로는 대화형 Bash 세션에서 설정됩니다.

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

내가 시도할 때

$ scons -u

나는 (결국) 얻는다

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.

덮개 아래에서 /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.

/bin/sh로 호출될 때 bash가 POSIX 쉘을 에뮬레이트하려고 시도하기 때문에 문제가 되지 않습니다. 아마도 Scons의 관점에서 볼 때 원하는 동작일 것입니다.

어려운 점은 비대화형, 비로그인 POSIX 셸 환경에 필요한 환경 변수를 가져오는 방법을 찾을 수 없다는 것입니다. 누군가가 어떻게하는지 말해 줄 수 있습니까?

답변1

나는 잘못된 접근 방식을 취하고있었습니다. 이를 수행하는 쉬운(그러나 보기 흉한) 방법은 SConstruct 파일을 수정하여 셸이 호출되기 전에 프로그래밍 방식으로 환경을 수정하는 일부 트리거가 있도록 하는 것입니다.

개념 증명을 위해 내 사용자 이름을 트리거로 사용했습니다.

import getpass

그리고 나중에

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

이것은 작동하는 것 같습니다.

관련 정보