[Scons-users] Generated headers in variant build

Mats Wichmann mats at wichmann.us
Sun Nov 26 10:15:08 EST 2023


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




More information about the Scons-users mailing list