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