SHELL = /bin/sh

BASENAME = oslogin
NAME = google-compute-engine-$(BASENAME)
MAJOR = 1
MINOR = 5
REVISION = 1

LIBNSS_CACHE_OSLOGIN = libnss_cache_$(BASENAME)
LIBNSS_CACHE_OSLOGIN_NAME = libnss_cache_$(NAME)-$(MAJOR).$(MINOR).$(REVISION).so
LIBNSS_CACHE_OSLOGIN_SONAME = $(LIBNSS_CACHE_OSLOGIN).so.2
NSS_LIBRARY_NAME = libnss_$(NAME)-$(MAJOR).$(MINOR).$(REVISION).so
NSS_LIBRARY_SONAME = libnss_$(BASENAME).so.2
NSS_INSTALL_PATH = /lib
PAM_INSTALL_PATH = /lib/security
AUTHKEYS_INSTALL_PATH = /usr/bin

JSON_INCLUDE_PATH = /usr/include/json-c
INCLUDE_FLAGS = -I$(JSON_INCLUDE_PATH)

CXX ?= g++
CXXFLAGS += -fPIC# -Wall
CC ?= gcc
PAMFLAGS = $(LDFLAGS) $(INCLUDE_FLAGS) -shared
NSSFLAGS = $(LDFLAGS) $(INCLUDE_FLAGS) -shared -Wl,-soname,$(NSS_LIBRARY_SONAME)
LIBNSSFLAGS = $(LDFLAGS) -Wall -Wstrict-prototypes -fPIC -g
LIBNSS_SO_FLAGS = $(LIBNSSFLAGS) -shared -Wl,-soname,$(LIBNSS_CACHE_OSLOGIN_SONAME)

# UTILS
UTILS_DIR = utils
UTILS_SRC = $(UTILS_DIR)/$(BASENAME)_utils.cc
UTILS = $(UTILS_DIR)/$(BASENAME)_utils.o

# AUTHORIZED KEYS
AUTHKEYS_DIR = authorized_keys
AUTHKEYS_SRC = $(AUTHKEYS_DIR)/authorized_keys.cc
AUTHKEYS_BIN = google_authorized_keys

# NSS
NSS = nss_$(BASENAME)
NSS_DIR = nss_module
NSS_SRC = $(NSS_DIR)/$(NSS).cc

# NSS CACHE
NSS_CACHE = nss_cache
NSS_CACHE_DIR = nss_cache
NSS_CACHE_BIN = google_$(BASENAME)_nss_cache
NSS_CACHE_SRC = $(NSS_CACHE_DIR)/$(NSS_CACHE).cc

# LIBNSS OSLOGIN CACHE
LIBNSS_CACHE_OSLOGIN_DIR = $(LIBNSS_CACHE_OSLOGIN)
LIBNSS_CACHE = nss_cache_$(BASENAME)
LIBNSS_CACHE_SRC = $(LIBNSS_CACHE_OSLOGIN_DIR)/$(LIBNSS_CACHE).c
LIBNSS_CACHE_OBJ = $(LIBNSS_CACHE_OSLOGIN_DIR)/$(LIBNSS_CACHE).o
LIBNSS_COMPAT = compat/getpwent_r
LIBNSS_COMPAT_SRC = $(LIBNSS_CACHE_OSLOGIN_DIR)/$(LIBNSS_COMPAT).c
LIBNSS_COMPAT_OBJ = $(LIBNSS_CACHE_OSLOGIN_DIR)/$(LIBNSS_COMPAT).o

# PAM
PAM = pam_$(BASENAME)
PAM_DIR = pam_module
PAM_ADMIN = $(PAM)_admin
PAM_ADMIN_SRC = $(PAM_DIR)/$(PAM_ADMIN).cc
PAM_ADMIN_OBJ = $(PAM_DIR)/$(PAM_ADMIN).o
PAM_ADMIN_MOD = $(PAM_ADMIN).so
PAM_LOGIN = $(PAM)_login
PAM_LOGIN_SRC = $(PAM_DIR)/$(PAM_LOGIN).cc
PAM_LOGIN_OBJ = $(PAM_DIR)/$(PAM_LOGIN).o
PAM_LOGIN_MOD = $(PAM_LOGIN).so

# HELPER SCRIPTS
BIN_DIR = bin
OSLOGIN_HELPER = $(BIN_DIR)/google_oslogin_control
BIN_INSTALL_PATH = /usr/bin

# SELINUX POLICY
INSTALL_SELINUX =
POLICY_DIR = policy
SELINUX_INSTALL_NAME = oslogin.pp
SELINUX_MODULE = $(POLICY_DIR)/$(SELINUX_INSTALL_NAME)
SELINUX_INSTALL_PATH = /usr/share/selinux/packages

LIBS = -lcurl -ljson-c
PAM_LIBS = -lpam $(LIBS)

ifdef INSTALL_SELINUX
all: $(NSS) $(NSS_CACHE_BIN) $(LIBNSS_CACHE_OSLOGIN_NAME) $(PAM) $(AUTHKEYS_BIN)
else
all: $(NSS) $(NSS_CACHE_BIN) $(LIBNSS_CACHE_OSLOGIN_NAME) $(PAM) $(AUTHKEYS_BIN)
endif

$(NSS): $(NSS_LIBRARY_SOURCE) $(UTILS)
	$(CXX) $(CXXFLAGS) $(NSSFLAGS) -o $(NSS_LIBRARY_NAME) \
	$(NSS_SRC) $(UTILS) $(LIBS)

$(NSS_CACHE_BIN): $(NSS_CACHE_SRC) $(UTILS_SRC)
	$(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDE_FLAGS) -o $(NSS_CACHE_BIN) $(NSS_CACHE_SRC) $(UTILS_SRC) $(LIBS)

$(LIBNSS_CACHE_OSLOGIN_NAME): $(LIBNSS_CACHE_OBJ) $(LIBNSS_COMPAT_OBJ)
	$(CXX) $(LIBNSS_SO_FLAGS) -o $(LIBNSS_CACHE_OSLOGIN_NAME) $(LIBNSS_CACHE_OBJ) $(LIBNSS_COMPAT_OBJ)

$(LIBNSS_CACHE_OBJ): $(LIBNSS_CACHE_SRC)
	$(CC) $(LIBNSSFLAGS) -c -o $(LIBNSS_CACHE_OBJ) $(LIBNSS_CACHE_SRC)

$(LIBNSS_COMPAT_OBJ): $(LIBNSS_COMPAT_SRC)
	$(CC) $(LIBNSSFLAGS) -c -o $(LIBNSS_COMPAT_OBJ) $(LIBNSS_COMPAT_SRC)

$(PAM): $(PAM_ADMIN_MOD) $(PAM_LOGIN_MOD)

$(PAM_LOGIN_MOD): $(PAM_LOGIN_OBJ) $(UTILS)
	$(CXX) $(PAMFLAGS) -o $(PAM_LOGIN_MOD) $(PAM_LOGIN_OBJ) $(UTILS) $(PAM_LIBS)

$(PAM_ADMIN_MOD): $(PAM_ADMIN_OBJ) $(UTILS)
	$(CXX) $(PAMFLAGS) -o $(PAM_ADMIN_MOD) $(PAM_ADMIN_OBJ) $(UTILS) $(PAM_LIBS)

$(PAM_LOGIN_OBJ): $(PAM_LOGIN_SRC)
	$(CXX) $(CXXFLAGS) -c $(PAM_LOGIN_SRC) -o $(PAM_LOGIN_OBJ)

$(PAM_ADMIN_OBJ): $(PAM_ADMIN_SRC)
	$(CXX) $(CXXFLAGS) -c $(PAM_ADMIN_SRC) -o $(PAM_ADMIN_OBJ)

$(AUTHKEYS_BIN): $(AUTHKEYS_SRC) $(UTILS_SRC)
	$(CXX) $(CXXFLAGS) $(LDFLAGS) $(INCLUDE_FLAGS) -o $(AUTHKEYS_BIN) $(AUTHKEYS_SRC) $(UTILS_SRC) $(LIBS)

$(UTILS): $(UTILS_SRC)
	$(CXX) $(CXXFLAGS) $(INCLUDE_FLAGS) -c $(UTILS_SRC) -o $(UTILS)

install: $(NSS_LIBRARY_NAME) $(LIBNSS_OSLOGIN_CACHE_NAME) $(PAM_ADMIN_MOD) $(PAM_LOGIN_MOD) $(AUTHKEYS_BIN) $(NSS_CACHE_BIN)
	mkdir -p $(DESTDIR)$(PREFIX)/$(NSS_INSTALL_PATH)
	mkdir -p $(DESTDIR)$(PREFIX)/$(PAM_INSTALL_PATH)
	mkdir -p $(DESTDIR)$(PREFIX)/$(AUTHKEYS_INSTALL_PATH)
	mkdir -p $(DESTDIR)$(PREFIX)/$(BIN_INSTALL_PATH)
	install -m 0644 $(LIBNSS_CACHE_OSLOGIN_NAME) $(DESTDIR)$(PREFIX)/$(NSS_INSTALL_PATH)
	install -m 0644 $(NSS_LIBRARY_NAME) $(DESTDIR)$(PREFIX)/$(NSS_INSTALL_PATH)
	install -m 0644 $(PAM_ADMIN_MOD) $(PAM_LOGIN_MOD) $(DESTDIR)$(PREFIX)/$(PAM_INSTALL_PATH)
	install -m 0755 $(AUTHKEYS_BIN) $(DESTDIR)$(PREFIX)/$(AUTHKEYS_INSTALL_PATH)
	install -m 0755 $(OSLOGIN_HELPER) $(DESTDIR)$(PREFIX)/$(BIN_INSTALL_PATH)
	install -m 0755 $(NSS_CACHE_BIN) $(DESTDIR)$(PREFIX)/$(BIN_INSTALL_PATH)
ifdef MAKE_LINKS
	ln -sf $(LIBNSS_CACHE_OSLOGIN_NAME) $(DESTDIR)$(PREFIX)/$(NSS_INSTALL_PATH)/$(LIBNSS_CACHE_OSLOGIN_SONAME)
	ln -sf $(NSS_LIBRARY_NAME) $(DESTDIR)$(PREFIX)/$(NSS_INSTALL_PATH)/$(NSS_LIBRARY_SONAME)
endif
ifdef INSTALL_SELINUX
	mkdir -p $(DESTDIR)$(PREFIX)/$(SELINUX_INSTALL_PATH)
	install -T -m 0644 $(SELINUX_MODULE) $(DESTDIR)$(PREFIX)/$(SELINUX_INSTALL_PATH)/$(SELINUX_INSTALL_NAME)
endif

uninstall:
	rm -f $(DESTDIR)$(PREFIX)/$(NSS_INSTALL_PATH)/$(LIBNSS_CACHE_OSLOGIN_NAME)
	rm -f $(DESTDIR)$(PREFIX)/$(NSS_INSTALL_PATH)/$(NSS_LIBRARY_NAME)
	rm -f $(DESTDIR)$(PREFIX)/$(PAM_INSTALL_PATH)/$(PAM_ADMIN_MOD)
	rm -f $(DESTDIR)$(PREFIX)/$(PAM_INSTALL_PATH)/$(PAM_LOGIN_MOD)
	rm -f $(DESTDIR)$(PREFIX)/$(AUTHKEYS_INSTALL_PATH)/$(AUTHKEYS_BIN)
	rm -f $(DESTDIR)$(PREFIX)/$(BIN_INSTALL_PATH)/$(OSLOGIN_HELPER)
	rm -f $(DESTDIR)$(PREFIX)/$(BIN_INSTALL_PATH)/$(NSS_CACHE_BIN)
clean:
	rm -f $(UTILS) $(NSS_LIBRARY_NAME) $(LIBNSS_CACHE_OSLOGIN_NAME) $(LIBNSS_CACHE_OBJ) $(LIBNSS_COMPAT_OBJ) $(PAM_ADMIN_OBJ) $(PAM_ADMIN_MOD) $(PAM_LOGIN_OBJ) $(PAM_LOGIN_MOD) $(AUTHKEYS_BIN) $(NSS_CACHE_BIN)

