我们有一个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到root或bin目录,然后调用SetEnv.cmd ...
,它也不起作用开始菜单链接工作正常。
为了记录,我现在的解决方案,如同这样奇怪,如下:
我创建了一个MSBuild文件,该文件在命令行上使用CMake创建解决方案文件,然后使用MSBuild任务调用创建的解决方案。 MSBuild文件可以很容易地从TeamCity构建,虽然我需要一些额外的技巧来满足CMake的愚蠢寻找编译器,尽管我不会调用它的东西。不太满意,但它确实有效。
答案 0 :(得分: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
本身......的灵感启发了。
答案 1 :(得分:0)
Mac,很好的答案! 现在我想用我的项目文件运行msbuild。但在我运行SetEnv.Cmd之前 - 对吗?
所以,我们走了:
run_Macs_code.bat REM see above
call "%WindowsSdkPath%\bin\Setenv.cmd" /Release /x86 /xp
cd E:\client
msbuild client.proj
现在它正在运作:)