使用scons作为由几个程序组成的项目

时间:2012-12-09 17:07:26

标签: build scons

我正在尝试为我的项目创建一个基于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....  

警告,对我来说不清楚。
值得注意的是,并非主脚本中的所有服务器组合都会产生这些警告 - 有些可能会和平地放在一起,但不是全部。 在我看来,这是正确的方法,但我无法找到摆脱这些警告(以及它们的根本原因)的方法。

感谢。

2 个答案:

答案 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)

在我尝试统一它们之前,我的脚本看起来像以下(并且正常工作):

Librarry building-script Stracture:

  1. 环境与定义:
    ~~~~~~~~~~~~~~~~~~~~~~

    import os  
    env = os.environ  
    home = env.get('HOME')  
    projects = []  
    third_parties_projects = []  
    my_rpath = []
    
  2. 准备路径和文件列表:
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    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  
        ...  
                """)
    
  3. 控制构建:
    ~~~~~~~~~~~~~~~~

    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)  
    
  4. 流程构建脚本Stracture:

    1. 环境与定义:
      ~~~~~~~~~~~~~~~~~~~~~~

      import os  
      env = os.environ  
      home = env.get('HOME')  
      projects = []  
      third_parties_projects = []  
      user_libpaths = []  
      my_rpath = []
      
    2. 准备路径和文件列表:
      ~~~~~~~~~~~~~~~~~~~~~~~~~

      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)
      
    3. 构建底层文件:
      ~~~~~~~~~~~~~~~~~~~~~~

      for project in projects:  
          SConscript(project+'/Sconstruct')
      
    4. 控制构建:
      ~~~~~~~~~~~~~~~~

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

      感谢。