Template: Un Makefile para gobernarlos a todos!

jraleman
jraleman
Nov 2, 2016 · 2 min read

Un makefile es un archivo de texto que tiene un conjunto de reglas, para automatizar la compilacion un programa, de forma simple y organizada. Make se puede usar para compilar cualquier lenguaje, pero en este caso usaremos el Lenguaje C.

Planilla de Makefile

El siguiente Makefile lo puedes usar como planilla para compilar sus programas en C de forma muy rapida.

# Nombre del programa
NAME = <nombre>
# Flags de compilacion
FLAGS = -Wall -Wextra -Werror -g -Ofast
# Directorios
SRC_DIR = ./srcs/
OBJ_DIR = ./obj/
INC_DIR = ./includes/
LIBFT_DIR = ./libft/
MINLBX_DIR = ./minilibx/
# Archivos fuentes y objetos
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
OBJ_FILES = $(SRC_FILES:.c=.o)
# Direcciones
SRC = $(addprefix $(SRC_DIR), $(SRC_FILES))
OBJ = $(addprefix $(OBJ_DIR), $(OBJ_FILES))
LIBFT = $(addprefix $(LIBFT_DIR), libft.a)
MINLBX = $(addprefix $(MINLBX_DIR), libmlx.a)
# Linkers
LNK = -Ofast
# Se compila el archivo binario (ejecutable).
all: obj $(NAME)
# Crea la carpeta donde estara los objetos.
obj:
@mkdir -p $(OBJ_DIR)
$(OBJ_DIR)%.o:$(SRC_DIR)%.c
@gcc $(FLAGS) -I $(INC_DIR) -o $@ -c $<
# Se compila los objetos con las librerias y archivos
$(NAME): $(OBJ)
@echo "(ノ◕ヮ◕)ノ*:・゚✧ Compilando, espere unos segundos..."
@gcc $(OBJ) $(LNK) -lm -o $(NAME)
@echo "(•̀ᴗ•́)و $(NAME) generado!"
# Remueve todos los archivos objetos
clean:
@rm -Rf $(OBJ_DIR)
@echo "¯\_(ツ)_/¯ Objectos removidos!"
# Remueve todos los archivos objetos, binarios, y sus respectivas carpetas
fclean: clean
@rm -f $(NAME)
@echo "(╯°□°)╯︵ ┻━┻ $(NAME) removido!"
# Hace un re-make (como si se hubiera ejecutado Make por primera vez)
re: fclean all
# Le dice al make que estos nombre no son archivos
.PHONY: all clean fclean re

Se asume que tienen la siguiente estructura de carpetas en el directorio del proyecto. Algo como esto.

proyecto/  
|-- includes/
| |-- archivos.h
|-- libs/
| |-- archivos.a
|-- srcs/
| |-- archivos.c
|-- Makefile

La carpeta obj se creara automaticamente con sus respectivos archivos objetos.

Disclaimer

Usar los wildcards, como [$(wildcard $(SRCDIR)/*.c)], se puede considerar una mala practica, ya que si se tienen archivos que no se desean compilar (o archivos que se olvidaron quitar), el programa puede ser que no funcione correctamente. Asi que usalo con responsabilidad. ;)

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store