2013년 2월 21일 목요일

Visual Studio 메시지 창에서 GCC(WinAVR) 컴파일 메시지 사용

ARM쪽 컴파일러나 AVR 컴파일러는 GCC(WinAVR)의 품질이 상당히 좋은데도 불구하고 일반사용자들은 일반 상용품을 쓰는 경우가 많은것 같습니다.

주변에서도 AVR을 쓸때 GCC를 쓰는것을 본적이 없을 뿐더러, 강요/권유를 해도 GCC로 옮겨 가지 않네요.
그러나 GCC는 상당히 품질이 높고, 정보가 많은데다가 대부분 MCU를 공통된 방식으로 지원하기 때문에 한번 익혀두면 여러가지로 쓸모가 있습니다.

프로그래머 입장에서 보면 에디터는 참으로 바꾸기 힘든 기본 도구임에는 틀림이 없습니다.

GCC는 아무래도 Eclipse와 같이 쓰시는 분이 많겠지만, 저는 오래전부터 GCC와 Visual Studio를 같이 썼습니다.
개발환경이나 에디터에 대한 의견에는 개인차가 있겠지만, Visual Studio의 IDE 환경이 상당히 우수하다고 생각합니다.

Visual Studio IDE환경의 Make 프로젝트를 통하면 GCC와 연계해서 사용하는것이 매우 쉽습니다.
(IDE 환경에 대한 논쟁을 하고 싶지는 않습니다.)

Visual Studio의 IDE 환경을 사용하면서의 문제는 GCC의 에러메시지가 VS IDE(이하 Visual Studio IDE)와 연계되는 방식이 아니라는 것입니다.

일반적인 GCC의 컴파일 에러메시지 포멧은 아래와 같습니다.

filename:line number: error message

하지만 VS IDE의 메시지 포멧은 다음과 같습니다.

full_path_and_filename(line number): error message

이렇게 다르기 때문에 GCC의 에러메시지가 VS IDE에서는 인식이 불가능해서, 컴파일러 메시지 창에서 더블클릭할때 해당 파일의 위치로 자동이동하지 않게됩니다.
이건 참 불편한 문제입니다.

저는 이 불편함을 그냥 어쩔수 없는것으로 받아들여왔지만 최근에 후배사원과 협업을 하면서, 이런 불편함을 개선하는 노력을 하지 않은것이 좀 미안했습니다.

구글링을 해보니 이런 문제에 대한 해결방법이 나와 있더군요.
지금 게시하는 내용은 해당 기사(원본)의 한글 의역판이 되겠습니다.

이것을 하는 방법을 정리하면 아래와 같습니다.

  1. VS IDE와 make 환경을 사용한다.
  2. filename을 full_path_and_filename로 바꾸기 위해 make 컴파일 규칙설정에 "$<" 대신에 "$(abspath $<)"를 써서 지정한다.
  3. stderr의 메시지를 파이프를 통해서 sed로 전달하기 위해서 "2>&1 | sed"를 쓴다.
  4. 파이프로 돌려진 텍스트 메시지를  sed로 변환하여 처리한다. 처리를 위한 sed 정규식 명령어는 's/\(\w\+\):\([0-9]\+\):/\1(\2):/' 이다.


이에 따라 변경된 make 파일의 컴파일 규칙 설정은 아래와 같습니다.
색을 칠한곳이 방법에 따라 변경된 부분입니다.

 # Compile: create object files from C source files.
$(OBJDIR)/%.o : %.c
$(CC) -c $(ALL_CFLAGS) $(abspath $<) -o $@ 2>&1 | sed -e 's/\(\w\+\):\([0-9]\+\):/\1(\2):/'

# Compile: create object files from C++ source files.
$(OBJDIR)/%.o : %.cpp
$(CC) -c $(ALL_CPPFLAGS) $(abspath $<) -o $@ 2>&1 | sed -e 's/\(\w\+\):\([0-9]\+\):/\1(\2):/'

그밖의 다른 종속성 지정도 비슷한 방식으로 하면됩니다.
위에서 맨 앞줄 $(CC)앞에는 공백이 아니라 1개의 탭문자로 해야 합니다.
그렇지 않으면 make가 작동하지 않습니다.

제 경우의 예를 보면 아래와 같은 컴파일러 메시지가


CSource/main-SRM.cpp: In function 'void Task1(void*)':
CSource/main-SRM.cpp:40: warning: unused variable 'Cnt'
./../Library/SHIFTREG.h: At global scope:
./../Library/SHIFTREG.h:28: warning: 'void SOREG_Shift(UINT08)' defined but not used
./../Library/SHIFTREG.h:47: warning: 'void SOREG_Set()' defined but not used
./../Library/SHIFTREG.h:82: warning: 'void LEDP_State(UINT08)' defined but not used


아래와 같은 형식으로 바뀌었습니다.


c:/Micro/AVR/Work/HS/CSource/main.cpp: In function 'void Task1(void*)':
c:/Micro/AVR/Work/HS/CSource/main.cpp(40): warning: unused variable 'Cnt'
./../Library/SHIFTREG.h: At global scope:
./../Library/SHIFTREG.h(28): warning: 'void SOREG_Shift(UINT08)' defined but not used
./../Library/SHIFTREG.h(47): warning: 'void SOREG_Set()' defined but not used
./../Library/SHIFTREG.h(82): warning: 'void LEDP_State(UINT08)' defined but not used


CS IDE에 나타난 메시지를 더블 클릭하면 해당파일이 열리면서 참조위치로 커서가 자동이동 합니다.

이와 관련한 추가 정보는 아래의 링크에서 확인하실 수 있으십니다.
http://aeroquad.com/showthread.php?2170-Using-Visual-Studio-as-IDE
http://utilitybase.com/article/show/2008/05/12/240/Cross+Compiling+for+OS4+or+OS3+using+MS+Visual+Studio+2005
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=367179
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=66984&highlight=


댓글 없음:

댓글 쓰기