我们正在运行一个Team City Build Server,并且希望编译一个Visual C++项目。到目前为止,这很容易,因为我已经使用Windows SDK设置了Windows Build Agent,但是我们没有解决方案/项目文件。
而是使用CMake创建项目文件。 CMake似乎有点愚蠢(未安装Visual Studio时无法生成解决方案),但是通过一些技巧,我可以做到这一点。然后可以使用MSBuild构建该解决方案。
问题来了。为了自动运行,我需要调用Windows SDK的SetEnv.cmd。而且我似乎无法自动找到它。它位于Windows SDK的bin子目录中,但bin和root都不在路径中,并且%mssdk%
环境变量由SetEnv.cmd设置,并且事先不可用!
将Windows SDK\bin目录添加到PATH会导致SetEnv.cmd不再起作用(退出时会显示类似The x86 compilers are not currently installed
和Jump target Set_x86 not found
的消息。
开始菜单链接正在使用Windows SDK目录作为工作目录来调用SetEnv.cmd。但是,如果我将根目录添加到PATH,则Bin\SetEnv.cmd不可用。
如何自动找到SetEnv.cmd?即使将环境变量设置为setenv.cmd的完整路径也不起作用,并且当我将%mssdk%定义为sdk目录时,则调用%mssdk%\bin\SetEnv也不起作用。我还尝试定义%mssdk%,然后定义cd%mssdk%,然后调用bin\SetEnv。同样,在所有这些情况下都找不到编译器。如果我在命令行上手动cd到根目录或bin目录,然后调用SetEnv.cmd,它也将不起作用。
虽然开始菜单链接可以正常工作。
记录下来,我目前的解决方案如下:
我创建了一个MSBuild文件,该文件在命令行上使用CMake创建了解决方案文件,然后使用MSBuild任务调用了创建的解决方案。可以从TeamCity轻松构建MSBuild文件,尽管我需要一些其他技巧来满足CMake愚蠢的寻找编译器的麻烦,尽管我不会调用它。并不是很令人满意,但确实可行。
最佳答案
我的解决方案(设置%WindowsSdkPath%
,以便可以在SetEnv.cmd
下找到%WindowsSdkPath%Bin\
):
@ECHO OFF
IF "%WindowsSdkVersion%"=="" (
CALL :SetWindowsSdkVersionHelper HKCU > nul 2>&1
IF ERRORLEVEL 1 CALL :SetWindowsSdkVersionHelper HKLM > nul 2>&1
IF ERRORLEVEL 1 GOTO ERROR_NOWSDK
)
CALL :SetWindowsSdkPathHelper > nul 2>&1
IF ERRORLEVEL 1 GOTO ERROR_NOWSDK
GOTO END
:SetWindowsSdkPathHelper
SET WindowsSdkPath=
FOR /F "tokens=1,2*" %%i in ('REG QUERY "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\%WindowsSdkVersion%" /V InstallationFolder') DO (
IF "%%i"=="InstallationFolder" (
SET "WindowsSdkPath=%%k"
)
)
IF "%WindowsSdkPath%"=="" EXIT /B 1
EXIT /B 0
:SetWindowsSdkVersion
CALL :GetWindowsSdkVersionHelper HKCU > nul 2>&1
IF ERRORLEVEL 1 CALL :GetWindowsSdkVersionHelper HKLM > nul 2>&1
IF ERRORLEVEL 1 EXIT /B 1
EXIT /B 0
:SetWindowsSdkVersionHelper
SET WindowsSdkVersion=
FOR /F "tokens=1,2*" %%i in ('REG QUERY "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /V "CurrentVersion"') DO (
IF "%%i"=="CurrentVersion" (
SET "WindowsSdkVersion=%%k"
)
)
IF "%WindowsSdkVersion%"=="" EXIT /B 1
EXIT /B 0
:ERROR_NOWSDK
ECHO The Windows SDK %WindowsSdkVersion% could not be found.
EXIT /B 1
:END
我的灵感是
SetEnv.cmd
本身...关于windows - 如何找到Windows SDK的SetEnv.cmd/SetEnv.cmd无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/887894/