miscellaneous_tips:20_software_development:implicit_variables_and_rules_of_gnu_make

# GNU 'make' Notes

Avoid appending a comment to a line with a variable declaration. Otherwise, some versions of make may consider the comment as part of the value string, which can yield strange effects.

Here are some hints how to write a Makefile in a way that the project is built quitely by default, but verbosely if required.

In quiet mode there's only a short info which command is being executed, so build errors and warnings don't disappear in a noisy output.

In verbose mode the full commands are displayed, so it's possible to see exactly which parameters are passed to each command.

# Define a variable V (verbose) which is 0 by default.
# Call 'make' with parameter "V=1" to get verbose output.
V ?= 0

# Define some helper variables depending on the value of V.
ifneq ("$(V)","0") # Verbose output. Q := QM := vecho = @true else # Quiet output. Q := @ QM := -s vecho = @echo endif # Override the builtin rules to compile a C module. %.o: %.c$(vecho) "    $(CC)$@"
$(Q)$(CC) $(CPPFLAGS)$(CFLAGS) -c -o $@$<

# Override the builtin rules to compile a C++ module.
%.o: %.cpp
$(vecho) "$(CXX)      $@"$(Q)$(CXX)$(CPPFLAGS) $(CXXFLAGS) -c -o$@ $< # Assume the default target is 'all', as usual, and the # real name of the target has been specified above, with # a line 'TARGET = …' .PHONY: all all:$(TARGET)

# Override the builtin rules to link the $(TARGET) binary.$(TARGET): $(OBJS)$(vecho) "    Linking $@"$(Q)$(CC) -o$@ $(LDFLAGS)$^ \$(LDLIBS)


Martin Burnicki martin.burnicki@burnicki.net, last updated 2021-01-26

• miscellaneous_tips/20_software_development/implicit_variables_and_rules_of_gnu_make.txt
• Zuletzt geändert: 2021-01-26 17:51
• von martin