Files
fblogin/Makefile
2025-10-22 05:04:19 -04:00

131 lines
3.7 KiB
Makefile

# Makefile for fblogin (clean, non-root build; root needed only for install)
# ---- config ----
TARGET := fblogin
SRC_DIR := src
OBJ_DIR := obj
INC_DIR := include
PREFIX := /usr/local
BINDIR := $(PREFIX)/bin
# Banner (issue) file used by pam_issue.so
ISSUE_DIR ?= system/issue
ISSUE_FILE ?= $(ISSUE_DIR)/issue.fblogin
ISSUE_DEST ?= /etc/issue.fblogin
# Manpage install defaults
MANPREFIX ?= $(PREFIX)/share/man
MAN1DIR ?= $(MANPREFIX)/man1
MAN1PAGES ?= man/fblogin.1
MAN1NAME := $(notdir $(MAN1PAGES))
# Compiler/Linker
CC := gcc
CPPFLAGS := -I$(INC_DIR) -D_GNU_SOURCE -MMD -MP
CFLAGS := -Wall -Wextra -Wpedantic -O2
LDFLAGS := -Wl,--as-needed
LDLIBS := -lpam -lpam_misc
# Optional libsystemd (sd-login diagnostics). Auto-detect.
SYSTEMD_CFLAGS := $(shell pkg-config --cflags libsystemd 2>/dev/null)
SYSTEMD_LIBS := $(shell pkg-config --libs libsystemd 2>/dev/null)
ifneq ($(strip $(SYSTEMD_LIBS)),)
CPPFLAGS += $(SYSTEMD_CFLAGS) -DHAVE_SYSTEMD_LOGIN=1
LDLIBS += $(SYSTEMD_LIBS)
endif
# Sources/Objects
SRCS := $(wildcard $(SRC_DIR)/*.c)
OBJS := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRCS))
DEPS := $(OBJS:.o=.d)
# ---- rules ----
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
$(OBJ_DIR):
mkdir -p $@
# ---- convenience modes ----
debug: CFLAGS := -Wall -Wextra -Wpedantic -O0 -g3
debug: LDFLAGS := -Wl,--as-needed
debug: clean all
release: CFLAGS := -Wall -Wextra -Wpedantic -O3 -DNDEBUG
release: LDFLAGS := -Wl,--as-needed -s
release: clean all
asan: CFLAGS := -Wall -Wextra -Wpedantic -O1 -g3 -fsanitize=address,undefined
asan: LDFLAGS := -fsanitize=address,undefined
asan: clean all
# ---- install ----
install: $(TARGET)
install -d -m 0755 $(DESTDIR)$(BINDIR)
install -o root -g root -m 4755 $(TARGET) $(DESTDIR)$(BINDIR)/$(TARGET)
install-systemd:
install -d -m 0755 $(DESTDIR)/etc/systemd/system
install -m 0644 system/systemd/fblogin@.service $(DESTDIR)/etc/systemd/system/fblogin@.service
install-pam:
install -d -m 0755 $(DESTDIR)/etc/pam.d
install -m 0644 system/pamd/fblogin $(DESTDIR)/etc/pam.d/fblogin
# Install custom banner used by pam_issue.so (skip gracefully if file missing)
install-issue:
@if [ -f "$(ISSUE_FILE)" ]; then \
echo "Installing banner: $(ISSUE_FILE) -> $(DESTDIR)$(ISSUE_DEST)"; \
install -d -m 0755 $(DESTDIR)/etc; \
install -m 0644 "$(ISSUE_FILE)" "$(DESTDIR)$(ISSUE_DEST)"; \
else \
echo "No banner file at $(ISSUE_FILE); skipping install-issue"; \
fi
install-man:
install -d -m 0755 $(DESTDIR)$(MAN1DIR)
install -m 0644 $(MAN1PAGES) $(DESTDIR)$(MAN1DIR)/
@# gzip if available, keep original if not
@if command -v gzip >/dev/null 2>&1; then \
gzip -9nf $(DESTDIR)$(MAN1DIR)/$(MAN1NAME); \
fi
# Convenience: install everything we ship
install-all: install install-systemd install-pam install-issue install-man
# ---- uninstall ----
uninstall:
rm -f $(DESTDIR)$(BINDIR)/$(TARGET)
uninstall-systemd:
rm -f $(DESTDIR)/etc/systemd/system/fblogin@.service
rm -f $(DESTDIR)/etc/systemd/system/multi-user.target.wants/fblogin@*.service
uninstall-pam:
rm -f $(DESTDIR)/etc/pam.d/fblogin
uninstall-issue:
rm -f $(DESTDIR)$(ISSUE_DEST)
uninstall-man:
rm -f $(DESTDIR)$(MAN1DIR)/$(MAN1NAME) $(DESTDIR)$(MAN1DIR)/$(MAN1NAME).gz
uninstall-all: uninstall uninstall-systemd uninstall-pam uninstall-issue uninstall-man
# ---- clean ----
clean:
rm -rf $(OBJ_DIR) $(TARGET)
distclean: clean
.PHONY: all debug release asan install uninstall clean distclean \
install-systemd install-pam install-issue install-man install-all \
uninstall-systemd uninstall-pam uninstall-issue uninstall-man uninstall-all
-include $(DEPS)