[Scons-users] compile scons submodule

Gary Granger granger at ucar.edu
Thu Feb 16 10:53:45 EST 2023


Hi Jan,

You can read the submodule's SConstruct file as if it were a SConscript, 
using something like this:

SConscript("external/another_project/SConstruct")

SCons does not care that the file is not named SConscript.  However, in 
that case the top directory, '#', will be the directory of the top 
SConstruct, and probably another_project/SConstruct is written expecting 
'#' to be the another_project directory.  However, it's possible to 
write the SConstruct file so that it doesn't depend on '#'.

Another approach we've used is to just create an actual SConscript file 
for the submodule, and share as much code as possible with the 
SConstruct.  Sometimes that means using a tool file, and sometimes the 
SConstruct file just contains a SConscript() call to the submodule's 
SConscript file.  That way the submodule can be built on it's own using 
the usual 'scons -u', but it also works to call the SConscript file from 
a parent project.

Another thing that has worked well for us is to create a scons tool file 
for the submodule, eg, another_project.py.  That tool creates the 
builders for the submodule, but then it also adds the library and 
cpppaths for that submodule to the calling environment.  That way other 
Environments anywhere else in the parent source tree can just apply that 
tool to build against another_project, eg, env.Tool('another_project').  
You just have to add the submodule directory to the tool path when the 
Environment is created.  We have a mechanism which goes a little further 
and actually scans the source for tool files when a tool is requested.  
With that, the top project does not need to know where the submodule 
even exists in the tree, it's enough for an Environment to apply the 
tool for that submodule name.

The problem with both a SConstruct and SConscript file in a submodule is 
that if you try to run 'scons -u' in the submodule as part of a larger 
project, that will only find the submodule SConstruct and only build 
that.  One workaround for that is to not use the SConstruct at all, just 
a SConscript.  Then run 'scons -f SConscript' when you really want to 
build just the submodule.

Here is a submodule project which uses the tool file and SConscript file 
approach instead of a SConstruct file: https://github.com/NCAR/logx.  
The tool searching and loading is provided by our extensions to SCons: 
https://github.com/NCAR/eol_scons, but I don't think you need that if 
you just add another_project to the tool path.

Hope that helps,
Gary

On 2/16/23 03:54, Jan Walter wrote:
> Hi,
>
> I'm not really that familiar with scons (yet) but I inherited a large
> project which uses scons.
>
> It uses a SConstruct file in it's root directory, which seems already
> pretty complicated,
> and a custom.py file which allows to set some environment variables to
> find other
> libraries and/or executable files.
>
> Anyway, I would like to use git submodule to create a clone of an
> existing project,
> which also uses scons and a related SConstruct file to compile a
> library, which is used
> in the main project. So far we compiled the library for each platform
> separately and the
> main SConstruct file simply knows how to link the external library
> into other libraries.
>
> So it looks like this:
>
> $ tree
> .
> ├── custom.py
> ├── external
> │   └── another_project
> │       └── SConstruct
> └── SConstruct
>
> Right now I could copy the custom.py (or create a softlink to it),
> change into the external/another_project/ folder and compile
> the library there using scons. What's the easiest way to adjust
> the main SConstruct file to do this for me, before some other
> libraries of the main project get compiled, which have to link
> in the library from the submodule.
>
> Any help with that would be appreciated.



More information about the Scons-users mailing list