SCons - Introduction

SCons - Introduction


SCons는 Python기반의 빌드툴이며, 나름 Makefile의 대안으로 떠오르고 있는 오픈 툴킷입니다.
어느 정도 규모를 가지는 Unix 계열의 프로젝트의 경우, 일반적으로 사용되어왔던 방식은
Autoconfig를 통한 configure를 거친 뒤, Makefile을 통한 빌드, 그리고 설치였습니다.
./configure
make all
sudo make install
기존의 이런 방식의 문제는 Autoconfig나 Makefile을 완벽히 마스터하기에 꽤 시간이 걸린다는 것이고,
빌드 코드의 가독성 및 확장성/유연성이 현저히 떨어진다는 것입니다. 저 역시 이러한 방식의 여러가지
귀차니즘 때문에-.- Xcode와 같은 IDE방식을 선호하는 편이었습니다.
이와 다르게 SCons는 이미 널리 알려진 Python함수들로 이루어진 툴입니다.
어찌보면 독립적인 프로그램이라기 보다는 거대한 Python 모듈이라고도 할 수 있겠습니다.
또한 SCons의 소스파일 자체도 Python 스크립트이기 때문에 내부적으로 Python의 다양한 기능들을
그대로 사용할 수 있다는 것이 특징입니다. 세상에 등장한지는 꽤 되었는데, 사실 아주 대중화 된 것 같지는
않습니다. 부끄럽게도 제가 SCons를 접한 것도  Google Chrome의 JavaScript엔진인 V8을
컴파일 해보면서입니다-_-; 하지만 다양한 빌드 툴 중에서 비교적 배우기 쉽고 많은 기능들을 제공하며
확장성이 좋다는 점에서 공부해보는 것이 좋을 것 같아 글을 올려봅니다.



1. 설치하기

우선 SCons를 사용하기 위해서는 Python이 설치되어 있어야 합니다. 일반적인 Unix계열의 운영체제들은
Python이 기본으로 장착되어 있습니다. Windows계열의 경우는 Python 사이트에서 간단하게 다운로드하여
설치, 사용할 수 있습니다. SCons는 공식 홈페이지 (www.scons.org)에서 다운받아 사용할 수 있습니다.
자세한 설치법은 홈페이지에 나와있습니다. Python 이외에는 종속 라이브러리가 없으므로, 큰 어려움 없이
쉽게 설치 가능합니다.



2. Hello, SCons

설치가 끝났으면 SCons를 이용하여 아주 간단한 C++프로그램을 컴파일해 보겠습니다.
가장 먼저 할 일은 프로젝트 폴더에 SConstruct라는 파일을 하나 생성합니다.
가령 main.cpp를 컴파일한다고 하면, SConstruct에 다음과 같이 적습니다.
Program('main.cpp')
그리고 커맨드 상에서
scons
라고 입력한 뒤, 엔터를 누르면 아래와 같이 SCons가 실행됩니다.
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o main.o -c main.cpp
g++ -o main main.o
scons: done building targets.
참~쉽죠~?-_-/
Program은 SCons가 새로이 정의한 Python 함수입니다.
SCons의 메시지가 보기 싫다면,
scons -Q
라고 입력합니다. 그럼 scons: 어쩌고 하는 메시지는 나타나지 않습니다.
Makefile에서는 clean에 대한 동작을 직접 정의해주어야 했었죠.
SCons는 이 상태에서 단순히
scons -c
라고만 입력하면 clean에 해당하는 동작을 실행합니다 (각종 *.o들과 최종 빌드 결과물을 삭제).
만약 복수개의 소스코드를 컴파일 해야 한다고 생각해봅시다. 그리고 실행 파일 (target)의 이름을
원하는 이름으로 바꾼다고 해보죠. 가령 main.cpp뿐만 아니라, foo.cpp, bar.cpp가 있고,
실행파일의 이름이 test가 되어야 한다고 치면, SConstruct파일을 다음과 같이 고쳐줍니다.
Program('test', ['foo.cpp', 'bar.cpp', 'main.cpp'])
눈치 채셨겠지만, 소스파일의 리스트 (를 비롯한 다양한 옵션들의 리스트)는 Python 배열로 넘겨준다는 것을
알 수 있습니다. 만일 어떤 폴더 안에 있는 모든 .cpp파일을 컴파일 해야 한다면, Glob함수를 사용합니다.
Program('test', Glob('*.cpp'))



3. 환경 변수 설정

외부 라이브러리를 사용한다면, 헤더 파일과 라이브러리 파일을 지정해주어야 합니다. gcc라면
-I와 -L, -l 옵션들에 해당하는 동작들이죠. 이런 기본적인 설정들을 비롯하여
각종 플래그, 환경 변수 설정을 담당하는 함수가 바로 Environment입니다.
가령, /usr/local/include에 설치된 헤더 파일들을 사용하고 싶다면,
env = Environment(CPPPATH='/usr/local/include')
env.Program('test', 'main.cpp')
와 같이 작성하면 됩니다. 실행 결과는 아래와 같습니다.
g++ -o main.o -c -I/usr/local/include main.cpp
g++ -o test main.o
마찬가지 원리로, 추가 라이브러리 링크를 위해서는 다음과 같이 적습니다.
만일 /usr/local/lib에 설치된 freetype (libfreetype.a)를 사용하고 싶다면,
env = Environment(LIBPATH='/usr/local/lib', LIBS='freetype')
env.Program('test', 'main.cpp')
와 같이 적습니다. 이는 아래와 같이 실행됩니다.
g++ -o main.o -c main.cpp
g++ -o test main.o -L/usr/local/lib -lfreetype
지금까지 가장 기초적인 SCons 사용법을 살펴보았는데, 다음번엔 라이브러리 작성 법,
커스텀 커맨드 옵션, 다양한 사용자화 등등등에 대해서 알아보겠습니다.
SCons는 문서화가 비교적 친절하게 잘 되어있는 편이므로, 자세한 내용들은
SCons User GuideSCons man page를 참조하세요.

Posted by

2009/04/05 15:51 2009/04/05 15:51
Response
0 Trackbacks , 1 Comments
RSS :
http://doyub.com/blog/rss/response/766

Trackback URL : http://doyub.com/blog/trackback/766

« Previous : 1 : ... 23 : 24 : 25 : 26 : 27 : 28 : 29 : 30 : 31 : ... 33 : Next »