-SOURCE=libthreads.cc schedule.cc libatomic.cc userprog.c model.cc malloc.c threads.cc
-HEADERS=libthreads.h schedule.h common.h libatomic.h model.h threads.h
-FLAGS=-Wall -ldl -g
+LIB_NAME=model
+LIB_SO=lib$(LIB_NAME).so
+
+USER_O=userprog.o
+USER_H=libthreads.h libatomic.h
+
+MODEL_CC=libthreads.cc schedule.cc libatomic.cc model.cc malloc.c threads.cc tree.cc librace.cc
+MODEL_O=libthreads.o schedule.o libatomic.o model.o malloc.o threads.o tree.o librace.o
+MODEL_H=libthreads.h schedule.h common.h libatomic.h model.h threads.h tree.h librace.h action.h
+
+CPPFLAGS=-Wall -g
+LDFLAGS=-ldl
+
+all: $(BIN)
+
+$(BIN): $(USER_O) $(LIB_SO)
+ $(CXX) -o $(BIN) $(USER_O) -L. -l$(LIB_NAME) $(CPPFLAGS)
+
+# note: implicit rule for generating $(USER_O) (i.e., userprog.c -> userprog.o)