# Makefile for ft_ping # Uses build.mk generated by ./configure script # Configuration # Include generated configuration (must run ./configure first) -include build.mk # Check if build.mk exists ifeq ($(wildcard build.mk),) $(error build.mk not found. Please run './configure' first) endif # Project Configuration NAME = ft_ping TEST_BIN = ft_ping.test .DEFAULT_GOAL := all MAKEFLAGS += --no-print-directory # Include source files include sources.mk # Build Directories OBJ_DIR = build OBJS = $(SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) DEPS = $(OBJS:.o=.d) # Build Rules .PHONY: all all: $(LIBICMP_DEP) $(NAME) # Build local libicmp if needed ifeq ($(BUILD_LOCAL_LIBICMP),yes) $(LIBICMP_DEP): @echo "[BUILD] Building local libicmp..." $(MAKE) -C $(LIBICMP_DIR) -f $(LIBICMP_MAKEFILE) $(LIBICMP_BUILD_FLAGS) @echo "[OK] libicmp built successfully" endif # Link ft_ping $(NAME): $(OBJS) $(LIBICMP_DEP) @echo "[LINK] Linking $(NAME)..." $(CC) -o $@ $(OBJS) $(LDFLAGS) @echo "[OK] $(NAME) built successfully" # Compile object files $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(dir $@) @echo "[CC] $<" $(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@ # Include dependencies -include $(DEPS) # Test Rules .PHONY: test ifeq ($(ENABLE_TESTS),yes) test: $(TEST_BIN) @echo "[TEST] Running tests..." ifeq ($(SUDO_TESTS),yes) @if [ "$$(id -u)" -ne 0 ]; then \ echo "[WARN] Tests require root privileges, using sudo..."; \ sudo ./$(TEST_BIN); \ else \ ./$(TEST_BIN); \ fi else ./$(TEST_BIN) endif @echo "[OK] All tests passed" $(TEST_BIN): $(TESTS) $(filter-out $(OBJ_DIR)/main.o,$(OBJS)) $(LIBICMP_DEP) @mkdir -p $(dir $@) @echo "[BUILD] Building test binary..." $(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) $(TEST_LDFLAGS) -o $@ else test: @echo "[SKIP] Tests are disabled" @echo "Run './configure --enable-tests' to enable tests" endif # Installation Rules .PHONY: install install: all @echo "[INSTALL] Installing $(NAME)..." ifeq ($(BUILD_LOCAL_LIBICMP),yes) ifeq ($(INSTALL_LIBICMP),yes) @echo "[INSTALL] Installing libicmp to $(LIBICMP_PREFIX)..." $(MAKE) -C $(LIBICMP_DIR) -f $(LIBICMP_MAKEFILE) install PREFIX=$(LIBICMP_PREFIX) @echo "[OK] libicmp installed" endif endif @echo "[INSTALL] Installing binary to $(BINDIR)..." install -d $(DESTDIR)$(BINDIR) install -m 755 $(NAME) $(DESTDIR)$(BINDIR)/$(NAME) @echo "[OK] $(NAME) installed to $(BINDIR)/$(NAME)" @echo "" @echo "Installation complete!" @echo "Run: $(BINDIR)/$(NAME)" .PHONY: uninstall uninstall: @echo "[UNINSTALL] Removing $(NAME)..." $(RM) $(DESTDIR)$(BINDIR)/$(NAME) @echo "[OK] $(NAME) removed" ifeq ($(BUILD_LOCAL_LIBICMP),yes) ifeq ($(INSTALL_LIBICMP),yes) @echo "[UNINSTALL] Removing libicmp..." $(MAKE) -C $(LIBICMP_DIR) -f $(LIBICMP_MAKEFILE) uninstall PREFIX=$(LIBICMP_PREFIX) @echo "[OK] libicmp removed" endif endif # Clean Rules .PHONY: clean clean: @echo "[CLEAN] Cleaning object files..." $(RM) -r $(OBJ_DIR) ifeq ($(BUILD_LOCAL_LIBICMP),yes) @echo "[CLEAN] Cleaning libicmp..." $(MAKE) -C $(LIBICMP_DIR) -f $(LIBICMP_MAKEFILE) clean endif @echo "[OK] Clean complete" .PHONY: fclean fclean: clean @echo "[FCLEAN] Removing binaries..." $(RM) $(NAME) $(RM) $(TEST_BIN) ifeq ($(BUILD_LOCAL_LIBICMP),yes) @echo "[FCLEAN] Cleaning libicmp binaries..." $(MAKE) -C $(LIBICMP_DIR) -f $(LIBICMP_MAKEFILE) fclean endif @echo "[OK] Full clean complete" .PHONY: re re: fclean $(MAKE) all # Configuration Management .PHONY: reconfigure reconfigure: @echo "[INFO] Removing build.mk..." $(RM) build.mk @echo "[INFO] Please run './configure' again" .PHONY: distclean distclean: fclean @echo "[DISTCLEAN] Removing generated configuration..." $(RM) build.mk @echo "[OK] Distribution clean complete" # Information Rules .PHONY: info info: @echo "======================================" @echo "Build Configuration for $(NAME)" @echo "======================================" @echo "" @echo "libicmp:" @echo " Source: $(if $(filter yes,$(USE_SYSTEM_LIBICMP)),system,local)" @echo " Type: $(LIBICMP_TYPE)" @echo " Path: $(LIBICMP_PATH)" @echo " Build local: $(BUILD_LOCAL_LIBICMP)" @echo " Install to system: $(INSTALL_LIBICMP)" @echo "" @echo "Compiler:" @echo " CC: $(CC)" @echo " CPPFLAGS: $(CPPFLAGS)" @echo " CFLAGS: $(CFLAGS)" @echo " LDFLAGS: $(LDFLAGS)" @echo "" @echo "Build Options:" @echo " Debug: $(ENABLE_DEBUG)" @echo " Sanitizers: $(ENABLE_SANITIZERS)" @echo " LTO: $(ENABLE_LTO)" @echo " Strict: $(ENABLE_STRICT)" @echo " Tests: $(ENABLE_TESTS)" @echo "" @echo "Installation:" @echo " PREFIX: $(PREFIX)" @echo " BINDIR: $(BINDIR)" @echo " LIBDIR: $(LIBDIR)" @echo " INCLUDEDIR: $(INCLUDEDIR)" @echo "" @echo "Run './configure --help' to reconfigure" .PHONY: help help: @echo "Available targets:" @echo "" @echo " make or make all Build ft_ping" @echo " make test Run tests (if enabled)" @echo " make install Install to PREFIX ($(PREFIX))" @echo " make uninstal Uninstall from system" @echo " make clean Remove object files" @echo " make fclean Remove all built files" @echo " make re Rebuild everything" @echo " make reconfigure Remove build.mk (run ./configure again)" @echo " make distclean Full clean including build.mk" @echo " make info Show build configuration" @echo " make help Show this help" @echo "" @echo "Note: Run './configure' first to generate build.mk" # vim: tabstop=8 shiftwidth=8 noexpandtab