SHELL := bash
CWD := $(shell pwd)

LIBDIR ?= /usr/lib64
INCLUDEDIR ?= /usr/include/smcs
SBINDIR ?= /usr/sbin
SERVICEDIR ?= /usr/lib/systemd/system/

KY_ARCH ?= $(shell uname -m)

GIT_COMMIT := $(shell git rev-parse HEAD 2>/dev/null)

CFLAGS += -I/usr/include -idirafter ../../../include/uapi/  -DSMCS_VERSION="\"1.0.0-$(GIT_COMMIT)\"" -fPIC -Wall -O2

SRCS := devioc.c nfioc.c sgioc.c adpt.c audit.c ulog.c version.c background.c
OBJS := $(SRCS:.c=.o)

LIB_NAME := libsmcs

define SMCS_SERVICE
[Unit]
Description=smcs Service
After=multi-user.target

[Service]
ExecStart=$(SBINDIR)/smcsstr
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
endef

define SMCSSG_SERVICE
[Unit]
Description=smcs shutdown prepare
DefaultDependencies=no
RefuseManualStart=yes
RefuseManualStop=yes
Before=shutdown.target reboot.target halt.target poweroff.target

[Service]
Type=oneshot
ExecStart=$(SBINDIR)/smcscli safegrd ppro add -p systemd

[Install]
WantedBy=halt.target reboot.target poweroff.target shutdown.target
endef

export SMCS_SERVICE
export SMCSSG_SERVICE

AR ?= ar
CC ?= gcc

.PHONY: all clean install

all: $(LIB_NAME).so $(LIB_NAME).a smcscli smcsstr

$(LIB_NAME).so: $(SRCS) ulog.h libsmcs.h internal.h adpt.h
	@echo "Building shared lib $(@) for $(KY_ARCH) ..."
	$(CC) $(CFLAGS) -shared -laudit -pthread -o $@ $^ || (rm -f $@; exit 1)
	ldd $@
	@echo

$(LIB_NAME).a: $(OBJS)
	@echo "Building static lib $(@) for $(KY_ARCH) ..."
	$(AR) rcs $@ $^

smcscli: cli.c libsmcs.so ulog.h libsmcs.h internal.h adpt.h
	@echo "Building smcscli $(@) for $(KY_ARCH) ..."
	$(CC)  $(CFLAGS) -o $@ $< -lsmcs -L$(CWD) -Wl,-rpath=$(LIBDIR) || (rm -f $@; exit 1)
	ldd $@
	@echo "smcssg.service"
	@printf "%s\n" "$$SMCSSG_SERVICE" > smcssg.service

smcsstr: store.c libsmcs.so ulog.h libsmcs.h internal.h adpt.h
	@echo "Building smcsstr $(@) for $(KY_ARCH) ..."
	$(CC)  $(CFLAGS) -o $@ $< -lsmcs -ljson-c -lpthread -L$(CWD) -Wl,-rpath=$(LIBDIR) || (rm -f $@; exit 1)
	ldd $@
	@echo "smcs.service"
	@printf "%s\n" "$$SMCS_SERVICE" > smcs.service

# 自动规则：从 .c 编译为 .o
%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

install: $(LIB_NAME).so $(LIB_NAME).a smcscli smcsstr
	install -d $(DESTDIR)$(LIBDIR) $(DESTDIR)$(INCLUDEDIR) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(SERVICEDIR)
	install -m 755 $(LIB_NAME).so $(DESTDIR)$(LIBDIR)/
	install -m 755 $(LIB_NAME).a $(DESTDIR)$(LIBDIR)/
	install -m 755 smcscli $(DESTDIR)$(SBINDIR)/
	install -m 755 smcsstr $(DESTDIR)$(SBINDIR)/
	install -m 644 libsmcs.h $(DESTDIR)$(INCLUDEDIR)/
	install -m 644 smcs.service $(DESTDIR)$(SERVICEDIR)
	install -m 644 smcssg.service $(DESTDIR)$(SERVICEDIR)

clean:
	rm -f *.o $(LIB_NAME).so $(LIB_NAME).a smcscli smcsstr smcs.service smcssg.service

