obj-m := drbd.o

clean-files := compat.h .config.timestamp

LINUXINCLUDE := -I$(src) $(LINUXINCLUDE)

# Files in the standard include directories take precendence over files
# in the compat directory.
#
# Add -I$(src) to EXTRA_CFLAGS again: some (rhel5, maybe other) kbuild does not
# yet use LINUXINCLUDE like we expect it to ;( fortunately it does not contain
# in-tree drbd either yet, so precedence of include files is not important.
#
# override: we absolutely need this, even if EXTRA_CFLAGS originates from make
# command line or environment
override EXTRA_CFLAGS += -I$(src) -I$(src)/compat

# The augmented rbtree helper functions are not exported at least until kernel
# version 2.6.38-rc2.
ifeq ($(shell grep -e '\<rb_augment_insert\>' \
		   -e '\<rb_augment_erase_begin\>' \
		   -e '\<rb_augment_erase_end\>' \
		   $(objtree)/Module.symvers | wc -l),3)
override EXTRA_CFLAGS += -DAUGMENTED_RBTREE_SYMBOLS_EXPORTED
endif

ifeq ($(shell grep -e '\<idr_get_next\>' \
		   $(objtree)/Module.symvers | wc -l),1)
override EXTRA_CFLAGS += -DIDR_GET_NEXT_EXPORTED
else
compat_objs += compat/idr.o
endif

ifeq ($(shell grep -e '\<kobject_create_and_add[[:space:]]*vmlinux\>' \
		   $(objtree)/Module.symvers | wc -l),1)
override EXTRA_CFLAGS += -DKOBJECT_CREATE_AND_ADD_EXPORTED
else
compat_objs += compat/kobject.o
endif

ifeq ($(shell grep -e '\<blkdev_issue_zeroout\>' \
		   $(objtree)/Module.symvers | wc -l),1)
override EXTRA_CFLAGS += -DBLKDEV_ISSUE_ZEROOUT_EXPORTED
else
compat_objs += compat/blkdev_issue_zeroout.o
endif

drbd-y := drbd_buildtag.o drbd_bitmap.o drbd_proc.o
drbd-y += drbd_worker.o drbd_receiver.o drbd_req.o drbd_actlog.o
drbd-y += lru_cache.o drbd_main.o drbd_strings.o drbd_nl.o
drbd-y += drbd_interval.o drbd_state.o $(compat_objs)
drbd-y += drbd_nla.o drbd_sysfs.o

ifndef CONFIG_CONNECTOR
	drbd-y += connector.o cn_queue.o
endif

$(patsubst %,$(obj)/%,$(drbd-y)): $(obj)/compat.h

obj-$(CONFIG_BLK_DEV_DRBD)     += drbd.o

# ======================================================================

# remember KERNELRELEASE for install target
# .kernelversion can be included in Makefile as well as
# sourced from shell
$(shell echo -e "VERSION=$(VERSION)\n"             \
			  "PATCHLEVEL=$(PATCHLEVEL)\n"       \
			  "SUBLEVEL=$(SUBLEVEL)\n"           \
			  "EXTRAVERSION=$(EXTRAVERSION)\n"   \
			  "LOCALVERSION=$(LOCALVERSION)\n"   \
			  "KERNELRELEASE=$(KERNELRELEASE)\n" \
			  "KERNELVERSION=$(KERNELVERSION)"   \
	  > $(src)/.drbd_kernelrelease.new       \
)

# Are we in stage 2 of the build (modpost)?

KBUILD_STAGE ?= $(if $(filter $(srctree)/scripts/Makefile.modpost,$(MAKEFILE_LIST)),modpost)

ifneq ($(shell date -r $(objtree)/.config),$(shell date -r $(obj)/.config.timestamp 2> /dev/null))
COMPAT_FORCE := FORCE
endif

ifneq ($(KBUILD_STAGE),modpost)
$(obj)/compat.h: $(wildcard $(src)/compat/tests/*.c) $(COMPAT_FORCE)
	$(call filechk,compat.h)
	$(Q)touch $@
	$(Q)touch -r $(objtree)/.config $(obj)/.config.timestamp
endif

filechk_compat.h = \
	for cfg in $(sort $(filter-out FORCE,$^)); do \
	    var=`echo $$cfg | \
		 sed -e "s,.*/,COMPAT_," -e "s,\.c,," | \
		 tr -- -a-z _A-Z | \
		 tr -dc A-Z0-9_`; \
	    if $(CC) $(c_flags) $(COMPAT_CFLAGS) -c -o $(obj)/dummy.o $$cfg \
		    > /dev/null $(if $(quiet),2>&1); then \
		echo "\#define $$var"; \
		rm -f $(obj)/dummy.{o,gcda,gcno}; \
	    else \
		echo "/* \#undef $$var */"; \
	    fi; \
	done



