我正在处理一个我们以前用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)
如果有人有洞察力,请分享,因为我几乎没有留下任何头发。 谢谢!
答案 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.