2015-01-05 2 views
0

SConscript에서 scons 함수 Glob의 사용과 관련된 이상한 오류가 발생했습니다. 내 실제 빌드 스크립트는 더 복잡하지만 다음과 같은 최소한의 예제로 좁혔습니다. 기본 SConstruct에서 SConscript에서 Glob을 사용하여 scons 오류가 발생했습니다.

:

SConscript('SConscript', 
      variant_dir='build') 

다음, SConscript에서 :

Glob('*.cc') 

이 오류 메시지 TypeError : Tried to lookup Dir 'build' as a File.으로 종료 이는 V2.1.0 및 v2.3.0 모두에서 테스트되었습니다 .

많은 해결 방법을 찾았지만 어느 것도 완전히 만족스럽지 않습니다.

  • SConscript를 하위 디렉토리로 이동하면 오류없이 scons가 실행됩니다. 그러나 그렇게되면 내 전체 src 트리가 하위 디렉토리로 이동해야하므로 지저분한 느낌이 들게됩니다.
  • scons를 실행하기 전에 build 디렉토리를 만들면 scons가 오류없이 실행됩니다. 그러나이 작업은 추가 단계가 필요하며 빈 디렉토리는 git과 잘 작동하지 않습니다.
  • SConscript를 호출하기 전에 Execute(Mkdir('build')) 행을 추가 할 수 있습니다. 그러나 이것은 scons -n으로 드라이 런을 수행 할 때 작동하지 않습니다.
  • duplicate=False으로 SConscript를 호출 할 수 있습니다. 오류가 발생하지 않습니다. 그러나 설명서를 이해하면 포함 파일의 위치에 따라 빌드에서 오류가 발생할 수 있습니다.

나는 근본적으로 문제의 근본 원인을 이해하지 못하고있다. 이 문제에 대한 깨끗한 해결책이 있습니까?

편집 : 오류 메시지의 원인이되는 코드뿐만 아니라 내 의도에 대한 추가 세부 정보를 추가해야합니다. 나는 리눅스 실행 파일과 Windows 실행 파일을 동시에 컴파일하기위한 빌드 파일을 만들려고 시도하고있다.

먼저 SConstruct에 컴파일 환경을 설정하십시오.

import os 

win32 = Environment() 
win64 = Environment() 
linux = Environment() 

#Define the working directory 
win32['SYS'] = 'win32' 
win64['SYS'] = 'win64' 
linux['SYS'] = 'linux' 

#Define the compilers 
win32.Replace(CXX='i686-w64-mingw32-g++') 
win64.Replace(CXX='x86_64-w64-mingw32-g++') 

#Define the appropriate file formats 
win32.Replace(SHLIBPREFIX='') 
win32.Replace(SHLIBSUFFIX='.dll') 
win32.Replace(PROGSUFFIX='.exe') 
win32.Append(LINKFLAGS='-static') 
win64.Replace(SHLIBPREFIX='') 
win64.Replace(SHLIBSUFFIX='.dll') 
win64.Replace(PROGSUFFIX='.exe') 
win64.Append(LINKFLAGS='-static') 

for env in [win32,win64,linux]: 
    build_dir = os.path.join('build',env['SYS']) 
    exe = SConscript('SConscript', 
        variant_dir=build_dir, 
        exports=['env']) 

그런 다음 SConscript에 실제 빌드 규칙이 있습니다.

Import('env') 

env.Append(CPPPATH=['include']) 

for main in Glob('*.cc'): 
    env.Program([main, Glob('src/*.cc')]) 

scons -n로 호출 할 때 위의 에러 메시지를 나타낸다.

+0

SConstruct 및 SConscript의 전체 내용을 표시하지 않으므로 완전한 예는 아닙니다. 깨끗한 MWE가 없어도 깨끗한 솔루션을 제공하기는 어렵습니다. ;) – dirkbaechle

+0

나는 오류의 실제 예제로 압축하여 생각하면 진단하기가 더 쉬울 것이라고 생각했기 때문에 사과드립니다. 내가 성취하려고하는 것에 대한 추가 세부 사항으로 게시물을 편집 할 것입니다. –

+0

원본 폴더 또는 최상위 위치에 'build.cc'파일이 있습니까? – dirkbaechle

답변

2

문제는 variant_dir을 사용하여 빌드 폴더를 "." "링크"하는 것입니다. 소스 디렉토리로. 기본 "duplicate = 1"옵션과 함께 SCons는 모든 소스를 "빌드"로 복제하려고 시도하지만, 후자는 소스 폴더의 일부이기도합니다. 이것은 모든 종류의 합병증과 순환 의존성에 대한 문호를 열어줍니다.

깨끗한 해결책은 모든 소스를 자신의 하위 디렉토리에 넣는 것입니다 (예 : 당신이 바로 이런 일을 할 것이다

SConscript('src/SConscript', variant_dir='build') 

로 포함 된 SConscript를 참조 할 수 있도록 "SRC".이것이 선호되는 설정이며,이 협약이 마음에 들지 않더라도 차후에 두통으로부터 당신을 구하기 위해 어쨌든 그것을 채택해야합니다.

추가 팁 : 당신은 (그리고해야) 대신

win32 = Environment() 
win64 = Environment() 
linux = Environment() 

win32 = Environment() 
win64 = win32.Clone() 
linux = win32.Clone() 

를 사용하여 일부 시작 시간을 절약 할 수 있습니다. 후자의 경우 SCons는 시스템에서 세 번 연속으로 컴파일러/도구를 검색하도록 강요합니다. 한 번만 수행 한 다음 다른 환경에 복제()하고 빌드 별 설정으로 추가로 꾸미십시오.

관련 문제