makefile

O objetivo de Makefile é definir regras de compilação para projetos de software. Tais regras são definidas em arquivo chamado Makefile. O programa make interpreta o conteúdo do Makefile e executa as regras lá definidas.

Vantagens

  • Evita a compilação de arquivos desnecessários. Por exemplo, se seu programa utiliza 120 bibliotecas e você altera apenas uma, o make descobre (comparando as datas de alteração dos arquivos fontes com as dos arquivos anteriormente compilados) qual arquivo foi alterado e compila apenas a biblioteca necessária.
  • Automatiza tarefas rotineiras como limpeza de vários arquivos criados temporariamente na compilação
  • Pode ser usado como linguagem geral de script embora seja mais usado para compilação

Makefile básico para o libft

NAME = libft.a

CC = gcc

CFLAGS = -Wall -Wextra -Werror

RM = rm -f

SRC	= ft_memset.c \
	  ft_bzero.c \
	  ft_memcpy.c \
	  ft_memccpy.c \
	  ft_memmove.c \
	  ft_memchr.c \
	  ft_memcmp.c \
	  ft_strlen.c \
	  ft_strlcpy.c \
	  ft_strlcat.c \
	  ft_strchr.c \
	  ft_strrchr.c \
	  ft_strnstr.c \
	  ft_strncmp.c \
	  ft_atoi.c \
	  ft_isalpha.c \
	  ft_isdigit.c \
	  ft_isalnum.c \
	  ft_isascii.c \
	  ft_isprint.c \
	  ft_toupper.c \
	  ft_tolower.c \
	  ft_calloc.c \
	  ft_strdup.c \
	  ft_substr.c \
	  ft_strjoin.c \
	  ft_strtrim.c \
	  ft_split.c \
	  ft_itoa.c \
	  ft_strmapi.c \
	  ft_putchar_fd.c \
	  ft_putstr_fd.c \
	  ft_putendl_fd.c \
	  ft_putnbr_fd.c \
	  ft_lstnew.c \
          ft_lstadd_front \
	  ft_lstsize.c \
          ft_lstlast \
          ft_lstadd_back \
          ft_lstdelone \
          ft_lstclear \
          ft_lstiter \
          ft_lstmap

OBJ = $(SRC:.c=.o)

$(NAME): libft.h 
	$(CC) $(CFLAGS) -c $(SRC) -I libft.h
	ar rc $(NAME) $(OBJ)
	ranlib $(NAME)

all: $(NAME)

clean:
	$(RM) $(OBJ)

fclean: clean
	$(RM) $(NAME)

re: fclean all

.PHONY: clean fclean

Explicando as regras

  • NAME: Nome do programa.
  • CC: Definimos CC para nomes de compiladores de C ou C++ .Aqui o gcc.
  • CFLAGS: Serve para definir opções passadas ao compilador. (no caso -Wall -Wextra -Werror).
  • RM: Comando para remover os arquivos.
  • SRC: Arquivos que serão usados.
  • OBJ:  Para cada arquivo.c um arquivo OBJETO e criado com a extensão “.o” arquivo.o .

Para utilizarmos uma variável colocamos entre $().

A variável $(NAME) realizará a compilação com gcc com as opções Wall Wextra e Werror mais a opção ‘-c‘ (compila/monta os arquivos de origem – no caso $(SRC) – sem fazer o link. O resultado final está na forma de um arquivo objeto para cada arquivo origem) e a opção ‘-I‘ (procura onde está o cabeçalho).

Ela também usará o comando ‘ar rc‘ que é usado para criar bibliotecas (c significa que ela será criada senão existir e r que os novos objetos substituirão os objetos antigos com o mesmo nome).

Por fim, temos o comando ‘ranlib‘ que cria e indexa os arquivos. Você não pode usar arquivos indexados como biblioteca.

  • all: É o nome das regras a serem executadas. No caso, executará %(NAME).
  • clean: Apaga os arquivos intermediários.
  • fclean: Realiza o ‘clean’ e apaga o programa.
  • re: Realiza o ‘fclean’ e recompila o programa.
  • .PHONY: Evita o relink (compilar várias vezes).

Algumas considerações

  • Arquivo objeto é a versão em linguagem de máquina do programa-fonte.
  • Arquivo .a é uma coleção de arquivos .o.

Referências

http://man7.org/linux/man-pages/man1/gcc.1.html

https://pt.wikibooks.org/wiki/Programar_em_C/Makefiles

http://www.eecs.umich.edu/courses/eecs380/HANDOUTS/Makefile-Tutorial.html

https://stackoverflow.com/questions/2286441/c-makefile-rcv-ranlib

https://epitech-2022-technical-documentation.readthedocs.io/en/latest/makefiles.html

https://jacknpoeexplicacpp.wordpress.com/2015/07/25/criando-bibliotecas-em-c-parte-3-arquivo-a/#more-30

https://www.inf.pucrs.br/~pinho/LaproI/ConceitosBasicos/ConceitosBasicos.htm

Deixe um comentário