2009-12-23 4 views
0

낮은 레벨에서 정적 또는 공유 오브젝트를 빌드 할 수 있도록 시공 환경을 조정할 수 있어야합니다. 현재, 나는 다음과 같은 접근 방식 내놓았다 :scons hierarchcal builds : builder 전파

최상위 SConstruct :

if build_shared: 
    env.Replace(ObjectBuilder = env.SharedObject) 
    env.Replace(LibraryBuilder = env.SharedLibrary) 
else: 
    env.Replace(ObjectBuilder = env.StaticObject) 
    env.Replace(LibraryBuilder = env.StaticLibrary) 

낮은 수준 SConstructs에서

내가 이름을 호출 :

env['ObjectBuilder']('foo.c') 
env['LibraryBuilder']('lib', objects) 

그러나, 난 이 솔루션이 얼마나 좋은지 확실하지 않습니다. 같은 기능을 달성하는 더 직접적인/적절한 방법이 있습니까? 사전에

감사합니다.

답변

5

가장 쉬운 방법은 매개 변수를 env.StaticLibrary() 또는 env.SharedLibrary()에 전달하는 env.Library()에 대한 자체 래퍼를 선언하는 것입니다.

어떤 건설 변수/scons 옵션에 따라이 래퍼가 두 변수를 번갈아 가질 수 있습니다.

def MyLibraryWrapper(self, *args, **kwargs): 
    if self['BUILD_SHARED']: 
    return self.SharedLibrary(*args, **kwargs) 
    else: 
    return self.StaticLibrary(*args, **kwargs) 

env.SetDefault(BUILD_SHARED = False) 
env.AddMethod(MyLibraryWrapper) 

는 SConscript이 구문 분석하기 전에 조각이 당신의 SConstruct 있는지 확인합니다. 깨끗하게하려면 site_scons/site_tools에 도구를 만들고 env.Tool()을 사용하여로드하십시오.

0

사용자가 제어 할 수있는 옵션 인 경우 AddOption, GetOption 인터페이스를 사용하여 정적 또는 동적 라이브러리를 빌드할지 여부를 제어 할 수 있습니다. IMHO, 그 방법론은 그리 나쁘지는 않겠지 만, 제 자신을 제외하고 많은 SCons 스크립트를 보지 못했습니다.

+0

물론 추가/가져 오기 옵션이 사용됩니다. 나는 단순화를 위해 그 물건들을 생략했다. – kolbusa