Build 在由几个程序组成的项目中使用SCON
我正在尝试为我的项目创建一个基于SCON的构建系统 该项目由几个目录组成,每个目录包含整个项目的一部分。Build 在由几个程序组成的项目中使用SCON,build,scons,Build,Scons,我正在尝试为我的项目创建一个基于SCON的构建系统 该项目由几个目录组成,每个目录包含整个项目的一部分。 每个目录都包含共享库、程序或进程(守护进程)的源代码。 一个目录(bin)包含所有共享库和所有可执行文件 大多数目录已经包含一个sconscript文件(名为sconstuct),该文件构建目录的模块(lib/executable)并将其放入bin目录中 现在,我想再创建一个sconscript-来管理它们所有.. 在父目录中,我需要一个sconscript,用于构建项目的所有库和可执行文件
每个目录都包含共享库、程序或进程(守护进程)的源代码。
一个目录(bin)包含所有共享库和所有可执行文件 大多数目录已经包含一个sconscript文件(名为sconstuct),该文件构建目录的模块(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'
])
子目录中的sconstruct(我知道它们应该称为Sconscript)以以下内容开头:
import os
Import('env')
home=env.get('HOME')
因此,在我看来,我对所有脚本都使用相同的环境,尽管我得到了很多:
scons: warning: Two different environments were specified for target....
警告,我不清楚。还值得注意的是,主脚本中并非所有的服务器组合都会产生这些警告-有些可能会和平离开,但不是全部。
在我看来,这是正确的做法,但我无法找到摆脱这些警告(及其根本原因)的方法
谢谢。如前所述,您要做的就是所谓的分层构建。在SCON中,每个项目只能有一个SConstruct 在SCons中创建分层构建的方法是将根SCons脚本设置为SConstruct,并将子目录SCons脚本称为SConscript。根SConstruct脚本使用上面链接中描述的SConscript()函数“加载”子目录SConscripts 下面是一个示例,假设您有一个根SConstruct和一个lib和bin子目录: s施工
env = Environment()
SConscript('lib/SConscript', exports='env')
SConscript('bin/SConscript', exports='env')
Import('env')
env.Library('yourlib', ['yourLibSource.cc'])
Import('env')
env.Program('yourbin', ['yourBinSource.cc'])
lib/SConscript
env = Environment()
SConscript('lib/SConscript', exports='env')
SConscript('bin/SConscript', exports='env')
Import('env')
env.Library('yourlib', ['yourLibSource.cc'])
Import('env')
env.Program('yourbin', ['yourBinSource.cc'])
bin/SConscript
env = Environment()
SConscript('lib/SConscript', exports='env')
SConscript('bin/SConscript', exports='env')
Import('env')
env.Library('yourlib', ['yourLibSource.cc'])
Import('env')
env.Program('yourbin', ['yourBinSource.cc'])
在我尝试统一脚本之前,我的脚本如下所示(并且工作正常): 图书馆建筑脚本结构:
~~~~~~~~~~~~~~~~~~~~~~~~
导入操作系统
env=os.environ
home=env.get('home'))
项目=[]
第三方项目=[]
我的路径=[]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
all\u user\u implemented\u libs=os.path.join(home,“Project/lib/”)
my_rpath.append(“/path/to/lib/dir/”)
append(os.path.join(home,“Project/library_1/”))
append(os.path.join(home,“Project/library_2/”))
...
第三方项目。追加(“/opt/some\u product/include/”)
...
so_files=Split(“”)
来源1.cpp
来源2.cpp
...
""")
~~~~~~~~~~~~~~~~~~~~~
myprog=Environment(cxflags=flags,ENV=ENV,CPPPATH=projects+third\u parties\u projects+['.],RPATH=my\u RPATH)
myprog.Decider(“MD5”)
mylib=myprog.SharedLibrary(所有用户实现的库+“库名”,so文件)
myprog.Default(mylib)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
导入操作系统
env=os.environ
home=env.get('home'))
项目=[]
第三方项目=[]
用户_libpath=[]
我的路径=[]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
projects.append(os.path.join(home,“Project/library\u 1/”)
append(os.path.join(home,“Project/library_2/”))
....
my_rpath.append(“/path/to/lib/dir/”)
第三方项目。追加(“/opt/some\u product/include/”)
...
所有用户实现的bin=os.path.join(home,“Project/bin/”)
所有_user_实现的_libs=os.path.join(home,“Project/lib/”)
旗帜=“”
libs=拆分(“”)
lib_1
lib_2
...
""")
第三方libpath.append(“/opt/some\u product/”)
...
source\u ext\u files=拆分(“”)
ext_source_1.cpp
...
""")
可执行文件的源文件=拆分(“”)
来源1.cpp
sosurce_2.cpp
...
""")
附加(所有用户实现的库)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
对于项目中的项目:
SConscript(project+'/Sconstruct')
~~~~~~~~~~~~~~~~~~~~~
myprog=Environment(cxflags=flags,ENV=ENV,CPPPATH=projects+third\u parties\u projects+['.],RPATH=my\u RPATH)
myprog.Decider(“MD5”)
my_prog=myprog.Program(所有_user_实现的_bin+‘进程名称’、源文件(用于可执行文件)和源文件(用于外部文件),LIBS=LIBS,LIBPATH=第三方_LIBPATH+用户_LIBPATH)
myprog.Default(my_prog)
现在我想在父目录中再添加一个脚本(如原始问题中的脚本),它将根据需要构建整个产品—所有可执行文件和所有底层库
谢谢。看来,您需要将构建系统从多个sconstruct文件重构为一个。我没有看到其他方法。@Torsten事实上,唯一的其他方法是使用我在回答中解释的层次结构构建。将所有内容放在一个脚本中可能会非常混乱。是的,分层构建是可用的