Как работает Makefile?
=> Когда команда make выполняется на терминале, она ищет файл с именем makefile или Makefile в текущем каталоге и создает дерево зависимостей.
Если у вас есть несколько файлов Makefile, вы можете выполнить определенные команды:
make -f MyMakefile
=> На основе make target, указанного в make-файле, проверять, существуют ли файлы зависимостей для этого target. И, если они существуют, сравнивают ли они временные метки файлов, если они новее, чем сама цель.
Here our first and default target is “all” which looks for main.o and function.o file dependencies. Second and third target is main.o and function.o respectively which have dependencies of main.c and function.c respectively.
=> Перед выполнением команд соответствующей цели, ее зависимости должны быть выполнены, если они не достигнуты, цели этих зависимостей выполняются до заданной цели make, чтобы предоставить недостающие зависимости.
=> Если целью является имя файла, make сравнивает временные метки целевого файла и его файлов зависимостей. Если файл зависимости новее, чем целевой файл, в противном случае целевое выполнение не будет выполнено.
In our case, when first target “all” start executing it looks for main.o file dependency, if its not met. Then it goes to second target main.o which check for its dependency main.c and compare time-stamp with it. If target found main.c dependency is updated, then target execute else not. Same process is follow for next target function.o.
=> Таким образом, он рекурсивно проверяет весь путь по дереву зависимостей до файлов исходного кода. Посредством этого процесса make экономит время, выполняя только те команды, которые необходимо выполнить, в зависимости от того, какие из исходных файлов (перечислены как зависимости) были обновлены и имеют более новую временную отметку, чем их цель.
=> Теперь, когда цель не является именем файла (которое мы назвали «специальными целями»), make, очевидно, не может сравнивать метки времени, чтобы проверить, являются ли зависимости цели более новыми. Поэтому такая цель всегда выполняется.
In our Makefile, special targets are “all” and “clean”. As we discussed target “all” earlier, but we not discuss target clean. Target clean removes the all object files created during compilation and binary executable files according to command.
Для выполнения каждой цели make печатает действия при их выполнении. Обратите внимание, что каждая команда выполняется в отдельной среде под-оболочки из-за безопасного выполнения, так что они не могут изменить текущую среду оболочки, которая может повлиять на выполнение другой цели. Например, если одна команда содержит cd newdir, текущий каталог будет изменен только для этой команды строки, для следующей команды строки текущий каталог не изменится.
Источник: - http://www.firmcodes.com/linux/write-first-makefile-c-source-code-linux-tutorial/