Pattern rules can have multiple targets but, unlike normal rules, the recipe is responsible for making all the targets. For example:
debug/%.o release/%.o: %.c $(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o $(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
Is a valid rule, which will build both debug and release objects when one of them has to be built. If we wrote something like:
debug/%.o release/%.o: %.c $(CC) $(CFLAGS) -c $< -o $@
It would work when only one of
release/*.o is built, but it would only build the first target (and consider the second one to be up-to-date) when both have to be built.