# Copyright (c) 2009-2011 Centro Svizzero di Calcolo Scientifico (CSCS)
# Licensed under the GPLv2.
# NAMES
TARGET = apstat_clone
MAIN   = main.c
OBJS   = appinfo.o \
	 print_apids.o print_reservations.o print_nodes.o\
	 node_placement_list.o\
	 cmdline.o\

# PROGRAMS
CC    := gcc
SHELL := /bin/bash
DIFF  := diff -up --suppress-common-lines

# PATHS
INCDIR	:= ../../include
LIBDIR	:= ../../libalps
ALPSLIB	:= $(LIBDIR)/libalps.a

# XT RELEASE VERSION
test_release 	 = $(shell [ -f $(dir)/xtrelease ] && echo $(dir)/xtrelease)
release_file    := $(foreach dir,/etc /etc/opt/cray/release/, $(test_release))
parse_xt_release = $(shell sed 's/^[^=]*=//;s/\..*$$//' $(1))
CLE_RELEASE	:= $(call parse_xt_release,$(release_file))

# FLAGS
CFLAGS	= -I$(INCDIR) -Wall -DCLE=$(CLE_RELEASE)
CFLAGS += -g # -Werror -pedantic
LDLIBS = -lexpat

# suffix rules
%.o : %.c common.h cmdline.h
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@

check: $(TARGET)
	./$< -n
gdb: $(TARGET)
	$@ $< -n
# force rebuild do to possible change between CLE releases
test: obj-clean $(TARGET)
ifneq ($(shell which apstat 2>/dev/null),)
	$(DIFF) <(apstat -zn)		<($(TARGET) -n) #>3
	-$(DIFF) <(apstat -a)		<($(TARGET) -a)
	-$(DIFF) <(apstat -a -v)	<($(TARGET) -a -v)
	-$(DIFF) <(apstat -a -v -v)	<($(TARGET) -a -v -v)
	-$(DIFF) <(apstat -a -v -v -v)	<($(TARGET) -a -v -v -v)
	$(DIFF) <(apstat -n | tail -3)	<($(TARGET) -n | tail -3)
	$(DIFF) <(apstat -z -no)	<($(TARGET) -n -o)
	$(DIFF) <(apstat -r)		<($(TARGET) -r)
	$(DIFF) <(apstat -r -v)		<($(TARGET) -r -v)
	$(DIFF) <(apstat -r -v -v)	<($(TARGET) -r -v -v)
	$(DIFF) <(apstat -r -v -v -v)	<($(TARGET) -r -v -v -v)
	-$(DIFF) <(apstat)		<($(TARGET))
else
	@./$(TARGET)
endif

all: check

$(TARGET): $(MAIN) $(OBJS) $(ALPSLIB)
	$(CC) $(CFLAGS) $^ $(LDLIBS) -o $@
#@strip $@

main.c: common.h cmdline.h $(INCDIR)/basil_alps.h

cmdline.o : cmdline.c cmdline.h
	$(CC) $(CFLAGS) -c $< -o $@

cmdline.h cmdline.c: arguments.ggo
	gengetopt < $<

$(ALPSLIB): $(wildcard $(LIBDIR)/*.c)
	$(MAKE) -C $(LIBDIR) all

inventory:
	echo '<?xml version="1.0"?><BasilRequest protocol="1.1" method="QUERY" type="INVENTORY"/>'|apbasil

.PHONY: clean distclean obj-clean inventory

tags: $(wildcard *.c *.h $(LIBDIR)/*.c $(INCDIR)/*.h) /usr/include/alps/apInfo.h
	ctags $^

obj-clean:
	$(RM) $(OBJS)

clean: obj-clean
	@$(RM) *~ ? core a.out TAGS tags *.orig *.rej
	@$(RM) $(TARGET)

distclean: clean
	@$(RM) cmdline.c cmdline.h
