170 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
		
		
			
		
	
	
			170 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
|   | # To build external modules, you must have a prebuilt kernel available
 | ||
|  | # that contains the configuration and header files used in the build.
 | ||
|  | # go in the kernel directory and do a
 | ||
|  | #       make oldconfig; make scripts; make prepare
 | ||
|  | # or    make defconfig; make scripts; make prepare
 | ||
|  | #
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | # list of objects for this module
 | ||
|  | #
 | ||
|  | # objects whose source file is in ../sys/dev/netmap
 | ||
|  | remoteobjs := netmap.o netmap_mem2.o \
 | ||
|  | 	netmap_generic.o netmap_mbq.o netmap_vale.o \
 | ||
|  | 	netmap_offloadings.o netmap_pipe.o | ||
|  | # all objects
 | ||
|  | netmap_lin-objs := $(remoteobjs) netmap_linux.o | ||
|  | 
 | ||
|  | obj-$(CONFIG_NETMAP) = netmap_lin.o | ||
|  | 
 | ||
|  | ifndef NODRIVERS | ||
|  | # list of modules to be built (actually also forcedeth and r8169)
 | ||
|  | MOD_LIST:=	CONFIG_E1000=m CONFIG_E1000E=m	\
 | ||
|  | 		CONFIG_IXGBE=m CONFIG_IGB=m	\
 | ||
|  | 		CONFIG_BNX2X=m CONFIG_MLX4=m	\
 | ||
|  | 		CONFIG_VIRTIO_NET=m | ||
|  | obj-m += $(O_DRIVERS) | ||
|  | GET_DRIVERS := get-drivers | ||
|  | else | ||
|  | MOD_LIST:= | ||
|  | endif | ||
|  | 
 | ||
|  | # DRIVER_SRCS names of the driver sources is only used to
 | ||
|  | # clean files that we copied.
 | ||
|  | DRIVER_SRCS = r8169.c forcedeth.c e1000/ e1000e/ ixgbe/ igb/ | ||
|  | DRIVER_SRCS += bnx2x/ mellanox/ mlx4/ virtio_net.c | ||
|  | 
 | ||
|  | # _DRV_SUBDIRS contains the subdirs with driver sources.
 | ||
|  | # In old linuxes everything is under drivers/net, newer versions
 | ||
|  | # have them in source/drivers/net/ethernet/$(manufacturer)
 | ||
|  | 
 | ||
|  | _DRV_SUBDIRS= nvidia realtek intel broadcom . .. | ||
|  | 
 | ||
|  | # The following commands are needed to build the modules as out-of-tree,
 | ||
|  | # in fact the kernel sources path must be specified.
 | ||
|  | 
 | ||
|  | PWD ?= $(CURDIR) | ||
|  | M:=$(PWD) | ||
|  | 
 | ||
|  | # Additional compile flags (e.g. header location)
 | ||
|  | EXTRA_CFLAGS := -I$(M) -I$(M)/../sys -I$(M)/../sys/dev -DCONFIG_NETMAP | ||
|  | EXTRA_CFLAGS += -Wno-unused-but-set-variable | ||
|  | 
 | ||
|  | # We use KSRC for the kernel configuration and sources.
 | ||
|  | # If the sources are elsewhere, then use SRC to point to them.
 | ||
|  | KSRC ?= /lib/modules/$(shell uname -r)/build | ||
|  | SRC ?= $(KSRC) | ||
|  | 
 | ||
|  | # extract version number.
 | ||
|  | # version.h can be in two different places.
 | ||
|  | # NOTE- A.B.C translates to aXXYY where XXYY are hex
 | ||
|  | LIN_VER = $(shell V=linux/version.h; G=. ; \
 | ||
|  | 	[ -f $(KSRC)/include/$${V} ] || G=generated/uapi ;\
 | ||
|  | 	grep LINUX_VERSION_CODE $(KSRC)/include/$${G}/linux/version.h | \
 | ||
|  | 	awk '{printf "%03x%02x", $$3/256, $$3%256} ') | ||
|  | 
 | ||
|  | # produce a list of applicable patches for this version
 | ||
|  | PATCHES := $(shell \
 | ||
|  | 	    cd $(PWD)/patches; ls diff--* | awk -v v=$(LIN_VER) -F -- \
 | ||
|  | 	    '{ if ((!$$3 || $$3 <= v) && (!$$4 || v < $$4)) print $$0; }') | ||
|  | 
 | ||
|  | # source drivers to copy. Names derived from the patches
 | ||
|  | S_DRIVERS := $(shell \
 | ||
|  | 	    cd $(PWD)/patches; ls diff--* | awk -v v=$(LIN_VER) -F -- \
 | ||
|  | 	    '{ if ((!$$3 || $$3 <= v) && (!$$4 || v < $$4)) print $$2 }' ) | ||
|  | 
 | ||
|  | # actual drivers after copy and patch
 | ||
|  | DRIVERS = $(shell [ "$(PATCHES)" != "" ] && ls -dAp \
 | ||
|  | 	`echo $(PATCHES:diff--%=%) | sed -r 's/--[0-9a-f-]+//g'` 2> /dev/null) | ||
|  | 
 | ||
|  | # Compile v1000 (vhost porting to e1000) only if
 | ||
|  | # the LIN_VER >= 3.8.0, because we don't want to deal
 | ||
|  | # with backporting problems for v1000.
 | ||
|  | ifeq ($(word 1, $(sort 30800 $(LIN_VER))), 30800) | ||
|  | CONFIG_V1000:=m | ||
|  | else | ||
|  | CONFIG_V1000:=n | ||
|  | endif | ||
|  | 
 | ||
|  | CONFIG_V1000:=n	# force disable by now | ||
|  | 
 | ||
|  | obj-$(CONFIG_V1000) += vhost-port/ | ||
|  | 
 | ||
|  | 
 | ||
|  | all: build | ||
|  | 
 | ||
|  | build: $(GET_DRIVERS) | ||
|  | 	$(MAKE) -C $(KSRC) M=$(PWD) CONFIG_NETMAP=m $(MOD_LIST) \
 | ||
|  | 		EXTRA_CFLAGS='$(EXTRA_CFLAGS)'			\
 | ||
|  | 		O_DRIVERS="$(DRIVERS:%.c=%.o)" modules | ||
|  | 	@ls -l `find . -name \*.ko` | ||
|  | 
 | ||
|  | 
 | ||
|  | test: | ||
|  | 	@echo "version $(LIN_VER)" | ||
|  | 	@echo "patches $(PATCHES)" | ||
|  | 	@echo "drivers $(DRIVERS)" | ||
|  | 
 | ||
|  | clean: | ||
|  | 	-@ $(MAKE) -C $(KSRC) M=$(PWD) clean 2> /dev/null | ||
|  | 	-@ (rm -rf $(DRIVER_SRCS) *.orig *.rej *.ko *.o .*.d \
 | ||
|  | 		.tmp_versions *.mod.c modules.order	\
 | ||
|  | 		Module.symvers .*.cmd get-drivers ) | ||
|  | 
 | ||
|  | # the source is not here so we need to specify a dependency
 | ||
|  | define remote_template | ||
|  | $$(obj)/$(1): $$(M)/../sys/dev/netmap/$(1:.o=.c) | ||
|  | 	$$(call cmd,cc_o_c) | ||
|  | 	$$(call cmd,modversions) | ||
|  | endef | ||
|  | $(foreach o,$(remoteobjs),$(eval $(call remote_template,$(o)))) | ||
|  | 
 | ||
|  | #-- copy and patch initial files
 | ||
|  | # The location changes depending on the OS version, so ...
 | ||
|  | get-drivers: | ||
|  | 	-@(								\
 | ||
|  | 	    if [ -d "$(DRIVER_SRC)" ] ; then				\
 | ||
|  | 		cd "$(DRIVER_SRC)"; s=.; what="`ls -dp *`" ;		\
 | ||
|  | 	    else							\
 | ||
|  | 		cd $(SRC); [ -d source ] && cd source ;			\
 | ||
|  | 		cd drivers/net; s=. ;					\
 | ||
|  | 		[ -d ethernet ] && cd ethernet && s="$(_DRV_SUBDIRS)" ;	\
 | ||
|  | 		what="$(S_DRIVERS)" ;					\
 | ||
|  | 	    fi ;							\
 | ||
|  | 	    echo "LIN_VER $(LIN_VER)" ;					\
 | ||
|  | 	    [ "$${what}" = "" ] && echo "-- NO DRIVERS --" && return;	\
 | ||
|  | 	    echo "---- Building from `pwd`";				\
 | ||
|  | 	    echo "---- copying $${what} ---" ;				\
 | ||
|  | 	    what="$${what} cnic_if.h";					\
 | ||
|  | 	    for i in $$s; do (cd $$i ;					\
 | ||
|  | 		echo "  From `pwd` :";					\
 | ||
|  | 		ls -ldp $${what} 2> /dev/null | sed 's/^/    /' ;	\
 | ||
|  | 	    	cp -Rp $${what} $(PWD) 2>/dev/null );			\
 | ||
|  | 	    done ;							\
 | ||
|  | 	    cd $(PWD) ;							\
 | ||
|  | 	    for i in $(PATCHES) ;					\
 | ||
|  | 		do echo "** patch with $$i";				\
 | ||
|  | 		patch --posix --quiet --force -p1 < patches/$$i;	\
 | ||
|  | 	    done ;							\
 | ||
|  | 	    echo "Building the following drivers: $(S_DRIVERS)" ) | ||
|  | 	@touch get-drivers | ||
|  | 
 | ||
|  | 
 | ||
|  | test3: | ||
|  | 	@echo "from $(PATCHES) -- to $(MYDRIVERS)" | ||
|  | 	@echo "Drivers is $(DRIVERS)" | ||
|  | 	@echo "Actually have `ls -d $(DRIVERS) 2> /dev/null`" | ||
|  | 
 | ||
|  | # compute the diffs for the original files
 | ||
|  | diffs: | ||
|  | 	@for i in `find . -name \*.orig`; do 	\
 | ||
|  | 		diff -urp $$i $${i%.orig} ;	\
 | ||
|  | 	done | ||
|  | 
 | ||
|  | apps: | ||
|  | 	(cd ../examples; $(MAKE)) | ||
|  | 
 | ||
|  | +%: | ||
|  | 	@echo $($*) |