2009-10-20 5 views
8

waf을 사용하여 공유 라이브러리를 만들고 싶습니다. GNU autotools보다 훨씬 쉽고 덜 복잡해 보입니다.waf를 사용하여 공유 라이브러리를 만드는 방법은 무엇입니까?

VERSION='0.0.1' 
APPNAME='libmylib' 

srcdir = '.' 
blddir = 'build' 

def set_options(opt): 
opt.tool_options('compiler_cc') 
pass 

def configure(conf): 
conf.check_tool('compiler_cc') 
conf.env.append_value('CCFLAGS', '-std=gnu99 -Wall -pedantic -ggdb') 

def build(bld): 
bld.new_task_gen(
    features = 'cc cshlib', 
    source = '*.c', 
    target='libmylib') 

source = '*.c'를 포함하는 라인이 작동하지 않습니다

는 사실은 지금까지 내가 쓰기 시작 한 WScript와는와 관련된 몇 가지 질문이 있습니다. 와일드 카드 대신 각 .c 파일을 지정해야합니까?

예를 들어 디버그 빌드를 활성화하려면 어떻게해야합니까 (현재 wscript는 디버그 빌드 CFLAGS를 사용하고 있지만이 옵션을 최종 사용자에게 선택하려는 경우).

라이브러리 소스가 하위 디렉토리에 있고, lib를 각각 자신의 하위 디렉토리에 사용하는 프로그램이 계획되어 있습니다.

+0

이 질문을 한 후 나는 또한 질문 : http://stackoverflow.com/questions/1596279/why-has-nobody-created-an-open-source-build-system-for-the-brain-dead 어느 날 조사하도록 이끌었습니다. –

답변

5

waf (작성 당시 1.5.9)의 최신 버전을 사용 중이라고 가정하면 빌드 컨텍스트에서 glob() 메서드를 통해 와일드 카드를 지정할 수 있습니다. 그래서 당신은 쓸 수 다음

lib = bld.new_task_gen(
    features = 'cc cshlib', 
    target = 'mylib') 
lib.find_sources_in_dirs('.') 

이 방법을 :

bld.new_task_gen(
    features = 'cc cshlib', 
    source = bld.glob('*.c'), 
    target='mylib') 

당신이 글로브가없는 웹 애플리케이션 방화벽의 이전 버전을 사용하고있는 경우는, 당신이 사용할 수있는 방법 find_sources_in_dirs있다 Waf에 아직 있지만 비추천으로 예정되어 결국 사라질 수 있습니다.

srcdirblddir 변수는 이제 선택 사항이므로 필요하지 않습니다. 기본값은 "."입니다. 그리고 어쨌든 "빌드". 대상 이름에 "lib"를 붙여서는 안되며, 플랫폼에 따라 자동으로 수행됩니다 (Windows에서는 lib가 추가되지 않고 공유 라이브러리는 .dll을 사용합니다). Debug vs Release 빌드는 놀라 울 정도로 까다로운 문제입니다. 원래 Waf에는이 기능이 포함되어 있었지만 어느 시점에서는 삭제되었으며 절대로 다시 추가되지 않았습니다. 메일 링리스트에 대한 일반적인 요청이므로 향후에 다시 나타날 수 있습니다. 한편 gjc's cflags module을 사용하는 것보다 훨씬 더 많은 작업을 수행 할 수 있습니다. 프로젝트 디렉토리에 추가하기 만하면됩니다. 그때는 아마해야, 당신은 자신의 하위 디렉토리에 라이브러리를 사용하는 경우

./waf configure -d debug 

:

VERSION='0.0.1' 
APPNAME='mylib' 

def set_options(opt): 
    opt.tool_options('compiler_cc') 
    opt.tool_options('cflags', tooldir='.') 

def configure(conf): 
    conf.check_tool('compiler_cc') 
    conf.check_tool('cflags', tooldir='.') 

def build(bld): 
    bld.new_task_gen(
     features = 'cc cshlib', 
     source = bld.glob('*.c'), 
     target=APPNAME) 

그리고 다음을 실행하는 것 디버그 빌드를 설정 : 마지막 WScript와는는 것 최상위 수준의 wscript가 있고 bld.add_subdirs() 기술을 사용하여 라이브러리/프로그램 디렉토리를 추가하십시오. 각 하위 디렉토리에는 자체 wscript_build 파일이 있습니다. 그런 다음 export_incdirsuselib_local 속성을 사용하여 라이브러리와 프로그램 "모듈"사이에 올바른 포함 디렉토리를 지정할 수 있습니다.

+1

아직 사용하지는 않았지만 다른 유용한 waf 모듈은 autowaf.py입니다 : svn.drobilla.net/lad/trunk/autowaf.py Dave Robillard와 Nedko Arnaudov가 만든 GNU GPL v2 이상인 "unixey 패키지/라이브러리를 쉽게 만들 수있는 Waf 유틸리티" –

+0

Handy that one, thanks. – richq

0

waf가 수년에 걸쳐 많이 바뀌 었으므로 문제의 코드 나 대답이 현재의 waf에서 더 이상 작동하지 않습니다. 요즘 그냥 쓰기 : 당신이 target = 'libname'를 작성하지 않도록 웹 애플리케이션 방화벽은 자동으로 lib 접두사를 추가합니다

def options(ctx): 
    ctx.load('compiler_c') 
def configure(ctx): 
    ctx.load('compiler_c') 
def build(ctx): 
    ctx.shlib(source = ctx.path.ant_glob('src/*.c'), 
       target = 'name') 

참고. Windows에서는 shlib 함수 호출에 defs 키워드 인수를 추가해야합니다.

개인적으로 나는 wscript_build 파일을 포함하는 재귀 빌드 스크립트를 권장합니다. 그것이 작동하지 않는다면 (예 : recursive makefiles) 모든 논리를 하나의 중간 크기 빌드 스크립트로 유지하는 것이 훨씬 간단합니다.

관련 문제