Похоже, что ваша проблема с конечным пробелом:
binfolder := bin #<- notice trailing whitespace.
# bindfolder is actually "bin "...
Так что теперь ваше правило
$(bins):%: $(binfolder)/%
расширяется до:
program1 secondprogram thethirdprogram:%: bin /%
, что, вероятно, вызывает вашу проблему. Чтобы проверить наличие таких вещей, вы можете добавить следующее:
$(info binfolder is "$(binfolder)")