2012-07-19 1 views
3

기본적으로 SCons는 프로그램을 작성하는 데 사용되는 'recipe'을보고 프로그램에서 암시 적 종속성을 추출합니다. 예를 들어 내 Sconstruct에 다음을 포함한다고 가정 해 보겠습니다.SCons에게 명령 동작의 암시 적 종속성을 무시하도록하려면 어떻게합니까?

Command('foo', 'foocreator.py', '/usr/bin/python foocreator.py > foo') 

그리고 나는 이미 'foo'('foo'가 최신 버전 임)를 구축했습니다. 지금 SCons는가 시도

Command('foo', 'foocreator.py', '/usr/bin/qrsh -V -cwd /usr/bin/python foocreator.py > foo') 

(즉, SGE를 통해 foocreator.py 스크립트를 실행) : '갑'에 대한 명령이되도록 는 지금은 SConstruct (이상 현실적으로, 서로 다른 옵션을 전달)을 변경 foo를 재 빌드하면, --debug = explain은 "/ usr/bin/qrsh에 대한 새로운 의존성"과 "/ usr/bin/python에 대한 종속성 감소"때문이라고 알려줍니다.

레시피와의 종속성에 대한 이러한 추측을 방지하려면 어떻게해야합니까? 지금까지 나는이 행동의 명세를 찾을 수조차 없었다. 나는 'foo'가 실제로 모든 python이나 qrsh에 의존하지 않는다는 사실을 밝히고 싶지 않습니다. 왜냐하면 나는 모든 목표와 그 프로그램의 가능한 모든 위치에 대해 그렇게해야 할 것이기 때문입니다. "올바른"방법이 있어야합니다.

편집 :

Ignore('foo', '/usr/bin/python') 
Ignore('foo', '/usr/bin/qrsh') 

을 심지어이 작동하지 않습니다 나는 또한 지금은 명시 적으로 같이 각 대상에 대한 무시를 추가하는 시도! SCons는 qrsh를 통해 실행될 때마다 모든 것을 다시 작성하려고합니다.

+0

SCons는 foo를 항상 다시 작성하려고합니까, 아니면 Command() 작업을 변경 한 직후입니까? 행동을 변경 한 후에야 그 일이 내게 상당히 합당한 것처럼 들립니다. – Brady

+0

@Brady 액션이 "변경"되는 경우에만. 환경이 변경되어 파이썬 (또는 gcc 등)의 다른 버전이 사용되는 경우에도 동일한 작업을 수행합니다. 나는 그 행동이 많은 경우에 유용하다는 것에 동의하며, 나는 그 행동을 끄는 법을 알고 싶다. – Joe

답변

1

문서화 된 해결책을 찾았습니다. 정확히이 동작을 제어하는 ​​구성 변수 IMPLICIT_COMMAND_DEPENDENCIES가 있습니다. http://www.scons.org/doc/HTML/scons-man.html에 문서화되어 있습니다 (그러나 scons 소스 코드를 검색하여 발견했습니다).

이렇게 원래의 예제를 기반으로 원하는 동작을 제공합니다.

env = Environment(IMPLICIT_COMMAND_DEPENDENCIES =0, ...) 
Command('foo', 'foocreator.py', '/usr/bin/python foocreator.py > foo') 

(또는)

env = Environment(IMPLICIT_COMMAND_DEPENDENCIES =0, ...) 
Command('foo', 'foocreator.py', '/usr/bin/python foocreator.py > foo') 

내가 대상 '갑'의 두 정의 사이를 전환 할 수와 SCons는 푸가 오래 생각하지 않습니다.

0

임이 도움이 될 것입니다 확실하지만, 다음과 같이 귀하의 액션 문자열을 변경하는 좋은 연습이 될 것이다 없습니다 :

actionStr = '/usr/bin/qrsh -V -cwd /usr/bin/python $SOURCE > $TARGET' 
Command(target = 'foo', source = 'foocreator.py', action = actionStr) 
액션 문자열에서 소스와 대상을 결정하지 못할 수 있습니다

SCons는 혼란 스러울 수 있습니다.

위의 설명에서 제안한 것처럼 동작을 해제 할 수는 없지만 자신의 빌더를 만드는 대신 Ignore()Depends() 기능을 사용하여 미세 조정 해보십시오. 절대적인 최악의 경우는 효과적으로 qrsh와 python을 내부적으로 실행하는 쉘 스크립트를 호출하여 액션 문자열을 변경하지 않는 것입니다.

+0

이 예제가 내 예제와 동일하다는 것을 확신합니다. (그리고 편의를위한 $ SOURCE와 $ TARGET을 사용합니다. 실제 이름은 프로그램 방식으로 만들어졌으며, 파일 이름은 하드 코딩되어 있지 않습니다.) – Joe

+0

@Joe, 나는 항상 기본적으로 이름 지정된 인수를 넣고 그것이 차이를 만들 것이라고 제안하지 않았다. 분명히 그것은 실용하지 않는다. 내 대답은 요점과 목표를 행동에 사용하는 것이었다. 대답에서 언급했듯이, 도움이 될지 확신 할 수는 없지만 시도할만한 가치가 있다고 생각했습니다. 나는 해결책을 찾았습니다. 그것은 정말로 행동을 끄지 않지만, 작동해야합니다. – Brady

3

것은

python $SOURCE > $TARGET 

가 자동으로 파이썬에 대한 종속성을 추가하도록 SCons는, 당신은 호출을 결정하는 작업의 최소한의 구문 분석을 수행한다는 것이다. 또한 작업의 md5에 TEXT 작업도 포함됩니다.

  • 추가 종속 명령 줄
  • 을 변경 anotherprog

  • 에 파이썬에

    1. 제거 의존성 : 당신이

      anotherprog -cmd python $SOURCE > $TARGET 
      

      로 변경할 경우 3 변화를 감지 할 수 있도록 이것은 당신이 anotherprog를 변경한다면 틀림없이 재건을해야한다는 점에서 반 정당하다.

      넌 때문에 발생하지 않습니다

      anotherprog $(-time $DATE $) $SOURCE > $TARGET 
      

      anotherprog $(-date $TIME $) $SOURCE > $TARGET 
      

      을 변경 SCons는이 중요하지 않은 비트 '$ ('와 '$)를'포함하여 명령 라인 변경을 검출 중지 할 재건. 당신이 당신은 내가 그것을 시도하지 않은 해야하는 건 무엇을 할 것

      $(anotherprog =cmd python $) $SOURCE > $TARGET 
      

      $(python $) $SOURCE > $TARGET 
      

      이 있다면

      그래서 나는 추측에는 요.