PNAME = hello-world BUILD_DIR = build INCLUDE_DIR = include SRC_DIR = src CC = gcc CFLAGS = -I$(INCLUDE_DIR) -Wall -Wextra -g TARGET = $(BUILD_DIR)/$(PNAME) SRCS = $(wildcard $(SRC_DIR)/*.c) OBJS = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRCS)) # Default target all: $(TARGET) # Build the executable $(TARGET): $(OBJS) $(CC) $(OBJS) -o $@ # Compile source files into object files $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR) $(CC) $(CFLAGS) -c $< -o $@ # Create the build directory $(BUILD_DIR): mkdir -p $(BUILD_DIR) # Run the executable run: $(TARGET) @$(TARGET) # Clean built files clean: rm -rf $(BUILD_DIR) # Clean then build rebuild: clean all # Display help information help: @echo "Makefile Usage:" @echo "" @echo " make - Builds the executable (default)" @echo " make all - Same as 'make'" @echo " make run - Builds the executable if needed and then runs it" @echo " make clean - Removes the build directory and all built files" @echo " make rebuild - Performs a clean first, then builds the project" @echo " make help - Displays this help message" .PHONY: all clean run rebuild help