Re: adding text to compile line
Jeremy Elson <[email protected]> Mon, 22 Jan 2024 23:38:07 -0800
| Newsgroups | gmane.comp.programming.tools.scons.user |
|---|---|
| Message-ID | <CAKufN8VJnVsyN7goHGcnsJsTEcuzWDE35+66zySdttLkjGc7GA@mail.gmail.com> |
Sure! On Sun, Jan 21, 2024 at 6:29 PM Bill Deegan <[email protected]> wrote: > Jeremy, > > Any chance you could contribute that to the > https://github.com/SCons/scons-contrib repo? > > Pretty interesting. > -Bill > > On Sun, Jan 21, 2024 at 1:40 PM Jeremy Elson <[email protected]> wrote: > >> This is a lot more than what OP asked for, but I'll describe the custom >> output code I wrote for one of my Scons-based build systems.(It's not >> open-source, so I can't link to the full code.) >> >> My goal was to replace all the raw command-line output with something >> like: >> >> Compiling src/app/foo.c >> Compiling src/app/bar.c >> Linking build/libs/libfoo.a >> Linking build/output/foo.elf >> Signing build/output/foo.elf >> >> In this case, "Compiling" and "Linking" are standard scons rules; >> "Signing" is a custom builder. The trick is that for some of the outputs, >> such as Compiling, should show the name of the source. Others, such as >> Linking, show the name of the target. >> >> First, I defined a class called SpinnerPrinter that looks sort of like >> this: >> >> class SpinnerPrinter: >> SPINNER = '<<spinner>>' >> SOURCE = 'src' >> TARGET = 'trg' >> >> def spin_source(s): >> return SpinnerPrinter.SPINNER + SpinnerPrinter.SOURCE + s >> >> def spin_target(s): >> return SpinnerPrinter.SPINNER + SpinnerPrinter.TARGET + s >> >> Then, in my function that sets up the scons build env, I have code that >> looks like the examples below. I call spin_source to indicate the build >> output should use the source filenames, and spin_target to show it should >> be target. The COMSTRs all end up being configuration strings for the >> custom output function. >> >> if not build_options.verbose: >> env['PRINT_CMD_LINE_FUNC'] = SpinnerPrinter().spinner_print >> # Overrides to standard builders >> env['CCCOMSTR'] = SpinnerPrinter.spin_source("Compiling") >> env['ASPPCOMSTR'] = SpinnerPrinter.spin_source("Assembling") >> env['LINKCOMSTR'] = SpinnerPrinter.spin_target("Linking") >> env['ARCOMSTR'] = SpinnerPrinter.spin_target("Creating library") >> >> # locally defined builders >> env['PROTOBUFCOMSTR'] = SpinnerPrinter.spin_source("Creating protobuf") >> env['SIGNCOMSTR'] = SpinnerPrinter.spin_source("Signing") >> >> The SpinnerPrinter class has a function spinner_print that uses the >> config string to generate the output based on the config >> string generated by spin_source and spin_target: >> >> def spinner_print(self, s, target, source, env): >> # Regular (non-spinner-aware) strings just get emitted as >> # usual >> if not s.startswith(self.SPINNER): >> sys.stdout.write(s + "\n") >> return >> >> # take off the marker >> s = s[len(self.SPINNER):] >> >> # figure out if we are supposed to print the source or target >> which = s[0:3] >> >> # Generate the prefix (the part printed before the filename). >> print_prefix = s[3:] >> # Find out what filename to print as part of the output. We'd >> # rather print the name of the source, but steps such as >> # library creation have a zillion sources and one target, so >> # we'll print the target instead for those. >> if which == SpinnerPrinter.SOURCE: >> file_to_print = source[0] >> else: >> file_to_print = target[0] >> fn_to_print = os.path.realpath(str(file_to_print)) >> >> # Combine the directive we were given (e.g. "Compiling") >> # with the filename >> sys.stdout.write(f"{print_prefix} {fn_to_print}\n" >> >> This can be made much fancier; I've elided various details. For example, >> the real spinner senses if stdout is a tty. If it is a tty, it uses ANSI >> escape sequences so the output lines overwrite themselves, and it prints >> only the part of the filename that fits on a single terminal line (after >> sensing its width). So when our team builds from the command-line, a normal >> build does not use any terminal space at all! When running from a script, >> the "Compiling" and "Linking" lines all appear as separate lines. And >> without the --verbose option, the entire custom output block is skipped and >> full command-lines get printed (the default scons behavior). >> >> Hopefully this helps someone! We've been very happy with how it works >> (and with scons in general). >> >> -Jeremy >> >> On Sun, Jan 21, 2024 at 1:07 PM Bill Deegan <[email protected]> >> wrote: >> >>> Dagg, >>> >>> What Mats said.. with more detail. >>> >>> So if your compiling c++, the relevant variables are >>> CXXCOM, CXXCOMSTR >>> SHCXXCOM, SHCXXCOMSTR >>> >>> The *STR variables are what is output to the screen, the non *STR are >>> what's used to build the command line and execute. >>> replace CXX with CC for C compiles.. >>> You can see the complete list of such variables in the manpage: >>> https://scons.org/doc/production/HTML/scons-man.html >>> >>> Hope this helps~! >>> -=Bill >>> >>> On Sun, Jan 21, 2024 at 11:07 AM Mats Wichmann <[email protected]> wrote: >>> >>>> On January 21, 2024 5:40:14 AM MST, daggs via Scons-users < >>>> [email protected]> wrote: >>>> >Greetings, >>>> > >>>> >I want to add a prefix the compile line scons is displaying, is it >>>> possible? >>>> > >>>> >Thanks, >>>> > >>>> >Dagg >>>> >_______________________________________________ >>>> >Scons-users mailing list >>>> >[email protected] >>>> >https://pairlist4.pair.net/mailman/listinfo/scons-users >>>> >>>> yes. >>>> >>>> sorry not at a place I can answer more fully, but can modify the >>>> relevant COMSTR (command string), or supply your own $PRINT_CMD_LINE_FUNC >>>> -- >>>> Sent from my Android device with K-9 Mail. Please excuse my brevity. >>>> _______________________________________________ >>>> 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 > _______________________________________________ Scons-users mailing list [email protected] https://pairlist4.pair.net/mailman/listinfo/scons-users