Спецсеминар "Разработка свободного ПО": http://uucode.com/oss2004/. 6-я лекция, 16 октября.
#include<stdio.h>
int main(void) {
char s[]="Hello, World!";
if (0 > printf("%s\n", s)) {
perror("Can't print");
return -1;
}
return 0;
}
homework: заставить сработать ошибку
Скобочки. На примере "while();" агитация за
if() {
...
}
вместо
if()
{
...
}
В одном проекте желателен единый стиль. Священные войны. К языкам программирования уже обычно пишется styleguide. Переформатировать можно программой "astyle".
make-файл состоит из набора правил вида:
target: deps <TAB> action <TAB> action
"Ёжики плакали и кололись, но продолжали есть кактус". Замены нет.
На сайте есть "book of make" в виде HTML, а также в других форматах.
hw: hw.c gcc -o hw hw.c test: hw ./hw $ make gcc -o hw hw.c $ make make: `hw' не требует обновления. $ make test ./hw Hello, World!
make-файл, чуть получше, но всё равно плохой:
CC = gcc CFLAGS += -O3 hw : hw.c $(CC) $(CFLAGS) -o hw hw.c $ make test CC=gcc-2.96 gcc-2.96 -O3 -o hw hw.c
Есть специальные переменные, которые всегда определены. И которые всегда используются в хороших make-файлах.
Два вида переменных: рекурсивные, ленивые и просто раскрываемые, активные. Обычно используются ленивые.
Польза ленивых:
CFLAGS = $(include_dirs) -O include_dirs = -Ifoo -Ibar
Непольза:
CFLAGS = $(CFLAGS) -O
Польза активных:
smth := $(shell find . -name 'xxx')
Непольза:
Выполняются, даже если и не нужны
Выводы:
homework: как сделать значение переменной равной одному пробелу
Допустим, 2000 C-файлов. Лениво для каждого писать своё правило. Тогда используются неявные правила.
OBJS = hw.o ... x.o hw: $(OBJS) $(CC) -o hw $(LDFLAGS) $(OBJS) %.o: %.c $(CC) -c $(CFLAGS) -o $@ $<
xslt := xslt/transform.xsl
sourcefiles := $(wildcard xml/*xml)
resultfiles := $(patsubst xml/%.xml, html/%.html, $(sourcefiles))
all: $(resultfiles)
html/%.html: xml/%.xml ${xslt}
xsltproc -o $@ $(xslt) $<
Надо стараться писать переносимые make-файлы. Например, делать запуск утилит через переменные ($(AR), $(BISON), $(CC), etc).
В общем, соглашений много. Но они в основном описаны. С пользовательской точки зрения хороший make-файл имеет цели:
Разных make'ов -- много. Например, во FreeBSD -- свой. Но принципы похожи.
Другие инструменты:
Ещё примеры использования:
Make -- один из инструментов для создания autobuild process. Важно уметь с помощью нажатия одной кнопки "сделать всё" в чистом окружении, включая запись на болванке.
Важно:
Лечит:
Joel Spolsky <http://joelonsoftware.com/>
The Joel Test: 12 Steps to Better Code http://joelonsoftware.com/articles/fog0000000043.html