# Makefile for MCE
# Copyright © 2004-2007 Nokia Corporation.  All rights reserved.
# Written by David Weinehall

VERSION := 1.6.45

INSTALL := install -o root -g root --mode=755
INSTALL_DIR := install -d
INSTALL_DATA := install -o root -g root --mode=644

DOXYGEN := doxygen

VARDIR := $(DESTDIR)/var/lib/mce
RUNDIR := $(DESTDIR)/var/run/mce
CONFDIR := /etc/mce
CONFINSTDIR := $(DESTDIR)$(CONFDIR)
SBINDIR := $(DESTDIR)/sbin
MODULEDIR := $(DESTDIR)/usr/lib/mce/modules
DBUSDIR := $(DESTDIR)/etc/dbus-1/system.d
LOCALEDIR := $(DESTDIR)/usr/share/locale

TOPDIR := $(shell /bin/pwd)
DOCDIR := $(TOPDIR)/doc
TOOLDIR := $(TOPDIR)/tools
TESTSDIR := $(TOPDIR)/tests
MODULE_DIR := $(TOPDIR)/modules
BUILD_TESTSDIR := $(TOPDIR)/build-tests
BUILD_TESTSDIR_TMP := $(TOPDIR)/build-tests/tmp

TOOLS := \
	$(TOOLDIR)/mcetool
TESTS := \
	$(TESTSDIR)/mcetorture
BUILD_TESTS := \
	$(BUILD_TESTSDIR)/test_mce-log \
	$(BUILD_TESTSDIR)/test_mce-io \
	$(BUILD_TESTSDIR)/test_mce-conf
BUILD_TESTS_ROOT := \
	$(BUILD_TESTSDIR)/test_input_event
TARGETS := \
	mce
MODULES := \
	$(MODULE_DIR)/libfilter-brightness-als.so \
	$(MODULE_DIR)/libfilter-brightness-simple.so \
	$(MODULE_DIR)/libinactivity.so \
	$(MODULE_DIR)/libcamera.so \
	$(MODULE_DIR)/libalarm.so \
	$(MODULE_DIR)/libhomekey.so
MODEFILE := mode
CONFFILE := mce.ini
DBUSCONF := mce.conf

WARNINGS := -W -Wall -Wpointer-arith -Wundef -Wcast-align -Wshadow
WARNINGS += -Wbad-function-cast -Wwrite-strings -Wsign-compare
WARNINGS += -Waggregate-return -Wmissing-noreturn -Wnested-externs
WARNINGS += -Wchar-subscripts -Wmissing-prototypes -Wformat-security
WARNINGS += -Wformat=2 -Wno-format-nonliteral
#WARNINGS += -Werror

COMMON_CFLAGS := $(WARNINGS)
COMMON_CFLAGS += -DOSSOLOG_COMPILE
COMMON_CFLAGS += -DPRG_VERSION=$(VERSION)

MCE_CFLAGS := $(COMMON_CFLAGS)
MCE_CFLAGS += -DMCE_CONF_FILE=$(CONFDIR)/$(CONFFILE)
MCE_CFLAGS += $$(pkg-config glib-2.0 gmodule-2.0 dbus-1 dbus-glib-1 gconf-2.0 gwconnect osso-systemui-dbus --cflags)
MCE_LDFLAGS := -lcrypt $$(pkg-config glib-2.0 gmodule-2.0 dbus-1 dbus-glib-1 gconf-2.0 dsme cal osso-systemui-dbus --libs)
LIBS := devlock.c tklock.c modetransition.c powerkey.c connectivity.c mce-dbus.c mce-dsme.c mce-gconf.c input_event.c keypad.c event-keypress.c event-switches.c event-touchscreen.c mce-log.c mce-conf.c led.c datapipe.c mce-modules.c mce-io.c
HEADERS := devlock.h tklock.h modetransition.h powerkey.h connectivity.h mce.h mce-dbus.h mce-dsme.h mce-gconf.h input_event.h keypad.h event-keypress.h event-switches.h event-touchscreen.h mce-log.h mce-conf.h led.h datapipe.h mce-modules.h mce-io.h

MODULE_CFLAGS := $(COMMON_CFLAGS)
MODULE_CFLAGS += -fPIC -shared
MODULE_CFLAGS += -I.
MODULE_CFLAGS += $$(pkg-config glib-2.0 gmodule-2.0 dbus-1 dbus-glib-1 gconf-2.0 --cflags)
MODULE_LDFLAGS := $$(pkg-config glib-2.0 gmodule-2.0 dbus-1 dbus-glib-1 gconf-2.0 --libs)
MODULE_LIBS := datapipe.c mce-log.c mce-dbus.c mce-conf.c mce-gconf.c
MODULE_HEADERS := datapipe.h mce-log.h mce-dbus.h mce-conf.h mce-gconf.h mce.h

TOOLS_CFLAGS := $(COMMON_CFLAGS)
TOOLS_CFLAGS += -I.
TOOLS_CFLAGS += $$(pkg-config glib-2.0 dbus-1 dbus-glib-1 gconf-2.0 --cflags)
TOOLS_LDFLAGS := $$(pkg-config glib-2.0 dbus-1 dbus-glib-1 gconf-2.0 cal --libs)
TOOLS_HEADERS := devlock.h tklock.h mce-dsme.h tools/mcetool.h

BLOCKER_CFLAGS := $(COMMON_CFLAGS)
BLOCKER_CFLAGS += $$(pkg-config glib-2.0 dbus-1 dbus-glib-1 --cflags)
BLOCKER_LDFLAGS := $$(pkg-config glib-2.0 dbus-1 dbus-glib-1 --libs)

BUILD_TESTS_CFLAGS := $(COMMON_CFLAGS)
BUILD_TESTS_CFLAGS += -I.
BUILD_TESTS_CFLAGS += -DMCE_BUILD_TEST_PATH=$(BUILD_TESTSDIR)
BUILD_TESTS_CFLAGS += $$(pkg-config glib-2.0 gmodule-2.0 dbus-1 dbus-glib-1 gconf-2.0 gwconnect osso-systemui-dbus --cflags)
BUILD_TESTS_LDFLAGS := $$(pkg-config glib-2.0 gmodule-2.0 dbus-1 dbus-glib-1 gconf-2.0 dsme cal osso-systemui-dbus --libs)
BUILD_TESTS_LIBS := datapipe.c mce-log.c mce-dbus.c mce-conf.c mce-gconf.c input_event.c mce-io.c

.PHONY: all
all: $(TARGETS) $(MODULES) $(TOOLS) devlock-blocker $(BUILD_TESTS)

$(TARGETS): %: %.c $(HEADERS) $(LIBS)
	@$(CC) $(CFLAGS) $(MCE_CFLAGS) -o $@ $< $(LIBS) $(LDFLAGS) $(MCE_LDFLAGS)

$(MODULES): $(MODULE_DIR)/lib%.so: $(MODULE_DIR)/%.c $(MODULE_HEADERS) $(MODULE_LIBS)
	@$(CC) $(CFLAGS) $(MODULE_CFLAGS) -o $@ $< $(MODULE_LIBS) $(LDFLAGS) $(MODULE_LDFLAGS)

$(TOOLS): %: %.c $(TOOLS_HEADERS)
	@$(CC) $(CFLAGS) $(TOOLS_CFLAGS) -o $@ $< $(LDFLAGS) mce-log.c $(TOOLS_LDFLAGS)

$(BUILD_TESTS): %: %.c $(TARGETS) $(MODULES)
	@$(CC) $(CFLAGS) $(BUILD_TESTS_CFLAGS) -o $@ $< $(BUILD_TESTS_LIBS) $(LDFLAGS) $(BUILD_TESTS_LDFLAGS)

devlock-blocker: devlock-blocker.c mce-log.c mce-log.h
	@$(CC) $(CFLAGS) $(BLOCKER_CFLAGS) -o $@ $< $(LDFLAGS) mce-log.c $(BLOCKER_LDFLAGS)

.PHONY: tags
tags:
	@find . $(MODULE_DIR) -maxdepth 1 -type f -name '*.[ch]' | xargs ctags -a --extra=+f

.PHONY: doc
doc:
	@$(DOXYGEN) 2> $(TOPDIR)/doc/warnings > /dev/null

.PHONY: install
install: all
	$(INSTALL_DIR) $(SBINDIR) $(DBUSDIR) $(VARDIR) $(MODULEDIR)	&&\
	$(INSTALL_DIR) $(RUNDIR) $(CONFINSTDIR)				&&\
	$(INSTALL) $(TARGETS) devlock-blocker $(SBINDIR)		&&\
	$(INSTALL) $(TOOLS) $(TESTS) $(SBINDIR)				&&\
	$(INSTALL) $(MODULES) $(MODULEDIR)				&&\
	$(INSTALL_DATA) $(MODEFILE) $(VARDIR)				&&\
	$(INSTALL_DATA) $(CONFFILE) $(CONFINSTDIR)			&&\
	$(INSTALL_DATA) $(DBUSCONF) $(DBUSDIR)

.PHONY: fixme
fixme:
	@find . -type f -name "*.[ch]" | xargs grep -E "FIXME|XXX|TODO"

.PHONY: test
test: all
	@if [ x"$(BUILD_TESTSDIR_TMP)" != x"" ] &&			\
	    ! [ -d $(BUILD_TESTSDIR_TMP) ]; then			\
		mkdir $(BUILD_TESTSDIR_TMP);				\
	fi
	@for test in "$(BUILD_TESTS)"; do				\
		$$test > /dev/null 2>&1;				\
	done

.PHONY: test-extended
test-extended: all
	@if [ x"$$(id -u)" != x"0" ]; then				\
		printf "The extended tests can only be run as root\n";	\
		exit -1;						\
	fi
	@for test in "$(BUILD_TESTS_ROOT)"; do				\
		$$test > /dev/null 2>&1;				\
	done

.PHONY: clean
clean:
	@rm -f $(TARGETS) $(TOOLS) $(MODULES) devlock-blocker
	@rm -f $(BUILD_TESTS) $(BUILD_TESTS_ROOT)
	@if [ x"$(DOCDIR)" != x"" ] && [ -d "$(DOCDIR)" ]; then		\
		rm -rf $(DOCDIR)/*;					\
	fi
	@if [ x"$(BUILD_TESTSDIR_TMP)" != x"" ] &&			\
	    [ -d "$(BUILD_TESTSDIR_TMP)" ]; then			\
		rm -f $(BUILD_TESTSDIR_TMP)/*;				\
		rmdir $(BUILD_TESTSDIR_TMP);				\
	fi

.PHONY: distclean
distclean: clean
	@rm -f tags
