/ Makefile
Makefile
  1  CC = clang
  2  
  3  CAC_DIR = .cache
  4  OBJ_DIR = $(CAC_DIR)/obj
  5  LFT_DIR = libft
  6  MLX_DIR = $(CAC_DIR)/minilibx
  7  INC_DIR = include/
  8  SRC_DIR = src/
  9  BUILD_DIR = build
 10  VERSION = 0.1.0
 11  
 12  # Added -MMD -MP to generate dependency files.
 13  CCFLAGS = -Wall -Wextra -Werror -Wpedantic -g -O3 -MMD -MP -I$(INC_DIR) -I$(LFT_DIR) -I$(MLX_DIR) \
 14    -Wno-strict-prototypes -fPIC
 15  LDFLAGS = -L$(LFT_DIR) -L$(MLX_DIR) -lft -lmlx -lXext -lX11 -lm -fPIC -Wl,-rpath,$(LFT_DIR) -Wl,-rpath,$(MLX_DIR) -Wl,-rpath,$(BUILD_DIR)
 16  
 17  LFT = $(LFT_DIR)/libft.a
 18  MLX = $(MLX_DIR)/libmlx.a
 19  
 20  NAME = libcrust
 21  
 22  SRC = \
 23  	$(SRC_DIR)imgs/img/crust_img_from_xpm.c \
 24  	$(SRC_DIR)imgs/img/crust_img_put_pixel.c \
 25  	$(SRC_DIR)imgs/img/crust_img_get_pixel.c \
 26  	$(SRC_DIR)imgs/img/crust_img_drop.c \
 27  	$(SRC_DIR)imgs/img/crust_img_crop.c \
 28  	$(SRC_DIR)imgs/img/crust_img_cpy.c \
 29  	$(SRC_DIR)imgs/img/crust_img_new.c \
 30  	\
 31  	$(SRC_DIR)imgs/scale/crust_img_scale.c \
 32  	$(SRC_DIR)imgs/scale/crust_img_scale_nearest.c \
 33  	$(SRC_DIR)imgs/scale/crust_img_scale_bilinear.c \
 34  	$(SRC_DIR)imgs/scale/crust_img_scale_lanczos.c \
 35  	\
 36  	$(SRC_DIR)imgs/set/crust_set_from_xpm.c \
 37  	$(SRC_DIR)imgs/set/crust_set_drop.c \
 38  	$(SRC_DIR)imgs/set/crust_set_get_img.c \
 39  	$(SRC_DIR)imgs/set/crust_set_get_img_by_pos.c \
 40  	$(SRC_DIR)imgs/set/crust_set_get_imgs.c \
 41  	$(SRC_DIR)imgs/set/crust_set_get_imgs_by_pos.c \
 42  	\
 43  	$(SRC_DIR)map/camera/camera_free.c \
 44  	$(SRC_DIR)map/camera/camera_init.c \
 45  	$(SRC_DIR)map/camera/camera_move.c \
 46  	$(SRC_DIR)map/camera/camera_render.c \
 47  	$(SRC_DIR)map/camera/camera_resize.c \
 48  	\
 49  	$(SRC_DIR)utils/math/clamp.c \
 50  	$(SRC_DIR)utils/math/lanczos.c \
 51  	$(SRC_DIR)utils/math/sinc.c \
 52  
 53  
 54  OBJ = $(addprefix $(OBJ_DIR)/crust/, $(SRC:.c=.o))
 55  
 56  all: static shared incl
 57  
 58  static: $(BUILD_DIR)/$(NAME)-$(VERSION).a
 59  shared: $(BUILD_DIR)/$(NAME)-$(VERSION).so
 60  incl: $(BUILD_DIR)/include
 61  
 62  $(BUILD_DIR)/include: $(shell find $(INC_DIR) -type f)
 63  	cp -r $(INC_DIR) $(BUILD_DIR)/include
 64  
 65  $(BUILD_DIR)/$(NAME)-$(VERSION).a: $(OBJ)
 66  	@mkdir -p $(BUILD_DIR)
 67  	ar rcs $@ $(OBJ)
 68  	ln -sf $(NAME)-$(VERSION).a $(BUILD_DIR)/$(NAME).a
 69  
 70  $(BUILD_DIR)/$(NAME)-$(VERSION).so: $(LFT) $(MLX) $(OBJ)
 71  	@mkdir -p $(BUILD_DIR)
 72  	$(CC) $(LDFLAGS) -shared -o $@ $(OBJ) $(LFT) $(MLX)
 73  	ln -sf $(NAME)-$(VERSION).so $(BUILD_DIR)/$(NAME).so
 74  
 75  # The $*.d file is automatically generated alongside the object file.
 76  $(OBJ_DIR)/crust/%.o: %.c $(LFT) $(MLX)
 77  	@mkdir -p $(dir $@)
 78  	$(CC) $(CCFLAGS) -c $< -o $@
 79  
 80  $(LFT):
 81  	@if [ ! -d "$(LFT_DIR)" ]; then \
 82  		git clone https://github.com/cliftontoaster-reid/libft $(LFT_DIR); \
 83  	fi
 84  	@cd $(LFT_DIR) && \
 85  		current_commit=$$(git rev-parse HEAD); \
 86  		if [ "$$current_commit" != "$(LFT_VER)" ]; then \
 87  			git fetch origin && git checkout $(LFT_VER); \
 88  		fi
 89  	$(MAKE) -C $(LFT_DIR) OBJ_DIR=$(abspath $(OBJ_DIR))/libft CFLAGS+=" -fPIC" -j$(nproc)
 90  
 91  $(MLX):
 92  	@mkdir -p $(CAC_DIR)
 93  	@if [ ! -d "$(MLX_DIR)" ]; then \
 94  		git clone https://github.com/42Paris/minilibx-linux $(MLX_DIR); \
 95  	fi
 96  	$(MAKE) -C $(MLX_DIR) CFLAGS+=" -fPIC -I$(abspath $(MLX_DIR))" -j$(nproc)
 97  
 98  clean:
 99  	rm -rf $(OBJ_DIR)
100  
101  nclean: clean
102  	rm -rf $(BUILD_DIR)
103  
104  fclean: nclean
105  	rm -rf $(LFT_DIR) $(CAC_DIR)
106  
107  re: fclean all
108  
109  qre: nclean all
110  
111  install: all
112  	@echo "Installing $(NAME)..."
113  	@sudo cp -r $(BUILD_DIR)/include/* /usr/local/include/
114  	@sudo cp $(BUILD_DIR)/$(NAME)-$(VERSION).a /usr/local/lib/
115  	@sudo cp $(BUILD_DIR)/$(NAME)-$(VERSION).so /usr/local/lib/
116  	@sudo ln -sf $(NAME)-$(VERSION).a /usr/local/lib/$(NAME).a
117  	@sudo ln -sf $(NAME)-$(VERSION).so /usr/local/lib/$(NAME).so
118  	@echo "Installation complete."
119  
120  uninstall:
121  	@echo "Uninstalling $(NAME)..."
122  	@echo "Deleting include files..."
123  	@for file in $(shell ls $(BUILD_DIR)/include); do \
124  		sudo rm -rf /usr/local/include/$$file; \
125  	done
126  	@sudo rm -f /usr/local/lib/$(NAME).a
127  	@sudo rm -f /usr/local/lib/$(NAME).so
128  	@echo "Uninstallation complete."
129  
130  
131  test: all
132  	$(MAKE) -C tests OBJ_DIR=$(abspath $(OBJ_DIR))/tests CAC_DIR=$(abspath $(CAC_DIR)) \
133  		LFT_DIR=$(abspath $(LFT_DIR)) MLX_DIR=$(abspath $(MLX_DIR)) BUILD_DIR=$(abspath $(BUILD_DIR)) \
134  		INC_DIR=$(abspath $(INC_DIR)) -j$(nproc)
135  
136  .PHONY: all static shared clean nclean fclean re qre tools incl