/ 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 OBJ = $(addprefix $(OBJ_DIR)/crust/, $(SRC:.c=.o)) 44 45 all: static shared incl 46 47 static: $(BUILD_DIR)/$(NAME)-$(VERSION).a 48 shared: $(BUILD_DIR)/$(NAME)-$(VERSION).so 49 incl: $(BUILD_DIR)/include 50 51 $(BUILD_DIR)/include: $(shell find $(INC_DIR) -type f) 52 cp -r $(INC_DIR) $(BUILD_DIR)/include 53 54 $(BUILD_DIR)/$(NAME)-$(VERSION).a: $(OBJ) 55 @mkdir -p $(BUILD_DIR) 56 ar rcs $@ $(OBJ) 57 ln -sf $(NAME)-$(VERSION).a $(BUILD_DIR)/$(NAME).a 58 59 $(BUILD_DIR)/$(NAME)-$(VERSION).so: $(LFT) $(MLX) $(OBJ) 60 @mkdir -p $(BUILD_DIR) 61 $(CC) $(LDFLAGS) -shared -o $@ $(OBJ) $(LFT) $(MLX) 62 ln -sf $(NAME)-$(VERSION).so $(BUILD_DIR)/$(NAME).so 63 64 # The $*.d file is automatically generated alongside the object file. 65 $(OBJ_DIR)/crust/%.o: %.c $(LFT) $(MLX) 66 @mkdir -p $(dir $@) 67 $(CC) $(CCFLAGS) -c $< -o $@ 68 69 $(LFT): 70 @if [ ! -d "$(LFT_DIR)" ]; then \ 71 git clone https://github.com/cliftontoaster-reid/libft $(LFT_DIR); \ 72 fi 73 @cd $(LFT_DIR) && \ 74 current_commit=$$(git rev-parse HEAD); \ 75 if [ "$$current_commit" != "$(LFT_VER)" ]; then \ 76 git fetch origin && git checkout $(LFT_VER); \ 77 fi 78 $(MAKE) -C $(LFT_DIR) OBJ_DIR=$(abspath $(OBJ_DIR))/libft CFLAGS+=" -fPIC" -j$(nproc) 79 80 $(MLX): 81 @mkdir -p $(CAC_DIR) 82 @if [ ! -d "$(MLX_DIR)" ]; then \ 83 git clone https://github.com/42Paris/minilibx-linux $(MLX_DIR); \ 84 fi 85 $(MAKE) -C $(MLX_DIR) CFLAGS+=" -fPIC -I$(abspath $(MLX_DIR))" -j$(nproc) 86 87 clean: 88 rm -rf $(OBJ_DIR) 89 90 nclean: clean 91 rm -rf $(BUILD_DIR) 92 93 fclean: nclean 94 rm -rf $(LFT_DIR) $(CAC_DIR) 95 96 re: fclean all 97 98 qre: nclean all 99 100 install: all 101 @echo "Installing $(NAME)..." 102 @sudo cp -r $(BUILD_DIR)/include/* /usr/local/include/ 103 @sudo cp $(BUILD_DIR)/$(NAME)-$(VERSION).a /usr/local/lib/ 104 @sudo cp $(BUILD_DIR)/$(NAME)-$(VERSION).so /usr/local/lib/ 105 @sudo ln -sf $(NAME)-$(VERSION).a /usr/local/lib/$(NAME).a 106 @sudo ln -sf $(NAME)-$(VERSION).so /usr/local/lib/$(NAME).so 107 @echo "Installation complete." 108 109 uninstall: 110 @echo "Uninstalling $(NAME)..." 111 @echo "Deleting include files..." 112 @for file in $(shell ls $(BUILD_DIR)/include); do \ 113 sudo rm -rf /usr/local/include/$$file; \ 114 done 115 @sudo rm -f /usr/local/lib/$(NAME).a 116 @sudo rm -f /usr/local/lib/$(NAME).so 117 @echo "Uninstallation complete." 118 119 120 test: all 121 $(MAKE) -C tests OBJ_DIR=$(abspath $(OBJ_DIR))/tests CAC_DIR=$(abspath $(CAC_DIR)) \ 122 LFT_DIR=$(abspath $(LFT_DIR)) MLX_DIR=$(abspath $(MLX_DIR)) BUILD_DIR=$(abspath $(BUILD_DIR)) \ 123 INC_DIR=$(abspath $(INC_DIR)) -j$(nproc) 124 125 compile_commands: 126 @echo "[" > compile_commands.json 127 @first=1; \ 128 for src in $(SRC); do \ 129 obj=$(OBJ_DIR)/crust/$$(echo $$src | sed 's/\.c$$/.o/'); \ 130 if [ $$first -eq 1 ]; then \ 131 first=0; \ 132 else \ 133 echo " ," >> compile_commands.json; \ 134 fi; \ 135 echo " {" >> compile_commands.json; \ 136 echo " \"directory\": \"$(CURDIR)\"," >> compile_commands.json; \ 137 echo " \"command\": \"$(CC) $(CCFLAGS) -c $$src -o $$obj\"," >> compile_commands.json; \ 138 echo " \"file\": \"$$src\"" >> compile_commands.json; \ 139 echo " }" >> compile_commands.json; \ 140 done; \ 141 echo "]" >> compile_commands.json 142 # Format the JSON file. 143 @clang-format -i compile_commands.json 144 145 .PHONY: all static shared clean nclean fclean re qre tools incl compile_commands