[Scons-users] Generated headers in variant build

Ian Scons sconsian at gmail.com
Mon Nov 27 05:42:06 EST 2023


Hi Bill,

> Do you know how your variant dirs are specified? Are you using
VariantDir(), or specifying variant_dir when calling SConscript()?

We are using VariantDir. VariantDir(<build root dir>, "#", duplicate=False)

I did wonder whether the duplicate flag was relevant, because then all the
source, including generated, is effectively in one place in the build tree.
But I did briefly try with True and the build failed in other packages
before it even got to mine. I don't want to do anything that would
destabilise the build for anyone else.

I wonder whether I should try switching to using variant_dir when calling
the SConscripts, and try selectively turning on duplication for my package.
I don't know if that makes sense.

> Which version of SCons and Python are you using?

SCons 4.3.0
CPython 3.10.9

Thanks,
I.


On Sun, 26 Nov 2023 at 18:27, Bill Deegan <bill at baddogconsulting.com> wrote:

> Ian,
>
> Do you know how your variant dirs are specified? Are you using
> VariantDir(), or specifying variant_dir when calling SConscript()?
> Which version of SCons and Python are you using?
>
> -Bill
>
> On Sun, Nov 26, 2023 at 7:15 AM Mats Wichmann <mats at wichmann.us> wrote:
>
>> On 11/26/23 06:12, Ian Scons wrote:
>>
>> That's a lot of detail - thanks, though it will take a while to pick
>> through it.
>>
>> > Here, "client.cpp" has a #include of "protos/client.grpc.pb.h", which
>> is
>> > a generated header.
>>
>> ...
>>
>> > In order to implement the code generation, I have defined a new builder
>> > in the SConstruct:
>> >
>> >      def protoc_emitter(tgt, src, env):
>> >          gen_tgt = []
>> >          for t in tgt:
>> >              ... # append names of generated *.h, *.cc based on t.path
>> >          return gen_tgt, src
>> >
>> >      env["BUILDERS"]["GrpcProtoc"] = Builder(
>> >          action=[...], # this is fine, and runs protoc to generate the
>> > files as expected
>> >          emitter=protoc_emitter,
>> >      )
>>
>> The first reaction is that the plumbing may work more easily if the
>> builder is defined to "know" the source and target file suffixes it is
>> responsible for.  That would mean adding the suffix and src_suffix
>> kwargs to the builder call. I might use suffix=".grpc.pb.h" and
>> "src_suffix=.proto"  (although it gets trickier if you generate two
>> outputs from protoc, as it seems you're doing - a .h and a .cc).
>>
>>  > Even if I do (i), sometimes the build fails because client.grpc.pb.h
>> cannot be found. It can be seen that the file does exist on the filesystem
>>
>> One issue in dealing with generated files is that SCons relocates the
>> things it needs to based on the directory of the SConscript, but when
>> indirect execution is involved, like an emitter, it doesn't always
>> figure out it needs to - and you end up with the human saying "but the
>> file is there" and SCons saying "I don't see anything *where I'm
>> looking*".  In your emitter, you might try generating the added targets
>> as File nodes, rather than as strings, and see if that helps - nodes
>> have path information in them so they don't get lost track of.
>>
>>
>> By the way, there's a protoc builder in the scons-contrib repository,
>> you might look at what it does differently/same as yours (my memory is
>> it was fairly convoluted)
>>
>> https://github.com/scons/scons-contrib
>>
>> https://github.com/SCons/scons-contrib/tree/master/sconscontrib/SCons/Tool/Protoc
>>
>>
>> _______________________________________________
>> Scons-users mailing list
>> Scons-users at scons.org
>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>>
> _______________________________________________
> Scons-users mailing list
> Scons-users at scons.org
> https://pairlist4.pair.net/mailman/listinfo/scons-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist4.pair.net/pipermail/scons-users/attachments/20231127/e1797a81/attachment.htm>


More information about the Scons-users mailing list