Многие проекты включают в себя множество исходных файлов. В принципе, вы можете вручную скомпилировать любой из этих файлов самостоятельно - вы используете компилятор для компиляции этого исходного файла в (временный) файл объекта, содержащий машинный код.
На практике очень сложно вручную скомпилировать каждый исходный файл по одному за раз, и еще более утомительно вручную отслеживать, какие исходные файлы необходимо перекомпилировать. Итак, мы строим весь проект сразу, запустив автоматическую программу сборки - обычно называемую «make». Эта программа проходит через список исходных файлов, часто хранится в еще одном «исходном» файле с именем «makefile» и вызывает компилятор на каждом из них - многие версии «make» достаточно умны, чтобы перекомпилировать файлы, которые имеют изменено и поэтому необходимо перекомпилировать.
Хотя компиляция, возможно, является самой важной частью процесса сборки, часто «сборка» запускает множество других программ после компилятора. Иногда полная сборка будет тратить больше времени на выполнение этих других программ, чем на запуск компилятора.
Например, многие люди считают, что удобно, чтобы одна кнопка не только скомпилировала весь исходный код до последней версии, но и выполнила стандартную серию тестов (C2: One Button Testing). Итак, makefile также перечисляет все команды, необходимые для запуска этих тестов, которые становятся частью процесса сборки.