generalized makefile