2009-05-20 51 views
4

我們有一個Team City Build Server正在運行並且想要編譯Visual C++項目。到目前爲止,這很容易,因爲我已經使用Windows SDK設置了Windows Build Agent,但是我們沒有解決方案/項目文件。如何查找Windows SDK的SetEnv.cmd/SetEnv.cmd無法正常工作

項目文件是用CMake創建的。 CMake似乎有點愚蠢(當Visual Studio沒有安裝時無法生成解決方案),但有一些技巧,我可以做到這一點。該解決方案可以使用MSBuild構建。

問題出在這裏。爲了自動工作,我需要調用Windows SDK的SetEnv.cmd。我似乎無法自動找到它。它位於Windows SDK的bin子目錄中,但路徑中都不存在bin和根目錄,並且環境變量由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到根目錄或目錄目錄,然後調用SetEnv.cmd ...

雖然開始菜單鏈接工作正常。

爲了記錄在案,我現在的解決方案,因爲陌生,因爲這是,如下:

我創建的創建與C進行命令行上的解決方案文件的MSBuild文件,然後調用與創建的解決方案一個MSBuild任務。 MSBuild文件可以從TeamCity輕鬆構建,儘管我需要一些額外的技巧來滿足CMake的愚蠢的尋找編譯器,儘管我不會調用它的東西。不是很令人滿意,但它有效。

回答

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

值得什麼,delims =被設置爲製表符這個工作。 – 2010-06-21 16:38:44

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 

現在,它的工作:)