include ../common.mk

VPATH = $(SHARED_PATH)

PACKAGE_D ?= gkrellmd

CFGDIR ?= $(PREFIX)/etc
SERVICE_DIR ?= $(PREFIX)/lib/systemd/system
SERVICE_FILE = $(PACKAGE_D).service

EXTRAOBJS =

ifeq ($(without-libsensors),yes)
	CONFIGURE_ARGS += --without-libsensors
endif
ifeq ($(without-libsensors),1)
	CONFIGURE_ARGS += --without-libsensors
endif

DUMMY_VAR := $(shell ./configure $(CONFIGURE_ARGS))

HAVE_LIBSENSORS = $(shell grep -c HAVE_LIBSENSORS configure.h)
ifeq ($(HAVE_LIBSENSORS),1)
    SENSORS_LIBS ?= -lsensors
endif

GKRELLMD_INCLUDES = gkrellmd.h gkrellmd-version.h $(SHARED_PATH)/log.h $(SHARED_PATH)/gkrellm-visibility.h

PKG_MODULES := "glib-2.0 >= 2.32" gmodule-2.0 gthread-2.0
PKG_INCLUDE := $(shell $(PKG_CONFIG) --cflags $(PKG_MODULES))
ifndef PKG_INCLUDE
    $(error One or more package requirements not met)
endif
PKG_LIB := $(shell $(PKG_CONFIG) --libs $(PKG_MODULES))

FLAGS += -DHAVE_CONFIGURE_H -DGKRELLM_SERVER
FLAGS += $(PKG_INCLUDE) $(PTHREAD_INC)

LIBS = $(PKG_LIB) $(SYS_LIBS) $(SENSORS_LIBS)

ifneq ($(PACKAGE_D),gkrellmd)
    FLAGS += -DPACKAGE_D=\"$(PACKAGE_D)\"
endif

OS_RELEASE=$(shell uname -r)

OBJS = main.o monitor.o mail.o plugins.o utils.o sysdeps-unix.o log.o

all: gkrellmd$(BINEXT) gkrellmd.pc $(SERVICE_FILE)

gkrellmd$(BINEXT): $(OBJS) $(EXTRAOBJS)
	$(CC) $(OBJS) $(EXTRAOBJS) -o $@ \
		$(LDFLAGS) $(LIBS) $(LINK_FLAGS)

gkrellmd.pc: Makefile
	echo 'prefix=$(PREFIX)' > $@
	echo 'Name: GKrellMd' >> $@
	echo 'Description: Extensible system monitoring application server' >> $@
	echo 'Version: $(GKRELLM_VERSION)' >> $@
	echo 'Requires: glib-2.0 >= 2.32' >> $@
	echo 'Cflags: -I$(INCLUDEDIR)' >> $@
	echo '$(GKRELLMD_PC_EXTRA)' >> $@

darwin: gkrellmd.pc
	$(MAKE) \
		EXTRAOBJS= \
		SYS_LIBS="-framework CoreFoundation -framework IOKit" \
		LINK_FLAGS="-Wl,-bind_at_load" \
		gkrellmd

macos macosx: darwin

freebsd: gkrellmd.pc
	$(MAKE) EXTRAOBJS= SYS_LIBS="-ldevstat" gkrellmd

netbsd1: gkrellmd.pc
	$(MAKE) EXTRAOBJS= SYS_LIBS="-lkvm" gkrellmd

netbsd2: gkrellmd.pc
	$(MAKE) EXTRAOBJS= SYS_LIBS="-lkvm -pthread" gkrellmd

openbsd: gkrellmd.pc
	$(MAKE) SYS_LIBS="-lkvm -pthread" gkrellmd

solaris: gkrellmd.pc
ifeq ($(OS_RELEASE),5.8)
	$(MAKE) CFLAGS="-Wno-implicit-int" \
		SYS_LIBS="-lkstat -lkvm -ldevinfo -lsocket -lnsl -lintl" \
		LINK_FLAGS="" gkrellmd
else
	$(MAKE) CFLAGS="-Wno-implicit-int" \
		SYS_LIBS="-lkstat -lkvm -ldevinfo -lsocket -lnsl" \
		LINK_FLAGS="" gkrellmd
endif

windows: GKRELLMD_PC_EXTRA:=Libs: -L$${prefix}/lib -lgkrellmd
windows: gkrellmd.pc
	$(MAKE) \
		BINEXT=.exe \
		CFLAGS="${CFLAGS} -D_WIN32_WINNT=0x0601 -DWINVER=0x0601 -DWIN32_LEAN_AND_MEAN -DPSAPI_VERSION=2" \
		LINK_FLAGS="-mconsole -Wl,--dynamicbase -Wl,--nxcompat -Wl,--out-implib=libgkrellmd.dll.a" \
		EXTRAOBJS="${EXTRAOBJS} win32-resource.o" \
		SYS_LIBS="-lws2_32 -lwtsapi32 -lpdh -lnetapi32 -liphlpapi -lintl" \
		gkrellmd.exe

$(SERVICE_FILE): ../data/gkrellmd.service.in
	sed -e 's#@SINSTALLDIR@#$(SINSTALLDIR)#g' ../data/gkrellmd.service.in > $@

install-service:
	$(INSTALL_DIRECTORY) $(DESTDIR)$(SERVICE_DIR)
	$(INSTALL_DATA) $(SERVICE_FILE) $(DESTDIR)$(SERVICE_DIR)/

uninstall-service:
	$(RM) -f $(DESTDIR)$(SERVICE_DIR)/$(SERVICE_FILE)

install_pkgconfig:
	$(INSTALL_DIRECTORY) $(DESTDIR)$(PKGCONFIGDIR)
	$(INSTALL_DATA) gkrellmd.pc $(DESTDIR)$(PKGCONFIGDIR)/

uninstall_pkgconfig:
	$(RM) $(DESTDIR)$(PKGCONFIGDIR)/gkrellmd.pc

install: install_unix install-service

install-strip:
	$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install

install_bin:
	$(INSTALL_DIRECTORY) $(DESTDIR)$(SINSTALLDIR)
	$(INSTALL_PROGRAM) $(PACKAGE_D)$(BINEXT) $(DESTDIR)$(SINSTALLDIR)/$(PACKAGE_D)$(BINEXT)

uninstall_bin:
	$(RM) $(DESTDIR)$(SINSTALLDIR)/$(PACKAGE_D)$(BINEXT)

install_inc:
	$(INSTALL_DIRECTORY) $(DESTDIR)$(INCLUDEDIR)/gkrellm2
	$(INSTALL_DATA) $(GKRELLMD_INCLUDES) $(DESTDIR)$(INCLUDEDIR)/gkrellm2/

# FIXME: may remove too many files, overlaps with uninstall_inc from client
uninstall_inc:
	$(RM) -r $(DESTDIR)$(INCLUDEDIR)/gkrellm2

install_man:
	$(INSTALL_DIRECTORY) $(DESTDIR)$(SMANDIR)
	$(INSTALL_DATA) ../docs/gkrellmd.1 $(DESTDIR)$(SMANDIR)/$(PACKAGE_D).$(SMANSECTION)

uninstall_man:
	$(RM) $(DESTDIR)$(SMANDIR)/$(PACKAGE_D).$(SMANSECTION)

install_cfg:
	$(INSTALL_DIRECTORY) $(DESTDIR)$(CFGDIR)
	$(INSTALL_DATA) ../data/gkrellmd.conf $(DESTDIR)$(CFGDIR)/

uninstall_cfg:
	$(RM) $(DESTDIR)$(CFGDIR)/gkrellmd.conf

uninstall: uninstall_bin uninstall_inc uninstall_man uninstall_cfg uninstall-service

# install rules common to all unix systems
install_unix: install_bin install_inc install_man install_cfg install_pkgconfig

install_darwin install_macos install_macosx:
	$(MAKE) install_unix

install_freebsd:
	$(MAKE) install_unix

install_netbsd:
	$(MAKE) SMANDIR="$(PREFIX)/man/man1" install_unix

install_openbsd:
	$(MAKE) install_unix
	chgrp kmem $(DESTDIR)$(SINSTALLDIR)/$(PACKAGE_D)
	chmod g+sx $(DESTDIR)$(SINSTALLDIR)/$(PACKAGE_D)

install_solaris:
	$(MAKE) INSTALL=/usr/ucb/install install_unix
	chgrp sys $(DESTDIR)$(SINSTALLDIR)/$(PACKAGE_D)
	chmod g+s $(DESTDIR)$(SINSTALLDIR)/$(PACKAGE_D)

install_windows:
	$(MAKE) BINEXT=.exe install_bin install_inc install_cfg install_pkgconfig
	$(INSTALL_DIRECTORY) $(DESTDIR)$(LIBDIR)
	$(INSTALL_DATA) libgkrellmd.dll.a $(DESTDIR)$(LIBDIR)/

uninstall_windows:
	$(MAKE) BINEXT=.exe uninstall_bin uninstall_inc uninstall_cfg uninstall_pkgconfig
	$(RM) $(DESTDIR)$(LIBDIR)/libgkrellmd.dll.a

clean:
	$(RM) \
		*.o \
		$(SERVICE_FILE) \
		configure.h \
		configure.log \
		gkrellmd \
		gkrellmd-version.h \
		gkrellmd.exe \
		gkrellmd.pc \
		libgkrellmd.dll.a \
		win32-resource.rc

SYSDEPS_SRC = \
	../src/sysdeps/bsd-common.c \
	../src/sysdeps/bsd-net-open.c \
	../src/sysdeps/darwin.c \
	../src/sysdeps/dragonfly.c \
	../src/sysdeps/freebsd.c \
	../src/sysdeps/linux.c \
	../src/sysdeps/netbsd.c \
	../src/sysdeps/openbsd.c \
	../src/sysdeps/sensors-common.c \
	../src/sysdeps/solaris.c \
	../src/sysdeps/win32-sensors.c \
	../src/sysdeps/win32.c

GKRELLMD_H = \
	../src/gkrellm-sysdeps.h \
	../src/inet.h \
	$(SHARED_PATH)/gkrellm-visibility.h \
	$(SHARED_PATH)/log.h \
	gkrellmd-private.h \
	gkrellmd-version.h \
	gkrellmd.h

main.o:		main.c $(GKRELLMD_H)
monitor.o:	monitor.c $(GKRELLMD_H)
mail.o:		mail.c $(GKRELLMD_H)
plugins.o:	plugins.c $(GKRELLMD_H)
utils.o:	utils.c $(GKRELLMD_H)
sysdeps-unix.o: sysdeps-unix.c $(SYSDEPS_SRC) $(GKRELLMD_H)
log.o: $(SHARED_PATH)/log.c $(GKRELLMD_H)
win32-resource.o:	win32-resource.rc
	$(WINDRES) $< -o $@
