Build 在由几个程序组成的项目中使用SCON

Build 在由几个程序组成的项目中使用SCON,build,scons,Build,Scons,我正在尝试为我的项目创建一个基于SCON的构建系统 该项目由几个目录组成,每个目录包含整个项目的一部分。 每个目录都包含共享库、程序或进程(守护进程)的源代码。 一个目录(bin)包含所有共享库和所有可执行文件 大多数目录已经包含一个sconscript文件(名为sconstuct),该文件构建目录的模块(lib/executable)并将其放入bin目录中 现在,我想再创建一个sconscript-来管理它们所有.. 在父目录中,我需要一个sconscript,用于构建项目的所有库和可执行文件

我正在尝试为我的项目创建一个基于SCON的构建系统

该项目由几个目录组成,每个目录包含整个项目的一部分。
每个目录都包含共享库、程序或进程(守护进程)的源代码。
一个目录(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
    ...  
    """)  
    附加(所有用户实现的库)
    
  • 构建基础LIB:
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    对于项目中的项目:
    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)
    
  • 这些脚本分散在相应的lib/exec目录中,单独执行时可以正常工作。
    现在我想在父目录中再添加一个脚本(如原始问题中的脚本),它将根据需要构建整个产品—所有可执行文件和所有底层库


    谢谢。

    看来,您需要将构建系统从多个sconstruct文件重构为一个。我没有看到其他方法。@Torsten事实上,唯一的其他方法是使用我在回答中解释的层次结构构建。将所有内容放在一个脚本中可能会非常混乱。是的,分层构建是可用的