Criando um Makefile [closed]

0

Como o título indica, estou querendo saber como criar um Makefile para compilar hello.c :

// for example

int main(int argc, char *argv[]) {
    puts("Hello world");
    return 0;
}

Estou ciente de que eu compilei o programa com a ajuda do gcc hello.c -o hello e como eu o executo, mas isso é o que eu sei no momento.

    
por Daniel 31.05.2014 / 14:54

2 respostas

2

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á").

    
por 31.05.2014 / 17:03
1

Para criar um Makefile apropriado, é necessário ter estas duas coisas:

  • Macros
  • Regras

Macros são o que usamos em Makefiles para encurtar a sintaxe e facilitar a edição do arquivo se algo for alterado. Por exemplo:

C = gcc # sets the macro for the C compiler to C

E assim, $(C) pode ser substituído por gcc

As regras são usadas para verificar as alterações de arquivos e suas dependências. Deve sempre haver uma regra all para que, quando make for executado, verifique primeiro a regra all . Assim como o seu programa C, onde a função main() é executada primeiro.

Exemplo de Makefile:

C = gcc
CFLAGS = -o
INPUT = hello
OUT = $(INPUT)

all: $(INPUT)

$(OUT): $(INPUT).c
        $(C) $(INPUT).cpp $(CFLAGS) $(OUT)

Uma regra pode ser declarada dando seu nome + um ponto-e-vírgula (por exemplo, do_this: ), adicionando quaisquer arquivos dependentes ou regras depois dela (por exemplo, another_rule $(DEPENDANDTFILE) ) e adicionando comandos na próxima linha após uma TAB.

NOTA: As regras não funcionarão a menos que haja uma ABA no início da linha da declaração.

    
por 31.05.2014 / 15:55

Tags