tweak for building in fedora20
[ipfw-google.git] / kipfw / Makefile
1 # $Id: Makefile 12257 2013-04-26 21:13:24Z luigi $
2 # gnu Makefile to build linux/Windows module for ipfw+dummynet.
3 #
4 # The defaults are set to build without modifications on PlanetLab
5 # and possibly 2.6 versions.
6 # On Windows, we use gnu-make and MSC
7
8 # Some variables need to have specific names, because they are used
9 # by the build infrastructure on Linux and OpenWrt. They are:
10
11 #   ccflags-y   additional $(CC) flags
12 #   M           used by Kbuild, we must set it to `pwd`
13 #   obj-m       list of .o modules to build
14 #   $(MOD)-y    for each $MOD in obj-m, the list of objects
15 #   obj-y       same as above, for openwrt
16 #   O_TARGET    the link target, for openwrt
17 #   EXTRA_CFLAGS as the name says... in openwrt
18 #   EXTRA_CFLAGS is used in 2.6.22 module kernel compilation too
19 #   KERNELPATH  the path to the kernel sources or headers
20 #       (on planetlab it is set already by the build system,
21 #       for other systems we take KSRC which is either guessed
22 #       or taken from the command line.
23 #
24 # Not sure about this (the name might be reserved)
25 #   ipfw-cflags         our flags for building the module
26 #
27 # Other variables are only private and can be renamed. They include:
28 #
29 #   VER         linux version we are building for (2.4 2.6 or openwrt)
30 #
31 #---
32 #
33 # The windows files (passthru etc.) are modified version of the
34 # examples found in the $(DDK)/src/network/ndis/passthru/driver/
35 # They can be re-created using the 'ndis-glue' target in the 
36
37 IPFW3_ROOT ?= $(PWD)/..
38 include $(IPFW3_ROOT)/Makefile.inc
39
40 TARGET = kipfw
41
42 # lets default for 2.6 for planetlab builds
43 VER ?= 2.6
44
45 # $(warning ########## linux dir is $(LINUX_DIR) ###########)
46 # $(warning ########## KERNELPATH is $(KERNELPATH) ###########)
47 #--- General values for all types of build ---
48 # obj-m is the target module
49 obj-m := ipfw_mod.o
50
51 #-- the list of source files. IPFW_SRCS is our own name.
52 # Original ipfw and dummynet sources + FreeBSD stuff,
53 IPFW_SRCS := ip_fw2.c ip_fw_pfil.c ip_fw_sockopt.c
54 IPFW_SRCS += ip_fw_dynamic.c ip_fw_table.c ip_fw_log.c
55 IPFW_SRCS += radix.c in_cksum.c
56 IPFW_SRCS += ip_dummynet.c ip_dn_io.c ip_dn_glue.c
57 IPFW_SRCS += dn_heap.c
58 IPFW_SRCS += dn_sched_fifo.c dn_sched_wf2q.c
59 IPFW_SRCS += dn_sched_rr.c dn_sched_qfq.c
60 IPFW_SRCS += dn_sched_prio.c
61 # Module glue and functions missing in linux
62 IPFW_SRCS += ipfw2_mod.c bsd_compat.c
63
64 # generic cflags used on all systems
65 #ipfw-cflags += -DIPFW_HASHTABLES
66 ipfw-cflags += -DIPFIREWALL_DEFAULT_TO_ACCEPT
67 # _BSD_SOURCE enables __FAVOR_BSD (udp/tcp bsd structs instead of posix)
68 ipfw-cflags += -D_BSD_SOURCE
69 ipfw-cflags += -DKERNEL_MODULE  # build linux kernel module
70 # the two header trees for empty and override files
71 ipfw-cflags += -I $(M)/include_e
72 ipfw-cflags += -I $(M)/../sys
73 ipfw-cflags += -include $(M)/../glue.h  # headers
74 ipfw-cflags += -include $(M)/missing.h  # headers
75
76 $(warning ------ arch $(OSARCH) goals $(MAKECMDGOALS) -----------)
77
78 ifeq ($(OSARCH),Windows)        #--- {  Windows block
79   ifeq ($(VER),win64)
80     $(warning ---- building for 64-bit windows ---)
81     win_arch= -DAMD64=1
82   else
83     win_arch= -Di386=1
84   endif
85     M ?= $(shell pwd)
86     WIN_SRCS += md_win.c
87     WIN_SRCS += miniport.c protocol.c passthru.c debug.c
88     #compiler, linker, target, sources and objects
89     #DDK is exported from the root makefile
90     #DDK = C:/WinDDK/7600.16385.1
91
92     CSOURCES = $(IPFW_SRCS) $(WIN_SRCS)
93
94     COBJS := $(CSOURCES:.c=.obj)
95     COBJS := $(addprefix $(OBJDIR)/,$(COBJS))
96
97     #include paths
98     INCLUDE_PATHS = -Ii386 -I../sys -Iinclude_e -I.
99     # INCLUDE_PATHS += -I$(OBJDIR)
100     INCLUDE_PATHS += -I$(DDK)/inc/api
101     INCLUDE_PATHS += -I$(DDK)/inc/ddk
102     INCLUDE_PATHS += -I$(DDK)/inc/crt
103
104     # #preprocessor MS defines
105     PREPROC  = -D_X86_=1 -Di386=1 -DSTD_CALL -DCONDITION_HANDLING=1
106     PREPROC += -DNT_UP=0 -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1
107     PREPROC += -D_WIN32_WINNT=0x0501 -DWINVER=0x0501 -D_WIN32_IE=0x0603
108     PREPROC += -DWIN32_LEAN_AND_MEAN=1 
109     PREPROC += -D__BUILDMACHINE__=WinDDK -DFPO=0 -D_DLL=1
110     PREPROC += -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1
111     PREPROC += -DNDIS51_MINIPORT=1 -DNDIS51=1
112     PREPROC += -DMSC_NOOPT -DNTDDI_VERSION=0x05010200
113     PREPROC += -DKMDF_MAJOR_VERSION_STRING=01 -DKMDF_MINOR_VERSION_STRING=009
114     #PREPROC += -DDBG=1 #debug
115     PREPROC += -DNDEBUG #always up, seems no effect, possibly no debug?
116     PREPROC += -DDEVL=1 #always up, seems no effect
117     #macroing module name, WARNING: must match the one in .inf files
118     PREPROC += -DMODULENAME=Ipfw 
119
120     #our defines
121     OUR_PREPROC  = -D_KERNEL -DKERNEL_MODULE -DKLD_MODULE
122     OUR_PREPROC += -D__BSD_VISIBLE -DIPFIREWALL_DEFAULT_TO_ACCEPT
123     OUR_PREPROC += -D__LITTLE_ENDIAN -DSYSCTL_NODE -DEMULATE_SYSCTL
124
125   ifeq ($(TCC),)        # Microsoft C compiler
126     CC = $(DDK)/bin/x86/x86/cl.exe
127     LD = $(DDK)/bin/x86/x86/link.exe
128     # #complier options
129     CFLAGS  = -Fo$(OBJDIR)/  -c -FC -Zc:wchar_t-
130     CFLAGS += -Zl -Zp8 -Gy -Gm- -GF -cbstring -Gz -hotpatch -EHs-c-
131     CFLAGS += -W2 # -W3 gives too many conversion errors
132     CFLAGS += -GR- -GF -GS -Zi  # XXX do we need this ?
133     CFLAGS += -Fd$(OBJDIR)/
134     CFLAGS += -wd4603 -wd4627 -typedil-
135     CFLAGS += -FI $(DDK)/inc/api/warning.h
136     CFLAGS += -FI winmissing.h
137     CFLAGS += -FI missing.h     # headers
138     CFLAGS += -FI ../glue.h     # headers
139
140     #optimization options
141     OPTIMIZE = -Od -Oi -Oy-
142
143     #linker options
144     LDFLAGS  = /MERGE:_PAGE=PAGE /MERGE:_TEXT=.text
145     LDFLAGS += /SECTION:INIT,d /OPT:REF /OPT:ICF
146     LDFLAGS += /IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221
147     LDFLAGS += /INCREMENTAL:NO /release /NODEFAULTLIB /WX
148     LDFLAGS += /debug /debugtype:cv,fixup,pdata
149     LDFLAGS += /version:6.1 /osversion:6.1 /functionpadmin:5
150     LDFLAGS += /safeseh /pdbcompress
151     LDFLAGS += /STACK:0x40000,0x1000 /driver /base:0x10000 /align:0x80
152     LDFLAGS += /stub:$(DDK)\\lib\\wxp\\stub512.com
153     LDFLAGS += /subsystem:native,5.01 /entry:GsDriverEntry@8
154     LDFLAGS += /out:$(OBJDIR)/ipfw.sys
155
156     #libraries to build against
157     LIBS  = $(DDK)/lib/wxp/i386/BufferOverflowK.lib
158     LIBS += $(DDK)/lib/wxp/i386/ntoskrnl.lib
159     LIBS += $(DDK)/lib/wxp/i386/hal.lib
160     LIBS += $(DDK)/lib/wxp/i386/wmilib.lib
161     LIBS += $(DDK)/lib/wxp/i386/ndis.lib
162     LIBS += $(DDK)/lib/wxp/i386/sehupd.lib
163   else  # use tcc. not working yet for the kernel module.
164     # TCC points to the root of tcc tree
165     CC=$(TCC)/bin/wintcc
166     EXTRA_CFLAGS += -DTCC -I..
167     EXTRA_CFLAGS += -I$(TCC)/include/winapi -I$(TCC)/include
168     EXTRA_CFLAGS += -nostdinc
169
170     CFLAGS += -include winmissing.h -include missing.h -include ../glue.h
171     CFLAGS += -I../../inc/api -I../../inc/ddk -I../../inc/crt
172     CFLAGS += -DRC_INVOKED
173   endif # use tcc
174
175     #empty include directory to be built
176     M ?= $(shell pwd)
177     EFILES_asm += div64.h
178     EFILES_linux += if.h random.h errno.h
179     EFILES_net += if_types.h inet_hashtables.h route.h
180
181     #targets
182 all: $(TARGET)
183
184 $(TARGET): include_e
185         # XXX dangerous rm -rf $(OBJDIR)
186         mkdir -p $(OBJDIR)
187         $(MSG) "  CC [$(CC)] $(CSOURCES)"
188         $(HIDE) $(CC) $(INCLUDE_PATHS) $(PREPROC) $(OUR_PREPROC) $(CFLAGS) $(OPTIMIZE) $(CSOURCES)
189         $(MSG) "  LD [$(LD)] $(COBJS)"
190         $(HIDE) $(LD) $(LDFLAGS) $(COBJS) $(LIBS)
191
192 else # } { linux variables and targets
193
194   # extract version number (hex, aXXYY). Newer linuxes have a different dir
195   # if not set, use the version from the installed system
196   KERNELPATH ?= $(KSRC)
197   LIN_VER := $(shell V=linux/version.h; G=. ; \
198         [ -f $(KERNELPATH)/include/$${V} ] || G=generated/uapi ;\
199         grep LINUX_VERSION_CODE $(KERNELPATH)/include/$${G}/linux/version.h | \
200         awk '{printf "%03x%02x", $$3/256, $$3%256} ')
201
202   $(warning ------------- linux version $(LIN_VER) (hex) ------------)
203 # We have three sections: OpenWrt, Linux 2.4 and Linux 2.6
204
205 ifeq ($(LIN_VER),openwrt)       #--- { The Makefile section for openwrt ---
206   # this was used on openwrt, but not anymore
207   $(error ------ build on openwrt ---------- )
208   # We do not include a dependency on include_e as it is called
209   # by Makefile.openwrt in Build/Prepare
210   M=.
211   obj-y := $(IPFW_SRCS:%.c=%.o)
212   O_TARGET := $(obj-m)
213
214   # xcflags-y is a temporary variable where we store build options
215   xcflags-y += -O1 -DLINUX_24
216   xcflags-y += -g
217
218   EXTRA_CFLAGS := $(xcflags-y) $(ipfw-cflags) -DSYSCTL_NODE -DEMULATE_SYSCTL
219
220   # we should not export anything
221   #export-objs := ipfw2_mod.o
222 -include $(TOPDIR)/Rules.make
223 endif # ---- } end openwrt version
224
225
226 ifneq ($(shell echo $(LIN_VER)|grep '2.4'),)    #--- {
227   # Makefile section for the linux 2.4 version
228   # tested on linux-2.4.35.4, does not work with 2.4.37
229   #
230   # guess the kernel path -- or is it under /lib/modules ?
231   KERNELPATH ?= $(KSRC)
232
233   # We need to figure out the gcc include directory, if not
234   # set by the user through MYGCC_INCLUDE
235   # Find compiler version (3rd field in last line returned by gcc -v)
236   # e.g.        gcc version 4.3.2 (Debian 4.3.2-1.1)
237   MYGCC_VER ?= $(shell $(CC) -v 2>&1 |tail -n 1 | cut -d " " -f 3)
238   # We don't know the exact directory under /usr/lib/gcc so we guess
239   MYGCC_INCLUDE ?= $(shell echo /usr/lib/gcc/*/$(MYGCC_VER) | cut -d " " -f 1)/include
240   $(warning "---- gcc includes guessed to $(MYGCC_INCLUDE)")
241
242   # additional warning
243   WARN += -Wall -Wundef
244   WARN += -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing
245   WARN += -fno-common -Werror-implicit-function-declaration
246   # WARN += -O2  -fno-stack-protector -m32 -msoft-float -mregparm=3
247   # -mregparm=3 gives a printk error
248   WARN += -m32 -msoft-float # -mregparm=3
249   #WARN += -freg-struct-return -mpreferred-stack-boundary=2
250   WARN += -Wno-sign-compare
251   WARN += -Wdeclaration-after-statement
252   ifneq ($(MYGCC_VER),3.4.6)
253         WARN += -Wno-pointer-sign
254   endif
255
256   ccflags-y += -O1 -DLINUX_24
257   CFLAGS = -DMODULE -D__KERNEL__ -nostdinc \
258         -isystem ${KERNELPATH}/include -isystem $(MYGCC_INCLUDE) \
259         ${ccflags-y}
260   # The Main target
261 all: mod24
262
263 else # --- } {  linux 2.6 and newer
264   $(warning --- build 2.6 and newer target $(TARGET) ----)
265
266   # This is the Makefile section for Linux 2.6.x including planetlab
267
268   ifeq ($(IPFW_PLANETLAB),1)
269     $(warning "---- Building for PlanetLab")
270     ipfw-cflags += -DIPFW_PLANETLAB        # PlanetLab compilation
271   endif
272
273   WARN := -O1 -Wall -Werror -DDEBUG_SPINLOCK -DDEBUG_MUTEXES
274   # The main target
275
276   # Required by GCC 4.6
277   ccflags-y += -Wno-unused-but-set-variable
278
279
280   ifeq ($(shell if [ -z $(LIN_VER) ] ; then echo "true"; fi),true)
281     $(warning "---- Perhaps you miss a (cd $(KERNELPATH); make oldconfig; make prepare; make scripts)");
282   endif
283
284   # Required by kernel < 2.6.23, ccflags-y is used on newer version
285   ifeq ($(shell [ "$(LIN_VER)" \< "20617" ] && echo "true"),true)
286     EXTRA_CFLAGS += $(ccflags-y)
287   endif
288
289   $(warning $(shell [ "$(LIN_VER)" \< "2061c" ] && \
290         [ `$(MAKE) -version | head -1 | cut -d " " -f 3` != '3.81' ] && \
291         echo "****   need make 3.81 *****") )
292   # $(warning make is $(MAKE) version is $(shell $(MAKE) -version | head -1) )
293
294   #--- openwrt ?
295   ifeq ($(_VER),xx-openwrt)
296     $(warning ----------------------- compiling for openwrt -----)
297     M=.
298     obj-y := $(IPFW_SRCS:%.c=%.o)
299     O_TARGET := $(obj-m)
300
301     # xcflags-y is a temporary variable where we store build options
302     xcflags-y += -O1
303     xcflags-y += -g
304
305     EXTRA_CFLAGS := $(xcflags-y) $(ipfw-cflags) -DSYSCTL_NODE -DEMULATE_SYSCTL
306   endif #---- end openwrt
307
308 all: $(TARGET)
309 $(TARGET):      include_e
310         echo "xxxxxxxxxxxxx $(MAKE) -C $(KERNELPATH) V=$(V) M=`pwd` modules"
311         $(MAKE) -C $(KERNELPATH) V=$(V) M=`pwd` modules
312
313
314 endif # } --- linux 2.6 and newer
315
316 #-- back to the common section for linux
317
318 # the list of objects used to build the module
319 ipfw_mod-y = $(IPFW_SRCS:%.c=%.o)
320
321 # additional $(CC) flags
322 ccflags-y += $(WARN)
323 ccflags-y += $(ipfw-cflags)
324 # if we really want debug symbols...
325 ccflags-y += -g
326
327 mod24: include_e $(obj-m)
328
329 $(obj-m): $(ipfw_mod-y)
330         $(LD) $(LDFLAGS) -m elf_i386 -r -o $@ $^
331
332 # M is the current directory, used in recursive builds
333 # so we allow it to be overridden
334 M ?= $(shell pwd)
335
336 endif # } ----- end of the non-Windows block
337
338 ifneq ($(OBJDIR),mia)
339     $(error objdir set to $(OBJDIR))
340 endif
341
342 #--- various common targets
343 clean:
344         -@rm -f *.o *.ko Module.symvers *.mod.c
345         -@# rm -rf $(OBJDIR)
346         -@rm -rf include_e
347
348 distclean: clean
349         -@rm -f .*cmd modules.order opt_*
350         -@rm -rf .tmp_versions .*.o.d _CL_*
351
352 # support to create empty dirs and files in include_e/
353 # EFILES_foo/bar is the list of files to be created in foo/bar
354 # (/ and . are allowed in gmake variable names)
355
356 EFILES_. += opt_inet.h opt_inet6.h opt_ipfw.h opt_ipsec.h opt_mpath.h
357 EFILES_. += opt_mbuf_stress_test.h opt_param.h opt_ipdivert.h
358
359 EFILES_altq += if_altq.h
360 EFILES_arpa += inet.h
361 EFILES_machine += in_cksum.h
362 EFILES_net += ethernet.h netisr.h pf_mtag.h bpf.h if_types.h vnet.h
363
364 EFILES_netinet += ether.h icmp6.h if_ether.h in.h in_pcb.h in_var.h
365 EFILES_netinet += in_systm.h ip_carp.h ip_var.h pim.h
366 EFILES_netinet += sctp.h tcp_timer.h tcpip.h udp_var.h
367 EFILES_netinet6 += ip6_var.h
368
369 EFILES_sys += _lock.h _rwlock.h rmlock.h _mutex.h jail.h
370 EFILES_sys += condvar.h eventhandler.h domain.h
371 EFILES_sys += limits.h lock.h mutex.h priv.h
372 EFILES_sys += proc.h rwlock.h socket.h socketvar.h
373 EFILES_sys += sysctl.h time.h ucred.h
374
375 # first make a list of directories from variable names
376 EDIRS= $(subst EFILES_,,$(filter EFILES_%,$(.VARIABLES)))
377 # then prepend the directory name to individual files.
378 #       $(empty) serves to interpret the following space literally,
379 #       and the ":  = " substitution packs spaces into one.
380 EFILES = $(foreach i,$(EDIRS),$(subst $(empty) , $(i)/, $(EFILES_$(i):  = )))
381
382 include_e:
383         -@rm -rf $(M)/include_e opt_*
384         -@mkdir -p $(M)/include_e
385         -@(cd $(M)/include_e; mkdir -p $(EDIRS); touch $(EFILES) )
386
387 #--- some other targets for testing purposes
388 test_radix: test_radix.o radix.o
389 test_lookup: ip_fw_lookup.o
390 test_radix test_lookup: CFLAGS=-Wall -Werror -O1