2

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

该项目由几个目录组成,每个目录都包含整个项目的一部分。
每个目录都包含共享库、程序或进程(守护程序)的源代码。
一个目录 ( bin ) 包含所有共享库和所有可执行文件。

大多数目录已经包含一个 sconscript 文件(名为Sconstruct),该文件构建目录的模块(lib / 可执行文件)并将其放在bin目录中。

现在我想再创建一个 sconscript - 来统治它们。在父目录中,我想要一个sconscript
来构建项目的所有库和可执行文件,这样在我在这里和那里更改一些源之后,我可以从父目录和所有受影响的模块将被重新构建。

我尝试了几种方法,但都失败了。
我是 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....  

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

谢谢。

4

2 回答 2

0

在我尝试统一它们之前,我的脚本如下所示(并且工作正常):

图书馆建设脚本结构:

  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)  
    

流程构建脚本结构:

  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)
    

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

谢谢。

于 2012-12-17T13:38:03.353 回答
0

您想要做的称为分层构建,如此所述。在 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'])

bin/SConscript

Import('env')
env.Program('yourbin', ['yourBinSource.cc'])
于 2012-12-09T17:58:02.213 回答