2009-12-10 7 views
5

최근 중간 크기의 C++ 프로젝트를위한 다중 플랫폼 빌드 프레임 워크를 구현하기 위해 scon을 선택했습니다. 빌드가 끝날 때마다 호출되어야하는 단위 테스트를 생성합니다. 그런 종류의 일을 어떻게 성취합니까?scons - something/after/all 대상을 실행하는 방법

내 최고 수준의 sconstruct에서 예를 들어, 내가 그들 내부에 내장 된 DLL 및 실행 사이의 종속성이 있기 때문에 하위 디렉터리의 각각은, 그러나, 그것의 단위 테스트를 가지고

subdirs=['list', 'of', 'my', 'subprojects'] 
for subdir in subdirs: 
    SConscript(dirs=subdir, exports='env', name='sconscript', 
     variant_dir=subdir+os.sep+'build'+os.sep+mode, duplicate=0) 

이 - 내가 보유 할 모든 하위 디렉토리가 빌드되어 설치 될 때까지 테스트를 실행합니다 (즉, env.Install 사용).

어디에서 빌드 테스트를 반복하고 실행하도록 루프를 작성해야합니까? 나는이 루프 다음에 퍼팅을 시도했다. 그러나 scons는 실행 순서를 제어 할 수 없기 때문에, 내가 원하기 전에 잘 실행된다.

초보자를 도와주세요. 모든 테스트 작업이 모든 프로그램에 내장 된 행동에 의존하는 :

감사, 의존성의 관점에서

답변

0

은, 당신이 원하는 것은입니다. 이 작업을 수행하는 방법은 더미 타겟을 생성하여 모든 하위 디렉토리의 sconscript 파일로 내보내고 sconscript 파일에서 더미 대상을 메인 타겟에 Depends으로 만들고 더미 대상에 테스트 대상 Depends을 지정하는 것입니다 .

내가 더미 목표를 설정하는 방법을 알아내는 약간의 문제가 있어요, 그러나 이것은 기본적으로 작동합니다

dummy = env.Command('.all_built', 'SConstruct', 'echo Targets built. > $TARGET') 
Export('dummy') 

(최상위 SConstruct에서) (각 하위에 디렉토리의 SConscript)

Import('dummy') 
for target in target_list: 
    Depends(dummy, targe) 
for test in test_list: 
    Depends(test, dummy) 

나는 더 세밀한 작업이 가능할 것이라고 확신하지만 아마도이 작업을 시작할 수 있습니다.

편집 : 주제에 대해 this page을 지적 해 볼 가치가 있습니다.

5

SCons는 Make와 마찬가지로 선언적 방법을 사용하여 빌드 문제를 해결합니다. 당신은 SCons에게 그 일을하는 방법을 알리고 싶지 않습니다. 모든 종속성을 문서화 한 다음 SCons가 모든 것을 빌드하는 방법을 해결하도록합니다.

뭔가 다른 것보다 먼저 실행되고있는 경우 종속성을 만들고 연결해야합니다. 당신이 DMY 터치 파일을 만들려면

, 당신은 같은 사용자 정의 빌더를 만들 수 있습니다

import time 

def action(target, source, env): 
    os.system('echo here I am running other build') 
    dmy_fh = open('dmy_file','w') 
    dmy_fh.write('Dummy dependency file created at %4d.%02d.%02d %02dh%02dm%02ds\n'%time.localtime()[0:6]) 
    dmy_fh.close() 

bldr = Builder(action=action) 
env.Append(BUILDERS = {'SubBuild' : bldr }) 

env.SubBuild(srcs,tgts) 

SCons는이 MD5 해시를 사용하기 때문에 더미 파일에 타임 스탬프를 넣어하는 것이 매우 중요합니다. 빈 파일이 있으면 md5는 항상 동일하며 후속 빌드 단계를 수행하지 않기로 결정할 수 있습니다. 기본 명령에서 다른 조정을해야하는 경우 함수 팩토리를 사용하여 템플릿을 수정할 수 있습니다. 예 :

def gen_a_echo_cmd_func(echo_str): 
    def cmd_func(target,source,env): 
     cmd = 'echo %s'%echo_str 
     print cmd 
     os.system(cmd) 
    return cmd_fun 

bldr = Builder(action = gen_a_echo_cmd_func('hi')) 
env.Append(BUILDERS = {'Hi': bldr}) 
env.Hi(srcs,tgts) 

bldr = Builder(action = gen_a_echo_cmd_func('bye')) 
env.Append(BUILDERS = {'Bye': bldr}) 
env.Bye(srcs,tgts) 

당신이 SCons는이 (다른 모든 실행 한 후 모든 빌드 로그 파일을 압축 예를 들어, 뭔가) 흐름을 구축에 자동으로 주입 할 무언가가있는 경우, my question here를 참조하십시오.

2

해결책은 이렇게 간단해야합니다.

테스트 빌더의 결과를 확인은 의사에

빌더에게 설치의 결과에 따라 달라집니다

test = Test(dlls) 
result = Install(dlls) 
Depends(test,result) 

테스트 빌더는 실제로 당신을 위해 DLL 종속성을 일 경우 가장 좋은 방법은 것 , 그러나 그것을하지 않는 여러 가지 이유가있을 수 있습니다.

0

SConscript은 종속성을 빌드 할 값을 반환합니다.

SConscript 파일 :

test = debug_environment.Program('myTest', src_files) 
Return('test') 

SConstruct 파일 : dep2 빌드가 완료된 후

dep1 = SConscript([...]) 
dep2 = SConscript([...]) 
Depends(dep1, dep2) 

지금 dep1 빌드가 완료됩니다.