Как найти SetEnv.cmd / SetEnv.cmd Windows SDK не работает правильно - PullRequest
4 голосов
/ 20 мая 2009

У нас работает Team City Build Server, и мы хотим скомпилировать проект Visual C ++. Пока это будет легко, поскольку я настроил наш агент сборки Windows с помощью Windows SDK, но у нас нет файла решения / проекта.

Вместо этого файлы проекта создаются с помощью CMake. CMake, кажется, немного туповат (не может сгенерировать Solution, когда Visual Studio не установлен), но с некоторыми хитростями я мог бы заставить его это сделать. Решение может быть построено с помощью MSBuild.

И тут возникает проблема. Чтобы это работало автоматически, мне нужно вызвать SetEnv.cmd в Windows SDK. И я не могу найти это автоматически. Он находится в подкаталоге bin пакета Windows SDK, но ни bin, ни root не находятся в пути, а переменная окружения %mssdk% задается SetEnv.cmd и заранее недоступна!

Добавление Windows SDK \ bin dir к PATH приводит к тому, что SetEnv.cmd больше не работает (выходит с сообщением типа The x86 compilers are not currently installed и Jump target Set_x86 not found.

Ссылка в меню «Пуск» вызывает SetEnv.cmd с каталогом Windows SDK в качестве рабочего каталога. Но если я добавлю корневой каталог в PATH, Bin \ SetEnv.cmd будет недоступен.

Как мне автоматически найти SetEnv.cmd? Даже установка переменной окружения на полный путь к setenv.cmd не работает, и когда я определяю% mssdk% в качестве sdk dir, то вызов% mssdk% \ bin \ SetEnv также не работает. Я также попытался определить% mssdk%, затем cd% mssdk%, а затем вызвать bin \ SetEnv. Также компиляторы не найдены во всех этих случаях. Это также не работает, если я вручную перехожу в корневой каталог или каталог bin в командной строке, а затем вызываю SetEnv.cmd ...

Ссылка на меню "Пуск" работает нормально.

Для справки, на данный момент, как ни странно, мое решение таково:

Я создал файл MSBuild, который создает файл решения с CMake в командной строке, а затем вызывает созданное решение с задачей MSBuild. Файл MSBuild может быть легко собран из TeamCity, хотя мне потребовались некоторые дополнительные уловки, чтобы удовлетворить глупый CMake , ищущий компилятор, хотя я не буду вызывать его . Не совсем удовлетворительно, но это работает.

Ответы [ 2 ]

3 голосов
/ 04 июня 2010

Мое решение (устанавливает %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 ...

0 голосов
/ 17 января 2011

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

Сейчас работает:)

...