Print bold or colored text from Makefile rule

Viewed 7420

I'm trying to print bold text from the following Makefile :

printf-bold-1:
    @printf "normal text - \e[1mbold text\e[0m"

But, escape sequences are printed as-is, so when running make printf-bold-1, I got :

normal text - \e[1mbold text\e[0m

Instead of expected :

normal text - bold text

It's weird because I can print bold text from my terminal : running directly command printf "normal text - \e[1mbold text\e[0m" produces, as expected :

normal text - bold text

In the Makefile, I tried to use @echo or echo instead of @printf, or print \x1b instead of \e, but without success.

Here are some variables describing my environment (Linux with standard Gnome terminal), if that can help :

COLORTERM=gnome-terminal
TERM=xterm-256color

Note also that on some colleagues laptops (Mac), bold text is printed correctly.

What is the portable way, working on every environment, to print bold or colored text from a Makefile rule?

2 Answers

You should use the usual tput program for producing the correct escape sequences for the actual terminal, rather than hard-coding specific strings (that look ugly in an Emacs compilation buffer, for example):

printf-bold-1:
    @printf "normal text - `tput bold`bold text`tput sgr0`"

.PHONY: printf-bold-1

Of course, you may store the result into a Make variable, to reduce the number of subshells:

bold := $(shell tput bold)
sgr0 := $(shell tput sgr0)

printf-bold-1:
    @printf 'normal text - $(bold)bold text$(sgr0)'

.PHONY: printf-bold-1

Ok, I got it. I should have used \033 instead of \e or \x1b :

printf-bold-1:
    @printf "normal text - \033[1mbold text\033[0m"

Or, as suggested in the comments, use simple quotes instead of double quotes :

printf-bold-1:
    @printf 'normal text - \e[1mbold text\e[0m'

make printf-bold-1 now produces :

normal text - bold text

Related