cygwin 환경은 가끔 곤혹스러운 경우를 만드는데, 이번건도 아마 그런 경우 중에 하나일 것이다.

armcc를 사용한 makefile을 만드는데, 일반적으로 armcc (ADS)는 C:\Program Files\ARM\ADSv1_2 뭐... 기본적으로 요렇게 깔린다.

이걸 cygwin에서 사용할라면 흔히 /cygdrive/c/Program\ Files/ARM/ADSv1_2 이렇게 표현을 하곤 한다.

다만 문제가 되는 것은, armcc 에 경로가 들어가는 인자 (include path를 지정하는 -J 옵션 같은 경우)가 들어간다면 문제가 생긴다. 예를 들어...

target:
armcc -여러가지 옵션들... -J/cygdrive/c/Program\ Files/ARM/ADSv1_2/Include


이렇게 하면 armcc는 이건 잘못된 경로라고 인식한다... (라기보다 그런 듯 하다.  그러나 armcc는 이게 잘못된 경로라는 에러를 발생시키지 않는다!!!)

이걸 해결하려면 cygwin에서 사용하는 경로를 windows나 dos style로 바꿔주는 util인 cygwin을 사용하면 해결 된다.  위와 같은 경우는

ADS_INC = "/cygdrive/c/Program\ Files/ARM\ADSv1_2/Include"
CYGWIN_ADS_INC = $(shell cygpath -d -a $(ADS_INC))

target:
armcc -여러가지 옵션들.. -J$(CYGWIN_ADS_INC)


cygpath에 사용되는 여러가지 옵션이 있는데, 이중에 -d는 dos style로.. (그러니까 8.3 규칙을 벗어나면 틸트(~)로 표시되게...) 하는것이고 -a는 절대경로로 만들라는 의미이다.  음... 오랜만의 포스팅인데 .. 의외로 간단 -.-
Posted by 강군님

댓글을 달아 주세요

cygwin에서 openssl library를 사용하는 프로그램을 짤 일이 생겼다.

아무 생각 없이 코딩을 해서 테스트를 해보고 릴리즈를 했다.  여기까진 좋았다.

근데 문제가 터졌다 -_-; 첫번째 문제는 cygwin이 깔리지 않은 PC에서 실행 안됨.  두번째 문제는 cygwin이 설치 되었다 하더라도 openssl library가 없는 곳이면 실행 안됨.

이런 젠장...

cygcheck를 어떤 cygwin상에서 library의 얽힌 구조를 알 수 있으므로, cygwin에서 컴파일 한 프로그램은 미리 확인을 해서 의존성을 제거해야 했었는데 깜빡하고 있었던거다 -.-;

어쨌뜬 cygcheck의 결과 cygcrypto-0.9.8.dll과 cygwin1.dll을 사용하게끔 되어있다.  다른것들도 많이 포함하고 있는데 어차피 그건 windows용 library니까 내가 신경 쓸바는 아닌것 같았다.

확인해본 결과 cygcrypto-0.9.8.dll은 openssl 0.9.8 dynamic library이고... cygwin1.dll은 말 그대로 cygwin에서 프로그램을 돌리기 위한 기본적인 library이다.

일단 cygwin1.dll을 배제하기 위한 방법은 간단하다.  CFLAGS에 -mno-cygwin 옵션을 주는 것이다.  요렇게 하면 windows native format으로 컴파일이 된다.

cygcrypto-0.9.8.dll에 대한 의존성을 없애기 위해서는 crypto library를 정적으로 링킹하도록 하는 수밖에 없는데, 정적 linking은 -static 옵션으로 수행이 가능하다.  허나 링킹 불가.  뭐냐 -_-

이래저래 삽질한 결과 openssl을 컴파일해서 static library를 만드는게 낫겠다는 생각이 들었다.

openssl의 INSTALL.W32를 보니 cygwin용으로 컴파일하는 방법이 나오는데, 아무래도 windows native하게 컴파일 해야 겠다는 생각이 들어서 mingw로 컴파일하는 방법을 선택하기로 했다.

./Configure mingw && make && make test && make install


이렇게 하면 /usr/local/ssl/lib에 libcrypto.a가 생성되는데... 이걸 링킹하면 되겠지? 했는데 말도 안되는 오류가 난다.

...undefined CreateDC...
...undefined CreateCompatibleDC...
...undefined GetDeviceCaps...
...


잠깐... 이거 어디서 많이 본거 같은 함수들이다.  바로 구글링 들어간다.  MSDN으로 연결된다 -_-;  WIN32 API 할 때 했던거 기억난다.

뭔가하고 openssl 소스를 뒤졌더니 crypto/rand/rand_win.c의 readscreen()에서 사용하는데, 문제는 이 부분은 다음과 같을때 활성화되게끔 되어있다.

#if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN)


대충 보니 플랫폼이 wince, cygwin이 아닐때는 사용하게끔 되어있는 거다.

openssl의 Makefile을 보니 gcc 옵션으로 define하도록 몇개 넣어놨는데, mingw로 했으니 당연히 있을리가 없다.  그래서 혹시나해서 cygwin용으로 configure해보았다.

make distclean && ./config


역시 INSTALL.W32에 있는 내용.  요러고 Makefile봤더니 그래도 정의가 안되있다! 이게 절대로 필요없을 거란 생각이 들어서 그냥 #if 0 ~ #endif로 묶고 다시

make distclean && ./Configure mingw && make && make test && make install


이렇게해서 /usr/local/ssl/lib/libcrypto.a가 생성되고 이것을 링킹하니 성공.

삽질의 연속... 어쨌든 해결되어서 다행 ㅋㅋ
Posted by 강군님

댓글을 달아 주세요

사용된 버전은 아래와 같다.

vim : 7.1
cscope : 15.6
exuberant Ctags : 5.7 (우리가 흔히 ctags라고 부르는 것이며 오리지널 ctags는 재귀 옵션인 -R이 안먹어서 손수 스크립트를 만들어줘야되는 불편을 수반한다 -_-)

vim이랑 ctags는 cygwin의 setup에서 설치가 되는데 cscope는 패키지에 선택이 안되므로 직접 컴파일해서 설치해야 한다.  물론 이를 위해 cygwin setup의 devel 부분의 웬만한 패키지들은 선택해놓는게 좋을거 같다 (하드가 완전 모자라지 않는 이상).

http://cscope.sourceforge.net/ 에서 최신 cscope를 download 받을 수 있다.  구글링해서 보니 static binary도 돌아다니는데, 내 cygwin 환경에서는 동작하지 않았다 (getline 어쩌고 하는 메세지인데 http://rommance.net/wikix/index.php?display=Cscope 아무래도 요거 적용이 안된거 같다.  어쨌든 static binary는 사용불가.

$ ./configure
$ make && make install

물론 INSTALL에 있는 내용 그대로다 -_-; 요렇게 하면 /usr/local/bin 에 cscope.exe가 생성이 된다.  cscope를 사용하기 위해서는 DB를 만들어야 되는데 맨날 치기 귀찮으니까 mkcscope.sh라는 스크립트를 만들어 놓자.

>> 2008년 6월 2일에 추가된 내용.  mkcscope.sh를 만드는 find에서 찾는 경로 지정을 . 으로 하면 상대경로로 찾아지므로 나중에 좀 불편해진다.  따라서 이걸 $PWD 로 바꾸면 절대경로로 바뀐다.  (env 해보면 알겠지만 PWD는 기본 환경 변수로 현재의 경로를 나타냄)

find $PWD \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' \) -print > cscope.files

cscope -o cscope.files
cscope -i cscope.files


위의 스크립트는 거의 표준처럼 쓰는 것 같다.  당연히 *.c *.cpp *.cc *.h *.s *.S를 대상으로 리다이렉션을 해서 목록을 만들고 요놈을 DB로 만들게 된다.

요거 끝났으면 실행권한 부여해서 (chmod +x mkcscope.sh) /bin에 복사해놓고 DB를 만든다. 

$ mkcscope.sh


하면 최상단의 바(-_-;)가 진행이 되고, 다 되면 Ctrl+D를 눌러 빠져나온다.  그럼 해당 디렉토리에 cscope.out이 생성된 것을 볼 수 있다.

이거 됐으면 vim이랑 연결시키는 부분을 처리해주어야 한다.  vim에는 이미 cscope에 대한 명령이 내장되어 있으니 몇개만 연결시켜주면 된다.  cygwin에 vim 설정이 아직 안된 상태라면 http://kangun.tistory.com/29 을 참고해서 기본 설정을 한뒤... .vimrc에 다음 내용을 추가한다.

set csprg=/usr/local/bin/cscope.exe
set csto=0
set cst
set nocsverb
cs add 절대경로/cscope.out


이렇게 하고 나서 vim을 띄우고 나서...

:cs find [query type] [symbol]


의 방식을 사용하면 원하는 symbol을 쉽게 찾을 수 있으며, query type은 아래와 같다.

0 or s : Find this C symbol
1 or g : Find this definition
2 or d : Find functions called by this function
3 or c : Find functions calling this function
4 or t : Find assignments to
6 or e : Find this egrep pattern
7 or f : Find this file
8 or i : Find files #including this file

뭐 ctags야... ctags -R해서 tags를 만들고 vimrc에 다음과 같이 설정해주면 된다.

set tags=/절대경로/ctags


이렇게 하고 Ctrl+]. Ctrl+T의 조합등으로 간단한 탐색이 가능해지며, ctags의 부가적인 기능들은 :help ctags 로 확인이 가능하다.
Posted by 강군님

댓글을 달아 주세요

  1. Favicon of https://happyoutlet.tistory.com 붕탱구 2009.01.05 09:44 신고  댓글주소  수정/삭제  댓글쓰기

    좋은글 잘보고 갑니다!!

  2. 양재모 2009.04.04 00:00  댓글주소  수정/삭제  댓글쓰기

    좋은글 감사합니다.
    쪽집게 처럼 필요한 내용만 딱딱있네요 ㅋ~

회사에서 사용하는 개발환경은 linux가 아니다... 안타깝다 -_-

어쨌든 회사에서의 개발환경은 cygwin + gcc + gmake이다.  따라서 cygwin을 설치한다.

http://www.cygwin.com/setup.exe 를 다운받아놓도록 한다.  향후 패키지를 추가/제거할 때도 사용하여야 하니까 그냥 다운 받아놓는 것이 낫다.  용량도 400KB 정도...

이걸 실행시키면 어디를 통해서 install 할 것인지를 물어본다.  여기에서 Install from Internet을 사용한다.

Root Directory는 기본 설정인 C:\cygwin을 그냥 사용하는 것이 제일 무방할 듯 싶다.  검색해본 결과 많은 사람들이 여기에 기반을 두고 작업을 하였기 때문에 헷갈리지 않을터이다.  밑의 설정은 All Users와 Unix/binary에 체크한다.

여기서 다음을 누르면 어디에 다운을 받을 것인지, 어떤 방법으로 받을 것인지 물어보는데 기본값을 쓰면 되고, download site는 http://ftp.daum.net을 추가해서 쓰면 괜찮을 듯 하다.

본격적으로 패키지를 선택해야 하는 부분이 나오는데 직감적으로 gcc나 make, gdb, vim 등등은 당연히 해야할 것이라는 느낌이 온다.  기본값은 진짜 기본만 설치하게 되므로 나중에 되는게 하나도 없다 -_-; 고로, 필요한거 두루 선택해주고, (Skip이라고 쓰여진 부분을 클릭) 다음으로 진행하면 인터넷에서 쭉쭉 받아와 설치하게 된다.  다음은 필요하다고 생각되는 package들을 정리한 것이다.

Admin - cygrunsrv (sshd 등을 bg로 돌릴 유틸)
Devel - gcc, make, ctags 관련
Editors - vim 관련
Net - openssh 관련 (ssh를 사용할 것이라면)
Shell - rxvt 관련 (xterm을 사용할 것이라면)

위에서 열거한 package 말고도 필요한 패키지들을 선택하도록 하고, 나중에 또 추가가 되므로 크게 신경 쓸 일은 아닌듯 하다.

어쨌거나 설치가 끝나면 환경변수를 설정하도록 한다.  내 컴퓨터 우클릭하여 '속성'->'고급'->'환경변수'를 선택하여 사용자 변수와 시스템 변수를 추가하도록 한다.

사용자 변수에는 HOME (linux에서의 ~ 를 말함)을 지정하고, LOGNAME (windows 계정과 동일하게)을 새로 만든다.

시스템 변수에는 CYGWIN (ntsec binmode)을 새로 만들고 PATH에 C:\Cygwin\bin을 추가한다 (당연히 항목과 항목 사이는 ;으로 구분한다).

만약 cygwin 자체의 terminal을 쓴다면 상관은 없지만, cygwin의 xterm을 사용하고 싶다면, 추가의 작업이 필요하다.

c:\cygwin을 보면 cygwin.bat가 있다.  autoexec.bat 이후로 bat 파일은 진짜 오랜만이다.  어쨌거나 이거 내용을 보면 다음과 같다.

@echo off

C:
chdir C:\cygwin\bin

bash --login -i

이거를 응용해서 rxvt,bat를 하나 만든다 (xterm용)

@echo off

C:
chdir C:\cygwin\bin

rxvt.exe -tn xterm -rv -sr -sw -bg gray -fg black -sl 1000 -sbt 15 -fn "Dotumche" -e /bin/bash --login -i

rxvt의 각 항목의 값들이 궁금하다면 cygwin에서 rxvt --help를 해보면 알 수 있다.  대충 xterm으로 띄우는데 scrolling이 가능하도록 하고 검은 배경에 회색글씨를 쓰겠다... 폰트는 Dotumche를 쓰겠고.. 뭐 이런 거다.

이게 끝난 다음에 만든 rxvt.bat를 실행시키면 익숙한 shell prompt를 확인할 수 있다.

cygwin에서 개발하려면 다른 editor도 있겠지만, 아무래도 vim을 가장 많이 사용하지 않을까 싶다.  cygwin에서 vim을 사용하려면 이거저거 걸리는게 많다.  일단 기본적으로 설정 파일이 없기 때문에 원 리눅스에서의 컬러풀(?)한 터미널을 기대하면 안된다.  또 한글입력에 문제가 많아서 요거 2가지 처리를 해줘야 한다.

먼저 vim을 설정해야 되는데, 항목이 워낙 많으니 그냥 /usr/share/vim/vim71/vimrc_example.vim을 home 디렉토리에 .vimrc로 복사하고, 좀 손을 봐준다.  쭉 내리다보면 다음과 같은 부분이 있다.

if has("vms")
  set nobackup
else
  set backup
endif

요 부분을 주석처리한다.  vimrc에서의 주석은 " (double quotation mark)를 맨 앞에 붙여주면 된다.  이거 안하면 저장하고 나올때마다 backup 파일이 생기는 짜증나는 (필요하긴 하지만) 현상을 목격하게 된다.  어쨌거나 이거 됐으면 다음 작업을 진행한다.  역시 .vimrc에 다음과 같은 항목을 추가하여 준다.

set fileencoding=euc-kr
set encoding=cp949

vi에서 한글을 사용하기 위한 설정이다.  이렇게 다 됐으면 저장하고 다시 vi로 아무 c파일이나 짜본다.

#include <stdio.h>

int main (void)
{
  printf ("헬로, 시그윈 월드\n");

  return 0;
}

잘 된다.  하지만 이렇게 하면 vim에서만 한글이 잘 보일뿐, 막상 쉘에서 ls해보면 잘 안나온다.  요것도 수정해야 하는데, 홈 디렉토리에 .bash_profile을 다음과 같은 내용을 추가한다.

alias ls='ls -F --color=auto --show-control-char'

쉘에서 ls를 해도 한글이 무리 없이 잘 나오게 된다.  후아... 이정도 했으면 큰 문제 없이 cygwin을 사용할 수 있을 것 같다.  헌데, 작업하다보면 새로운 terminal을 띄워야 할 때가 있는데 이때마다 마우스로 손이 가는건 상당히 부하가 큰 작업(-_-?)이다.  요거를... 키보드에서만 해결하도록 다음과 같은 alias도 하나 추가한다.

alias rxvtTerm='/cygdrive/c/cygwin/bin/rxvt -tn xterm -rv -sr -sw -bg gray -fg black -sl 1000 -sbt 15 -fn "Dotumche" -e /bin/bash --login -i &'

이러면 그냥 쉘 프롬프트에서 rxvtTerm을 실행시켜서 새로운 xterm 하나를 더 얻을 수 있게 된다.
Posted by 강군님
TAG CygWIN, Vim, xterm

댓글을 달아 주세요

@echo off

C:
chdir C:\cygwin\bin

rxvt.exe -tn xterm -rv -sr -sw -bg gray -fg black -sl 1000 -sbt 15 -fn "Dotumche" -e /bin/bash --login -i


저번에 이렇게 했었는데, 글씨가 너무 작아서 불편한 감이 있다.  그래서 아래와 같이 바꿨다.

@echo off

C:
chdir C:\cygwin\bin

rxvt.exe -tn xterm -rv -sr -sw -bg gray -fg black -sl 1000 -sbt 15 -fn "Dotumche-20" -e /bin/bash --login -i


이렇게 하니까... 글꼴 크기가 변경이 되는구나!
Posted by 강군님

댓글을 달아 주세요