К просто добавить что-то в список элементов, разделенных пробелами, которые вы можете использовать:
program_OBJS := $(foreach program,$(program_SRCS),$(program).o)
Чтобы использовать метод подстановки (как показано в вашем вопросе):
program_OBJS := $(program_SRCS:.cpp=.cpp.o)
, но для этого в списке должно быть достаточно .cpp , иначе замены не произойдут.