Writing portable makefiles is an art. Since a makefile's commands are executed by the shell, you must consider the shell portability issues already mentioned. However, other issues are specific to make itself.
make macro=value
$(MAKEFLAGS)
$(SHELL)
VPATH