VS 프로젝트 쉽게 설정하기 + log4cxx 빌드 삽질

Visual Studio (C++; 2005/2008) 에서 프로젝트 설정 쉽게하기

*nix 에서 프로그래밍하다가 VS에서 작업하면서 제일 짜증나던 것 중에 하나가, include path / library(linker) path를 프로젝트 단위로 관리해줘야 했던 것. 

*nix 에서는 흔히,

$(CC) -c filename.cc -I$(SOME_PATH) -L$(ANOTHER_PATH)

형식으로 per-file로 하되, 미리 지정한 값으로 지정해서 한 큐에(…) 관리할 수 있었다.

근데 VS로 작업하다보면 프로젝트 단위로 include path / library path를 지정해 줘야하는데, 단일 프로젝트가 아니라 비슷한 설정을 공유하는 복수의 프로젝트에서 이걸 일일이 지정해주려니 영 죽을 맛이더라(…)

어제 IRC 채널에서 이것 관련된 얘기가 오고가는데 stania였나 xeno였나가 vs-property-sheet이란게 있다고 하더라. 그래서 오늘 좀 구글링해보니  MSDN에 VS Property sheet 관련된 페이지가 있다. 이걸 이용해서 프로퍼티 쉿을 만들고 거기에 additional include/library path를 추가해주고 이걸 각 프로젝트에 상속 시켜서 끝(…).

다만 상속시킬 때 단순히 파일 경로를 지정하는건 안되고 일단 프로퍼티 쉿 자체가 어느 프로젝트엔간 등록이 되어있어야 하더라? -_-;;

 

Windows Vista Platform SDK 덕에 삽질

빌드 서버에 특정 프로젝트 때문에  Windows Vista Platform SDK를 설치했다 (Platform SDK 6.1) . 근데 그러고나니 예전부터 잘 써오던(…) log4cxx 0.10.0 이 빌드 실패 -_-;;

증상은, log4cxx에서 사용하는 Apache Portable Runtime (ARP)에서 사용하는 Windows 상수인 IPPROTO_IPV6 가 없다고 에러를 내는 것. 구글링 해보니 비슷한 증상이 있었고, 그에 대한 해결책도 단순했다

일부 심볼들이 Windows 버젼 상수 중 하나인 _WIN_NT 값에 따라 정의가 되기도/안되기도 하게 바뀐 것. ASF 쪽에서 그런 것까지 다 신경써서 하진 않았던 것 같고(내 경우 0.10.0 릴리즈버젼을 쓰고있기도 하고), 덕분에 _WIN_NT 값이 정의 안된 APR 빌드가 실패하고 -> log4cxx도 연쇄 실패 ㄳ(…)

아예 preprocessor-definition으로 _WIN_NT 버젼을 설정해주고(일단 적당히 0x501로),  빌드하니까 잘 되더라(…);

 

여튼 이상으로 오늘의 Windows 삽질은 끝. 흑흑 전 터미널이 더 좋아요 Orz

log4cxx 0.10.0 released

Apache Software Foundaion에서 진행하는 logger project중 한 갈래인 log4cxx[1] 가 릴리즈되었다.

이전 릴리즈였던 0.9.7버젼이 굉장히 오래된 녀석이고(4년 다되감), 이번이 첫 apache release이기도 해서 어서 나오길 기다리고 있었다. 일단 나왔으니 내가 사용하는 프로그래밍 환경들에서 각각 빌드해봐야할듯. 회사에서 사용중이던 log4cxx도 리비젼 따라가는걸 포기하고 중간 dev-snapshot[2] 을 썼었는데, 0.10.0으로 올려봐야할듯.

로거처럼 필요는 한데, 처음부터 만들기는 — 특히나 범용/멀티스레딩 지원이 되는 — 것은 좀 괴로운데, ASF처럼 믿음이 가는 소프트웨어 재단에서 만드는 걸 편하게 가져다 쓰는 것은[3] 꽤나 즐거운 일이다 — 유지 보수에 신경을 덜 써도 되거든.

ps. 그렇지만 release candidate를 내기 시작한 것이 2월의 일인데 실제 릴리즈는 RC8 까지 진행된다고 4월 초까지 걸려야했다 -_- 좀 길었음 Orz

  1. C++를 위한 log4j port []
  2. 개발 중간에 빌드되고/동작한다고 어느 정도만 알려진 상태. 말 그대로 개발 중의 어느 한 시점의 상태다. []
  3. 물론 Apache License가 상용 소프트웨어에서 쓰기 편하기도 하지만, 로거는 주로 서버 응용에서 써서, GPL이라도 큰 차이는 없긴하다 []

잡담: 2008년 3월 31일

현재는 과거로부터 추론 가능하다

오늘 새벽 1시경에 내가 하던 짓

duty_calls

Image from http://xkcd.net 

under CCL 2.5-attribution non-commercial

…그리고 나서 중편 애니메이션 한 편, 책 두 권, 그리고 나서도 라노벨 반 권을 읽고야 잠이 들었다. 토요일에 12시간 일하고(…) 일요일에도 4시간 일한 사람이 저런 짓을 하면 월요일날 몸 상태를 짐작할 수 있다.[1]

log4cxx 0.10.0 RC 6

뭔가 RC 상태가 계속 지속되는게 불만족스럽긴 하지만, 그렇다고 첫번째 Apache Release가 될 애를 그냥 내놓고 싶지않은 개발자들의 심정을 이해 못할 것도 아니다. 일단 빌드만해보고 링크해서 잘 도나 보기만. RC가 끝나야 main-trunk에 commit을 하던가 말던가…

대가의 글이란

한 분야에서 대가(master)라고 부를만한 사람의 글은 세 줄정도만 읽어봐도 대가다 라는 것을 느낄 수 있다. 적당한 숙련자가 수 페이지의 아티클을 만들어낼 내용을 몇 단어로 표현할 수 있다는 점에서 Hurb SutterBjarne Stroustrup은 대가다.[2]

그렇지만  C++에 익숙해지기 위해서 이런 대가급을 따라잡으려 노력해야하는건 좀 피곤한듯. 뭐 그래서 어제 람다와 클로져가 문법적으로 쉽게 표현되는 걸 환영한 것이긴 하지만…[3]

ps. 마지막 부분의 내용을 한 번 더 곱씹자면, 내 생각을 표현하기 위해선 몇 페이지의 글이 언제나 필요하다는 점에서 아직 난 멀었다고 채찍질해야할 필요를 너무나 느낀다.

  1. C++로 그전에 구성해둔 메시지 전송 방식을 ActionScript 2.0 과 섞어서도 잘 쓸 수 있다는 걸 일종의 개념 증명 + 약간의 production-level로 옮겨갈 수 있는 프로토타입을 짜는 거였는데 AS 2.0의 괴악함 덕에 고생 좀 했다 []
  2. 짧은 글 / 인터뷰된 내용은 아니지만, 담긴 내용의 양으로 볼 때 저 길이는 참 미니멀 하다… []
  3. C++이 너무 어려워진다는 댓글들이 좀 있긴했지만 오늘 해당 아티클을 뽑아서 드래프트 전체를 찬찬히 읽어보니 boost를 사용해서 우회 구현하는 것보다 훨씬 가독성이 높고 쉽다(?)라고 생각된다. 적어도 C#의 delegate수준은 된다고 생각함 []

Software 관련 잡담: 2008년 3월 13일

WordPress 2.5 출시가 일주일 연기

전번 포스팅에 댓글로도 달아놨지만, 3월 10일에 출시될 예정이된 WP 2.5가 17일로 연기. 남은 티켓들을 맹렬히(…)처리하고 있지만, 17일까지 처리하기엔 좀 많지 않나 싶기도 하다. 그렇지만 열심히 작업하고 있을 커미터들에게 응원을.

관리자 페이지도 디자인이나 색감이 좀 바뀌어서 현재 개발 중인 버젼은 이런 상태다. 예정대로라면 몇 일 후엔 최종 버젼을 볼 수 있겠다. 원래 회색조였던 헤더 부분이 푸른 색 계통으로 바뀌고, 오렌지 색으로 나왔던 Right Now 부분도 푸른색 계통으로 변경 되었다. (그리고 선택된 링크가 오렌지 색으로)

wordpress.2.5

Visual UnitTest++ 0.3 Release

VS2005/2008에서 UnitTest++[1] 을 사용하게 쉽게 만들어주는 VUTPP의 새 버젼이 릴리즈 되었다. VS 2008 지원과 WinUnit 이라는 테스트 프레임웍에 대한 지원이 추가되었다.

그리고 메뉴가 패널만 떠다니는(스마트 독킹이되긴하지만) 형식에서 VisualStudio 메뉴로 변경되었기 때문에, VUTPP의 각 메뉴를 단축키를 지정해서 실행할 수 있게 되었다. 덕분에 rein은 심심풀이로 ctrl + `[2] 를 눌러서 테스트들을 돌리고 있다.

만들어주신 쑥갓님 감사합니다!

log4cxx 0.10은 언제?

여전히 메일링 리스트만 눈팅하고 있지만, 아직도 RC3 작업이 안 끝난 분위기. 원래 RC2까지만 나올 예정이었으나 몇 가지 문제로(맥에서의 빌드, Windows에서의 오류…) RC3가 나올 예정이다. 여기서 VOTE 과정이 positive로 가게되면 최종적으로 릴리즈되게 된다.

오래된 (그래서 쓰지말라고 경고도 있는) 이전 안정판(stable-release)이후 제대로 된 릴리즈 — 이면서도 Apache Release 인 — 0.10이 어서 나왔으면 좋겠다.

  1. http://unittest-cpp.sourceforge.net/ C++ 기반의 작고 단순한 — 그렇지만 필요한건 다 있는 — UnitTest/Test 프레임웍이다. []
  2. 모든 테스트 실행 단축키를 이렇게 지정했다. 왼손으로 누르기 편한 단축키 조합 중에 VS에 남아있는 조합이 거의 없더라 Orz []

log4cxx 0.10 RC2 소감

어제 저녁에 다시 HEAD 리비젼으로 빌드해 본 후에 RC2상태인(첫번째 아파치 릴리즈가 준비 중) log4cxx 0.10 RC2를 빌드해봤다. (뭐 사실상 같다)

대충 이전 버젼이랑 VC8 project (VisualStudio.Net2005) 를 만들 때의 차이를 말하자면, (단순히 빌드할 때랑의 차이도 있다)

  • DLL 빌드만 된다 — 이전 버젼에선 static lib으로도 빌드가 되었던 것 같은데 흠 -_-; 지금은 일단 ant build 로만 lib 파일을 생성하는 중(아니면 프로젝트 설정을 뜯어고쳐야)
  • include / lib path가 상대 경로로 생성된다 — 이전 버젼은 절대경로로 생성되서 일일이 수정해주거나 스크립트를 짜야해서 귀찮아졌다
  • 새 버젼[1] 의 cpptask가 필요하다 — 이건 바로 받을 수 있는게 아니라서 좀 짜증나더라. 그렇지만 RC2 -> 0.10 release가 나올때 쯤은 정식으로 나온다하니 어찌 되긴하겠지;
  • 몇 개의 UnitTest가 실패한다 — 이건 원인을 좀 분석해봐야겠는데 언제하지?
  • apr, apr-util이 포함되지 않은 상태로 배포된다 — 이전 버젼은 자동 다운로드. 새로 추가되거나 할지도? 뭐 이건 큰 변화가 아니다. 귀찮을 뿐이지..

요약하자면,

  • VisualStudio 2005 사용자 관점에서 귀찮았던 점(path 관련) 수정
  • 빌드 툴에서 요구하는 라이브러리/툴의 버젼 변화

정도. 뭐 RC2가 끝나고 정식으로 릴리즈되면 (VOTE 과정이 끝나야하겠지만) 그 때가서 다시 테스트 해봐야겠다.

  1. 정확히는 아직 릴리즈되지 않아서 svn에서 긁어와야하는 []

log4cxx 0.10 RC2 공개

rein이 사용 중인 C++ 용 logging 라이브러리인 log4cxx에 대해 예전에 포스팅한 글에 질문이 붙어서 간만에 메일링을 좀 뒤졌다.[1]

2008년 2월 23일자 메일링에 이런게 있다.

log4cxx 0.10.0 RC2 is now available for review for release on the unofficial builds area. This release candidate is strictly provided for consideration for release, may be withdrawn and will be removed from the publication location at the conclusion of the voting period. RC2 is currently available at:

0.9.7 인 상태로 굉장히 긴 기간 (대충 2년?)을 보내고 0.10 (첫번째 apache release)가 나오게 된다. 그 동안 개발자 수도 상대적으로 적은 프로젝트였고 (java기반이고 log4cxx의 코드베이스이기도한 log4j에 비하면 정말로 적다), svn 접근만 오래했던지라 약간 불안(?)한 점도 있었는데 곧 나올 수 있게 되었다니 기쁘기도 하다 :D[2]

최종적으로 RC 딱지를 떼고 정식 릴리즈되는 것은 CPPTask의 code-freeze랑도 연관이 있고, 빠르면 다음주 중순에는 볼 수 있을듯도 하다. 조만간 이쪽도 다시 손을 대야(?)하는데 타이밍이 적당히 맞아주는 것도 즐거운듯.

 

ps. 덤으로 이전 포스팅에 달린 댓글에서 나온 문제[3] 와 해결책

BUILD FAILED
d:\work\log4cxx\log4cxx-trunk\build.xml:348: The following error occurred while
executing this line:
d:\work\log4cxx\log4cxx-trunk\src\ant\apr-build.xml:111: project doesn't support
the nested "comment" element.
 

문제의 원인 :  ant에서 C++ 코드를 컴파일하는데 사용하는  CCTask의 버젼이 낮아서 발생하는 문제[4]

해결책 :

  1. http://ant-contrib.svn.sourceforge.net/svnroot/ant-contrib/ 에서 antcontrib의 HEAD rev. 을 받는다
  2. cpptask trunk를 찾아서 ant로 cpptask를 빌드
  3. 빌드된 cpptasks.jar를 ant의 lib 디렉토리 밑에 복사하거나 CLASS_PATH 설정
  4. log4cxx를 빌드한다
  1. svn HEAD만 가끔 가져갈 뿐 추가적인 관심을 안가졌었다. log4cxx 첫인상과 간단한 설명은 이전 글을 []
  2. 이건 일종의 공짜 점심(!)이 된다. 기여한 것도 없으면서(…) 코드를 날로 써 먹는 일이니… []
  3. 밑의 인용부분은 메일링에서 긁어왔다. 문제를 내 trunk에서는 수정한 상태라 이미 볼 수 없게된 로그라서 []
  4. 이것을 사용해서 log4cxx가 여러 플랫폼에서 빌드된다. []

log4cxx 빌드하기

예전에 포스팅 했던 것 처럼, log4cxx라는 log4j 프로젝트의 하위 프로젝트로 존재하는 C++ 용의 로깅 라이브러리가 있다. 다음의 내용은 이 라이브러리의 현재 HEAD 리비젼인 611128 (2008-01-10 15:26:45 +0900)을 빌드하는 과정의 이야기이다(좀 긴관계로 두 개로 나눠서(…)). 일단 빌드 환경은,

  • Microsoft Visual Studio 2005
  • Windows XP w/ SP2 32bit edition
  • Subversion 1.6 (Win32)
  • Apache Ant 1.7.0
  • Java SDK 1.6.0_03

에서 여기에 서술되지 않은 툴들을 설치하면서 진행된다.

일단 목표는 다음과 같은 빌드 파일을 만들어내는 일이다.

  • VS 2005 에서 제대로 빌드 될 것
  • wchar_t 지원
  • Debug 빌드 뿐아니라 Release 빌드의 설정도 포함되야

이 요구사항을 만족시키려면 아마도 간단한 script 정도는 추가해야한다고 가정하면서 진행했다. 이제 진행과정.

Continue reading log4cxx 빌드하기

log4cxx

Apache Software Foundation(ASF)log4cxx (cxx는 C++를 영문자만 가지고 표기할 때 많이 사용되는 표현(?)이다) 는 유명한 java 기반 logging library인 log4j 의 C++ 버젼이다. 사실 log4j도 ASF 산하의 프로젝트고, log4net, log4php 등등의 자매 프로젝트들이 널려 있는, MT지원이 잘 되는 로깅 라이브러리들이다.

이걸 써보려고 몇 가지 테스트(?)겸 해서 돌아가던 소스에 붙여 봤다. 일단 장점 몇 가지,

  • 설정이 간편하다 – 쌩노가다로 코드에 구조를 쳐 넣을 수도 있지만, log4j 및 기타 자매 프로젝트들과 동일한 형식을 갖는 설정 파일 혹은 xml 로 표현된 설정파일을 읽어서 로거의 출력 구조를 결정할 수도 있다.
  • 연동되는 툴들이 있다 – chainsaw 라는 java 기반의 GUI 로그 뷰어를 제공한다 (필터링이나 기타 등등 왠간한 로그 뷰어에서 필요한 기능은 대부분 제공한다)
  • 다양한 출력 포맷을 설정 파일 인자 변경만으로 지원한다 – 출력하는 형식( 날짜 -스레드 번호 – 내용으로 한다거나 날짜 – 스레드 번호 – 로거 이름 – 컨텍스트 – 내용 – 스레드 로 한다거나 하는 등등)을 조절하는 일이 설정 파일에서 간단히 이루어진다.
  • 다양한 출력 수단(media)를 제공한다 – 콘솔 출력, 파일 기반 출력(시간 기준 혹은 파일 크기 기준의 log-rotation을 지원)을 지원한다. 그리고 XML 기반의 출력이나, 출력을 소켓을 통해 보내거나 하는 것도 가능하다. Win32 플랫폼을 쓴다면 기반 라이브러리를 몇 개 가져다가 Windows NT event logger에 나오게 할 수도 있다.
  • Threading 기반의 프로그램에서 로깅을 사용하기가 편하다 – 기본적으로 스레딩을 사용하는 프로그램의 로깅을 위해 작성된 라이브러리다.
  • 출력 루틴들이 std::string, std::wstring에 기반으로 해서 돌고(C++스럽다!) 예외 기반의 오류 처리를 한다.

물론 단점도 존재한다.

  • 현재 stable 버젼(0.9.7)으로 나와있는 것은 의미가 없다 – 다음 버젼이 나올 때까지 그냥 svn HEAD를 가져다가 쓰라고 권고하고 있다.
  • Stream-like 출력을 지원하기는 하지만 완전하지 않고, 빠질 가능성도 있다(메일링 아키이브에 이 내용이 -_-)
  • 비동기 출력을 지원하는 부분이 있는데(모든 방식에서 스레딩이 지원되긴 한다), 이 것에서 무한정 블락당하는 경우가 존재한다 – APR(apache portable runtime)을 사용해서 포팅하는 중에 완전히 안된 부분이 있다한다(0.9.8이 정식으로 나올 때가 되어야 완전히 해결될 듯; 내 경우에는 이 출력 방식을 안써서 확인할 수 없었다)
  • 일부 메모리 릭이 생기는 경우가 있다고 한다 – 아직까지 실제로 보지는 못했다.
  • 빌드하기 위해 필요한 것들이 많다 – 직접적으로 dependency가 걸린 apr, apr-util과 빌드하기 위한 각종 툴들(java sdk, ant, cppunit, cpptask, GNU patch/sed 등등)이 있어야한다.
  • 소스 트리가 난감할 정도로 크고, 빌드 툴이 apache ant기반이라 시험적으로 제공되는 msvc 8.0 proj 파일 생성기능을 써야 했다(물론 이것도 ant로 생성한다). 난감하게도 이건 절대 경로 기반의 include path와 DEBUG 버젼의 설정만 만들어진다 – 그래서 현재는 APR, APR-UTIL, log4cxx를 ant 출력 파일을 해석해서 변환하는 스크립트 작업을 시작했다.

Continue reading log4cxx