Hello, World! GNU make.

Спецсеминар "Разработка свободного ПО": http://uucode.com/oss2004/. 6-я лекция, 16 октября.

Hello, World!

#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-файл

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-файлах. Два типа переменных.

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 -- свой. Но принципы похожи.

Другие инструменты:

Необходимость и важность autobuild

Ещё примеры использования:

Make -- один из инструментов для создания autobuild process. Важно уметь с помощью нажатия одной кнопки "сделать всё" в чистом окружении, включая запись на болванке.

Важно:

Лечит:

Joel Spolsky <http://joelonsoftware.com/>

The Joel Test: 12 Steps to Better Code http://joelonsoftware.com/articles/fog0000000043.html

  1. Do you use source control?
  2. Can you make a build in one step?
  3. Do you make daily builds?