Система сборки GNU имеет набор инструментов, обычно называемых autotools . Как отметил @wilhelmtell, autoconf является частью этого пакета. Основная идея заключается в том, что ваш исходный код является исходным входом для сложной цепочки процессов, в результате которой получается красивый, переносимый Makefile. Каждый шаг процесса создает промежуточные текстовые файлы, которые вы можете настроить по своему усмотрению, но есть утилиты, которые выполняют большую часть работы за вас.
Как говорится, автоинструментальные средства могут быть довольно громоздкими и, возможно, излишними в зависимости от ваших потребностей. Исходя из моего опыта, мне обычно было проще просто вручную написать простой Makefile.