make

linguagem de programação


No desenvolvimento de software, make é um utilitário que compila automaticamente programas e bibliotecas do arquivo fonte através da leitura de instruções contidas em arquivos denominados Makefiles, que especificam como obter o programa de destino. O make pode decidir por onde começar através de uma ordenação topológica. Ele também é capaz de resolver automaticamente as dependências do programa que se pretende compilar. Apesar de Ambientes Integrados de Desenvolvimento e funcionalidades de compiladores específicos de linguagem também poderem ser utilizados para gerenciar o processo de compilação nos sistemas modernos, o make continua sendo amplamente usado, principalmente em plataformas do tipo Unix.

O ficheiro "Makefile" é constituido por comandos como os seguintes:

foo.o: foo.c foo.h bar.h
       gcc -o foo.o foo.c

logobig.ppm: logo.pov
       $(POVRAY) logo.pov -k0 -o logobig.ppm

O primeiro comando ordena a recompilação do ficheiro foo.o se um dos ficheiros foo.c, foo.h ou bar.h for mais recente que foo.o. Diz-se que foo.o depende de foo.c, foo.h ou bar.h.

O segundo comando estabelece uma dependência de logobig.ppm em relação a logo.pov e ordena a compilação do ficheiro logobig.ppm através do programa POV-Ray.

Os ficheiros Makefile são utilizados para compilar programas, mas podem ser utilizados em qualquer situação em que alguns ficheiros são produzidos a partir de outros através de programa que podem ser executados a partir da linha de comandos.

Estrutura do makefile

editar

Um Makefile consiste de linhas de dependência, que definem um destino (uma regra), seguido por dois pontos (:) e opcionalmente um conjunto de arquivos nos quais o destino depende. A linha de dependência é organizada de maneira que o destino (do lado esquerdo do caractere :) depende dos componentes (do lado direito do caractere :).

Após cada linha de dependência, uma série de linhas de texto identado por tabulação pode vir adiante, o que define a maneira de como transformar os componentes (normalmente arquivos fonte) no destino (normalmente a "saída"). Se qualquer um dos componentes for modificado, os comandos abaixo da linha serão executados. A estrutura básica é:

  # Comentários são iniciados com o símbolo cerquilha (#).
  destino [destino ...]: [componente ...]
  [<TAB>comando 1]
         .
         .
         .
  [<TAB>comando n]

Um exemplo de um ficheiro (arquivo) makefile

editar
# Especifica o compilador
CC      = g  

# Especifica as opções do compilador
CFLAGS  = -g 
LDFLAGS = -L/usr/openwin/lib
LDLIBS  = -lX11 -lXext

# Necessário para reconhecer .cpp como uma extensão de ficheiro (arquivo)
.SUFFIXES: $(SUFFIXES) .cpp

# Nome do executável
PROG  = life

# Lista dos ficheiros (arquivos) objetos necessários para o programa final
OBJS  = main.o window.o Board.o Life.o BoundedBoard.o
 
all: $(PROG)

# Compilação do programa e passos das ligações de dependências
$(PROG): $(OBJS)
      $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o $(PROG) $(OBJS)

.cpp.o:
      $(CC) $(CFLAGS) -c $*.cpp

Como obter o Make

editar

Os utilizadores do GNU/Linux devem recorrer ao endereço seguinte: http://www.gnu.org/directory/.

Alternativas

editar
  • O makepp deriva de (GNU) make, mas tem adicionalmente um analisador extensível de comandos e ficheiros incluídos a fim de reconhecer automaticamente as dependências implícitas. As opções do comando mudadas e outras influências são reconhecidas. O grande problema de make recursif pode ser contornado facilmente, para garantir uma construção correcta. Além disso o Perl está disponível em todos os níveis. http://makepp.sf.net

Ligações externas

editar