Кажется, вы уже решили свой первый пункт: объедините их все в одну переменную (я не думаю, что вам на самом деле нужно разделять их на TEMP1 и TEMP2, как у вас, просто есть разные правила сборки)
Во втором пункте вы можете указать компилятору, куда выводить объектные файлы (для g ++ это выглядит так:
g++ -c MySourceFile.cpp -o obj/MySourceFile.o
Правило make для этого будет выглядеть так:
obj/%.o: %.cpp
g++ -c $*.cpp -o obj/$*.o
И ваш третий пункт также легко решается, так как вы можете иметь для него правило сборки (просто поместите имя каталога в список зависимостей для цели, прежде чем все объекты будут перечислены), и правило сборки будет выглядеть так:this
obj:
mkdir obj
Редактировать: или после примеров кода:
$(BIN_DIR)$(PROGRAM) : $(BIN_DIR) $(OBJS)
$(LINK)
$(BIN_DIR):
$(CREATE_OUT_DIR)