ifneq (0,0)

Module Name:

    Makefile

Abstract:

    This is a main makefile used to build ufsd.o

Author:

    Ahdrey Shedel

Revision History:

    26/12/2002 - Andrey Shedel - Created

endif

#
# nodebug is a variable used to turn off debug build.
# default is nodebug = 0. This can be altered from nmake command
# line like 'nmake nodebug = 1'
#
ifndef nodebug
nodebug=1
endif

#CONFIG_MODVERSIONS=1

# OS dependent parameters
ifeq ("$(OS)", "Windows_NT")
# Building test module on NT host.
PATH += ;C:\Program Files\gcc-2.95.2\bin
LINUX_INCLUDES= -I "C:\TEMP\linux-2.4.20\include"
LINUX_INCLUDES+= -I ".\linux.inc"
RM=del
MKDIR=@if not exist $(subst /,\,$@)\nul mkdir $(subst /,\,$@)

LIBPREFIX=lib
LIBSUFFIX=.a
OBJEXT=.o
MODSUFFIX=.o
#LIBSUFFIX=.lib
#OBJEXT=.obj
#MODSUFFIX=.obj

DEFINES += -D__linux__ -DUFSD_TEST
LDFLAGS += -m i386pe
else  #("$(OS)", "Windows_NT")
# Assume host matches target.
LIBPREFIX=lib
LIBSUFFIX=.a
OBJEXT=.o
MODSUFFIX=.o
MKDIR=@if [ ! -d $@ ]; then mkdir $@; fi

DEFINES += -DMODULE -D__KERNEL__ -fshort-wchar -fno-enforce-eh-specs 
ifeq (1, $(CONFIG_MODVERSIONS))
DEFINES += -DMODVERSIONS -include /usr/include/linux/modversions.h
endif
DEFINES += -D__NO_VERSION__

LDFLAGS += -m elf_i386
endif #("$(OS)", "Windows_NT")

# override make' default for CC
CC = gcc
LD = ld

#
# Next lines are used to tune UFSD internals.
# VxD will be compiled with support for filesystems
# from list below.
#

#UFSD_FAT  = 1
#UFSD_EXT2 = 1
UFSD_NTFS = 1
#UFSD_HPFS = 1
#UFSD_TEST = 1

#UFSD_BUILD_TYPE = 2
UFSD_READONLY=1

#DEVICE = UFSD
#DEVICE = NTFS

# construct default project parameters
# if none of above has been defined.
ifndef DEVICE
DEVICE = ufsd
endif

LIBNAME = libufsd.a

ifndef UFSD_READONLY
UFSD_READONLY=0
endif

ifndef UFSD_FAT
ifndef UFSD_EXT2
ifndef UFSD_NTFS
ifndef UFSD_HPFS
ifndef UFSD_TEST
error you should define some FS to support
endif 
endif 
endif 
endif 
endif 

OBJDIR = obj
#UFSD_LIB = ./../../ufsd
UFSD_LIB = ..

# debug defines
ifeq ($(nodebug), 1)
OPTIMIZATION =  -g0 -O2
OPTIMIZATION += -fomit-frame-pointer -fno-strict-aliasing -fno-common 
OPTIMIZATION += -fmerge-all-constants
DEFINES += -DNDEBUG
LDFLAGS += -S -x
O = $(OBJDIR)fre
else
OPTIMIZATION = -g3 -O0
O = $(OBJDIR)chk
LFLAGS   += 
endif

#Vfs output and objects
O_VFS = $(O)/vfs
O_UFSD = $(O)/ufsd
O_UFSD_EXT2 = $(O_UFSD)/ext2
O_UFSD_FAT  = $(O_UFSD)/fat
O_UFSD_NTFS = $(O_UFSD)/ntfs
O_UFSD_HPFS = $(O_UFSD)/hpfs
O_UFSD_TEST = $(O_UFSD)/test

# FS-dependent elements
ifeq (1, $(UFSD_FAT))
DEFINES  +=  -DUFSD_FAT=1
UFSD_OBJS += $(UFSD_OBJS_FAT)
endif

ifeq (1, $(UFSD_EXT2))
DEFINES  +=  -DUFSD_EXT2=1
UFSD_OBJS += $(UFSD_OBJS_EXT2)
endif

ifeq (1, $(UFSD_NTFS))
DEFINES  +=  -DUFSD_NTFS=1
ifneq (1, $(UFSD_READONLY))
DEFINES  += -DUFSD_NTFS_SECURITY -DUFSD_NTFS_OBJECTID -DUFSD_NTFS_WRITE_ENABLE
endif
UFSD_OBJS += $(UFSD_OBJS_NTFS)
endif

ifeq (1, $(UFSD_HPFS))
DEFINES  +=  -DUFSD_HPFS=1
UFSD_OBJS += $(UFSD_OBJS_HPFS)
endif

ifeq (1, $(UFSD_TEST))
DEFINES  +=  -DUFSD_TEST=1
UFSD_OBJS += $(UFSD_OBJS_TEST)
endif

# force config include.
DEFINES += -DUFSD_DEVICE=$(DEVICE) -DUFSD_READONLY=$(UFSD_READONLY)
DEFINES += -DKBUILD_BASENAME=$(UFSD_DEVICE)_$(subst $(comma),_,$(subst -,_,$(*F)))
DEFINES += -include fs_conf.h
DEFINES += -pipe -march=i686 -Wall -mpreferred-stack-boundary=2 -fno-exceptions
DEFINES += -Wno-multichar -Wstrict-prototypes -Wno-unknown-pragmas
#-fno-strength-reduce -m486 -DCPU=686 -malign-loops=2 -malign-jumps=2 -malign-functions=2

# Set common build rules vars.
CFLAGS   +=  $(DEFINES) $(OPTIMIZATION)
CXXFLAGS +=  $(DEFINES) $(OPTIMIZATION)
CXXFLAGS +=  -Wno-reorder -fcheck-new -fno-rtti #-fvtable-gc
LFLAGS   +=  #--demangle

#general rules
.PHONY: all
all: out_dirs Makefile fs_conf.h $(O)/$(LIBNAME) $(O)/$(DEVICE)$(MODSUFFIX) probe

ufsdvfs.c: \
	ufsdapi.h\
	vfsdebug.h

$(O_VFS)/%$(OBJEXT): %.c
	$(COMPILE.c) $(LINUX_INCLUDES)  $< $(OUTPUT_OPTION)

########################################
# final driver rule.
LDFLAGS += -r
              #$(O)/$(LIBPREFIX)ufsd$(LIBSUFFIX)

$(O)/$(DEVICE)$(MODSUFFIX): $(O_VFS)/ufsdvfs$(OBJEXT) $(O)/$(LIBNAME) 
	$(LD) $(LDFLAGS)  $^ -o $@
	@echo "You don't need to install the module under Linux. Just use 'insmod ./$(O)/$(LIBNAME)'."
	@echo "But if you want to do this tape make install"

.PHONY: probe
probe: $(O)/$(DEVICE)$(MODSUFFIX)
ifeq ("$(OS)", "Windows_NT")
	$(CC) $(LINUX_INCLUDES) $(CFLAGS) $(VFS_OBJS) $(UFSD_OBJS) vfstest.c -o $(O)/$(DEVICE).exe
else
	/sbin/insmod -nvp $(O)/$(DEVICE)$(MODSUFFIX)
endif

############################
# Set of rules used to
# create output directories.

O_ALL = \
	$(O)\
	$(O_VFS)\
	$(O_UFSD)\
	$(O_UFSD_EXT2)\
	$(O_UFSD_FAT)\
	$(O_UFSD_HPFS)\
	$(O_UFSD_NTFS)\
	$(O_UFSD_TEST)

O_ALL := $(sort $(O_ALL))

.PHONY: out_dirs
out_dirs: $(O_ALL)

$(O_ALL) :
	$(MKDIR)

CURRKERNEL=`uname -r`
INSTPATH=/lib/modules/$(CURRKERNEL)/kernel/fs/ufsd
INSTMODULE="$(INSTPATH)/ufsd.o"

install:
	@if [ ! -d $(INSTPATH) ]; then 			\
	    echo Creating the directory for module; 	\
	    mkdir $(INSTPATH); 				\
	fi 						
	@if [ ! -r $(INSTMODULE) ]; then 		\
	    echo Moving module in destination directory; \
	    cp $(O)/$(DEVICE)$(MODSUFFIX) $(INSTMODULE);\
	else						\
	    echo "It is impossible to install $(O)/$(DEVICE)$(MODSUFFIX) because this file exists in $(INSTPATH)";	\
	fi

remove:
	@if [ -r $(INSTMODULE) ]; then 		\
	    echo Removing module; 		\
	    rm $(INSTMODULE); 			\
	else					\
	    echo Module not found; 		\
	fi

load:
	@if [ -r $(INSTMODULE) ]; then 		\
	    echo Loading module; 		\
	    insmod $(INSTMODULE); 		\
	fi

unload:
	@if [ -r $(INSTMODULE) ]; then 		\
	    echo Loading module; 		\
	    rmmod $(INSTMODULE); 		\
	fi

#######################
# Clean rule
# 

.PHONY: clean
clean:
	rm -f $(O_VFS)/ufsdvfs$(OBJEXT) 
	-rm -rf $(O_UFSD_EXT2)
	-rm -rf $(O_UFSD_FAT)
	-rm -rf $(O_UFSD_NTFS)
	-rm -rf $(O_UFSD_HPFS)
	-rm -rf $(O_UFSD_TEST)
	-rm -rf $(O_UFSD)
	-rm -rf $(O_VFS)
	-$(RM) $(O)/$(DEVICE)$(MODSUFFIX)
