2017-02-27 1 views
0

나는 scons 2.3.0에서 이상한 행동을보고있다. 아마도 다시는 destinationslibsrc에서 그들을 명명 된 라이브러리를 가지고 복사 할 수있는 ...scons가 파일 대상 경로를 무시하고 있습니까?

destinations = [base_dir+'lib/', base_dir+'tree/usr/local/lib/'] 
boost_ver = '1.63.0' 
boost_libs = (x for x in env['LIBS'] if 'boost_' in x) 
# eg. 'boost_thread', 'boost_system' 

for dest in destinations: 
    for lib_name in boost_libs: 
     lib_so = 'lib'+lib_name+'.so' 
     lib_so_ver = lib_so+'.'+boost_ver 

     env.Command(dest+lib_so_ver, libsrc+lib_so_ver, Copy("$TARGET","$SOURCE")) 
     env.Command(dest+lib_so, dest+lib_so_ver, SymLink) 

점을 난 그냥 그것을 잘못 ™를하고 있어요,하지만 분별되어야한다처럼이 보인다 비 버전 심볼릭 링크. (base_dirlibsrc는 절대 경로입니다 비록 SCons는 출력 트리 내부 base_dir 점.)

이 하나의 대상에 대해 잘 작동하지만, 복사 또는 연결 결코 다른 어떤 대상에 대해 발생하지 않습니다. 명시 적 종속성을 env.Depends과 함께 추가하려고했습니다. 결과에 변수를 할당하고 나중에 사용하려고 시도했습니다. 아무것도 작동하지 않는 것 같습니다.

출력이 --tree 인 경우 첫 번째 대상의 파일 만 표시됩니다. 그 이후의 것들은 절대로 존재하지 않습니다. (나열된 순서를 변경하면 나열된 순서대로 표시됩니다.)

각 대상에 대한 별칭 대상을 추가하고 명령 결과가 Depends 인 경우 두 개의 별칭 대상이 트리에 나타나지만 첫 번째 대상에만 하위 항목이 있습니다. 두 번째 나타나는 것은 항상 자식이 없습니다.

명령 줄에 두 번째 별칭 대상을 명시 적으로 지정하더라도 아무것도 수행하지 않고 --tree에 자식을 인쇄하지 않습니다. 목적지를 재주문 만하면 아무 것도 할 수 있습니다. 물론 다른 하나는 작동을 멈 춥니 다.

기본적으로 모든 주어진 입력 파일에 대해 하나의 동작 만 가능하고 경고없이 많은 횟수의 소스 파일 사용을 완전히 무시하는 것처럼 보입니다. 그냥 너트 같아.

+0

'SymLink' 메쏘드 (?)가 무엇을하고 있는지 그리고 왜 어떤 인자가 필요없는 것 같은지 조금 더 말해 줄 수 있습니까? UserGuide/sources에서이 이름을 가진 메소드/팩토리를 찾을 수 없습니다 ... SCons 2.3.0 또는 최신 2.5.1은 아닙니다. – dirkbaechle

+0

단지 로컬에서 정의 된 파이썬 함수 ('def SymLink (target, source, env)')입니다. 표준 scons [사용자 지정 동작 확장 메커니즘] (http://scons.org/doc/2.3.0/HTML/scons-user.html#chap-builders-commands)을 사용하고 있으며이 문제와 관련이 없습니다. – Miral

+0

설명 : 단일 대상에 대해 사본과 심볼릭 링크가 모두 작동합니다. scons가 추가적인'Command'를 무시하고있는 것처럼 보이기 때문에 사본이나 심볼릭 링크가 추가 목적지를 위해 작동하지 않습니다. 왜 이런 일이 일어나는가에 대한 유일한 이론은 모든 대상 간의 각 쌍의 첫 번째 명령에 대해 소스가 동일하다는 것입니다. 그러나 이것이 실제로 이유가된다면 실패 할 수있는 멍청한 이유처럼 보입니다. – Miral

답변

0

이것은 Scons에서는 문제가 아니지만 Python에서는 문제가되었습니다.

boost_libs = (x for x in env['LIBS'] if 'boost_' in x) 

어떤 이유 (분명 내 파이썬-FU가 충분하지 않습니다)이 첫 번째 대상에 대해 한 번만 실행 위의 루프 내부에 결과 : 진짜 문제 ™이 정의입니다.

용액 대신 대괄호를 사용하는 것이다

boost_libs = [x for x in env['LIBS'] if 'boost_' in x] 

이 정확하게 모든 대상에 대한 내부 루프를 실행한다.

+0

참고로, 이제 그 이유를 알았습니다 - 괄호가있는 구문은 한 번만 반복 할 수있는 생성기입니다. 반대로 대괄호는 여러 번 반복 될 수있는 목록입니다. 그냥 혼란 스럽기 만하면 튜플 (괄호도 사용)이 여러 번 반복 될 수 있습니다. – Miral

+0

(튜플에 대한 혼란스러운 점은 코드가 이전에'('boost_thread', 'boost_system')'을 읽었으며 이것이 예상대로 작동했음을 나타 냈지만 괄호를 유지하면서 식을 사용했기 때문에 이것은 내 잘못이었습니다. 분명히 생성자에 대해 알지 못하기 때문에, 이전 개발자는 목록 대신 튜플을 사용하여 혼란에 기여했습니다.) – Miral

관련 문제