Ctags, Cscope for Android

2011/12/03 23:19

오늘, Google Developer Hackaton Korea에 참여하면서, 안드로이드 태블릿을 위한 코드뷰어를 만들기 위해서, ctags와 cscope를 Android NDK에서 빌드되게끔 포팅했다. 코드뷰어는 다 못만들어서 틈틈히 만들 예정이고, 포팅한 ctags와 cscope를 github에 올렸다.

Ctags는 원래 GPLv2 라서, GPLv2로 할 수 밖에 없었고.. Cscope는 원래는 BSD였는데 포팅하면서 필요한 몇몇 파일을 glibc에서 가져왔더니 GPLv2 가 되어버렸다. 아놔. 결국 둘 다 내가 싫어하는 라이센스 GPLv2가 되었다. 안드로이드에서 ctags, cscope 같은 파일을 직접 실행할 일은 거의 없으나, 뭐 올려두면 누군가는 도움이 될까 싶어서 올린다. Cscope같은 경우는 ncurses를 포팅할 수가 없어서, ncurses를 사용하는 부분은 동작하지 않게 했다. 즉, 인덱스 생성 등도 되고, 커맨드라인에서 옵션으로 검색하는 것도 정상적으로 되지만, ncurses가 필요한 GUI틱한 화면은 동작하지 않는다.

참고로, 루팅한 폰/태블릿에서는 adb shell 연결하고 chmod로 실행권한만 주면, adb shell에서 바로 실행해볼 수 있고, 루팅하지 않은 폰/태블릿에서는 /data/data/자기앱/ 안에 복사하고 권한조정을 해야 한다. 근데, 오늘 해커톤에서 해본바로는 Java의 File.setExecutable 로는 권한이 변경되지 않고, 뭔가 다른 방법을 해보려다가 시간이 다 되서 망했다. 나중에 해보니 잘 된다. File.setExecutable 문제가 아니었다.

-- 이상한 나라의 종텐.


Build Xv6 on Mac OS X Lion

2011/11/18 02:40

故 Dennis Ritchie와 Ken Thompson이 약 40년전에 PDP-11에서 C언어와 UNIX를 만들었다. PDP-11용 UNIX는 version 6의 코드가 남아있는데, Go언어 개발 등에 참여하고 있는 Russ Cox를 비롯한 옛날 벨연구소의 Plan9 프로젝트 일당이 MIT에서 운영체제 수업을 위해서 UNIX version 6 를 x86으로 포팅한 것이 Xv6라는 프로젝트이다.

간단히 말하면 x86용 운영체제 커널이고, 약 8천라인의 매우 짧은, 학습용의 운영체제 커널이다. 하지만, 다른 학습용 커널과 달리, 이것은 최초의 UNIX를 re-implementation한 거이라는 데에 의의가 있다. 아무튼, Xv6는 Linux에서는 매우 쉽게 빌드(make만 하면 된다)가 되고, Windows에서는 Cygwin을 끼얹으면 매우 불편하지만 대충 빌드가 되는 모양인데, Mac OS X의 gcc는 기본적으로 ELF 포맷이 아니기 때문에 약간의 빌드환경을 위한 크로스컴파일을 위한 gcc 자체를 빌드하는 과정이 필요하다.

웹사이트에는 이렇게저렇게 20줄 정도만 입력하면 빌드환경을 구축할 수 있다고 하는데, 직접 해보니 잘 안되었다. 수정한 빌드 과정을 여기에 기록한다. 아래처럼 하면 빌드할 수 있다. wget과 Homebrew가 설치되어 있다고 가정한다. wget이 없다면 brew install wget 으로 설치한다. Homebrew의 설치는 이쪽을 참조한다.

1. 일단, gawk, gmp, mpfr, mpc, glib 가 필요하다. gawk, gmp와 mpfr은 brew로 설치하면 되는데, mpc는 brew로 설치하면 동명이인의 다른 패키지이다. brew는 설치되었다고 가정한다. MacPort를 사용하더라도 큰 차이는 없으리라 생각된다.

brew install gawk gmp mpfr glib

혹시, glib의 소스 다운로드가 매우 오래걸리고 진행이 안된다면, brew edit glib 를 실행해서, ftp:// 부분을 http:// 로 바꿔보면, 매우 빠르게 다운로드가 될 것이다.

2. mpc를 수동으로 설치한다. 컴파일 에러가 나는 부분을 sed -ie로 수정한다.

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
tar xvfz mpc-0.8.1.tar.gz
cd mpc-0.8.1
sed -ie 's/GMP_RNDA/MPFR_RNDA/g' src/acos.c
./configure --prefix=/usr/local/mpc-0.8.1
make
sudo make install

3. binutils, gcc-4.5.1, gdb-6.8a의 소스를 받아서 빌드 한다.

wget http://ftpmirror.gnu.org/binutils/binutils-2.21.1.tar.bz2
wget http://ftpmirror.gnu.org/gcc/gcc-4.5.1/gcc-core-4.5.1.tar.bz2
wget http://ftpmirror.gnu.org/gdb/gdb-6.8a.tar.gz
tar xvfz binutils-2.21.1.tar.bz2
tar xvfz gcc-core-4.5.1.tar.bz2
tar xvfz gdb-6.8a.tar.gz
cd binutils-2.21.1
./configure --target=i386-jos-elf --disable-nls
make
sudo make install
cd ../gcc-4.5.1
mkdir build
cd build
../configure --target=i386-jos-elf --disable-nls --without-headers \
              --with-newlib --disable-threads --disable-shared \
              --disable-libmudflap --disable-libssp \
              --with-mpc=/usr/local/mpc-0.8.1
make
sudo make install
cd ../gdb-6.8
./configure --target=i386-jos-elf --program-prefix=i386-jos-elf- \
              --disable-werror
make
sudo make install
cd ..

참고로, Linux는 여기까지의 과정이 필요없다. -_-

4. 패치된 qemu를 설치한다. qemu를 이미 다른 곳에서 쓰는 경우는, configure 할때 --prefix 로 프리픽스를 건다.

git clone http://pdos.csail.mit.edu/6.828/qemu.git -b 6.828-0.15
cd qemu
./configure --disable-kvm --disable-sdl --target-list="i386-softmmu x86_64-softmmu"
make
sudo make install

5. Xv6 의 소스를 받아서 빌드하고, 실행한다. 지금도 개발중일 수 있는데, xv6-rev6 버전으로 빌드하겠다. 리눅스는 make 할때 TOOLPREFIX 옵션이 필요 없다.

git clone git://pdos.csail.mit.edu/xv6/xv6.git
cd xv6
git checkout -b xv6-rev6 xv6-rev6
make TOOLPREFIX=i386-jos-elf-
make qemu

qemu를 통해서, 빌드한 Xv6의 이미지가 부팅된 것을 볼 수 있다. 즐거운 커널 해킹 되시길!

-- 이상한 나라의 종텐.


GitLab 설정시 팁

2011/11/13 00:48

개인 서버의 private한 소스 저장소를 Mercurial + Trac + WSGI + Apache 2.2 를 메인으로 써오다가, Git과 Ruby 기반의 GitLab + Passenger + Nginx 로 마이그레이션 했다. GitLab은 Gitosis 기반의 git 저장소의 웹프론트엔드인데, 웹에서 적당한 액세스 관리를 할 수 있다는 것이 장점이다. GitHub의 오픈소스 클론을 표방하고 있고, 매달 릴리즈를 하는 등의 (아직 초창기라 그렇겠지만) 버전업 속도가 빠른 편인듯 하다. Rails3 로 만들어져 있어서, ruby 1.9.2-p290 이 필요하다.

그동안 Apache만 써오다가, 퍼포먼스 소문을 많이 들어왔던 Nginx를 처음 써봤는데, 사실 개인 서버라서 퍼포먼스 같은건 잘 모르겠고 설정은 매우 간편했다. Apache2에서 Rails 서비스를 붙일때 굉장히 헤멨던 것을 생각하면 매우 간단했다. 다만, 모듈이 없고, Passenger랑 같이 빌드해야 한다는 점이 좀 충격이었다.

rvm도 처음 써봤는데, 1.9.2와 1.8대의 루비가 동시에 설치되는걸 어찌 해야 하나 했는데, rvm으로 하면 지금 실행할 루비 버전과 패키지들을 포함한 환경을 선택할 수 있다. 특히, .rvmrc 가 포함된 폴더에 cd로 이동만 하더라도 ruby를 실행할때 버전이 바뀌는 것이 좀 짱이었다. python에도 virtualenv가 비슷한 것이라고 하는 것 같은데, 자세히는 모르겠다. 다만, rvm을 root로 실행하면 /usr/local 에 설치되는데, 어떤 사이드이펙트가 있을지 몰라서, rails를 돌리는 계정에만 rvm으로 ruty 1.9.2와 passenger를 설치했다.

일단, 우분투 기준으로 아래 문서들을 참조하면 매우 쉽게 할 수 있다.

  1. Rails3 을 위한, RVM, Ruby 1.9.2, Passenger, Nginx 설치
    1. Install RVM, Passenger, Nginx and Rails 3 on Ubuntu Lucid Lynx
    2. Rails 3 on Ubuntu 10.10 with RVM, Passenger and Nginx
  2. Gitosis, GitLab 설치
    1. https://github.com/gitlabhq/gitlabhq/blob/master/README.rdoc

다만, gitosis 관련해서 약간의 삽질을 했는데, gitosis는 원래는 gitosis-admin.git 라는 저장소의 gitosis.conf 파일에서 유저 액세스 컨트롤을 한다. 하지만, GitLab을 사용하면 이를 웹에서 가능하게 해주는데, 예전에 gitosis를 사용할 때 처럼, 내 계정의 SSH키로 gitosis-admin.git 을 초기화 했다가 한참 헤맸다.

반드시, rails3 을 돌리는 계정의 ssh키를 gitosis에 초기화 해줘야 하는데, 그래서 난 rails3 을 돌리는 계정과, gitosis에 초기화 하는 ssh키와, 내 계정의 ssh키를 모두 같은 키로 썼더니, 프로젝트를 만든 후에 push가 안되고 ssh키를 등록하면 push는 되지만 프로젝트 생성이 안되는 일을 겪었다.

종합하면,

  1. rails3을 돌리는 계정의 rsa키
  2. gitosis를 초기화 할 때 사용하는 rsa키
  3. 웹에서 사용할 관리자 계정의 이메일과 연결되는, clone/push에도 사용할 사용자 계정의 rsa키

1번과 2번은 반드시 같아야 하고, 3번은 1,2번과 달라야 한다. 이것을 모두 같게 하면, 문제가 발생한다. 이 한 문장을 쓰기 위해 이 글을 썼다. Gitosis를 사용해보지 않았다면, 이유를 영원히 몰랐을 것 같다.

-- 이상한 나라의 종텐.

p.s. 블로그에 글을 쓸때마다 티스토리 웹에디터가 구려서 마크업을 직접 수정하는데, 마크다운이 지원되는 환경으로 옮기고 싶다. ㅠㅠ


« Previous : 1 : 2 : 3 : 4 : 5 : ... 83 : Next »