/ 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