2011-09-12 4 views
5

SCons가 소스 dir에서 빌드 dir로 Makefile 프로젝트를 복사하고 libmoo.a를 생성하기 위해 일부 명령을 실행하려고하지만 종속성주기 오류가 발생합니다. 세부 사항은 다음과 같습니다SCons : 종속성주기?

./SConstruct :

env = Environment() 
Export('env') 

dirs = ['.'] 

variant_dir = 'build' 

for dir in dirs: 
     SConscript(dir + '/' + 'SConscript', variant_dir=variant_dir + '/' + dir, duplicate=0) 

./SConscript :

import os 
Import('env') 

env.Command(env.Dir('moo2').abspath, env.Dir('#moo').abspath, ["echo copying moo to the build dir", Copy("$TARGET", "$SOURCE")]) 

env.Command(env.Dir('moo2/Makefile').abspath, env.Dir('moo2').abspath, 'echo would run moo2.configure') 

moolib = env.Command(env.Dir('moo2/libmoo.a').abspath, env.Dir('moo2/Makefile').abspath, 'echo would run make') 

Default(moolib) 

오류가 실행 SCons는 :

scons: *** Found dependency cycle(s): 
    build/moo2/Makefile -> build/moo2 -> build/moo2/Makefile 
    build/moo2/libmoo.a -> build/moo2 -> build/moo2/Makefile -> build/moo2/libmoo.a 
또한

.abspath를 사용하지 않고 시도했지만 그 shouldn를 상관 없어, 그렇지?

나는 어떤 사이클을 볼 수 없습니다 :

  • 빌드/MoO2이다가/libmoo.a 구축 필요/MoO2이다/메이크
  • 빌드/MoO2이다/메이크 MoO2이다가
  • 빌드/MoO2이다 필요한 빌드/필요 (소스 /) 무

주기가 어떻게 보이나요? build/moo2/Makefile은 build/moo2/libmoo.a에 의존한다고 생각하는 것 같습니다. 이것은 의도 한 것이 아닙니다.

모든 관련 제안

는 abspath 어디서나 SConscript 인치도 환영합니다 :-)

답변

5

env.Dir ('무')에 대한 필요가 없습니다 수 있습니다. 그래서로 변경합니다 :

Import('env') 
env.Command('moo2', '#moo', ["echo copying moo to the build dir", Copy("$TARGET", "$SOURCE")]) 
env.Command('moo2/Makefile', 'moo2', 'echo would run moo2.configure') # Look Here 
moolib = env.Command('moo2/libmoo.a', 'moo2/Makefile', 'echo would run make') 
Default(moolib) 

하지만 여전히 같은 오류 산출 :

scons: *** Found dependency cycle(s): 
build/moo2/Makefile -> build/moo2 -> build/moo2/Makefile 
build/moo2/libmoo.a -> build/moo2/Makefile -> build/moo2/libmoo.a 

그래서 이유가 있습니까? SCons는 디렉토리를 자동으로 포함 된 모든 파일에 종속시킵니다. "# Look Here"주석이있는 행을 참조하십시오. 의존성을 추가했습니다. moo2/Makefile은 이제 moo2에 따라 다릅니다. moo2는 기본적으로 모든 내용에 따라 달라 지므로주기가 달라집니다.

그래서 어떻게 수정합니까?

Import('env') 
env.Install('moo2',Glob('#moo/*')) 
env.Command('moo2/Makefile', env.Glob('moo2/*'), 'echo would run moo2.configure') 
moolib = env.Command('moo2/libmoo.a', 'moo2/Makefile', 'echo would run make') 
Default(moolib) 

Copy()를 env.Install()으로 변경했습니다. Copy는 Build Environment() 객체에 첨부되지 않으므로 변형 dir에 대해 알 수 없습니다. Install() 및 Copy()는 기능상으로 동일하며 env.Install()이 env를 인식합니다. 또한 디렉토리 자체보다는 디렉토리의 모든 파일을 복사/사용합니다. 이제

의 줄 수 있도록 시도한다 :

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python /Users/bdbaddog/devel/scons/trunk/bootstrap/src/script/scons.py --tree=prune 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
Install file: "moo/abc.c" as "build/moo2/abc.c" 
Install file: "moo/configure" as "build/moo2/configure" 
Install file: "moo/def.c" as "build/moo2/def.c" 
echo would run moo2.configure 
would run moo2.configure 
echo would run make 
would run make 
+-build/moo2/libmoo.a 
    +-build/moo2/Makefile 
    | +-build/moo2/abc.c 
    | | +-moo/abc.c 
    | +-build/moo2/configure 
    | | +-moo/configure 
    | +-build/moo2/def.c 
    | | +-moo/def.c 
    | +-/bin/echo 
    +-/bin/echo 
scons: done building targets. 

참고 "--tree = 치기"이 플래그는 SCons는 트리 (에 중복을 종속성 트리를 인쇄 및 가지 치기해야합니다 때문에이 개 파일이 의존하는 경우 동일한 파일 트리에서 한 번만 볼 수 있습니다)

+0

포스트에 감사드립니다. 너무 간단하게 몇 가지 파일을 내 variant 디렉토리에 복사하는 두 가지 명령을 사용하는 SConscript 파일 : 가져 오기 ('env') env.Install ('', Glob ('# kernels/* .cl')) – NoahR