Cómo encontrar SetEnv.cmd/SetEnv.cmd de Windows SDK no funciona correctamente
msbuild (2)
Mi solución (establece %WindowsSdkPath%
, para que SetEnv.cmd
se encuentre en %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
Me inspiré en esto por SetEnv.cmd
sí ...
Tenemos un Team Build Server en ejecución y queremos compilar un proyecto de Visual C ++. Hasta ahora, esto sería fácil, ya que configuré nuestro Windows Build Agent con el SDK de Windows, pero no tenemos un archivo de solución / proyecto.
Los archivos de proyecto se crean en cambio con CMake. CMake parece ser un poco tonto (no se puede generar una solución cuando Visual Studio no está instalado), pero con algunos trucos, podría conseguir que lo haga. La solución se puede construir con MSBuild.
Y aquí viene el problema. Para que esto funcione automáticamente, necesito llamar a SetEnv.cmd del SDK de Windows. Y parece que no puedo encontrarlo automáticamente. Está en el subdirectorio bin del SDK de Windows, pero ni el bin ni la raíz están en la ruta, y la variable de entorno %mssdk%
la establece SetEnv.cmd y no está disponible de antemano.
Agregar el directorio Windows SDK / bin a la RUTA lleva a que SetEnv.cmd deje de funcionar (sale con un mensaje como The x86 compilers are not currently installed
y Jump target Set_x86 not found
.
El enlace del menú de inicio llama a SetEnv.cmd con el directorio de Windows SDK como directorio de trabajo. Pero si agrego el directorio raíz a la RUTA, Bin / SetEnv.cmd no está disponible.
¿Cómo puedo encontrar SetEnv.cmd automáticamente? Incluso establecer una variable de entorno para la ruta completa de setenv.cmd no funciona, y cuando defino% mssdk% como el directorio sdk, entonces la llamada% mssdk% / bin / SetEnv no funciona tan bien. También traté de definir% mssdk%, luego cd% mssdk%, y luego llamar a bin / SetEnv. También compiladores no encontrados en todos estos casos. Tampoco funciona si doy cd manualmente al directorio raíz o bin en una línea de comando y luego llamo a SetEnv.cmd ...
Sin embargo, el enlace del menú de inicio funciona bien.
Para el registro, mi solución por ahora, por extraño que sea, es la siguiente:
Creé un archivo MSBuild que crea el archivo de solución con CMake en la línea de comandos, luego invoca la solución creada con una tarea MSBuild. El archivo MSBuild se puede construir fácilmente desde TeamCity, aunque necesitaba algunos trucos adicionales para satisfacer el estúpido buscador de CMake en busca del compilador, aunque no voy a invocarlo . No es muy satisfactorio, pero funciona.
Mac, buena respuesta! Ahora me gustaría ejecutar msbuild con mi archivo de proyecto. Pero antes debería ejecutar SetEnv.Cmd, ¿no?
Así que, aquí vamos:
run_Macs_code.bat REM see above
call "%WindowsSdkPath%/bin/Setenv.cmd" /Release /x86 /xp
cd E:/client
msbuild client.proj
Ahora funciona :)