From http://www.gnu.org/software/make/manual/make.html:
There is another assignment operator
for variables, `?=’. This is called a
conditional variable assignment
operator, because it only has an
effect if the variable is not yet
defined. This statement:FOO ?= baris exactly equivalent to this (see The
origin Function):ifeq ($(origin FOO), undefined) FOO = bar endif
Probably CC is already defined as gcc, so CC ?= g++ won’t override the existing gcc.