2014-09-19 2 views
1

오늘 이상한 SCons 동작이 발생합니다.SCons를 사용하여 배열에서 추가/제거하는 이상한 동작

내 문제는 다음과 같습니다 (더 나은 해결 방법이있는 경우 Skons에 익숙하지 않습니다.) SCons 스크립트는 .cu cuda 파일과 .cpp C++ 파일을 작성합니다. 우리가 C++ 11을하고 있기 때문에 C++ 파일을 위해서는 -std = C++ 0x 플래그가 필요하지만 nvcc는 실제로 그 플래그를 좋아하지 않습니다.

그래서 C++ 파일을 컴파일하는 동안 플래그를 임시로 추가하고 cuda 파일을 컴파일하는 동안 제거해야합니다. 내 cpponlyflags (이 경우 -std=c++0x) 그래서 추가됩니다 나는 결국 대신이 모든 시간,

def defaultLibConstructObjs(self,targetName,env,avoided=[]): 
     constructedObjects=[] 
     oldcppflags=env["CPPFLAGS"] 
     print(env["CPPFLAGS"]) 
     for ext in ["cu","c","cpp"]: 
     if ext == "cu": 
       prefix = ext 
      else: 
       prefix = "" 
      if ext == "cpp": 
       env["CPPFLAGS"]+=env["CPPONLYFLAGS"] 
     constructedObjects.append(self.constructObjs(targetName,env,ext,prefix,avoided)) 
     env["CPPFLAGS"]=oldcppflags 
     return constructedObjects 

가 그래서 각 루프 회전에서 변경 될 env["CPPFLAGS"]을 기대 :

나는 이런 식으로 뭔가를 시도 내가 defaultLibConstructObjs를 호출 한 횟수가리스트 인 -std=c++0x.

답변

2

마치 SCons에 익숙하지 않은 것처럼 보이지만 파이썬에도 비슷합니다. ;)

oldcppflags=env["CPPFLAGS"] 

당신은 변수에 환경에 대한 "참조"를 저장하고 있지만 내용의 전체 복사본을 만들지는 않습니다. 환경이 실제 문제에 대해 ... 어쨌든

변경됩니다 이유 : 당신이이를 통과 할 수

다음
cuda_env = Environment(...) # default, without the offending flags 
std_env = cuda_env.Clone() # create a copy 
std_env.Append(CPPFLAGS=['-std=c++0x']) 

: 더 SConsish 방법은 설정에 최상위 SConstruct에서 두 환경이 될 것입니다 귀하의 하위 폴더 SConscripts (내보내기/가져 오기 방법 참조)

cuda_env.Program('foo', Glob('*.cu')) 

또는, 거기에 사용

std_env.Library('bar', Glob('*.cpp')) 

을 필요에 따라 설치하십시오. 동일한 SConscript 내에서도 어떤 파일을 어떤 환경에서 생성하는지 자유롭게 혼합 할 수 있습니다! 예를 들어 autotools와 같이 빌드 환경에 폴더 위주의 경계가 없습니다. 프로젝트에 행운이 있기를 바랍니다. 더 이상의 질문이 있으시면 scons-serss.scons.org의 SCons 사용자 메일 링리스트로 오셔야 할 수도 있습니다.

+0

안녕하세요, 당신은 맞습니다. 나는 파이썬으로 그렇게 많은 경험을하지 못했습니다. 내 잘못이야. 원본 문제 (cf 참조 VS 사본)가있는이 주제를 보는 사람들이 있다면 유용한 링크가 있습니다. http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list- in-python) 감사합니다. – MisterJ

+0

편집 : 내가 추가 한 링크에 언급 된 솔루션 중 아무 것도 작동하지 않습니다. 그것은 SCons와 관련이 있습니까? – MisterJ

+0

심지어 개체 건물 뒤에 단계가있는 경우 : 'if (ext == cpp) : env [ "CPPFLAGS"] = env [ "CPPFLAGS"] [: 1]' 디버그 출력시 cpp 파일을 빌드해야합니다, std = C++ 0x 플래그를 볼 수 있지만 실제 빌드 시간에, 그것은 dissapeared .... 그래서 당신의 다중 env 솔루션은 – MisterJ