我们是否需要每个源目录中的sconscript文件

Sri*_*ddy 3 python scons

我正在使用scons来编译我的项目.在我的项目中,源文件位于不同的目录中.我们是否需要在每个目录中使用sconscript文件来编译这些项目源文件?

我试图使用单个sconscript文件编译所有目录.但是所有目标文件都只添加到我的源目录中.

我正在使用这个功能:

env.Library('libs',files_list)
Run Code Online (Sandbox Code Playgroud)

如果files_list包含唯一的文件名,则Obj文件正在生成@variable目录.

如果files_list包含文件路径名,则Obj文件正在生成@ source目录.

你能告诉我怎么做吗?

Bra*_*ady 14

我准备了一个示例,演示了如何使用SCons VariantDir()函数只使用一个SConstruct脚本(没有子SConscripts)来编译像您这样的项目.我决定在单独的答案中这样做,以便更容易阅读.

VariantDir()函数没有很好地记录,因此您提到的有关编译对象文件放置的行为不是直接修复的."技巧"是指变体目录中的所有源文件,而不是实际的源目录,如下所示.

这是我项目中源文件的结构:

$ tree .
.
??? SConstruct
??? src1
?   ??? class1.cc
?   ??? class1.h
??? src2
?   ??? class2.cc
?   ??? class2.h
??? srcMain
    ??? main.cc
Run Code Online (Sandbox Code Playgroud)

这是SConstruct:

env = Environment()

# Set the include paths
env.Append(CPPPATH = ['src1', 'src2'])

# Notice the source files are referred to in the build dir
# If you dont do this, the compiled objects will be in the src dirs
src1Sources = ['build/lib1/class1.cc']
src2Sources = ['build/lib2/class2.cc']
mainSources = ['build/mainApp/main.cc']

env.VariantDir(variant_dir = 'build/lib1', src_dir = 'src1', duplicate = 0)
env.VariantDir(variant_dir = 'build/lib2', src_dir = 'src2', duplicate = 0)
env.VariantDir(variant_dir = 'build/mainApp', src_dir = 'srcMain', duplicate = 0)

lib1 = env.Library(target = 'build/lib1/src1', source = src1Sources)
lib2 = env.Library(target = 'build/lib1/src2', source = src2Sources)
env.Program(target = 'build/mainApp/main', source = [mainSources, lib1, lib2])
Run Code Online (Sandbox Code Playgroud)

这是编译输出:

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o build/lib1/class1.o -c -Isrc1 -Isrc2 src1/class1.cc
ar rc build/lib1/libsrc1.a build/lib1/class1.o
ranlib build/lib1/libsrc1.a
g++ -o build/lib2/class2.o -c -Isrc1 -Isrc2 src2/class2.cc
ar rc build/lib1/libsrc2.a build/lib2/class2.o
ranlib build/lib1/libsrc2.a
g++ -o build/mainApp/main.o -c -Isrc1 -Isrc2 srcMain/main.cc
g++ -o build/mainApp/main build/mainApp/main.o build/lib1/libsrc1.a build/lib1/libsrc2.a
scons: done building targets.
Run Code Online (Sandbox Code Playgroud)

以下是编译后生成的项目结构:

$ tree .
.
??? build
?   ??? lib1
?   ?   ??? class1.o
?   ?   ??? libsrc1.a
?   ?   ??? libsrc2.a
?   ??? lib2
?   ?   ??? class2.o
?   ??? mainApp
?       ??? main
?       ??? main.o
??? SConstruct
??? src1
?   ??? class1.cc
?   ??? class1.h
??? src2
?   ??? class2.cc
?   ??? class2.h
??? srcMain
    ??? main.cc
Run Code Online (Sandbox Code Playgroud)

应该提到的是,更直接的方法是使用SConscript()函数,指定variant_dir,但如果您的要求不允许这样做,则此示例将起作用.该SCons的手册页有关于VariantDir()函数的更多信息.在那里你还会发现以下内容:

请注意,VariantDir()最自然地使用辅助SConscript文件.