2017-09-14 12 views
0

scons documentation에 따르면 subst 메서드는 이 구성 변수을 재귀 적으로 보간합니다. 그러나, 재귀하지 않는 것 :env.subst로 재귀 변수를 대체

e = Environment(CPPDEFINES = ["FOOBAR=${foobar}"]) 

e["foo"] = 1 
e["bar"] = "${foo + 1}" 
e["foobar"] = "$${foo + ${bar}}" 

# I want this to print "foobar: 3" 
print "foobar:", e.subst("${foobar}") 

e.Program("test.c") 

인쇄 :

scons: Reading SConscript files ... 
foobar: ${foo + 2} 
scons: done reading SConscript files. 
scons: Building targets ... 
gcc -o test.o -c -DFOOBAR=3 test.c 
gcc -o test test.o 
scons: done building targets. 

foobar가 제대로 아니라 인쇄 문, CPPDEFINES의 일부로서 컴파일시 평가된다. foobar를 완전히 평가하려면 subst을 얻으려면 어떻게해야합니까? 케니 스트롬에 의해 제안 표현

e["foobar"] = "${foo + ${bar}}" 

를 사용

+0

지금 당장 테스트 할 수있는 위치에 없기 때문에 문서에서 찾을 수 없으므로 완전한 대답을 게시 할 수는 없지만 $$은 비 - 평가 된 $. e [ "foobar"] = "$ {foo + $ {bar}}"를 제외하고 동일한 코드를 사용해보십시오. –

답변

0

, 도움이되지 않습니다. subst 메서드는 실제로 중첩 된 중괄호를 너무 잘 처리하지 않으므로 구문 오류가 발생합니다.

실제로 질문 : SConstruct에서 subst을 직접 사용하는 경우와 빌드 명령 내에서 사용되는 경우 다른 출력이 나타나는 이유는 무엇입니까? 우리가 SConstruct

print "CPPDEFINES:", e.subst("$CPPDEFINES") 

를 추가하는 경우

, 우리는 FOOBAR에 대해 동일한 출력 ${foo + 2}를 참조하십시오. 제작시의 차이는 내부 변수 $_CPPDEFFLAGS_defines 방법의 관점에서 선언되어있다 : (a print e.Dump())에서

'_CPPDEFFLAGS': '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}' 

. 이 _defines 메서드는 모든 변수를 subst_path을 통해 두 번째 실행하므로 포함 경로에 변수를 사용할 수 있습니다.

그래서 subst 방법은 옳은 일을하고있다, 당신은 다시 평가해야한다 :

print "foobar:", e.subst(e.subst("${foobar}")) 

이 같은 출력을 얻을 수 있습니다.

+0

고마워요! 그래서 설명서의 _recursive_ 단어가 잘못되었다고 생각하십니까? – Andak

+0

글쎄, 나는 여전히 변수의 단순한 텍스트 대체 *를 주장한다. 이것은 아마도 * 보간 된 단어의 의도 된 의미 일 것이다. 그러나 단일 파이썬 표현식의'eval'은 다소 특별합니다 ...차이점을보다 분명하게 만드는 방법에 대한 아이디어가 있으면 설명서에 대한 요청을 제출하십시오. – dirkbaechle

+0

죄송하지만 무례한 것으로 여겨지면 죄송합니다. 필자가 생각하기에 _recursive_ 힌트를 사용하면 대체 할 수있는 것이 없어 질 때까지 'subst'에 의해 _recursively_를 얻을 수있는 임의의 복잡한 표현식을 사용할 수 있다는 것을 알 수 있습니다. 그러나 당신이 말하는 것은 또한 의미가 있습니다. 나는 여기에서 열쇠가 "재귀 적으로 _interpolates_"라고 생각한다. – Andak

0

dirkbaechle이 무엇을 말했는지 분명히하기 위해; 에 의해이 작업을 수행 할 수 있습니다. 보간과 평가는 두 단계로 나누어 져 있습니다 (subst를 두 번 호출하여). 이것은 우리가 임의의 복잡한 식을 가질 수 있습니다 :

# Notice how we wrap foobar in $$ 
e = Environment(CPPDEFINES = ["FOOBARBAZ=$${${foobarbaz}}"]) 

e["foo"] = 1 
e["bar"] = "($foo + 1)" 
e["foobar"] = "($foo + $bar)" 
e["foobarbaz"] = "($foobar + $foobar)" 

print "foobarbaz after substituting once:", e.subst("$${${foobarbaz}}") 
print "foobarbaz after substituting twice:", e.subst(e.subst("$${${foobarbaz}}")) 

e.Program("test.c") 

인쇄 :

scons: Reading SConscript files ... 
foobarbaz after substituting once: ${((1 + (1 + 1)) + (1 + (1 + 1)))} 
foobarbaz after substituting twice: 6 
scons: done reading SConscript files. 
scons: Building targets ... 
gcc -o test.o -c -DFOOBARBAZ=6 test.c 
gcc -o test test.o 
scons: done building targets. 

다시 한번 감사, dirkbaechle!