1. Принцип make - собирается только то, зависимости(исходники) чего были изменены.
2. Для того, чтобы что-нибудь собрать, нужно сделать вызовы программ-собирателей, такие вызовы записываются в каком-то синтаксисе, например bash
3. Проверка изменённости тоже может быть описана при помощи bash
что-то вроде
if [ "$(( $(stat -c "%Y" $srcfile) - $(stat -c "%Y" $dstfile) ))" -gt "0" ]; then
echo "$srcfile is newer then $dstfile"
fi
5. Если можно скомпилирвоать в bash, то можно и в другие языки (например C, но это неважно в этом топике)
6. Когда чего-то много, образуется фреймворк (по аналогии с llvm). Т.е. разные бэкенды, во что преобразовать и общая для всех них инфраструктура.
Зачем ненужен make? Ну, например, если есть ebuild, то у него базовый язык bash, а не make