Процесс компиляции программ на языке C (Семинары), страница 3
Описание файла
Файл "Процесс компиляции программ на языке C" внутри архива находится в папке "Семинары". Документ из архива "Семинары", который расположен в категории "". Всё это находится в предмете "архитектура эвм" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "Процесс компиляции программ на языке C"
Текст 3 страницы из документа "Процесс компиляции программ на языке C"
Проверка осуществляется рекурсивно: так, при сборке цели hello, make сначала проверяет, надо ли сделать все его зависимости, то есть файлы main.o, factorial.o и hello.o.
Если команда сборки какой-то из целей выдает ошибку (код завершения, отличный от 0), make останавливает процесс компиляции и не пытается собирать остальные цели. На самом деле, make имеет опции, выключающие это поведение и заставляющие make собрать все цели, какие можно. При сборке из командной строки это не всегда удобно, так как при прекращении сборки последней строкой выдачи, скорее всего, будет сообщение об ошибке, из-за которой сборка остановилась, а при продолжении сборки это сообщение может быть сложно найти в общей выдаче.
Комментарии и переменные
В Makefile, кроме правил, могут также содержаться комментарии и переменные.
Комментарии — это строки, начинающиеся с символа #, заканчивающиеся символом <NEWLINE> и содержащие произвольный текст. Комментарии игнорируются утилитой make.
Есть любители вставлять в начало Makefile магическую последовательность #!/bin/make
Эта строка является комментарием с точки зрения make, но обозначает такой файл как интерпретируемую программу с интерпретатором /bin/make с точки зрения системного вызова exec(2) и, следовательно, с точки зрения shell. Такой Makefile можно сделать исполняемым командой chmod +x и запускать из shell без явного вызова make, командой ./Makefile.
Переменные — это текстовые строки вида NAME=VALUE, похожие на переменные среды или переменные shell. К значениям переменных можно обращаться, используя синтаксис $(NAME). Переменные можно использовать в любых местах Makefile. Значения переменных можно задавать внутри самого Makefile или в командной строке make, передавая в качестве параметра строку NAME=OTHER_VALUE. При этом, значения, заданные в командной строке, «сильнее» значений, заданных в файле.
Также, запустив make с опцией -e, можно заставить его брать значения переменных из переменных среды.
Пример файла с использованием комментариев и переменных:
# Если пользователь захочет собирать программу при помощи GCC, # он может запустить сборку командой make CC=gcc # или командами export CC=gcc; make -e CC=сс CFLAGS=-Wall -O OBJECTS=main.o factorial.o hello.o hello: $(OBJECTS) $(CC) $(OBJECTS) -o hello main.o: main.c functions.h $(CC) -c $(CFLAGS) main.c factorial.o: factorial.c functions.h $(CC) -c $(CFLAGS) factorial.c hello.o: hello.c functions.h $(CC) -c $(CFLAGS) hello.cpp # Обратите внимание, что эта версия Makefile гораздо умнее предыдущей # Она удаляет только объектные файлы, относящиеся к проекту # а не все объектные файлы в текущем каталоге. clean: rm -rf $(OBJECTS) hello
Детальное описание make(1) может быть найдено в системном руководстве man и в многочисленных учебниках и туториалах, доступных в сети Интернет. Подробная документация по dmake доступна на сайте http://docs.oracle.com.
Автоматическая генерация Makefile
make предоставляет ряд средств, упрощающих создание больших Makefile для больших проектов. Самая сложная задача при поддержании Makefile — это правильное отслеживание зависимостей, в первую очередь — отслеживание, какие .c файлы включают какие заголовочные файлы. Для решения этой задачи в рамках проекта GNU была реализована утилита automake (не входит в стандартную поставку Solaris, но может быть собрана из исходных текстов).
Большинство современных интегрированных сред разработки на C/C++, например, SunStudio, включают простые для использования средства автоматической генерации и поддержки Makefile. К сожалению, генерируемые такими средами Makefile не очень-то удобны для последующей ручной модификации.