Re: Attaching an emitter to an existing builder
Jeremy Elson <[email protected]>
| Newsgroups | gmane.comp.programming.tools.scons.user |
|---|---|
| Message-ID | <CAKufN8UY9_Dehx0v68GE6E1QyrEh=GA5KGbJXiQfmaJDT27_1Q@mail.gmail.com> |
Just wanted to ping yon on the PR above adding native mapfile support to scons: https://github.com/SCons/scons/compare/master...jelson:jelson/scons-mapfile On Sat, Jan 30, 2021 at 4:07 PM Jeremy Elson <[email protected]> wrote: > Hi Bill, > > I'd like to do better than file a bug -- how about a PR? > > https://github.com/SCons/scons/compare/master...jelson:jelson/scons-mapfile > > I don't have much experience with SCons internals, so I might have not > done this in the most idiomatic way, but I'm open to suggestions how to > improve it so I can make it into a PR. I tested this with a simple > SConstruct file: > > Program('prog1.c') > Program('prog2.c', mapfile='prog2.map') > Program('prog3', source='prog1.c') > > It generates the output you would expect: > > gcc -o prog1.o -c prog1.c > gcc -o prog1 prog1.o > gcc -o prog2.o -c prog2.c > gcc -o prog2 prog2.o -Wl,-Map=prog2.map,--cref > gcc -o prog3 prog1.o > > If my implementation is way too off the mark to be useful, I'd be happy to > just file a bug instead :) > > -Jeremy > > > On Fri, Jan 29, 2021 at 10:58 AM Bill Deegan <[email protected]> > wrote: > >> Jeremy, >> >> Glad that worked for you! >> Please consider filing an enhancement request issue to support generating >> map files? >> >> Thanks, >> Bill >> >> On Thu, Jan 28, 2021 at 4:20 PM Jeremy Elson <[email protected]> wrote: >> >>> Thanks, everyone for the help -- PROGEMITTER worked perfectly: >>> >>> # Add map creation as a linker flag, and modify the standard >>> Program >>> # emitter to know that map generation is a side-effect >>> map_filename = os.path.join(build_obj_dir, f"{target.name}.map") >>> env.Append(LINKFLAGS = f"-Wl,-Map={map_filename},--cref") >>> def map_emitter(target, source, env): >>> assert(str(target[0]) == os.path.abspath(program_name)) >>> target.append(map_filename) >>> return target, source >>> env.Append(PROGEMITTER = [map_emitter]) >>> >>> My only concern with PROGEMITTER was that it was not a general solution >>> to this problem -- i.e., what if I want to override something other than >>> Program()? But from looking at MSlink.py as Mats suggested, it seems that >>> nearly all the standard builders have similar overrides (SHLIBEMITTER, >>> LDMODULEEMITTER, etc). I guess it's similar to the *COMSTR series of >>> constants for modifying the message printed at each build step. >>> >>> Thanks again for a great build system. SCons is a pleasure to use. >>> >>> -Jeremy >>> >>> >>> >>> On Thu, Jan 28, 2021 at 7:19 AM Mats Wichmann <[email protected]> wrote: >>> >>>> On 1/27/21 3:11 PM, Bill Deegan wrote: >>>> > Jeremy, >>>> > >>>> > Greetings! >>>> > You're not the first to mention adding the map file as a side effect. >>>> > (or target) >>>> > Please go ahead and file and Issue on github for this. >>>> > Ideally with a simple example, what the gcc flag is, and what the >>>> file >>>> > naming/location would be? >>>> > >>>> > So likely the easiest way to add an emitter to Program() would be the >>>> > following (not tested) >>>> > >>>> > env.Append(PROGEMITTER = [my_map_emitter]) >>>> > >>>> > Give that a try and let us know if it works for you? >>>> > >>>> > Also there's a discord server for scons help if you'd like to ask >>>> > questions/get help there. >>>> > https://discord.gg/bXVpWAy <https://discord.gg/bXVpWAy> >>>> > >>>> > Hope that helps! >>>> > -Bill >>>> >>>> For inspiration, the mslink tool does this (as does the qt tool) - see >>>> the somewhat messy SCons/Tool/mslink.py. >>>> >>>> Meanwhile, while many tools use add_emitter, the code for add_emitter >>>> itself includes this comment: >>>> >>>> This assumes that emitter has been initialized with an >>>> appropriate dictionary type, and will throw a TypeError if >>>> not, so the caller is responsible for knowing that this is an >>>> appropriate method to call for the Builder in question. >>>> >>>> > env["BUILDERS"]["Program"].add_emitter( >>>> > suffix = ".map", >>>> > emitter = map_emitter) >>>> > >>>> > But it throws an exception: >>>> > >>>> > TypeError: 'EmitterProxy' object does not support item assignment >>>> >>>> So I guess "expected"? although pretty awkward.... >>>> >>>> _______________________________________________ >>>> Scons-users mailing list >>>> [email protected] >>>> https://pairlist4.pair.net/mailman/listinfo/scons-users >>>> >>> _______________________________________________ >>> Scons-users mailing list >>> [email protected] >>> https://pairlist4.pair.net/mailman/listinfo/scons-users >>> >> _______________________________________________ >> Scons-users mailing list >> [email protected] >> https://pairlist4.pair.net/mailman/listinfo/scons-users >> > _______________________________________________ Scons-users mailing list [email protected] https://pairlist4.pair.net/mailman/listinfo/scons-users