====== 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)
/*
Call a sub-make in a different directory:
$(Q)$(MAKE) $(QM) -C mbgclock $@
*/
----
--- //Martin Burnicki [[martin.burnicki@burnicki.net]], last updated 2021-01-26//