Doyub Kim

Computer graphics, software development, web,
photography, and graphic design




Main     Research     Photography     Blog     About




2009/07

SCons - Making Library by doyub 2009/07/30
될 놈 Theory by doyub 2009/07/28
Solar Eclipse by doyub (2) 2009/07/22
Start Tweeting by doyub 2009/07/11



Pages

1  



SCons - Making Library


이전 글에 이어서 SCons로 정적 라이브러리를 만들고 빌드 결과물들을 디렉토리별로 관리하는 방법을
알아보도록 하겠습니다.


1. 라이브러리 생성하기

SCons에서 라이브러리를 만드는 것은 매우 간단합니다. 프로그램을 생성하는 함수가 Program(...)
이었다면 라이브러리는 Library(...)로 이름만 바꿔주면 됩니다.
Library('mylib', 'foo.cpp')
패스설정을 한다든지, 다른 라이브러리를 참조한다든지 하는 것은 Program(...)과 완전히 동일합니다.
프로젝트를 관리한다면 보통 라이브러리만 생성하지는 않겠죠? 테스트 프로그램들도 동봉되는 것이
일반적입니다.
Library('mylib', 'src/mylib/foo.cpp')
env = Environment(CPPPATH=['./include/mylib'], LIBPATH = ['./'])
env.Program('test', Glob('src/test/*.cpp'))
소스는 SConstruct가 있는 폴더 아래에 src폴더가 있다고 가정하였고, 인클루드 폴더 역시 마찬가지입니다.
scons를 입력하여 실행하면 SConstruct가 있는 폴더에 libmylib.a와 test가 생성됨을 알 수 있습니다.
물론 이는 UNIX계열인 경우이며, Windows에서 MSVC를 사용할 경우는 mylib.lib 및 test.exe가 생성되겠죠.
하지만 빌드 중간 생성물인 오브젝트 파일들이 해당 cpp파일이 있는 곳에 지저분하게 생성됨을 알 수 있습니다.
빌드 결과물도 일반적으로는 다른 폴더에 (bin이나 lib등에) 생성되도록 하는 것이 보다 깔끔하겠죠.
이 문제들을 아래에서 차근차근히 해결해보도록 합시다.



2. 빌드 생성물을 디렉토리별로 분류하기

빌드 중간 생성물 및 최종 결과물들을 분류하는 컨벤션은 개인마다 다른 것 같습니다. 마치 멤버 함수 이름이
대문자로 시작하냐 마느냐의 문제와도 같은 것 같습니다. 여기서는 각종 중간 결과물들은 build 디렉토리에,
최종 라이브러리 결과물은 lib에, 최종 실행 파일은 bin에 생성된다고 가정하겠습니다. 물론 debug냐, release냐,
아키텍쳐가 뭐냐에 따라서 세부 폴더는 더 나눌 수 있겠습니다만, 여기서는 간단한 상황만 생각해보겠습니다.
우선 위의 SConstruct에 다음과 같이 입력합니다.
BUILD_DIR = 'build/'
VariantDir(BUILD_DIR, '.', duplicate=0)
이 간단한 코드에서 당연히 주목할 만한 함수는 VariantDir(...)입니다. SCons wiki에 따르면

Use the VariantDir() function to establish that target files should be built in a separate directory from the source files.

라고 하네요. 말 그대로 우리가 원하는 장소에서 빌드를 진행하겠다는 것입니다.
이 함수의 첫번째 인자는 직관적으로 중간 생성물이 담겨질 장소입니다.
두번째 인자는 소스 파일이 존재하는 곳의 루트 경로인데, '.' 을 입력한 것은 소스를 찾아가는 경로의 시작을
말 그대로,  SConstruct가 있는 현재 디렉토리로 하겠다는 것입니다.
마지막 인자인 duplicate는 소스 파일을 빌드가 일어날 디렉토리로 복사를 하느냐 여부를 결정하는
플래그입니다. 이 인자를 생략하면 1이 기본 값입니다. 1이 의미하는 바는 소스파일 전체를 빌드 디렉토리로
복사한 뒤, 그대로 해당 디렉토리에 유지하겠다는 것입니다. 0은 물론 그러지 않겠다는 것이겠죠?
원래 VariantDir함수 대신 BuildDir이라는 좀 더 직관적인 함수가 있었으나, 좀 더 넒은 의미/기능으로 사용하기
위해 해당 함수는 deprecated 되었습니다.

마지막으로 해줄 작업은 Program 및 Library함수들의 인자를 고쳐주는 것입니다. 기존의
env.Program('test', Glob('src/test/*.cpp'))
대신
import os
...
env.Program('bin/test', source=map(lambda x: BUILD_DIR + x, glob.glob('src/test/*.cpp'))
를 입력하면 됩니다. Library도 똑같은 요령으로 바꿔주면 됩니다.
기존의 Glob함수 대신 map과 lambda, 그리고 glob.glob를 사용한 다는 것을 알 수 있는데, 전자가 map형태의
파일 리스트를 넘기는 대신 후자는 list형태로 파일들을 넘겨주게 됩니다.
(이 부분은 정확한 기술 필요. lambda함수의 사용에 대한 자세한 내용은 Python 자료를 참고하세요)
결국 위의 코드가 하는 역할은 소스 경로를 기존의 src/...에서 build/src/...로 전환시키겠다는 것입니다.
이렇게 한 뒤, scons를 입력하면 깔끔하게~ 빌드 생성물들이 디렉토리 별로 정리가 됩니다.
물론 프로젝트에서 생성된 라이브러리를 사용하기 위한 설정이었던
env = Environment(CPPPATH=['./include/mylib'], LIBPATH = ['./'])
와 같은 코드는
env = Environment(CPPPATH=['./include/mylib'], LIBPATH = ['./lib'])
와 같이 바뀌어야 겠지요. 다음 번 포스팅에서는 Windows에서 SCons를 사용하는 방법을 알아보겠습니다.
2009/07/30 23:49 2009/07/30 23:49


No Trackback |  No Comment

Comments

Have your say







될 놈 Theory



될 놈은 어떻게든 되고, 안 될 놈은 어떻게든 안된다.

(유사) 내려갈 팀은 내려간다.
2009/07/28 00:07 2009/07/28 00:07


No Trackback |  No Comment

Comments

Have your say







Solar Eclipse


Solar Eclipse

태어나서 처음으로 직접 관측한 일식.
카메라질 끊은지 4년만에 렌즈 구매 본능을 일깨우다.
2009/07/22 11:12 2009/07/22 11:12


No Trackback |  2 Comments

Comments


진짜나도

2009/07/23 14:30 edit / delete reply

싸구료삼숭으로 만족할순읎

>   doyub

2009/07/23 15:41 edit / delete reply

질러라질러라질러라ㅋㅋㅋㅋ


Have your say







Start Tweeting


트위터 시작했어요-.-/


신변잡기는 여기로.
2009/07/11 21:51 2009/07/11 21:51


No Trackback |  No Comment

Comments

Have your say




Pages

1  


Copyright ⓒ 2010 Doyub Kim. All rights reserved.
Powered by Textcube, Blueprint CSS Framework 0.8 and script.aculo.us 1.8.2

Entries RSS | Comments RSS