Por favor, explique o que acontece quando eu executo este Makefile

0

Estou aprendendo flex e (pela primeira vez) usando a linha de comando.

Eu criei um Makefile para simplificar o processo de teste, mas não entendo por que os comandos são inversos.

Por exemplo, no terminal, a ordem é assim:

flex test.l

isso cria o arquivo lex.yy.c

então eu compilo isso:

g++ lex.yy.c -ll -o test

O Makefile é lido ao contrário:

test: lex.yy.c
     g++ lex.yy.c -ll -o test

lex.yy.c: test.l
     flex test.l

Então, o que acontece especificamente quando eu executo make ?

    
por MayNotBe 28.08.2014 / 20:14

2 respostas

8

Makefiles seguem este formato (os Makefiles devem sempre usar tabulações em vez de espaços, já que são necessários na maioria (senão em todas) implementações de make ):

target: dependencies
    operations to build target
  • O alvo é o que você está disposto a construir / compilar / criar. Pode haver vários deles, e eles devem ser criados na ordem Makefile, a menos que as dependências precisem ser atendidas primeiro. O primeiro destino em seu arquivo é chamado de padrão de destino , é o que make tenta criar quando você o chama sem argumentos.
  • As dependências são as diferentes partes necessárias para construir um destino.

Neste Makefile, você tem dois alvos:

  • teste
  • lex.yy.c

Como lex.yy.c é uma dependência necessária para criar test , ele será criado primeiro em test.l . Uma vez gerado, será possível compilar test . Basicamente, make ...:

  • Tenta criar test .
  • Dependência não resolvida. lex.yy.c não existe (ou foi atualizado), ele precisa ser criado primeiro.
  • Operações de leitura para criar lex.yy.c . A execução de flex test.l : lex.yy.c foi criada.
  • Todas as dependências para test são atendidas. Executando g++ lex.yy.c -ll -o test .
  • test é criado.

Informações adicionais: Para mais informações sobre makefiles, eu recomendaria The Linux Development Platform por Rafeeq Ur Rehman . Capítulo 4: Usando o GNU Make .

    
por 28.08.2014 / 20:32
4

Fazer chamadas o alvo test primeiro, mas lex.yy.c é uma dependência.

Portanto, antes de executar a execução real, faça análises de seus destinos e todas as dependências. O primeiro alvo é test , mas antes de começar a executá-lo, lex.yy.c é chamado.

    
por 28.08.2014 / 20:30

Tags