#
# $Id$
#
-# gnu Makefile to build linux module for ipfw+dummynet
+# gnu Makefile to build linux module for ipfw+dummynet.
+#
+# The defaults are set to build without modifications on PlanetLab
+# and possibly 2.6 versions.
+#
-# Unless specified otherwise, variable names are arbitrary.
-# Exceptions are the following:
+# Some variables need to have specific names, because they are used
+# by the build infrastructure on Linux and OpenWrt. They are:
#
# ccflags-y additional $(CC) flags
# M used by Kbuild, we must set it to `pwd`
# O_TARGET the link target, for openwrt
# EXTRA_CFLAGS as the name says... in openwrt
# EXTRA_CFLAGS is used in 2.6.22 module kernel compilation too
+# KERNELPATH the path to the kernel sources or headers
+#
+# Not sure about this (the name might be reserved)
+# ipfw-cflags our flags for building the module
+#
+# Other variables are only private and can be renamed. They include:
+#
+# VER linux version we are building for (2.4 2.6 or openwrt)
#---
$(warning including dummynet/Makefile)
# lets default for 2.6 for planetlab builds
VER ?= 2.6
-ifeq ($(VER),openwrt)
-
-$(warning dummynet/Makefile doing openwrt)
+# General values
obj-m := ipfw_mod.o
-obj-y := ipfw2_mod.o bsd_compat.o \
+
+# generic cflags used on all systems
+ipfw-cflags += -DIPFIREWALL_DEFAULT_TO_ACCEPT -DTRACE
+# _BSD_SOURCE enables __FAVOR_BSD (udp/tcp bsd structs instead of posix)
+ipfw-cflags += -D_BSD_SOURCE
+ipfw-cflags += -DKERNEL_MODULE # build linux kernel module
+# the two header trees for empty and override files
+ipfw-cflags += -I $(M)/include_e -I $(M)/include
+ipfw-cflags += -include $(M)/../glue.h # headers
+
+$(warning "---- Building dummynet kernel module for Version $(VER)")
+# We have three sections for OpenWrt, Linux 2.4 and Linux 2.6
+#
+ifeq ($(VER),openwrt)
+ M=.
+ obj-y := ipfw2_mod.o bsd_compat.o \
in_cksum.o ip_dummynet.o ip_fw2.o ip_fw_pfil.o
-O_TARGET := ipfw_mod.o
+ O_TARGET := ipfw_mod.o
-xcflags-y += -O1 -DLINUX_24
-xcflags-y += -DIPFIREWALL_DEFAULT_TO_ACCEPT
-xcflags-y += -g
-xcflags-y += -D_BSD_SOURCE # enable __FAVOR_BSD (udp/tcp bsd struct over posix)
-xcflags-y += -DKERNEL_MODULE # linux kernel module
-xcflags-y += -I include_e -I include
-xcflags-y += -include ../glue.h # headers
+ # xcflags-y is a temporary variable where we store build options
+ xcflags-y += -O1 -DLINUX_24
+ xcflags-y += -g
-EXTRA_CFLAGS := $(xcflags-y)
+ EXTRA_CFLAGS := $(xcflags-y) $(ipfw-cflags)
-# we should not export anything
-#export-objs := ipfw2_mod.o
+ # we should not export anything
+ #export-objs := ipfw2_mod.o
-include $(TOPDIR)/Rules.make
-else # !openwrt
+else # !openwrt, below we do linux builds for 2.4 and 2.6
+
+ # KERNELPATH is where the kernel headers reside. On PlanetLab
+ # it is set already by the build system.
+ # We can override it from the command line, or let the system guess.
-obj-m := ipfw_mod.o
ifneq ($(shell echo $(VER)|grep '2.4'),)
- $(warning "---- Building for Version $(VER)")
- KERNELDIR := -isystem /usr/src/linux-2.4.35.4/include
- # replace the system include directory
- WARN += -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.2.4/include
+ # The linux 2.4 version
+ # guess the kernel path -- or is it under /lib/modules ?
+ KERNELPATH ?= /usr/src/`uname -r`/build
+
+ # Guess the gcc include directory
+ # The gcc version is in the last line returned by gcc -v
+ # gcc version 4.3.2 (Debian 4.3.2-1.1)
+ MYGCC_VER ?= $(shell gcc -v 2>&1 |tail -n 1 | cut -d " " -f 3)
+ # We don't know the exact directory unde /usr/lib/gcc so we guess
+ MYGCC_INCLUDE ?= $(shell echo /usr/lib/gcc/*/$(MYGCC_VER) | cut -d " " -f 1)/include
+ $(warning "---- gcc includes guessed to $(MYGCC_INCLUDE)")
+
+ # additional warning
#WARN = -Wp,-MD,/home/luigi/ports-luigi/dummynet-branches/ipfw_mod/dummynet/.ipfw2_mod.o.d
#WARN += -Iinclude -include include/linux/autoconf.h
WARN += -m32 -msoft-float # -mregparm=3
#WARN += -freg-struct-return -mpreferred-stack-boundary=2
WARN += -Wno-sign-compare
- WARN += -Wdeclaration-after-statement -Wno-pointer-sign
+ WARN += -Wdeclaration-after-statement -Wno-pointer-sign
ccflags-y += -O1 -DLINUX_24
- CFLAGS = -DMODULE -D__KERNEL__ ${KERNELDIR} ${ccflags-y}
+ CFLAGS = -DMODULE -D__KERNEL__ -nostdinc \
+ -isystem ${KERNELPATH}/include -isystem $(MYGCC_INCLUDE) ${ccflags-y}
# The Main target
all: mod24
else
- # KERNELDIR is where the kernel headers reside
- # XXX on Planetlab, KERNELDIR must be same as KERNELPATH
- KERNELDIR ?= $(KERNELPATH)
- # KERNELDIR := /home/luigi/linux-2.6.25.17/
- # test on rock
- #KERNELDIR := /usr/src/linux-2.6.24 # not with v.2237
- #KERNELDIR := /usr/src/linux-2.6.26
- #KERNELDIR := /usr/src/linux-2.6.22
- #KERNELDIR := /usr/src/linux-source-2.6.26
- #KERNELDIR := /lib/modules/`uname -r`/build
- $(warning "---- Building Version 2.6 $(VER) in $(KERNELDIR)")
+ifeq ($(IPFW_PLANETLAB),1)
+ $(warning "---- Building for PlanetLab")
+ ipfw-cflags += -DIPFW_PLANETLAB # PlanetLab compilation
+endif
+ # if not set, use the version from the installed system
+ KERNELPATH ?= /lib/modules/`uname -r`/build
+ # the latest kernel
+ #KERNELPATH = /usr/src/linux-2.6.22
+ $(warning "---- Building Version 2.6 $(VER) in $(KERNELPATH)")
WARN := -O1 -Wall -Werror -DDEBUG_SPINLOCK -DDEBUG_MUTEXES
# The main target
# Required by kernel <= 2.6.22, ccflags-y is used on newer version
-LINUX_VERSION_CODE := $(shell grep LINUX_VERSION_CODE $(KERNELDIR)/include/linux/version.h|cut -d " " -f3)
-ifeq ($(LINUX_VERSION_CODE),132630)
- EXTRA_CFLAGS += $(ccflags-y)
-endif
+ LINUX_VERSION_CODE := $(shell grep LINUX_VERSION_CODE $(KERNELPATH)/include/linux/version.h|cut -d " " -f3)
+ ifeq ($(LINUX_VERSION_CODE),132630)
+ EXTRA_CFLAGS += $(ccflags-y)
+ endif
all: include_e
- $(MAKE) -C $(KERNELDIR) V=1 M=`pwd` modules
+ $(MAKE) -C $(KERNELPATH) V=1 M=`pwd` modules
endif
#-- back to the common section of code
# Module glue and functions missing in linux
IPFW_SRCS += ipfw2_mod.c bsd_compat.c
-
# additional $(CC) flags
ccflags-y += $(WARN)
-ccflags-y += -DIPFIREWALL_DEFAULT_TO_ACCEPT
+ccflags-y += $(ipfw-cflags)
ccflags-y += -g
-ccflags-y += -D_BSD_SOURCE # enable __FAVOR_BSD (udp/tcp bsd structure over posix)
-ccflags-y += -DKERNEL_MODULE # linux kernel module
-ccflags-y += -I $(M)/include_e -I $(M)/include
-ccflags-y += -include $(M)/../glue.h # headers
mod24: include_e $(obj-m)