Makefile for a x86 operating system in C++
Dependency Propagation

One thing that's missing is dependency propagation. So each .o file will be recompiled only if its corresponding .cc file has changed. This is good, I don't want to have to recompile foo.o just because I changed bar.cc. However, what if both foo.cc and bar.cc include some other file quux.h, and you changed some of the function signatures. Currently, neither foo.o nor bar.o will be recompiled! This is bad. However, you don't want to manually have to go through and add:

bar.o : quux.h
foo.o : quux.h


Since that is tedious, error-prone, and unmaintanable. You want to make the compiler do this for you.You can start with reading about automatic prerequisites, but rather than follow the guidelines there, note that gcc can both build the .o files and generate the .d files concurrently with -M (check out all the -M* arguments). 

Targets

run and clean should be .PHONY targets. 

I also like to get in the habit of setting .DEFAULT_GOAL instead of just making sure that all is at the top. You never know. 

Comments

Very helpful for the most part. But I would omit these:

# $&lt; : Names the first prerequiste
# $@ : Names the current Target


People who don't know what those mean likely won't understand anything about the makefile anyway, not sure the comments will help. Those are very commonly used.