我正在尝试为我的项目创建一个基于scons的构建系统。
该项目由几个目录组成,每个目录都包含整个项目的一部分 每个目录都包含共享库,程序或进程(守护程序)的源 一个目录( bin )包含所有共享库和所有可执行文件。
大多数目录已经包含一个sconscript文件(名为 Sconstruct ),该文件构建目录的模块(lib / executable)并将其放在 bin 目录中。
现在我想再创建一个sconscript - 统治它们所有 在父目录中,我想要一个构建项目的所有库和可执行文件的sconscript,以便在我更改几个源之后,我可以从父项运行 scons 将重建目录和所有受影响的模块。
我尝试了几种方法,但都失败了 我在scons业务中相当不错,我认为这是我失败的根本原因,但我确信这个问题已被其他更有经验的开发人员多次解决 - 因为我所描述的情况很常见。
所以,欢迎任何建议!
编辑:
我父目录中的当前Sconstruct如下所示:
import os
env = os.environ
Export('env', 'os')
SConscript([
'Server1_Dir/Sconstruct',
'Server2_Dir/Sconstruct',
'Server3_Dir/Sconstruct'
])
子目录中的Sconstructs(我知道它们应该被称为Sconscript)以:
开头import os
Import('env')
home=env.get('HOME')
所以在我看来,我为所有脚本使用相同的环境,虽然我得到了很多:
scons: warning: Two different environments were specified for target....
警告,对我来说不清楚。
值得注意的是,并非主脚本中的所有服务器组合都会产生这些警告 - 有些可能会和平地放在一起,但不是全部。
在我看来,这是正确的方法,但我无法找到摆脱这些警告(以及它们的根本原因)的方法。
感谢。
答案 0 :(得分:0)
您要做的事情称为here描述的分层构建。在SCons中,每个项目只能有一个SConstruct。
在SCons中创建分层构建的方法是使根SCons脚本成为SConstruct,子目录SCons脚本称为SConscript。根SConstruct脚本使用上面链接中描述的SConscript()函数“加载”子目录SConscripts。
这是一个假设你有一个根SConstruct和一个lib和bin子目录的例子:
<强> SConstruct 强>
env = Environment()
SConscript('lib/SConscript', exports='env')
SConscript('bin/SConscript', exports='env')
<强> LIB / SConscript 强>
Import('env')
env.Library('yourlib', ['yourLibSource.cc'])
<强>仓/ SConscript 强>
Import('env')
env.Program('yourbin', ['yourBinSource.cc'])
答案 1 :(得分:0)
在我尝试统一它们之前,我的脚本看起来像以下(并且正常工作):
环境与定义:
~~~~~~~~~~~~~~~~~~~~~~
import os env = os.environ home = env.get('HOME') projects = [] third_parties_projects = [] my_rpath = []
准备路径和文件列表:
~~~~~~~~~~~~~~~~~~~~~~~~~
all_user_implemented_libs = os.path.join(home,"Project/lib/") my_rpath.append("/path/to/lib/dir/") projects.append(os.path.join(home,"Project/library_1/")) projects.append(os.path.join(home,"Project/library_2/")) ... third_parties_projects.append("/opt/some_product/include/") ... so_files = Split(""" source_1.cpp source_2.cpp ... """)
控制构建:
~~~~~~~~~~~~~~~~
myprog = Environment(CXXFLAGS = flags, ENV = env, CPPPATH = projects + third_parties_projects + ['.'], RPATH = my_rpath) myprog.Decider('MD5') mylib = myprog.SharedLibrary(all_user_implemented_libs + 'lib_name', so_files) myprog.Default(mylib)
环境与定义:
~~~~~~~~~~~~~~~~~~~~~~
import os env = os.environ home = env.get('HOME') projects = [] third_parties_projects = [] user_libpaths = [] my_rpath = []
准备路径和文件列表:
~~~~~~~~~~~~~~~~~~~~~~~~~
projects.append(os.path.join(home,"Project/library_1/")) projects.append(os.path.join(home,"Project/library_2/")) .... my_rpath.append("/path/to/lib/dir/") third_parties_projects.append("/opt/some_product/include/") ... all_user_implemented_bins = os.path.join(home,"Project/bin/") all_user_implemented_libs = os.path.join(home,"Project/lib/") flags = '' libs = Split(""" lib_1 lib_2 ... """) third_party_libpaths.append("/opt/some_product/") ... source_ext_files = Split(""" ext_source_1.cpp ... """) source_files_for_executable = Split(""" source_1.cpp sosurce_2.cpp ... """) user_libpaths.append(all_user_implemented_libs)
构建底层文件:
~~~~~~~~~~~~~~~~~~~~~~
for project in projects: SConscript(project+'/Sconstruct')
控制构建:
~~~~~~~~~~~~~~~~
myprog = Environment(CXXFLAGS = flags, ENV = env, CPPPATH = projects + third_parties_projects + ['.'], RPATH = my_rpath) myprog.Decider('MD5') my_prog = myprog.Program(all_user_implemented_bins + 'process_name', source_files_for_executable + source_ext_files, LIBS = libs, LIBPATH = third_party_libpaths + user_libpaths) myprog.Default(my_prog)
这些脚本分散在相应的lib / exec目录中,单独执行时工作正常 现在我想在父目录中再添加一个脚本(如原始问题中的那个),它将构建整个产品 - 所有可执行文件和所有底层库 - 必要时。
感谢。