환경을 통해 파이썬 기반 빌더에 매개 변수를 전달하는 것과 관련하여 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 파일에서 빌드 기능을 유지할 수있는 곳보다 쉬운 해결 방법이 있습니까?