For those of you who are unfamiliar with the mysteries of Unix style Makefiles, here is some information that I hope will be helpful. "gmake", and relate programs like "make" and "nmake" (the Microsoft version) are tools for building programs. They use a "Makefile" as input. The makefile provides a set of rules for compiling and linking your programs. It is most useful for building multipart programs like "nachos" because it is smart enough to only compile the source files you have modified since the last time you built the program. For nachos, the makefile is pretty complicated but the usage is easy. Just type "gmake" and it will build nachos by default. For the C++ examples, the makefile is fairly simple and if you just type "gmake" it will try to build all of the examples. The only thing is that it won't recompile the program if the source hasn't changed. So, if you need to change the makefile to add the "-g" compile flag for use with the debugger, you will need to update the source of the program so it will actually be rebuilt. The easiest way to do this is with the touch command. For instance, "touch stack.cc" will change the date on the stack.cc file without actually changing the file itself. This will fool "gmake" into recompiling the program. Example: Here is the rule for building the stack executable: stack: stack.h stack.cc g++ -o stack stack.cc The first line says that to build stack we depend on stack.h and stack.cc. If either of these have changed then we should run invoke the command given on the second line. To build your programs for debugging you should add "-g" to the second line. g++ -g -o stack stack.cc Then save the makefile and run "touch stack.cc" followed by "gmake" to rebuild the program.