패스트캠퍼스에서 진행하고 있는 OpenCV 강의에서 사용되는 예제 프로그램은 100개가 훨씬 넘습니다. 매번 새로운 강의가 시작될 때마다 Visual Studio 버전이 바뀌거나 OpenCV 라이브러리 버전이 바뀌면 모든 프로젝트를 새로 빌드해서 테스트를 진행하는데요, 100개가 넘는 프로젝트를 Visual Studio에서 불러와서 하나씩 하나씩 컴파일하고 빌드하려고 하면 너무 번거롭습니다. 그래서 일괄 빌드 방법을 알아봤습니다.


일단 저의 OpenCV 강의는 8주 과정으로 이루어져있기 때문에 "1주차_예제_코드", "2주차_예제_코드", ... 같은 형태의 폴더가 있고, 그 아래에 여러 개의 예제 프로젝트 폴더를 만들어두었습니다. 그러므로 현재 폴더에서 "N주차_예제_코드" 폴더를 모두 찾고, 그 아래에 있는 폴더들에 각각 들어가서 예제 프로젝트를 빌드해야 합니다. 이 작업을 수행하는 배치 파일 build_all.bat 파일을 아래와 같이 작성했습니다.


@ECHO OFF

SET CURR=%CD%
ECHO Current dir: %CURR%

FOR /D %%i IN (%CURR%\*) DO (
  PUSHD %%i
  ECHO Check sub-dir in %%i

  FOR /D %%k IN (%%i\*) DO (
    PUSHD %%k

    ECHO Now in %%k

    IF EXIST "*.vcxproj" (
      ECHO Build the project in %%k
	  
      msbuild /t:Rebuild /p:Configuration=Release
      copy .\x64\release\*.exe .
      rmdir x64 /S /Q
	  
    ) ELSE (
      ECHO No project in %%k
    )	

    POPD 
  )

  POPD 
)


위 배치 파일은 현재 폴더에서 하위 폴더들을 모두 찾고, 각각의 하위 폴더에서 또 한번 하위 폴더들을 찾아서 방문하고, 해당 폴더에 *.vcxproj 파일이 있는 경우에는 해당 프로젝트를 Release 모드로 빌드합니다. 그리고 생성된 ./release/<proj_name>.exe 파일을 프로젝트 폴더쪽으로 복사한 후, release 폴더는 지워버립니다. 그러면 나중에 실행 파일을 쉽게 실행하여 결과를 볼 수 있기 때문에 유용하죠.


아래는 실제로 build_all.bat 파일을 실행했을 때의 결과입니다. (프로젝트 몇 개만 복사해서 테스트해봤습니다.)


위에 나타난 도스창은 CMD 또는 일반 명령 프롬프트가 아니라 시작 메뉴에서 Developer Command Prompt for VS 2017 라는 이름을 검색해서 실행한 창입니다. Visual Studio 프로젝트 빌드를 위한 환경 설정이 적용된 창이라서 msbuild라는 이름의 빌드 명령을 사용할 수 있습니다.


만약 현재 폴더 아래의 하위 폴더에 존재하는 모든 프로젝트를 빌드하려면 위 배치 파일을 아래처럼 변경하면 되겠죠?

@ECHO OFF

SET CURR=%CD%
ECHO Current dir: %CURR%

FOR /D %%i IN (%CURR%\*) DO (
  PUSHD %%i
  ECHO Check sub-dir in %%i

  IF EXIST "*.vcxproj" (
    ECHO Build the project in %%i
	  
    msbuild /t:Rebuild /p:Configuration=Release
    copy .\x64\release\*.exe .
    rmdir x64 /S /Q
	  
  ) ELSE (
    ECHO No project in %%i
  )	

  POPD 
)


한 가지 주의할 점은, 빌드하려고 하는 전체 경로 이름에 빈칸이 있으면 안됩니다. 배치 파일의 FOR 구문에서 빈칸에 대해서는 제대로 처리를 하지 못하네요.


Posted by kkokkal
: