我们正在运行一个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 installedJump 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/

10-10 23:31