MSBuild 알기 – #002 MSBuild 배치 파일

  • Post author:
  • Post category:
  • Post last modified:October 23, 2012

여태까지 뭔지도 모르고 써왔던 MSBuild_Win32.bat 파일. 대체 이것의 정체는 무엇인가?

@echo off
SETLOCAL
call "%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" x86
"%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" %*
SET ERR_LEVEL=%errorlevel%
ENDLOCAL
exit /b %ERR_LEVEL%

이 배치 파일의 핵심은 단 두 줄

call "%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" x86

vcvarsall.bat 파일은 Visual C++에 필요한 SDK, 빌드 도구 등의 경로를 설정한다. %VS90COMNTOOLS% 에서 90은 Visual Studio 2008을 뜻한다. 물론 뒤의 x86은 WIN32/x86 빌드에 필요한 환경설정이 필요하단 뜻이다.

"%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" %*

msbuild.exe 는 MSBuild 인터프리터이다. 닷넷 프레임워크 버전마다 그에 맞는 바이너리를 배포한다. 여기서는 닷넷 프레임워크 버전 4.0용 MSBuild를 사용한다.

x64 빌드용 MSBuild 배치 파일

@echo off
SETLOCAL
call "%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" x64
"%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe" %*
SET ERR_LEVEL=%errorlevel%
ENDLOCAL
exit /b %ERR_LEVEL%

예상대로 아주 쉽다. vcvarsall.bat 를 호출할 땐 x86이 아니라 x64라고 이야기해주고, 64 비트용 msbuid.exe 의 경로(Framework –> Framework64)를 지정한다.

Windows 명령 줄 스크립트

여기선 MSBuild_Win32.bat 에서 쓴 기능만 간단히 살펴본다. 명령 줄 스크립트에 대해 더 깊게 알고 싶다면 윈도우 명령줄 스크립트를 참고하자.

@echo on/off

이게 뭔지 궁금하다면 off 값을 on 으로 바꿔보고 스크립트를 실행해보자. 끝!

SETLOCAL

  1. 명령 줄 cmd.exe 를 실행한다.
  2. SET 을 친다. 어떤 환경 변수가 있는지 확인해둔다.
  3. 배치 스크립트를 실행한다.

    MSBuild_Win32.bat msbuild.xml /t:Build 
  4. 다시 SET을 치고 환경 변수가 바뀌었나 확인한다.
  5. 안 바뀐다!!!

MSBuild_Win32.bat 에서 SETLOCAL 을 제거하고 위의 과정을 반복한다. 이번에 SET을 치면 환경 변수가 많이도 추가됐다. SETLOCAL이 없으면 배치 스크립트 안에서 바꾼 환경 설정이 실행이 끝난 뒤에도 영향을 미친다. SETLOCAL은 그 전까지의 환경 설정을 저장해놨다가 배치 스크립트가 종료되거나 명시적으로 ENDLOCAL 을 호출할 때 다시 복구한다.

%*

이 부분은 MSBuild_Win32.bat 에 준 명령 인자를 그대로 msbuild.exe 의 명령 인자로 넘기란 뜻이다. 이를테면,

MSBuild_Win32.bat msbuild.xml /t:Build 

이렇게 명령을 내리면 %* 는 “msbuild.xml /t:Build” 가 된다.

%errorlevel% 과 exit

SET ERR_LEVEL=%errorlevel%
exit /b %ERR_LEVEL%

이 부분은 msbuild.exe 의 종료 코드(exit code)를 배치 파일의 종료 코드로 그대로 쓰게 한다. 윈도우 명령 줄에선 0 은 성공으로, 그 외의 값은 실패로 처리하는 관행이 있다.

Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.