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://www.inf.pucrs.br/~pinho/LaproI/ConceitosBasicos/ConceitosBasicos.htm