feat: add libcli as a git submodule

This commit is contained in:
lohhiiccc 2026-03-29 15:17:57 +02:00
parent d27ed4a839
commit f8a65d87db
4 changed files with 4 additions and 987 deletions

3
.gitmodules vendored
View file

@ -1,3 +1,6 @@
[submodule "libicmp"] [submodule "libicmp"]
path = libicmp path = libicmp
url = git@github.com:lohhiiccc/icmp.git url = git@github.com:lohhiiccc/icmp.git
[submodule "libcli"]
path = libcli
url = forgejo@lohic.dev:loic/libcli.git

280
Makefile
View file

@ -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
View file

@ -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

@ -0,0 +1 @@
Subproject commit a1bb371d3ad2a77af8888b8c7d8b645026483f76