feat: add libcli as a git submodule
This commit is contained in:
parent
d27ed4a839
commit
f8a65d87db
4 changed files with 4 additions and 987 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
|
@ -1,3 +1,6 @@
|
|||
[submodule "libicmp"]
|
||||
path = libicmp
|
||||
url = git@github.com:lohhiiccc/icmp.git
|
||||
[submodule "libcli"]
|
||||
path = libcli
|
||||
url = forgejo@lohic.dev:loic/libcli.git
|
||||
|
|
|
|||
280
Makefile
280
Makefile
|
|
@ -1,280 +0,0 @@
|
|||
# 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
|
||||
VERSION := 0.0.1
|
||||
BUILD_DATE := $(shell git log -1 --format=%cd --date=format:'%Y-%m-%d %H:%M:%S' 2>/dev/null || date -u '+%Y-%m-%d %H:%M:%S')
|
||||
GIT_COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null || echo "nogit")
|
||||
|
||||
ifeq ($(GIT_COMMIT),nogit)
|
||||
HAS_GIT_COMMIT=0
|
||||
else
|
||||
HAS_GIT_COMMIT=1
|
||||
endif
|
||||
|
||||
.DEFAULT_GOAL := all
|
||||
MAKEFLAGS += --no-print-directory
|
||||
|
||||
BINARIES = ft_ping
|
||||
# Future: BINARIES = ft_ping ft_traceroute
|
||||
|
||||
# Include source files
|
||||
include sources/ping.mk
|
||||
|
||||
SRCS = $(PING_SRCS)
|
||||
TESTS = $(PING_TESTS)
|
||||
|
||||
# Get libicmp sources for dependency tracking if building locally
|
||||
ifeq ($(BUILD_LOCAL_LIBICMP),yes)
|
||||
LIBICMP_SRCS = $(shell find $(LIBICMP_DIR)/src -type f -name '*.c' 2>/dev/null)
|
||||
LIBICMP_HEADERS = $(wildcard $(LIBICMP_DIR)/includes/*.h)
|
||||
endif
|
||||
|
||||
# Build Directories
|
||||
OBJ_DIR = build
|
||||
OBJS = $(SRCS:src/%.c=$(OBJ_DIR)/%.o)
|
||||
DEPS = $(OBJS:.o=.d)
|
||||
|
||||
# Build Rules
|
||||
|
||||
VERSION_HEADER = includes/version_gen.h
|
||||
|
||||
$(VERSION_HEADER): FORCE
|
||||
@$(MAKE) --no-print-directory update-version-header
|
||||
|
||||
.PHONY: update-version-header
|
||||
update-version-header:
|
||||
@NEW_HEADER=$$(mktemp); \
|
||||
echo "/* Auto-generated - DO NOT EDIT */" > $$NEW_HEADER; \
|
||||
echo "#ifndef PING_VERSION_GEN_H" >> $$NEW_HEADER; \
|
||||
echo "#define PING_VERSION_GEN_H" >> $$NEW_HEADER; \
|
||||
echo "#define PING_VERSION \"$(VERSION)\"" >> $$NEW_HEADER; \
|
||||
echo "#define PING_BUILD_DATE \"$(BUILD_DATE)\"" >> $$NEW_HEADER; \
|
||||
echo "#define PING_GIT_COMMIT \"$(GIT_COMMIT)\"" >> $$NEW_HEADER; \
|
||||
echo "#define PING_HAS_GIT_COMMIT $(HAS_GIT_COMMIT)" >> $$NEW_HEADER; \
|
||||
echo "" >> $$NEW_HEADER; \
|
||||
echo "struct prog_name" >> $$NEW_HEADER; \
|
||||
echo "{" >> $$NEW_HEADER; \
|
||||
echo " char *alloc;" >> $$NEW_HEADER; \
|
||||
echo " const char *name;" >> $$NEW_HEADER; \
|
||||
echo "};" >> $$NEW_HEADER; \
|
||||
echo "" >> $$NEW_HEADER; \
|
||||
echo "extern struct prog_name g_prog_name;" >> $$NEW_HEADER; \
|
||||
echo "" >> $$NEW_HEADER; \
|
||||
echo "#endif" >> $$NEW_HEADER; \
|
||||
if [ ! -f $(VERSION_HEADER) ] || ! cmp -s $$NEW_HEADER $(VERSION_HEADER); then \
|
||||
mv $$NEW_HEADER $(VERSION_HEADER); \
|
||||
echo "[OK] Version header generated"; \
|
||||
else \
|
||||
rm -f $$NEW_HEADER; \
|
||||
fi
|
||||
|
||||
FORCE:
|
||||
.PHONY: FORCE
|
||||
|
||||
.PHONY: all
|
||||
all: $(LIBICMP_DEP) $(VERSION_HEADER) $(NAME)
|
||||
|
||||
# Build local libicmp if needed
|
||||
ifeq ($(BUILD_LOCAL_LIBICMP),yes)
|
||||
$(LIBICMP_DEP): $(LIBICMP_SRCS) $(LIBICMP_HEADERS)
|
||||
@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)
|
||||
$(CC) -o $@ $(OBJS) $(LDFLAGS)
|
||||
@echo "[OK] $(NAME) built successfully"
|
||||
|
||||
# Compile object files
|
||||
$(OBJ_DIR)/%.o: src/%.c
|
||||
@mkdir -p $(dir $@)
|
||||
$(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): $(VERSION_HEADER) $(TESTS) $(filter-out $(OBJ_DIR)/ping/main.o,$(OBJS)) $(LIBICMP_DEP)
|
||||
@mkdir -p $(dir $@)
|
||||
@echo "[BUILD] Building test binary..."
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(filter-out $(VERSION_HEADER),$^) $(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 ($(LIBICMP_TYPE),shared)
|
||||
@echo "[INSTALL] Installing libicmp (shared) to $(LIBICMP_PREFIX)..."
|
||||
$(MAKE) -C $(LIBICMP_DIR) -f $(LIBICMP_MAKEFILE) install PREFIX=$(LIBICMP_PREFIX) BUILD_SHARED=yes BUILD_STATIC=no
|
||||
@echo "[OK] libicmp installed"
|
||||
else 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 ($(LIBICMP_TYPE),shared)
|
||||
@echo "[UNINSTALL] Removing libicmp (shared)..."
|
||||
$(MAKE) -C $(LIBICMP_DIR) -f $(LIBICMP_MAKEFILE) uninstall PREFIX=$(LIBICMP_PREFIX)
|
||||
@echo "[OK] libicmp removed"
|
||||
else 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) $(VERSION_HEADER)
|
||||
$(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 uninstall 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
|
||||
707
configure
vendored
707
configure
vendored
|
|
@ -1,707 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
# configure - Configuration script for ft_ping
|
||||
# Generates build.mk with build configuration
|
||||
|
||||
set -e
|
||||
|
||||
# CONSTANTS
|
||||
|
||||
SCRIPT_VERSION="1.0.0"
|
||||
PROJECT_NAME="ft_ping"
|
||||
BUILD_MK="build.mk"
|
||||
LIBICMP_DIR="libicmp"
|
||||
LIBICMP_MAKEFILE="Makefile"
|
||||
|
||||
# Default values
|
||||
DEFAULT_PREFIX="/usr/local"
|
||||
DEFAULT_CC="clang"
|
||||
DEFAULT_LIBICMP_MODE="auto"
|
||||
DEFAULT_LIBRARY_TYPE="shared"
|
||||
DEFAULT_ENABLE_TESTS="no"
|
||||
DEFAULT_ENABLE_DEBUG="no"
|
||||
DEFAULT_ENABLE_SANITIZERS="no"
|
||||
DEFAULT_ENABLE_LTO="no"
|
||||
DEFAULT_ENABLE_STRICT="no"
|
||||
DEFAULT_SUDO_TESTS="yes"
|
||||
DEFAULT_INSTALL_LIBICMP="no"
|
||||
|
||||
# Current configuration
|
||||
PREFIX="$DEFAULT_PREFIX"
|
||||
CC="$DEFAULT_CC"
|
||||
LIBICMP_MODE="$DEFAULT_LIBICMP_MODE"
|
||||
LIBRARY_TYPE="$DEFAULT_LIBRARY_TYPE"
|
||||
LIBRARY_PREFERENCE="prefer" # prefer, only
|
||||
ENABLE_TESTS="$DEFAULT_ENABLE_TESTS"
|
||||
ENABLE_DEBUG="$DEFAULT_ENABLE_DEBUG"
|
||||
ENABLE_SANITIZERS="$DEFAULT_ENABLE_SANITIZERS"
|
||||
ENABLE_LTO="$DEFAULT_ENABLE_LTO"
|
||||
ENABLE_STRICT="$DEFAULT_ENABLE_STRICT"
|
||||
SUDO_TESTS="$DEFAULT_SUDO_TESTS"
|
||||
INSTALL_LIBICMP="$DEFAULT_INSTALL_LIBICMP"
|
||||
VERBOSE="no"
|
||||
QUIET="no"
|
||||
|
||||
# User-provided flags
|
||||
USER_CFLAGS=""
|
||||
USER_LDFLAGS=""
|
||||
USER_CPPFLAGS=""
|
||||
|
||||
# Derived paths
|
||||
BINDIR=""
|
||||
LIBDIR=""
|
||||
INCLUDEDIR=""
|
||||
LIBICMP_PREFIX=""
|
||||
|
||||
# HELPER FUNCTIONS
|
||||
|
||||
info() {
|
||||
if [ "$QUIET" != "yes" ]; then
|
||||
echo -e "[INFO] $*"
|
||||
fi
|
||||
}
|
||||
|
||||
success() {
|
||||
if [ "$QUIET" != "yes" ]; then
|
||||
echo -e "[OK] $*"
|
||||
fi
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "[WARN] $*" >&2
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "[ERROR] $*" >&2
|
||||
}
|
||||
|
||||
fatal() {
|
||||
error "$@"
|
||||
exit 1
|
||||
}
|
||||
|
||||
verbose() {
|
||||
if [ "$VERBOSE" = "yes" ]; then
|
||||
echo -e "[VERBOSE] $*"
|
||||
fi
|
||||
}
|
||||
|
||||
# HELP
|
||||
|
||||
show_help() {
|
||||
cat << EOF
|
||||
Usage: ./configure [OPTIONS]
|
||||
|
||||
Configuration script for $PROJECT_NAME v$SCRIPT_VERSION
|
||||
|
||||
libicmp Options:
|
||||
--with-system-libicmp Use system-installed libicmp (fail if not found)
|
||||
--with-local-libicmp Build local libicmp (ignore system version)
|
||||
--auto-libicmp Auto-detect libicmp (default)
|
||||
|
||||
Library Type Options:
|
||||
--prefer-static Prefer static library (.a) with fallback (default if local)
|
||||
--prefer-shared Prefer shared library (.so) with fallback (default if system)
|
||||
--static-only Require static library (fail if unavailable)
|
||||
--shared-only Require shared library (fail if unavailable)
|
||||
|
||||
Build Options:
|
||||
--enable-debug Enable debug symbols (-g -O0)
|
||||
--disable-debug Disable debug (default, -O2)
|
||||
--enable-sanitizers Enable AddressSanitizer and UndefinedBehaviorSanitizer
|
||||
--enable-lto Enable Link Time Optimization
|
||||
--strict Enable strict warnings (-Wpedantic -Wconversion etc.)
|
||||
|
||||
Installation Paths:
|
||||
--prefix=PREFIX Installation prefix (default: $DEFAULT_PREFIX)
|
||||
--bindir=DIR Binary directory (default: PREFIX/bin)
|
||||
--libdir=DIR Library directory (default: PREFIX/lib)
|
||||
--includedir=DIR Include directory (default: PREFIX/include)
|
||||
--libicmp-prefix=PREFIX libicmp installation prefix (default: same as --prefix)
|
||||
|
||||
Test Options:
|
||||
--enable-tests Build tests (requires criterion)
|
||||
--disable-tests Don't build tests (default)
|
||||
--enable-sudo-tests Tests require sudo (default)
|
||||
--disable-sudo-tests Tests without sudo (requires capabilities)
|
||||
|
||||
libicmp Installation:
|
||||
--install-libicmp Install libicmp to system (if built locally)
|
||||
--no-install-libicmp Don't install libicmp (default)
|
||||
|
||||
Compiler Options:
|
||||
CC=compiler Specify compiler (default: $DEFAULT_CC)
|
||||
CFLAGS="flags" Additional compilation flags
|
||||
CPPFLAGS="flags" Additional preprocessor flags
|
||||
LDFLAGS="flags" Additional linker flags
|
||||
|
||||
Other Options:
|
||||
--help, -h Show this help message
|
||||
--version, -v Show version
|
||||
--verbose Verbose output during configuration
|
||||
--quiet, -q Quiet mode (minimal output)
|
||||
|
||||
Examples:
|
||||
./configure
|
||||
./configure --with-local-libicmp --static-only
|
||||
./configure --enable-debug --enable-sanitizers --enable-tests
|
||||
./configure --prefix=/opt/ft_ping --install-libicmp
|
||||
./configure CC=gcc --strict
|
||||
|
||||
EOF
|
||||
exit 0
|
||||
}
|
||||
|
||||
show_version() {
|
||||
echo "$PROJECT_NAME configure script version $SCRIPT_VERSION"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# ARGUMENT PARSING
|
||||
|
||||
parse_arguments() {
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--help|-h)
|
||||
show_help
|
||||
;;
|
||||
--version|-v)
|
||||
show_version
|
||||
;;
|
||||
--verbose)
|
||||
VERBOSE="yes"
|
||||
;;
|
||||
--quiet|-q)
|
||||
QUIET="yes"
|
||||
;;
|
||||
|
||||
# libicmp mode
|
||||
--with-system-libicmp)
|
||||
LIBICMP_MODE="system"
|
||||
;;
|
||||
--with-local-libicmp)
|
||||
LIBICMP_MODE="local"
|
||||
;;
|
||||
--auto-libicmp)
|
||||
LIBICMP_MODE="auto"
|
||||
;;
|
||||
|
||||
# Library type
|
||||
--prefer-static)
|
||||
LIBRARY_TYPE="static"
|
||||
LIBRARY_PREFERENCE="prefer"
|
||||
;;
|
||||
--prefer-shared)
|
||||
LIBRARY_TYPE="shared"
|
||||
LIBRARY_PREFERENCE="prefer"
|
||||
;;
|
||||
--static-only)
|
||||
LIBRARY_TYPE="static"
|
||||
LIBRARY_PREFERENCE="only"
|
||||
;;
|
||||
--shared-only)
|
||||
LIBRARY_TYPE="shared"
|
||||
LIBRARY_PREFERENCE="only"
|
||||
;;
|
||||
|
||||
# Build options
|
||||
--enable-debug)
|
||||
ENABLE_DEBUG="yes"
|
||||
;;
|
||||
--disable-debug)
|
||||
ENABLE_DEBUG="no"
|
||||
;;
|
||||
--enable-sanitizers)
|
||||
ENABLE_SANITIZERS="yes"
|
||||
;;
|
||||
--enable-lto)
|
||||
ENABLE_LTO="yes"
|
||||
;;
|
||||
--strict)
|
||||
ENABLE_STRICT="yes"
|
||||
;;
|
||||
|
||||
# Installation paths
|
||||
--prefix=*)
|
||||
PREFIX="${1#*=}"
|
||||
;;
|
||||
--bindir=*)
|
||||
BINDIR="${1#*=}"
|
||||
;;
|
||||
--libdir=*)
|
||||
LIBDIR="${1#*=}"
|
||||
;;
|
||||
--includedir=*)
|
||||
INCLUDEDIR="${1#*=}"
|
||||
;;
|
||||
--libicmp-prefix=*)
|
||||
LIBICMP_PREFIX="${1#*=}"
|
||||
;;
|
||||
|
||||
# Tests
|
||||
--enable-tests)
|
||||
ENABLE_TESTS="yes"
|
||||
;;
|
||||
--disable-tests)
|
||||
ENABLE_TESTS="no"
|
||||
;;
|
||||
--enable-sudo-tests)
|
||||
SUDO_TESTS="yes"
|
||||
;;
|
||||
--disable-sudo-tests)
|
||||
SUDO_TESTS="no"
|
||||
;;
|
||||
|
||||
# libicmp installation
|
||||
--install-libicmp)
|
||||
INSTALL_LIBICMP="yes"
|
||||
;;
|
||||
--no-install-libicmp)
|
||||
INSTALL_LIBICMP="no"
|
||||
;;
|
||||
|
||||
# Compiler variables
|
||||
CC=*)
|
||||
CC="${1#*=}"
|
||||
;;
|
||||
CFLAGS=*)
|
||||
USER_CFLAGS="${1#*=}"
|
||||
;;
|
||||
CPPFLAGS=*)
|
||||
USER_CPPFLAGS="${1#*=}"
|
||||
;;
|
||||
LDFLAGS=*)
|
||||
USER_LDFLAGS="${1#*=}"
|
||||
;;
|
||||
|
||||
*)
|
||||
fatal "Unknown option: $1\nTry './configure --help' for more information."
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
# VALIDATION
|
||||
|
||||
validate_configuration() {
|
||||
verbose "Validating configuration..."
|
||||
|
||||
# Check for conflicting options
|
||||
if [ "$LIBICMP_MODE" = "system" ] && [ "$INSTALL_LIBICMP" = "yes" ]; then
|
||||
warn "Option --install-libicmp ignored when using system libicmp"
|
||||
INSTALL_LIBICMP="no"
|
||||
fi
|
||||
|
||||
# Set derived paths
|
||||
[ -z "$BINDIR" ] && BINDIR="$PREFIX/bin"
|
||||
[ -z "$LIBDIR" ] && LIBDIR="$PREFIX/lib"
|
||||
[ -z "$INCLUDEDIR" ] && INCLUDEDIR="$PREFIX/include"
|
||||
[ -z "$LIBICMP_PREFIX" ] && LIBICMP_PREFIX="$PREFIX"
|
||||
|
||||
verbose "PREFIX=$PREFIX"
|
||||
verbose "BINDIR=$BINDIR"
|
||||
verbose "LIBDIR=$LIBDIR"
|
||||
verbose "INCLUDEDIR=$INCLUDEDIR"
|
||||
}
|
||||
|
||||
# DETECTION
|
||||
|
||||
check_command() {
|
||||
local cmd="$1"
|
||||
if command -v "$cmd" >/dev/null 2>&1; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_compiler() {
|
||||
info "Checking for compiler: $CC"
|
||||
|
||||
if ! check_command "$CC"; then
|
||||
fatal "Compiler '$CC' not found"
|
||||
fi
|
||||
|
||||
# Get compiler version
|
||||
local cc_version
|
||||
cc_version=$($CC --version 2>&1 | head -n1)
|
||||
success "Found $cc_version"
|
||||
|
||||
verbose "Compiler: $CC"
|
||||
verbose "Version: $cc_version"
|
||||
}
|
||||
|
||||
detect_system_libicmp() {
|
||||
local system_libdir="${PREFIX}/lib"
|
||||
local system_includedir="${PREFIX}/include"
|
||||
|
||||
verbose "Searching for system libicmp in $system_libdir"
|
||||
|
||||
SYSTEM_LIBICMP_STATIC="${system_libdir}/libicmp.a"
|
||||
SYSTEM_LIBICMP_SHARED="${system_libdir}/libicmp.so"
|
||||
SYSTEM_ICMP_H="${system_includedir}/icmp.h"
|
||||
|
||||
HAS_STATIC="no"
|
||||
HAS_SHARED="no"
|
||||
HAS_HEADERS="no"
|
||||
|
||||
if [ -f "$SYSTEM_LIBICMP_STATIC" ]; then
|
||||
HAS_STATIC="yes"
|
||||
verbose "Found static library: $SYSTEM_LIBICMP_STATIC"
|
||||
fi
|
||||
|
||||
if [ -f "$SYSTEM_LIBICMP_SHARED" ]; then
|
||||
HAS_SHARED="yes"
|
||||
verbose "Found shared library: $SYSTEM_LIBICMP_SHARED"
|
||||
fi
|
||||
|
||||
if [ -f "$SYSTEM_ICMP_H" ]; then
|
||||
HAS_HEADERS="yes"
|
||||
verbose "Found headers: $SYSTEM_ICMP_H"
|
||||
fi
|
||||
|
||||
if [ "$HAS_HEADERS" = "yes" ] && { [ "$HAS_STATIC" = "yes" ] || [ "$HAS_SHARED" = "yes" ]; }; then
|
||||
return 0 # System libicmp found
|
||||
else
|
||||
return 1 # System libicmp not found
|
||||
fi
|
||||
}
|
||||
|
||||
decide_libicmp_source() {
|
||||
info "Determining libicmp source..."
|
||||
|
||||
case "$LIBICMP_MODE" in
|
||||
system)
|
||||
verbose "Mode: force system libicmp"
|
||||
if detect_system_libicmp; then
|
||||
success "Using system-installed libicmp from $PREFIX/lib"
|
||||
USE_SYSTEM_LIBICMP="yes"
|
||||
BUILD_LOCAL_LIBICMP="no"
|
||||
else
|
||||
fatal "System libicmp not found but --with-system-libicmp specified"
|
||||
fi
|
||||
;;
|
||||
|
||||
local)
|
||||
verbose "Mode: force local build"
|
||||
success "Building local libicmp from $LIBICMP_DIR/"
|
||||
USE_SYSTEM_LIBICMP="no"
|
||||
BUILD_LOCAL_LIBICMP="yes"
|
||||
;;
|
||||
|
||||
auto)
|
||||
verbose "Mode: auto-detect"
|
||||
if detect_system_libicmp; then
|
||||
success "Using system-installed libicmp from $PREFIX/lib"
|
||||
USE_SYSTEM_LIBICMP="yes"
|
||||
BUILD_LOCAL_LIBICMP="no"
|
||||
else
|
||||
info "System libicmp not found, will build local version"
|
||||
USE_SYSTEM_LIBICMP="no"
|
||||
BUILD_LOCAL_LIBICMP="yes"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
determine_library_type() {
|
||||
info "Determining library type..."
|
||||
|
||||
if [ "$USE_SYSTEM_LIBICMP" = "yes" ]; then
|
||||
# System library - check what's available
|
||||
case "$LIBRARY_TYPE" in
|
||||
static)
|
||||
if [ "$HAS_STATIC" = "yes" ]; then
|
||||
FINAL_LIBRARY_TYPE="static"
|
||||
LIBICMP_PATH="$SYSTEM_LIBICMP_STATIC"
|
||||
success "Using static system library"
|
||||
elif [ "$LIBRARY_PREFERENCE" = "only" ]; then
|
||||
fatal "Static library required but only shared library found"
|
||||
elif [ "$HAS_SHARED" = "yes" ]; then
|
||||
warn "Static library not found, falling back to shared"
|
||||
FINAL_LIBRARY_TYPE="shared"
|
||||
LIBICMP_PATH="$SYSTEM_LIBICMP_SHARED"
|
||||
else
|
||||
fatal "No suitable library found"
|
||||
fi
|
||||
;;
|
||||
shared)
|
||||
if [ "$HAS_SHARED" = "yes" ]; then
|
||||
FINAL_LIBRARY_TYPE="shared"
|
||||
LIBICMP_PATH="$SYSTEM_LIBICMP_SHARED"
|
||||
success "Using shared system library"
|
||||
elif [ "$LIBRARY_PREFERENCE" = "only" ]; then
|
||||
fatal "Shared library required but only static library found"
|
||||
elif [ "$HAS_STATIC" = "yes" ]; then
|
||||
warn "Shared library not found, falling back to static"
|
||||
FINAL_LIBRARY_TYPE="static"
|
||||
LIBICMP_PATH="$SYSTEM_LIBICMP_STATIC"
|
||||
else
|
||||
fatal "No suitable library found"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
else
|
||||
# Local build - we control what to build
|
||||
FINAL_LIBRARY_TYPE="$LIBRARY_TYPE"
|
||||
|
||||
if [ "$FINAL_LIBRARY_TYPE" = "static" ]; then
|
||||
LIBICMP_BUILD_STATIC="yes"
|
||||
LIBICMP_BUILD_SHARED="no"
|
||||
LIBICMP_PATH="$LIBICMP_DIR/libicmp.a"
|
||||
success "Will build static library"
|
||||
else
|
||||
LIBICMP_BUILD_STATIC="no"
|
||||
LIBICMP_BUILD_SHARED="yes"
|
||||
LIBICMP_PATH="$LIBICMP_DIR/libicmp.so"
|
||||
success "Will build shared library"
|
||||
fi
|
||||
fi
|
||||
|
||||
verbose "Final library type: $FINAL_LIBRARY_TYPE"
|
||||
verbose "Library path: $LIBICMP_PATH"
|
||||
}
|
||||
|
||||
check_test_dependencies() {
|
||||
if [ "$ENABLE_TESTS" = "yes" ]; then
|
||||
info "Checking test dependencies..."
|
||||
|
||||
# Check for criterion library
|
||||
if ! $CC -lcriterion -o /dev/null -xc - >/dev/null 2>&1 <<< "int main(){return 0;}"; then
|
||||
warn "Criterion library not found, tests may fail to build"
|
||||
warn "Install criterion: https://github.com/Snaipe/Criterion"
|
||||
else
|
||||
success "Found criterion library"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# BUILD.MK GENERATION
|
||||
|
||||
generate_build_mk() {
|
||||
info "Generating $BUILD_MK..."
|
||||
|
||||
local timestamp
|
||||
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
|
||||
# Prepare compiler flags
|
||||
local cflags="-Wall -Wextra -Werror -pipe"
|
||||
local cppflags="-std=c99 -I includes -D_GNU_SOURCE"
|
||||
local ldflags=""
|
||||
local debug_flags=""
|
||||
local sanitizer_flags=""
|
||||
local lto_flags=""
|
||||
local strict_flags=""
|
||||
|
||||
# Debug flags
|
||||
if [ "$ENABLE_DEBUG" = "yes" ]; then
|
||||
debug_flags="-g -O0 -DDEBUG"
|
||||
else
|
||||
debug_flags="-O2 -DNDEBUG"
|
||||
fi
|
||||
|
||||
# Sanitizer flags
|
||||
if [ "$ENABLE_SANITIZERS" = "yes" ]; then
|
||||
sanitizer_flags="-fsanitize=address,undefined -fno-omit-frame-pointer"
|
||||
fi
|
||||
|
||||
# LTO flags
|
||||
if [ "$ENABLE_LTO" = "yes" ]; then
|
||||
lto_flags="-flto"
|
||||
fi
|
||||
|
||||
# Strict flags
|
||||
if [ "$ENABLE_STRICT" = "yes" ]; then
|
||||
strict_flags="-Wpedantic -Wconversion -Wshadow -Wcast-align -Wstrict-prototypes -Wvla -Wswitch-enum -Wunreachable-code"
|
||||
fi
|
||||
|
||||
# libicmp-specific configuration
|
||||
if [ "$USE_SYSTEM_LIBICMP" = "yes" ]; then
|
||||
LIBICMP_DEP=""
|
||||
ldflags="-licmp"
|
||||
else
|
||||
LIBICMP_DEP="$LIBICMP_PATH"
|
||||
cppflags="$cppflags -I $LIBICMP_DIR/includes"
|
||||
ldflags="-L$LIBICMP_DIR -licmp"
|
||||
|
||||
if [ "$FINAL_LIBRARY_TYPE" = "shared" ] && [ "$INSTALL_LIBICMP" = "yes" ]; then
|
||||
ldflags="$ldflags -Wl,-rpath,$LIBDIR"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Math library (required for stats mdev)
|
||||
ldflags="$ldflags -lm"
|
||||
|
||||
# User-provided flags
|
||||
if [ -n "$USER_CFLAGS" ]; then
|
||||
cflags="$cflags $USER_CFLAGS"
|
||||
fi
|
||||
if [ -n "$USER_CPPFLAGS" ]; then
|
||||
cppflags="$cppflags $USER_CPPFLAGS"
|
||||
fi
|
||||
if [ -n "$USER_LDFLAGS" ]; then
|
||||
ldflags="$ldflags $USER_LDFLAGS"
|
||||
fi
|
||||
|
||||
# Write build.mk
|
||||
cat > "$BUILD_MK" << EOF
|
||||
# $BUILD_MK - Generated by configure on $timestamp
|
||||
# DO NOT EDIT - This file is automatically generated
|
||||
|
||||
|
||||
# libicmp Configuration
|
||||
|
||||
USE_SYSTEM_LIBICMP = $USE_SYSTEM_LIBICMP
|
||||
BUILD_LOCAL_LIBICMP = $BUILD_LOCAL_LIBICMP
|
||||
LIBICMP_TYPE = $FINAL_LIBRARY_TYPE
|
||||
LIBICMP_DIR = $LIBICMP_DIR
|
||||
LIBICMP_PATH = $LIBICMP_PATH
|
||||
LIBICMP_DEP = $LIBICMP_DEP
|
||||
|
||||
EOF
|
||||
|
||||
if [ "$BUILD_LOCAL_LIBICMP" = "yes" ]; then
|
||||
local libicmp_cflags="-Wall -Wextra -Werror -pipe -Wpedantic -Wconversion"
|
||||
local libicmp_cppflags="-std=c99 -I includes -D_POSIX_C_SOURCE=199309L"
|
||||
|
||||
libicmp_cflags="$libicmp_cflags $debug_flags"
|
||||
|
||||
if [ "$ENABLE_SANITIZERS" = "yes" ]; then
|
||||
libicmp_cflags="$libicmp_cflags $sanitizer_flags"
|
||||
fi
|
||||
|
||||
if [ "$ENABLE_LTO" = "yes" ]; then
|
||||
libicmp_cflags="$libicmp_cflags $lto_flags"
|
||||
fi
|
||||
|
||||
cat >> "$BUILD_MK" << EOF
|
||||
# libicmp build configuration
|
||||
LIBICMP_BUILD_STATIC = $LIBICMP_BUILD_STATIC
|
||||
LIBICMP_BUILD_SHARED = $LIBICMP_BUILD_SHARED
|
||||
LIBICMP_CC = $CC
|
||||
LIBICMP_CPPFLAGS = $libicmp_cppflags
|
||||
LIBICMP_CFLAGS = $libicmp_cflags
|
||||
LIBICMP_BUILD_FLAGS = BUILD_STATIC=\$(LIBICMP_BUILD_STATIC) BUILD_SHARED=\$(LIBICMP_BUILD_SHARED) CC=\$(LIBICMP_CC) CPPFLAGS="\$(LIBICMP_CPPFLAGS)" CFLAGS="\$(LIBICMP_CFLAGS)"
|
||||
LIBICMP_MAKEFILE = $LIBICMP_MAKEFILE
|
||||
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat >> "$BUILD_MK" << EOF
|
||||
|
||||
# Compiler Configuration
|
||||
|
||||
CC = $CC
|
||||
CPPFLAGS = $cppflags
|
||||
CFLAGS = $cflags
|
||||
LDFLAGS = $ldflags
|
||||
|
||||
# Individual flag components (for reference)
|
||||
DEBUG_FLAGS = $debug_flags
|
||||
SANITIZER_FLAGS = $sanitizer_flags
|
||||
LTO_FLAGS = $lto_flags
|
||||
STRICT_FLAGS = $strict_flags
|
||||
|
||||
# Combined flags
|
||||
CFLAGS += \$(DEBUG_FLAGS) \$(SANITIZER_FLAGS) \$(LTO_FLAGS) \$(STRICT_FLAGS)
|
||||
LDFLAGS += \$(SANITIZER_FLAGS) \$(LTO_FLAGS)
|
||||
|
||||
|
||||
# Installation Paths
|
||||
|
||||
PREFIX = $PREFIX
|
||||
BINDIR = $BINDIR
|
||||
LIBDIR = $LIBDIR
|
||||
INCLUDEDIR = $INCLUDEDIR
|
||||
|
||||
|
||||
# Test Configuration
|
||||
|
||||
ENABLE_TESTS = $ENABLE_TESTS
|
||||
SUDO_TESTS = $SUDO_TESTS
|
||||
TEST_LDFLAGS = -lcriterion
|
||||
|
||||
|
||||
# Build Options
|
||||
|
||||
ENABLE_DEBUG = $ENABLE_DEBUG
|
||||
ENABLE_SANITIZERS = $ENABLE_SANITIZERS
|
||||
ENABLE_LTO = $ENABLE_LTO
|
||||
ENABLE_STRICT = $ENABLE_STRICT
|
||||
|
||||
|
||||
# libicmp Installation (if built locally)
|
||||
|
||||
INSTALL_LIBICMP = $INSTALL_LIBICMP
|
||||
LIBICMP_PREFIX = $LIBICMP_PREFIX
|
||||
|
||||
EOF
|
||||
|
||||
success "Generated $BUILD_MK"
|
||||
}
|
||||
|
||||
|
||||
# SUMMARY
|
||||
|
||||
|
||||
show_summary() {
|
||||
if [ "$QUIET" = "yes" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
cat << EOF
|
||||
|
||||
------------------------------------------------------------------------
|
||||
Configuration Summary for $PROJECT_NAME
|
||||
------------------------------------------------------------------------
|
||||
|
||||
libicmp Source: $([ "$USE_SYSTEM_LIBICMP" = "yes" ] && echo "system ($PREFIX/lib)" || echo "local ($LIBICMP_DIR/)")
|
||||
Library Type: $FINAL_LIBRARY_TYPE
|
||||
Compiler: $CC
|
||||
Installation Prefix: $PREFIX
|
||||
|
||||
Build Options:
|
||||
Debug: $ENABLE_DEBUG
|
||||
Sanitizers: $ENABLE_SANITIZERS
|
||||
LTO: $ENABLE_LTO
|
||||
Strict: $ENABLE_STRICT
|
||||
Tests: $ENABLE_TESTS$([ "$ENABLE_TESTS" = "yes" ] && echo " ($([ "$SUDO_TESTS" = "yes" ] && echo "with sudo" || echo "without sudo"))" || echo "")
|
||||
|
||||
EOF
|
||||
|
||||
if [ "$BUILD_LOCAL_LIBICMP" = "yes" ]; then
|
||||
cat << EOF
|
||||
libicmp Installation: $([ "$INSTALL_LIBICMP" = "yes" ] && echo "yes (to $LIBICMP_PREFIX)" || echo "no (local use only)")
|
||||
|
||||
EOF
|
||||
fi
|
||||
|
||||
cat << EOF
|
||||
Compiler Flags:
|
||||
CPPFLAGS: $cppflags
|
||||
CFLAGS: -Wall -Wextra -Werror -pipe $debug_flags $sanitizer_flags $lto_flags $strict_flags
|
||||
LDFLAGS: $ldflags
|
||||
|
||||
------------------------------------------------------------------------
|
||||
|
||||
Configuration saved to $BUILD_MK
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
# MAIN
|
||||
|
||||
main() {
|
||||
parse_arguments "$@"
|
||||
validate_configuration
|
||||
check_compiler
|
||||
decide_libicmp_source
|
||||
determine_library_type
|
||||
check_test_dependencies
|
||||
generate_build_mk
|
||||
show_summary
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
main "$@"
|
||||
1
libcli
Submodule
1
libcli
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit a1bb371d3ad2a77af8888b8c7d8b645026483f76
|
||||
Loading…
Add table
Reference in a new issue