2009-05-20 3 views
4

Team City Build Server가 실행 중이며 Visual C++ 프로젝트를 컴파일하려고합니다. 지금까지는 Windows SDK를 사용하여 Windows Build Agent를 설치했지만 솔루션/프로젝트 파일이 없으므로이 작업은 쉽습니다.Windows SDK의 SetEnv.cmd/SetEnv.cmd를 찾는 방법이 올바르게 작동하지 않습니다.

대신 CMake를 사용하여 프로젝트 파일을 만듭니다. CMake는 (Visual Studio가 설치되어 있지 않을 때 Solution을 생성 할 수 없다는) 조금 바보 같지만, 몇 가지 트릭을 사용하면 할 수 있습니다. 그런 다음 솔루션을 MSBuild로 구축 할 수 있습니다.

그리고 여기에 문제가 있습니다. 이 작업을 자동으로 수행하려면 Windows SDK의 SetEnv.cmd를 호출해야합니다. 그리고 나는 그것을 자동적으로 발견 할 수 없다. Windows SDK의 bin 하위 디렉터리에 있지만 bin 또는 루트가 경로에없고 %mssdk% 환경 변수 은 SetEnv.cmd에 의해 설정되며 미리 사용할 수 없습니다.

경로로 윈도우 SDK \ 빈 디렉토리가 더 이상 The x86 compilers are not currently installedJump target Set_x86 not found 같은 메시지와 함께 (종료 작업 SetEnv.cmd로 연결되지 추가.

시작 메뉴 링크는 Windows SDK와 SetEnv.cmd를 호출 dir을 작업 디렉토리로 사용하십시오. 그러나 루트 디렉토리를 PATH에 추가하면 Bin \ SetEnv.cmd를 사용할 수 없습니다.

자동으로 SetEnv.cmd를 찾을 수 있습니까? setenv.cmd가 작동하지 않으며 sdk dir로 % mssdk %를 정의한 후 % mssdk % \ bin \ SetEnv를 호출해도 작동하지 않습니다. % mssdk %, cd % mssdk % , 그런 다음 bin 호출 \ SetEnv. 또한이 모든 경우에 컴파일러가 없습니다. 수동으로 명령 줄에서 루트 또는 bin 디렉터리로 이동 한 다음 SetEnv.cmd를 호출해도 작동하지 않습니다 ...

시작 메뉴 링크가 제대로 작동하지만. 다음으로 생성 된 솔루션을 호출,

내가 명령 줄에서 CMake와 솔루션 파일을 생성하는 MSBuild에서 파일을 만든 :이만큼 이상한 기록, 지금 내 솔루션에 대해서는

다음이다 MSBuild 작업. 비록 내가 그것을 thing을 호출하지는 않지만, CMake의 어리 석음 인 을 만족시키기위한 몇 가지 추가 트릭이 필요했지만, MSBuild 파일은 TeamCity에서 쉽게 만들 수있다. 정말 만족스럽지는 않지만 작동합니다.

답변

3

내 솔루션 (SetEnv.cmd 있도록 %WindowsSdkPath%Bin\에서 볼 수 있습니다, %WindowsSdkPath% 설정) :

@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

감사합니다. 내가 뭘 찾고 있었는지. :) –

+0

맞습니다. 저는 실제로 집에서 이미 그 부분을 개선했습니다 (Windows Server 2003에서는 제대로 작동하지 않았습니다). 그에 따라 내 대답을 편집했습니다. – Mac

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 

을 지금은이 작업을 할 탭 문자로 설정 =을 delims :