====== 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//