4852
Комментарий:
|
5440
|
Удаления помечены так. | Добавления помечены так. |
Строка 101: | Строка 101: |
|| prog.c || fun.c || || <<MiniPage({{{#!highlight c\n#include <stdio.h>\n#include "outlib.h"\nint main(int argc, char *argv[]) {\n int i;\n if((Count = argc)>1) {\n output("<INIT>");\n for(i=1; i<argc; i++)\n output(argv[i]);\n output("<DONE>");\n }\n else\n usage(argv[0]);\n return 0;\n}\n}}})>> || <<MiniPage({{{#!highlight c\n#include <stdio.h>\n#include "outlib.h"\nvoid output(char *str) {\n printf("%d: %s\012", Count++, str);\n}\n\nvoid usage(char *prog) {\n fprintf(stderr, "%s: Print all arguments\012\t"\\n "Usage: %s arg1 [arg2 […]]\012", prog, prog);\n}\n}}})>> || |
|| prog.c || fun.c || || <<MiniPage({{{#!highlight c\n#include <stdio.h>\n#include "outlib.h"\nint main(int argc, char *argv[]) {\n int i;\n if((Count = argc)>1) {\n output("<INIT>");\n for(i=1; i<argc; i++)\n output(argv[i]);\n output("<DONE>");\n }\n else\n usage(argv[0]);\n return 0;\n}\n}}})>> || <<MiniPage({{{#!highlight c\n#include <stdio.h>\n#include "outlib.h"\nvoid output(char *str) {\n printf("%d: %s\012", Count++, str);\n}\n\nvoid usage(char *prog) {\n fprintf(stderr, "%s: Print all arguments\012\t"\\n "Usage: %s arg1 [arg2 […]]\012", prog, prog);\n}\n}}})>> || |
Строка 105: | Строка 105: |
|||| Makefile || |||| <<MiniPage( {{{#!highlight makefile\nGENERATES = prog README\nTRASH = *.o *~ o.*\n\n%.o: %.c\n cc $< -c -o $@\n\nall: README prog\n\nprog: const.o fun.o prog.o\n cc $^ -o $@\n\nREADME: prog\n ./$< 2> $@\n\nclean:\n rm -f $(TRASH)\n\ndistclean: clean\n rm -rf $(GENERATES)\n}}})>> || * Следуя традиции, мы разделили генераты на совсем ненужные (`TRASH` и собственно целевые файлы проекта (`GENERATES`), которые всё равно стоит удалять, если в репозитории должны остаться только исходники |
Пример написания и использования Makefile
Начнём с таких вот файлов:
prog.c |
fun.c |
|
|
const.c |
outlib.h |
1 int Count=0;
|
|
Их можно собрать в один файл просто с помощью cc *.c -o prog
- Напишем простейший Makefile для этого:
- Помните о табах!
Заодно сделаем цель clean. Пробуем make, make clean.
- Так можно и скриптом было сделать. Обеспечим раздельную компиляцию и компоновку.
- Раздельная компиляция работает:
1 $ make clean 2 rm -f prog a.out *.o 3 $ make prog 4 cc const.c -c -o const.o 5 cc fun.c -c -o fun.o 6 cc prog.c -c -o prog.o 7 cc const.o fun.o prog.o -o prog 8 $ touch fun.c 9 $ make prog 10 cc fun.c -c -o fun.o 11 cc const.o fun.o prog.o -o prog 12 $ touch fun.o 13 $ make prog 14 cc const.o fun.o prog.o -o prog 15
- Кстати, вот альтернативная форма, в которой нет табуляций. Она малочитаема, не будем ей пользоваться:
- (а табуляции и пробелы становятся обычными разделителями)
- И ещё одна. На этот раз полями рецепта определяются не табуляции, а тильды (а табуляции и пробелы становятся обычными разделителями):
- Раздельная компиляция работает:
Хорошо бы задать правило по умолчанию, как делать .o файлы из .c.
Конструкции, начинающиеся с $ — подстановки значения некоторых переменных Make:
$@ означает цель (похожа на цель в тире)
$< означает первую из зависимостей
$^ означает список всех зависимостей
- В Make есть и нормальные переменные, только их подстановка должна заключаться в круглые скобки. Заодно усложним и нашу программу.
prog.c
fun.c
|
|
const.c |
outlib.h |
1 int Count=0;
|
|
Makefile |
|
|
Следуя традиции, мы разделили генераты на совсем ненужные (TRASH и собственно целевые файлы проекта (GENERATES), которые всё равно стоит удалять, если в репозитории должны остаться только исходники