net-tools/Makefile
2026-02-07 20:54:16 +01:00

216 lines
5.5 KiB
Makefile

# 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