generalize makefile