6

我们有一个正在运行的 Team City Build Server,并且想要编译一个 Visual C++ 项目。到目前为止,这很容易,因为我已经使用 Windows SDK 设置了我们的 Windows 构建代理,但我们没有解决方案/项目文件。

项目文件是使用 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 到 root 或 bin 目录,然后调用 SetEnv.cmd,它也不起作用...

不过,开始菜单链接工作正常。

作为记录,我现在的解决方案虽然很奇怪,但如下:

我创建了一个 MSBuild 文件,该文件在命令行上使用 CMake 创建解决方案文件,然后使用 MSBuild 任务调用创建的解决方案。MSBuild 文件可以很容易地从 TeamCity 构建,尽管我需要一些额外的技巧来满足 CMake 愚蠢地寻找编译器,尽管我不会调用它。不是很令人满意,但它确实有效。

4

2 回答 2

3

我的解决方案(设置%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本身所启发......

于 2010-06-04T14:18:51.480 回答
0

马克,很好的答案!现在我想用我的项目文件运行 msbuild。但在我应该运行 SetEnv.Cmd 之前 - 对吧?

所以,我们开始:

run_Macs_code.bat REM see above
call "%WindowsSdkPath%\bin\Setenv.cmd" /Release /x86 /xp
cd E:\client
msbuild client.proj

现在它正在工作:)

于 2011-01-17T15:18:08.897 回答