Когда make запускает рецепт, он запускает каждую строку рецепта в своей собственной оболочке. После того, как эта строка рецепта заканчивается, оболочка завершается, и для следующей строки запускается новая оболочка.
Таким образом, ваше правило clean
такое же, как и при выполнении:
/bin/sh -c "rm -rf *.o *.h.gch test"
/bin/sh -c "cd $(m)"
/bin/sh -c "rm -rf *.o *.h.gch test"
/bin/sh -c "cd .."
/bin/sh -c "cd $(ds)"
/bin/sh -c "rm -rf *.o *.h.gch test"
/bin/sh -c "cd .."
/bin/sh -c "cd $(nn)"
/bin/sh -c "rm -rf *.o *.h.gch test"
/bin/sh -c "cd .."
/bin/sh -c "cd $(g)"
/bin/sh -c "rm -rf *.o *.h.gch test"
Таким образом, ваши cd
команды бесполезны, потому что вы изменяете каталоги в подоболочке, затем оболочка закрывается и смена каталогов теряется, а затем вы запускаете команду rm
в том же каталоге, в котором вы начали.
Вы должны поместить cd
в ту же (логическую) строку, что и rm
, и вам не нужно запускать cd ..
, потому что это подразумевается:
clean:
rm -rf *.o *.h.gch test
cd $(m) && rm -rf *.o *.h.gch test
cd $(ds) && rm -rf *.o *.h.gch test
cd $(nn) && rm -rf *.o *.h.gch test
cd $(g) && rm -rf *.o *.h.gch test