Re: adding text to compile line

daggs via Scons-users <[email protected]> Sun, 28 Jan 2024 09:04:50 +0100
Newsgroups gmane.comp.programming.tools.scons.user
Message-ID <trinity-028b1455-22d5-4e8b-a95e-50acb830f225-1706429090821@3c-app-mailcom-bs15>
Greetings.

question, I've defined the str as such: env['LINKCOMSTR'] = "[" + label + "]: " + env['LINKCOM']

and now I'm seeing $( and $) added to prints, is there any way to remove them?

Thanks,

Dagg

Sent: Tuesday, January 23, 2024 at 10:38 AM

From: "Jeremy Elson" <[email protected]>

To: "SCons users mailing list" <[email protected]>

Subject: Re: [Scons-users] adding text to compile line

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

_______________________________________________
Scons-users mailing list
[email protected]
https://pairlist4.pair.net/mailman/listinfo/scons-users