MOD_VER=5.0.65.1 # core driver files CFILES = bp_mod.c HFILES = bp_mod.h PRDPATH_UTIL=/bin TARGET_UTIL=bpctl_util OBJS = bp_util.o ifeq (,$(BUILD_KERNEL)) BUILD_KERNEL=$(shell uname -r) endif ########################################################################### # Environment tests # Kernel Search Path # All the places we look for kernel source KSP := /lib/modules/$(BUILD_KERNEL)/build \ /lib/modules/$(BUILD_KERNEL)/source \ /usr/src/linux-$(BUILD_KERNEL) \ /usr/src/linux-$($(BUILD_KERNEL) | sed 's/-.*//') \ /usr/src/kernel-headers-$(BUILD_KERNEL) \ /usr/src/kernel-source-$(BUILD_KERNEL) \ /usr/src/linux-$($(BUILD_KERNEL) | sed 's/\([0-9]*\.[0-9]*\)\..*/\1/') \ /usr/src/linux # prune the list down to only values that exist # and have an include/linux sub-directory test_dir = $(shell [ -e $(dir)/include/linux ] && echo $(dir)) KSP := $(foreach dir, $(KSP), $(test_dir)) # we will use this first valid entry in the search path ifeq (,$(KSRC)) KSRC := $(firstword $(KSP)) endif ifeq (,$(KSRC)) $(warning *** Kernel header files not in any of the expected locations.) $(warning *** Install the appropriate kernel development package, e.g.) $(error kernel-devel, for building kernel modules and try again) else ifeq (/lib/modules/$(BUILD_KERNEL)/source, $(KSRC)) KOBJ := /lib/modules/$(BUILD_KERNEL)/build else KOBJ := $(KSRC) endif endif # Version file Search Path VSP := $(KOBJ)/include/generated/utsrelease.h \ $(KOBJ)/include/linux/utsrelease.h \ $(KOBJ)/include/linux/version.h \ $(KOBJ)/include/generated/uapi/linux/version.h \ /boot/vmlinuz.version.h # Config file Search Path CSP := $(KOBJ)/include/generated/autoconf.h \ $(KOBJ)/include/linux/autoconf.h \ /boot/vmlinuz.autoconf.h # prune the lists down to only files that exist test_file = $(shell [ -f $(file) ] && echo $(file)) VSP := $(foreach file, $(VSP), $(test_file)) CSP := $(foreach file, $(CSP), $(test_file)) # and use the first valid entry in the Search Paths ifeq (,$(VERSION_FILE)) VERSION_FILE := $(firstword $(VSP)) endif ifeq (,$(CONFIG_FILE)) CONFIG_FILE := $(firstword $(CSP)) endif ifeq (,$(wildcard $(VERSION_FILE))) $(error Linux kernel source not configured - missing version header file) endif ifeq (,$(wildcard $(CONFIG_FILE))) $(error Linux kernel source not configured - missing autoconf.h) endif # pick a compiler ifneq (,$(findstring egcs-2.91.66, $(shell cat /proc/version))) CC := kgcc gcc cc else CC := gcc cc endif test_cc = $(shell $(cc) --version > /dev/null 2>&1 && echo $(cc)) CC := $(foreach cc, $(CC), $(test_cc)) CC := $(firstword $(CC)) ifeq (,$(CC)) $(error Compiler not found) endif # we need to know what platform the driver is being built on # some additional features are only built on Intel platforms ARCH := $(shell uname -m | sed 's/i.86/i386/') ifeq ($(ARCH),alpha) EXTRA_CFLAGS += -ffixed-8 -mno-fp-regs endif ifeq ($(ARCH),x86_64) EXTRA_CFLAGS += -mcmodel=kernel -mno-red-zone endif ifeq ($(ARCH),ppc) EXTRA_CFLAGS += -msoft-float endif ifeq ($(ARCH),ppc64) EXTRA_CFLAGS += -m64 -msoft-float LDFLAGS += -melf64ppc endif EXTRA_CFLAGS += -DVER_STR_SET="\"$(MOD_VER)\"" EXTRA_CFLAGS += -DBP_READ_REG EXTRA_CFLAGS += -DPMC_FIX_FLAG EXTRA_CFLAGS += -DBP_SYNC_FLAG EXTRA_CFLAGS += -DBP_10G #EXTRA_CFLAGS += -DBP_SELF_TEST #EXTRA_CFLAGS += -DBP_LINK_FAIL_NOTIFIER EXTRA_CFLAGS += -DBP_PROC_SUPPORT #EXTRA_CFLAGS += -DBP_DBI_FLAG # extra flags for module builds EXTRA_CFLAGS += -DDRIVER_$(shell echo $(DRIVER_NAME) | tr '[a-z]' '[A-Z]') EXTRA_CFLAGS += -DDRIVER_NAME=$(DRIVER_NAME) EXTRA_CFLAGS += -DDRIVER_NAME_CAPS=$(shell echo $(DRIVER_NAME) | tr '[a-z]' '[A-Z]') # standard flags for module builds EXTRA_CFLAGS += -DLINUX -D__KERNEL__ -DMODULE -O2 -pipe -Wall EXTRA_CFLAGS += -I$(KSRC)/generated/uapi -I$(KSRC)/include -I. EXTRA_CFLAGS += $(shell [ -f $(KSRC)/include/linux/modversions.h ] && \ echo "-DMODVERSIONS -DEXPORT_SYMTAB \ -include $(KSRC)/include/linux/modversions.h") EXTRA_CFLAGS += $(CFLAGS_EXTRA) RHC := $(KSRC)/include/linux/rhconfig.h ifneq (,$(wildcard $(RHC))) # 7.3 typo in rhconfig.h ifneq (,$(shell $(CC) $(CFLAGS) -E -dM $(RHC) | grep __module__bigmem)) EXTRA_CFLAGS += -D__module_bigmem endif endif # get the kernel version - we use this to find the correct install path KVER := $(shell $(CC) $(EXTRA_CFLAGS) -E -dM $(VERSION_FILE) | grep UTS_RELEASE | \ awk '{ print $$3 }' | sed 's/\"//g') # assume source symlink is the same as build, otherwise adjust KOBJ ifneq (,$(wildcard /lib/modules/$(KVER)/build)) ifneq ($(KSRC),$(shell readlink /lib/modules/$(KVER)/build)) KOBJ=/lib/modules/$(KVER)/build endif endif KVER_CODE := $(shell $(CC) $(EXTRA_CFLAGS) -E -dM $(VSP) 2>/dev/null |\ grep -m 1 LINUX_VERSION_CODE | awk '{ print $$3 }' | sed 's/\"//g') # abort the build on kernels older than 2.4.0 ifneq (1,$(shell [ $(KVER_CODE) -ge 132096 ] && echo 1 || echo 0)) $(error *** Aborting the build. \ *** This driver is not supported on kernel versions older than 2.4.0) endif # set the install path INSTDIR := /lib/modules/$(KVER)/kernel/drivers/net/$(DRIVER_NAME) # look for SMP in config.h SMP := $(shell $(CC) $(EXTRA_CFLAGS) -E -dM $(CONFIG_FILE) | \ grep -w CONFIG_SMP | awk '{ print $$3 }') ifneq ($(SMP),1) SMP := 0 endif ifneq ($(SMP),$(shell uname -a | grep SMP > /dev/null 2>&1 && echo 1 || echo 0)) $(warning ***) ifeq ($(SMP),1) $(warning *** Warning: kernel source configuration (SMP)) $(warning *** does not match running kernel (UP)) else $(warning *** Warning: kernel source configuration (UP)) $(warning *** does not match running kernel (SMP)) endif $(warning *** Continuing with build,) $(warning *** resulting driver may not be what you want) $(warning ***) endif ifeq ($(SMP),1) EXTRA_CFLAGS += -D__SMP__ endif ########################################################################### # Kernel Version Specific rules ifeq (1,$(shell [ $(KVER_CODE) -ge 132352 ] && echo 1 || echo 0)) # Makefile for 2.5.x and newer kernel TARGET = bpctl_mod.ko # man page MANSECTION = 7 MANFILE = $(TARGET:.ko=.$(MANSECTION)) ifneq ($(PATCHLEVEL),) EXTRA_CFLAGS += $(CFLAGS_EXTRA) obj-m += bpctl_mod.o bpctl_mod-objs := $(CFILES:.c=.o) else default: $(TARGET_UTIL) ifeq ($(KOBJ),$(KSRC)) $(MAKE) -C $(KSRC) SUBDIRS=$(shell pwd) modules else $(MAKE) -C $(KSRC) O=$(KOBJ) SUBDIRS=$(shell pwd) modules endif endif else # ifeq (1,$(shell [ $(KVER_CODE) -ge 132352 ] && echo 1 || echo 0)) # Makefile for 2.4.x kernel TARGET = bpctl_mod.o # man page MANSECTION = 7 MANFILE = $(TARGET:.o=.$(MANSECTION)) # Get rid of compile warnings in kernel header files from SuSE ifneq (,$(wildcard /etc/SuSE-release)) EXTRA_CFLAGS += -Wno-sign-compare -fno-strict-aliasing endif # Get rid of compile warnings in kernel header files from fedora ifneq (,$(wildcard /etc/fedora-release)) EXTRA_CFLAGS += -fno-strict-aliasing endif CFLAGS += $(EXTRA_CFLAGS) .SILENT: $(TARGET) $(TARGET): $(filter-out $(TARGET), $(CFILES:.c=.o)) $(LD) $(LDFLAGS) -r $^ -o $@ echo; echo echo "**************************************************" echo "** $(TARGET) built for $(KVER)" echo -n "** SMP " if [ "$(SMP)" = "1" ]; \ then echo "Enabled"; else echo "Disabled"; fi echo "**************************************************" echo $(CFILES:.c=.o): $(HFILES) Makefile default: $(MAKE) endif # ifeq (1,$(shell [ $(KVER_CODE) -ge 132352 ] && echo 1 || echo 0)) # depmod version for rpm builds DEPVER := $(shell /sbin/depmod -V 2>/dev/null | \ awk 'BEGIN {FS="."} NR==1 {print $$2}') ########################################################################### # Build rules install: default # remove all old versions of the driver find $(INSTALL_MOD_PATH)/lib/modules/$(KVER) -name $(TARGET) -exec rm -f {} \; || true find $(INSTALL_MOD_PATH)/lib/modules/$(KVER) -name $(TARGET).gz -exec rm -f {} \; || true install -D -m 777 $(TARGET) $(INSTALL_MOD_PATH)$(INSTDIR)/$(TARGET) ifeq (,$(INSTALL_MOD_PATH)) /sbin/depmod -a || true else ifeq ($(DEPVER),1 ) /sbin/depmod -r $(INSTALL_MOD_PATH) -a || true else /sbin/depmod -b $(INSTALL_MOD_PATH) -a -n $(KVERSION) > /dev/null || true endif endif mkdir -p $(INSTALL_MOD_PATH)$(PRDPATH_UTIL) install $(TARGET_UTIL) $(INSTALL_MOD_PATH)$(PRDPATH_UTIL) install bpctl_start $(INSTALL_MOD_PATH)$(PRDPATH_UTIL) install bpctl_stop $(INSTALL_MOD_PATH)$(PRDPATH_UTIL) $(TARGET_UTIL): $(OBJS) $(OBJS): bp_util.c $(CC) $(CFLAGS) -c bp_util.c -DBP_DBI_FLAG -DPMC_FIX_FLAG -DVER_STR_SET="\"$(MOD_VER)\"" $(CC) $(OBJS) -o $(TARGET_UTIL) uninstall: if [ -e $(INSTDIR)/$(TARGET) ] ; then \ rm -f $(INSTDIR)/$(TARGET) ; \ fi /sbin/depmod -a if [ -e $(INSTALL_MOD_PATH)$(PRDPATH_UTIL)/$(TARGET_UTIL) ] ; then \ rm -f $(INSTALL_MOD_PATH)$(PRDPATH_UTIL)/$(TARGET_UTIL) ; \ fi if [ -e $(INSTALL_MOD_PATH)$(PRDPATH_UTIL)/bpctl_start ] ; then \ rm -f $(INSTALL_MOD_PATH)$(PRDPATH_UTIL)/bpctl_start ; \ fi if [ -e $(INSTALL_MOD_PATH)$(PRDPATH_UTIL)/bpctl_stop ] ; then \ rm -f $(INSTALL_MOD_PATH)$(PRDPATH_UTIL)/bpctl_stop ; \ fi .PHONY: clean install clean: ifeq ($(KOBJ),$(KSRC)) $(MAKE) -C $(KSRC) SUBDIRS=$(shell pwd) clean else $(MAKE) -C $(KSRC) O=$(KOBJ) SUBDIRS=$(shell pwd) clean endif rm -rf $(TARGET) $(TARGET:.ko=.o) $(TARGET:.ko=.mod.c) $(TARGET:.ko=.mod.o) $(CFILES:.c=.o) .*cmd .tmp_versions $(OBJS) $(TARGET_UTIL) Module.symvers Modules.symvers modules.order Module.markers