The GNU make utility has quite a lot of "implicit" rules and implicitly set variables. The first can hit you, if you organise your stuff even only slightly differently than the "standard GNU way". The latter is even worse, as it renders constructions like
CC ?= clang
Fortunately, there are the commandline options -r ("no builtin rules") and -R ("no builtin variables"). To make good use of these options without forcing the user to remember that gmake needs them to handle your Makefile properly, you can use a construction like the following.
ifeq (${RECURSIVECALL},) MAKEFLAGS += -rR %: @${MAKE} RECURSIVECALL=1 $@ all: @${MAKE} RECURSIVECALL=1 all else #################################### ## Your actual Makefile goes here ## #################################### endif