如何使Scons在单独的文件夹

时间:2017-12-06 13:13:00

标签: python scons

我正在处理一个我们以前用make编译的项目。现在我们想要使用scons,所以我已经创建了一个Sconstruct文件,似乎可以很好地处理它。

尽管如此,我对scons放置.o文件的位置(我的源文件(.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)

如果有人有洞察力,请分享,因为我几乎没有留下任何头发。 谢谢!

1 个答案:

答案 0 :(得分: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)

GIT-子模块/交流转换器

#include <stdio.h>

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

GIT-子模块/ 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.

注意:您可以将duplicate = 0添加到VariantDir(),然后输出为:

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.