O GNU make tem um manual on-line muito substancial e, embora o IMO seja agravante e obtuso em muitos pontos, faz uma referência decente. Como outros já disseram, basta procurar um tutorial que funcione para você e consultar o manual para que você se acostume a organizá-lo, etc.
Um makefile básico (make do GNU) para a criação de hello.c
pode ser semelhante a:
CFLAGS += -Wall -g -O0
PROGS = hello
.PHONY: clean
%: %.c
$(CC) $(CFLAGS) $< -o $@
clean:
-rm $(PROGS)
$(CC)
é uma variável incorporada ; se você não redefini-lo, o padrão é cc
, que em um sistema GNU será um symlink para gcc
. %
indica uma regra padrão ; neste caso, ele corresponderá a qualquer coisa , embora, se não houver anything.c
no diretório, a receita falhará. $<
e $@
são variáveis automáticas . Então, se você executar agora:
make hello
Make será executado:
cc -Wall -g -O0 hello.c -o hello
Usar +=
com '$ (CFLAGS) permite que você faça coisas assim:
CFLAGS="--std=c99" make hello
Para que -Wall -g -O0
seja anexado a --std=c99
, separado por um espaço. Note que se você usar make CFLAGS="--std=c99" hello
, esse valor irá substituir qualquer definição no makefile.
As regras têm três partes básicas, os alvos , os pré-requisitos e a receita ( veja aqui ). A regra será executada se:
- O arquivo de destino não existe.
- O arquivo de destino é mais antigo que um dos pré-requisitos.
.PHONY
metas serão executadas, não importa o quê. Portanto, executar make clean
com o arquivo acima será executado:
rm hello
Nesse caso, $(PROGS)
não é usado em nenhum outro lugar, embora em um projeto mais complexo faça um arquivo que possa ser usado como um pré-requisito para outra coisa. Por exemplo, se você adicionar esta regra ao topo (após as declarações de variáveis):
all: $(PROGS)
E anexe all
à lista .PHONY:
, agora você pode inserir make
e tudo na lista $(PROGS)
será criado usando a regra %: %.c
, pois esse é um pré-requisito para fazer all
e all
é a primeira regra no arquivo - usada por padrão se você não especificar uma (ou seja, você ainda pode usar make hello
para criar apenas o programa "olá").