<p>如果不将遗留的SConstruct中的一些功能重构到一个helper文件中,我认为没有办法做到这一点。你知道吗</p>
<p>如果可以重构代码,那么有三种可能的替代方法可用——一种是使用SCons中内置的现有SConscript机制,另一种是使用python模块,最后一种方法是使用site dir选项。你知道吗</p>
<p><strong>通过SConscripts重用</p>
<p>假设项目结构如下:</p>
<pre><code>.
├── common
│ └── SConscript
├── legacyProject
│ └── SConstruct
└── myProject
└── SConstruct
</code></pre>
<p>您的SConstruct文件将创建一个环境,然后执行<code>common/SConscript</code>,它返回一个修改过的环境。例如,如果您想在公共目录中收集一些选项,您可能会得到如下结果:</p>
<pre><code># common/SConscript
Import('env')
env['CCFLAGS'] = '-Wall -Wextra -pedantic'
Return('env')
</code></pre>
<p>以及</p>
<pre><code># myProject/SConstruct (similar for legacy/SConstruct)
env = Environment()
print 'before:', env['CCFLAGS']
env = SConscript('../common/SConscript', exports = 'env')
print 'after:', env['CCFLAGS']
</code></pre>
<p><em>如果:</em></p>
<ul>
<li>您熟悉SCons,但不太熟悉Python</li>
<li>您不希望将额外的标志传递给scon或设置环境变量</li>
<li>您试图不知道您使用的是哪种Python安装</li>
<li>你没有使用变体目录</li>
</ul>
<p><strong>通过Python模块重用</p>
<p>如果要将scons实用程序打包为python包,可以采用两种方法。你知道吗</p>
<p>首先是使用传统的Python打包技术。有一些很好的指南-我推荐<a href="https://packaging.python.org/en/latest/" rel="nofollow">Python Packaging User Guide</a>。要使其正常工作,您需要编写一个<a href="https://packaging.python.org/en/latest/distributing.html#setup-py" rel="nofollow">setup.py</a>,并使用<code>pip</code>或<code>python setup.py install</code>安装</p>
<p>使这个问题变得棘手的是,可以同时安装多个Python和scon,它们通过<a href="https://en.wikipedia.org/wiki/PATH_(variable)" rel="nofollow">PATH</a>环境变量微妙地耦合在一起。这可能意味着在一台机器上工作的东西可能在另一台机器上不工作。你知道吗</p>
<p>一种更常见的方法是修改python用于在sconstruct中搜索模块的路径——从python的角度来看,这是一种糟糕的做法,但是更易于维护,特别是在构建机器很复杂的情况下。你知道吗</p>
<p>假设项目结构如下:</p>
<pre><code>.
├── common
│ └── __init__.py
├── legacyProject
│ └── SConstruct
└── myProject
└── SConscript
</code></pre>
<p>python模块可以非常简单:</p>
<pre><code># common/__init__.py
def set_warning_flags(env):
env['CCFLAGS'] = '-Wall -Wextra -pedantic'
</code></pre>
<p>以及:</p>
<pre><code># myProject/SConstruct
import sys
sys.path.insert(0, '..')
import common
env = Environment()
print 'before:', env['CCFLAGS']
common.set_warning_flags(env)
print 'after:', env['CCFLAGS']
</code></pre>
<p><em>如果:</em></p>
<ul>
<li>您有很多外部配置(许多构建器/复杂的环境),只需要从少数地方拉入。你知道吗</li>
<li>您没有使用变体版本</li>
</ul>
<p><strong>通过site dir/site init重用</p>
<p>如果希望在不更改多个scon结构的情况下动态地向多个scon结构添加功能,可以使用scon支持的内置扩展性(请参阅用户手册<a href="http://www.scons.org/doc/HTML/scons-user.html#idm140113664596608" rel="nofollow">Where To Put Your Custom Builders and Tools</a>中的部分或在<a href="http://www.scons.org/doc/HTML/scons-man.html" rel="nofollow">SCons Man Page</a>中搜索<code> site-dir=dir</code>)</p>
<p>在这种情况下,您可以:</p>
<pre><code>.
├── common
│ └── site_init.py
├── legacyProject
│ └── SConstruct
└── myProject
└── SConstruct
</code></pre>
<p>其中<code>site_init.py</code>是:</p>
<pre><code># common/site_init.py
def set_warning_flags(env):
env['CCFLAGS'] = '-Wall -Wextra -pedantic'
</code></pre>
<p>结构是:</p>
<pre><code>env = Environment()
print 'before:', env['CCFLAGS']
set_warning_flags(env)
print 'after:', env['CCFLAGS']
</code></pre>
<p>但是您需要使用以下命令调用scon(从myProject/legacyProject目录):</p>
<pre><code>scons site-dir=../common
</code></pre>
<p><em>如果:</em></p>
<ul>
<li>您希望对两个项目生成都进行更改,而不更改其中一个的代码。你知道吗</li>
</ul>