[Scons-users] Generated source file is placed in build directory, missing includes

William Deegan bill at baddogconsulting.com
Sat Oct 27 16:21:56 EDT 2012


Thomas,

On Oct 27, 2012, at 4:51 AM, Thomas Berg <merlin66b at gmail.com> wrote:


> Hi,

>

> On Sat, Oct 27, 2012 at 12:45 PM, Carsten Fuchs <carsten.fuchs at cafu.de> wrote:

>> Hi all,

>>

>> I'm using a Command() builder for generating a C++ source code file that is

>> part of the input files for a program builder. Shortened example:

>>

>>

>> def generateCode(target, source, env):

>> with open(str(target[0]), 'w') as f:

>> f.write("#include "AppCafu.hpp"\n");

>> f.write("// ...\n");

>>

>> app = env.Program('Ca3DE/Cafu',

>> Glob("Ca3DE/*.cpp") +

>> envCafu.Command("Ca3DE/AppCafu_GenList.cpp", "", generateCode))

>>

>>

>> This is in a SConscript file that is called from SConstruct via a call to

>> SConscript(..., variant_dir=..., duplicate=0).

>>

>>

>> It all works, but like all obj and exe files, also the generated source file

>> Ca3DE/AppCafu_GenList.cpp is created in the build directory that was

>> specified with variant_dir.

>>

>> The problem is that when Scons next calls the compiler to build the file, it

>> cannot find the header specified in the #include statement.

>>

>> It seems obvious that I can either manipulate the #include

>> "../../../Ca3DE/AppCafu.hpp" path so that it points to the proper header

>> file directly, whereas adding another parameter CPPPATH=['.', 'Ca3DE'] does

>> not seem to have any effect.

>> It seems like I'm missing something, but I've not been able to figure out

>> what it is.

>

> Usually the trick is to add env.Dir('.').srcnode() to CPPPATH.

>

> You probably don't need it here, but another useful trick to know

> about is the '#' for referring to paths relative to the top level

> SConstruct. It is mainly useful if you are in a subdirectory

> SConscript for example, and it is another thing to try if you have

> trouble setting things up:

> env.AppendUnique(CPPPATH = [env.Dir('#/Ca3DE').srcnode()])



You shouldn't need to use the srcnode().

env.AppendUnique(CPPPATH=['#/Ca3DE',])

Should be sufficient..

Likely if you find yourself (for the most part) heavily using the .srcnode() and/or .abspath() you may be doing it the hard way...

-Bill


More information about the Scons-users mailing list