/ 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