2017-12-10 9 views
0

환경을 통해 파이썬 기반 빌더에 매개 변수를 전달하는 것과 관련하여 scons 2.5.1에서 문제점이 있습니다. 일반 빌더가 호출 될 때 전달 된 소스 파일이나 환경 변수가 변경되면 결과에 더티 (dirty) 플래그가 설정된 것처럼 보입니다. 파이썬 함수 빌더 (여기 http://scons.org/doc/1.2.0/HTML/scons-user/x3524.html에서 설명 됨)를 사용하면 scons가 소스 파일에만 관심을 갖는 것처럼 보입니다.Scons는 파이썬 함수 빌더를 사용할 때 종속성 추적 환경을 무시합니다.

여기는 실패한 부분의 인공적인 예입니다. 환경을 통해 매개 변수를 전달하고 쉘을 사용하여 매개 변수를 대상 파일에 기록하는 두 가지 구현입니다. 하나의 구현은 단지 명령 문자열이며 다른 하나는 파이썬 함수에서 호출하기 위해 파이썬 서브 프로세스를 사용합니다. 나는 빌더가 사용할 빌더를 선택하기 위해 scons에 대한 논쟁을 사용합니다. 여기

#SConstruct 
import subprocess 

def echo_fun(env, source, target): 
    subprocess.check_call('echo %s > %s' % (env['MESSAGE'], str(target[0])), shell= True) 
    return None 

env = Environment(BUILDERS = {'echo' : Builder(action='echo $MESSAGE > $TARGET'), 
           'echo_py': Builder(action=echo_fun), 
           }) 
build_fn = env.echo_py if ARGUMENTS.get('USE_PYTHON', False) else env.echo 
build_fn(['test.file'], [], MESSAGE = ARGUMENTS.get('MSG', 'None')) 

다른 파라미터로 SCons는 스크립트 실행 결과 : 결과가 오염된다는 사실을 검출하는 통상의 빌더를 사용하는 경우에는

PS C:\work\code\sconsissue> scons -Q MSG=Hello 
echo Hello > test.file 
PS C:\work\code\sconsissue> scons -Q MSG=Hello 
scons: `.' is up to date. 
PS C:\work\code\sconsissue> scons -Q MSG=HelloAgain 
echo HelloAgain > test.file 
PS C:\work\code\sconsissue> del .\test.file 
PS C:\work\code\sconsissue> scons -Q MSG=Hello -Q USE_PYTHON=True 
echo_fun(["test.file"], []) 
PS C:\work\code\sconsissue> scons -Q MSG=Hello -Q USE_PYTHON=True 
scons: `.' is up to date. 
PS C:\work\code\sconsissue> scons -Q MSG=HelloAgain -Q USE_PYTHON=True 
scons: `.' is up to date. 

언제 MSG 변경 (깨끗한 MSG 같은 유지)하지만 파이썬 명령 버전에서 그것이 MSG가 변경된 경우에도 최신으로 간주.

이 해결 방법은 내 빌더 스크립트를 별도의 파이썬 스크립트에 넣고 환경 의존성이있는 python 스크립트를 명령 줄 매개 변수로 호출하는 것입니다.하지만 그것은 복잡한 것처럼 보입니다.

이것은 예상되는 동작입니까? 아니면 버그입니까?

내가 SConstruct 파일에서 빌드 기능을 유지할 수있는 곳보다 쉬운 해결 방법이 있습니까?

답변

1

SCons가 (작성된대로) 기능이 MESSAGE에 종속되어 있음을 알 수있는 방법이 없으므로 예상되는 동작입니다.

당신이 맨 페이지를 읽어 그러나 경우 http://scons.org/doc/production/HTML/scons-man.html

당신은이를 볼 수 있습니다 ("작업 개체"에서) :

변수는 또한 varlist = 키워드 매개 변수에 의해 지정 될 수있다; 둘 다 존재하면 결합됩니다. 특정 건설 ​​변수 이 변경 될 때 대상을 다시 작성해야 할 때마다이 작업이 필요합니다. 확장 된 변수는 일반적으로 명령 행의 일부가되지만, 명령 행을 생성 할 때 파이썬 함수 조치가 구성 변수 의 값을 사용하면 이 필요할 수 있습니다.

... 
# Alternatively, use a keyword argument. 
a = Action(build_it, varlist=['XXX']) 

그래서 당신은 다시 작성하는 경우 : 당신이 원하는대로

#SConstruct 
import subprocess 

def echo_fun(env, source, target): 
    subprocess.check_call('echo %s > %s' % (env['MESSAGE'], str(target[0])), shell= True) 
    return None 

env = Environment(BUILDERS = {'echo' : Builder(action='echo $MESSAGE > $TARGET'), 
           'echo_py': Builder(action=Action(echo_fun, varlist=['MESSAGE'])), 
           }) 
build_fn = env.echo_py if ARGUMENTS.get('USE_PYTHON', False) else env.echo 
build_fn(['test.file'], [], MESSAGE = ARGUMENTS.get('MSG', 'None')) 

그것은 행동해야한다.