2017-12-06 12 views
0

나는 make를 사용하여 컴파일 할 때 사용했던 프로젝트에서 작업하고 있습니다. 이제 대신 scons를 사용하여 Sconstruct 파일을 만들었습니다.Scons를 별도의 폴더에 오브젝트 파일을 만드는 방법

그럼에도 불구하고 나는 scons가 .so 파일 (내 소스 파일 (.c) 옆에 성가신 파일)을 놓는 위치에 크게 불만을 나타 냈으며 파일을 만드는 방법을 이해할 수없는 것처럼 보입니다. 빌드하는 동안 특정 폴더에.

"VariantDir()", "env.VariantDir()", "variant_dir = ..."등의 호출을 여러 번 시도했지만 아직 아무 것도 작동하지 않았습니다. 내가 원하는 것은 내가 .o 파일이 어디서 내 소스 파일과 섞이지 않도록 폴더를 선택할 수있게 해주는 옵션이다. 사람이 통찰력이 있다면 나는 거의 남아있는 머리를하지 않는

### Imports ### 
import os 

### Environment de compilation ### 

# Dossier et nom du binaire 
binFolder = 'bin/' 
binName = 'sc.bin' 

# Outils de l'environnement 
env = DefaultEnvironment(
    tools = [ 'gcc', 'link' ], 
) 

# Chaine de compilation 
env.PrependENVPath('PATH', os.path.abspath('path/to/cross/compiler')) 
prefix = 'cross-compiler-prefix' 
env['CC'] = prefix + env['CC'] 


### Fichiers a compiler ### 
srcFiles = [ 
    'some', 
    'source', 
    'files' 
] 

### Dossiers a inclure (headers) ### 
includeFolders = [ 
    'some', 
    'include', 
    'folders' 
] 

### Flags de compilation ### 
compilationFlags = '-some -compilation -flags' 

### Librairies externes ## 
libs = [ 
    'some', 
    'libraries' 
] 

### Regle de generation sc.bin ### 
sc_multi = env.Program(
    binFolder+binName, 
    srcFiles, 
    CDEFINES = {'SOME_MACRO':'SOME_VALUE'}, 
    CPPPATH = includeFolders, 
    CFLAGS = compilationFlags, 
    LIBS = libs, 
) 

# Par default, on genere la cible sc_multi 
Default(sc_multi) 
Alias('sc_multi', sc_multi) 

가 공유하십시오

는 여기에 지금까지 무슨 짓을했는지의 맛입니다. Thx!

+0

에 (당신이 가지고있는 SConstruct과 함께) 현재의 소스를 이동 새 하위 폴더 "src". 그런 다음 [SCons User Guide] (http://scons.org/doc/production/HTML/scons-user.html)에서 조리법을 적용하십시오. 특히 chap. 14 "계층 적 빌드"및 chap. 15 "소스 및 빌드 디렉토리 분리". **'VariantDir()'을 직접 사용하지 말고 대신'SConscript()'호출의'variant_dir ='옵션을 사용하십시오. 그건 자동으로 작동하도록해야합니다 ... – dirkbaechle

+0

당신은 내 [SCons Talks Repo] (https://bitbucket.org/dirkbaechle/scons_talks), 특히 폴더 "pyconde2013/examples/exvar"를 볼 수도 있습니다. " 실습 예제를 찾을 수 있습니다. – dirkbaechle

+0

문제는 다음과 같습니다 : 1 - 소스 파일은 내 것이 아닌 git submodule의 일부입니다. 즉, 업스트림을 변경할 수 없으므로 "현재 소스를 새 하위 폴더로 옮길"수 없습니다. ... 2 - 필자는 Sconscript 파일이 없으므로 사실대로 하나의 메이크 파일을 만들지 않아도 돼서 고마워. 단지 하나의 Sconstruct 파일을 가질 수 없습니까? – Fointard

답변

0

확인.

: 나는 당신의 SConstruct이의이 나무는 다음과 같습니다 가정 해 봅시다

을의 위치에서 당신이 정말로 서브 디렉토리에 소스 파일에 대해 얘기하는 것을 (또는 적어도 다른 디렉토리) 위의 의견에 따라 가정거야 여기

- SConstruct 
- Git_Submodule_Directory 
    |--- a.c 
    |--- b.c 
- bin 
    |--- a.o 
    |--- b.o 
는 SConstruct입니다 :

env=Environment() 

binName='my_favorite' 
### Fichiers a compiler ### 
srcFiles = [ 
    'a.c', 
    'b.c', 
] 

### Dossiers a inclure (headers) ### 
includeFolders = [ 
    'git-submodule', 
] 

### Flags de compilation ### 
compilationFlags = '-some -compilation -flags' 

### Librairies externes ## 
libs = [ 
    'm', 
] 

VariantDir('bin','git-submodule') 

var_src = ["#bin/"+f for f in srcFiles] 


### Regle de generation sc.bin ### 
sc_multi = env.Program(
    "#bin/"+binName, 
    var_src, 
    CDEFINES = {'SOME_MACRO':'SOME_VALUE'}, 
    CPPPATH = includeFolders, 
    CFLAGS = compilationFlags, 
    LIBS = libs, 
) 

# Par default, on genere la cible sc_multi 
Default(sc_multi) 
Alias('sc_multi', sc_multi) 

자식 - 서브 모듈/AC

#include <stdio.h> 

void another() 
{ 
    printf("Another\n"); 
} 

git-submodule/b.c

/* Hello World program */ 

#include<stdio.h> 

extern void another(); 

int main() 
{ 
    printf("Hello World"); 
    another(); 
    return(0); 
} 

이 방법이 도움이 되나요? 빌드 출력 :

scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
gcc -o bin/a.o -c -Igit-submodule bin/a.c 
gcc -o bin/b.o -c -Igit-submodule bin/b.c 
gcc -o bin/my_favorite bin/a.o bin/b.o -lm 
scons: done building targets. 

참고 : VariantDir()에 중복 = 0을 추가 할 수하는 것은 다음 출력은 다음과 같습니다

scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
gcc -o bin/a.o -c -Igit-submodule git-submodule/a.c 
gcc -o bin/b.o -c -Igit-submodule git-submodule/b.c 
gcc -o bin/my_favorite bin/a.o bin/b.o -lm 
scons: done building targets.