xref: /f-stack/lib/Makefile (revision 22ce4aff)
1#
2# Copyright (c) 2013 Patrick Kelsey. All rights reserved.
3# Copyright (C) 2017 THL A29 Limited, a Tencent company.
4# All rights reserved.
5#
6# Derived in part from libuinet's Makefile.
7#
8# Derived from FreeBSD auto-generated kernel Makefile and
9# machine-specific Makefile templates
10#
11
12TOPDIR?=${CURDIR}/..
13S=${TOPDIR}/freebsd
14C=${TOPDIR}/freebsd/contrib/ck/include
15MACHINE_INCLUDES_ROOT:=${CURDIR}/machine_include
16OVERRIDE_INCLUDES_ROOT:=${CURDIR}/include
17X86_INCLUDES=0
18PREFIX=/usr/local
19PREFIX_LIB=${PREFIX}/lib
20PREFIX_INCLUDE=/usr/local/include
21PREFIX_BIN=/usr/local/bin
22F-STACK_CONF=/etc/f-stack.conf
23F-STACK_VERSION=1.22
24
25HOST_OS:=$(shell uname -s)
26
27DEBUG=-O0 -gdwarf-2 -g3 -Wno-format-truncation
28
29FF_KNI=1
30#FF_FLOW_ISOLATE=1
31#FF_NETGRAPH=1
32#FF_IPFW=1
33#FF_USE_PAGE_ARRAY=1
34FF_INET6=1
35
36
37include ${TOPDIR}/mk/kern.pre.mk
38
39ifneq ($(shell pkg-config --exists libdpdk && echo 0),0)
40$(error "no installation of DPDK found, maybe you shuld export environment variable `PKG_CONFIG_PATH`")
41endif
42
43PKGCONF ?= pkg-config
44
45DPDK_CFLAGS= -Wall -Wno-deprecated-declarations -Werror $(shell $(PKGCONF) --cflags libdpdk)
46
47KERNPREINCLUDES:= ${INCLUDES}
48INCLUDES= -I${OVERRIDE_INCLUDES_ROOT} ${KERNPREINCLUDES}
49INCLUDES+= -I./machine_include
50INCLUDES+= -I./opt
51
52# Include search path for files that only include host OS headers
53HOST_INCLUDES= -I.
54ifndef DEBUG
55HOST_CFLAGS = -O2 -frename-registers  -funswitch-loops -fweb -Wno-format-truncation
56else
57HOST_CFLAGS = ${DEBUG}
58endif
59
60ifdef FF_KNI
61HOST_CFLAGS+= -DFF_KNI
62endif
63
64HOST_CFLAGS+= ${DPDK_CFLAGS}
65HOST_CFLAGS+= ${CONF_CFLAGS}
66
67ifdef FF_FLOW_ISOLATE
68HOST_CFLAGS+= -DFF_FLOW_ISOLATE
69endif
70
71ifdef FF_NETGRAPH
72HOST_CFLAGS+= -DFF_NETGRAPH
73endif
74
75ifdef FF_IPFW
76HOST_CFLAGS+= -DFF_IPFW
77endif
78
79ifdef FF_USE_PAGE_ARRAY
80HOST_CFLAGS+= -DFF_USE_PAGE_ARRAY
81endif
82
83HOST_CFLAGS+= -DINET
84CFLAGS+= -DINET
85
86ifdef FF_INET6
87HOST_CFLAGS+= -DINET6
88CFLAGS+= -DINET6
89endif
90
91HOST_C= ${CC} -c $(HOST_CFLAGS) ${HOST_INCLUDES} ${WERROR} ${PROF} $<
92
93
94ifneq ($(filter amd64 i386,${MACHINE_CPUARCH}),)
95X86_INCLUDES=1
96endif
97
98
99#
100# Distilled from FreeBSD src/sys/conf/Makefile.amd64
101#
102ifeq (${MACHINE_CPUARCH},amd64)
103endif
104
105#
106# Distilled from FreeBSD src/sys/conf/Makefile.arm
107#
108ifeq (${MACHINE_CPUARCH},arm)
109
110ifneq (${COMPILER_TYPE},clang)
111CFLAGS += -mno-thumb-interwork
112endif
113
114endif
115
116#
117# fix the MACHINE_CPUARCH to match the FreeBSD directory name
118#
119ifeq (${MACHINE_CPUARCH},aarch64)
120MACHINE_CPUARCH=arm64
121endif
122
123
124#
125# Distilled from FreeBSD src/sys/conf/Makefile.i386
126#
127ifeq (${MACHINE_CPUARCH},i386)
128MACHINE=i386
129endif
130
131
132#
133# Distilled from FreeBSD src/sys/conf/Makefile.mips
134#
135ifeq (${MACHINE_CPUARCH},mips)
136
137# We default to the MIPS32 ISA, if none specified in the
138# kernel configuration file.
139ARCH_FLAGS?=-march=mips32
140
141HACK_EXTRA_FLAGS=-shared
142
143CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
144HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
145endif
146
147CFLAGS+= -DFSTACK
148
149# add for LVS tcp option toa, disabled by default
150# CFLAGS+= -DLVS_TCPOPT_TOA
151
152VPATH+= $S/${MACHINE_CPUARCH}/${MACHINE_CPUARCH}
153VPATH+= $S/kern
154VPATH+= $S/x86
155VPATH+= $S/crypto
156VPATH+= $S/crypto/aesni
157VPATH+= $S/crypto/blowfish
158VPATH+= $S/crypto/camellia
159VPATH+= $S/crypto/des
160VPATH+= $S/crypto/rijndael
161VPATH+= $S/crypto/sha2
162VPATH+= $S/crypto/siphash
163VPATH+= $S/net
164VPATH+= $S/net/route
165ifdef FF_NETGRAPH
166VPATH+= $S/netgraph
167endif
168VPATH+= $S/netinet
169VPATH+= $S/netinet/libalias
170VPATH+= $S/netinet/cc
171ifdef FF_INET6
172VPATH+= $S/netinet6
173endif
174VPATH+= $S/netipsec
175ifdef FF_IPFW
176VPATH+= $S/netpfil/ipfw
177endif
178VPATH+= $S/opencrypto
179VPATH+= $S/vm
180VPATH+= $S/libkern
181
182
183FF_SRCS+=                     \
184	ff_compat.c           \
185	ff_glue.c             \
186	ff_freebsd_init.c     \
187	ff_init_main.c        \
188	ff_kern_condvar.c     \
189	ff_kern_environment.c \
190	ff_kern_intr.c        \
191	ff_kern_subr.c        \
192	ff_kern_synch.c       \
193	ff_kern_timeout.c     \
194	ff_lock.c             \
195	ff_syscall_wrapper.c  \
196	ff_subr_prf.c         \
197	ff_vfs_ops.c          \
198	ff_veth.c             \
199	ff_route.c
200
201ifdef FF_NETGRAPH
202FF_SRCS+=                   \
203        ff_ng_base.c        \
204        ff_ngctl.c
205endif
206
207FF_HOST_SRCS+=              \
208	ff_host_interface.c \
209	ff_config.c         \
210	ff_ini_parser.c     \
211	ff_dpdk_if.c        \
212	ff_dpdk_pcap.c      \
213	ff_epoll.c          \
214	ff_init.c
215
216ifdef FF_KNI
217FF_HOST_SRCS+=              \
218	ff_dpdk_kni.c
219endif
220
221ifdef FF_USE_PAGE_ARRAY
222FF_HOST_SRCS+=              \
223  ff_memory.c
224endif
225
226ifdef FF_IPSEC
227CRYPTO_ASM_SRCS+=                       \
228	aesencdec_${MACHINE_CPUARCH}.S  \
229	aeskeys_${MACHINE_CPUARCH}.S
230
231CRYPTO_SRCS+=               \
232	aesni.c	            \
233	aesni_wrap.c        \
234	bf_ecb.c            \
235	bf_enc.c            \
236	bf_skey.c           \
237	camellia.c          \
238	camellia-api.c      \
239	des_ecb.c           \
240	des_enc.c           \
241	des_setkey.c        \
242	rijndael-alg-fst.c  \
243	rijndael-api.c      \
244	sha1.c              \
245	sha256c.c           \
246	sha512c.c           \
247	siphash.c
248else
249CRYPTO_SRCS+=               \
250	sha1.c              \
251	siphash.c
252endif
253
254KERN_SRCS+=                 \
255	kern_descrip.c      \
256	kern_event.c        \
257	kern_fail.c         \
258	kern_khelp.c        \
259	kern_hhook.c        \
260	kern_linker.c       \
261	kern_mbuf.c         \
262	kern_module.c       \
263	kern_mtxpool.c      \
264	kern_ntptime.c      \
265	kern_osd.c          \
266	kern_sysctl.c       \
267	kern_tc.c           \
268	kern_uuid.c         \
269	link_elf.c          \
270	md5c.c              \
271	subr_capability.c   \
272	subr_counter.c      \
273	subr_eventhandler.c \
274	subr_kobj.c         \
275	subr_lock.c         \
276	subr_module.c       \
277	subr_param.c        \
278	subr_pcpu.c         \
279	subr_sbuf.c         \
280	subr_taskqueue.c    \
281	subr_unit.c         \
282	subr_smr.c          \
283	subr_epoch.c        \
284	sys_capability.c    \
285	sys_generic.c       \
286	sys_socket.c        \
287	uipc_accf.c         \
288	uipc_mbuf.c         \
289	uipc_mbuf2.c        \
290	uipc_domain.c       \
291	uipc_sockbuf.c      \
292	uipc_socket.c       \
293	uipc_syscalls.c
294
295
296KERN_MHEADERS+=		\
297	bus_if.m	\
298	device_if.m	\
299	linker_if.m
300
301
302KERN_MSRCS+=		\
303	linker_if.m
304
305ifeq (${MACHINE_CPUARCH},arm64)
306LIBKERN_SRCS+=		 \
307	bcd.c		 \
308	inet_ntoa.c	 \
309	jenkins_hash.c   \
310	strlcpy.c	 \
311	strnlen.c        \
312	fls.c		 \
313	flsl.c
314else
315LIBKERN_SRCS+=		 \
316	bcd.c		 \
317	gsb_crc32.c	 \
318	inet_ntoa.c	 \
319	jenkins_hash.c   \
320	strlcpy.c	 \
321	strnlen.c
322endif
323
324
325MACHINE_SRCS+=		 \
326	in_cksum.c
327
328
329NET_SRCS+=		 \
330	bpf.c		 \
331	bridgestp.c      \
332	if.c		 \
333	if_bridge.c      \
334	if_clone.c	 \
335	if_dead.c	 \
336	if_ethersubr.c	 \
337	if_loop.c	 \
338	if_llatbl.c	 \
339	if_media.c       \
340	if_spppfr.c      \
341	if_spppsubr.c    \
342	if_vlan.c        \
343	if_vxlan.c       \
344	in_fib.c	 \
345	in_gif.c         \
346	ip_reass.c	 \
347	netisr.c	 \
348	pfil.c		 \
349	radix.c		 \
350	raw_cb.c	 \
351	raw_usrreq.c	 \
352	route.c		 \
353	route_ctl.c	 \
354	route_tables.c	 \
355	route_helpers.c	 \
356	route_ifaddrs.c	 \
357	route_temporal.c \
358	nhop_utils.c	 \
359	nhop.c		 \
360	nhop_ctl.c	 \
361	rtsock.c         \
362	slcompress.c
363
364ifdef FF_NETGRAPH
365NETGRAPH_SRCS +=         \
366	ng_async.c       \
367	ng_atmllc.c      \
368	ng_bridge.c      \
369	ng_car.c         \
370	ng_cisco.c       \
371	ng_deflate.c     \
372	ng_echo.c        \
373	ng_eiface.c      \
374	ng_etf.c         \
375	ng_ether.c       \
376	ng_ether_echo.c  \
377	ng_frame_relay.c \
378	ng_gif.c         \
379	ng_gif_demux.c   \
380	ng_hole.c        \
381	ng_hub.c         \
382	ng_iface.c       \
383	ng_ip_input.c    \
384	ng_ipfw.c        \
385	ng_ksocket.c     \
386	ng_l2tp.c        \
387	ng_lmi.c         \
388	ng_nat.c         \
389	ng_one2many.c    \
390	ng_parse.c       \
391	ng_patch.c       \
392	ng_pipe.c        \
393	ng_ppp.c         \
394	ng_pppoe.c       \
395	ng_pptpgre.c     \
396	ng_pred1.c       \
397	ng_rfc1490.c     \
398	ng_sample.c      \
399	ng_socket.c      \
400	ng_source.c      \
401	ng_split.c       \
402	ng_sppp.c        \
403	ng_tag.c         \
404	ng_tcpmss.c      \
405	ng_tee.c         \
406	ng_UI.c          \
407	ng_vjc.c         \
408	ng_vlan.c
409endif
410
411NETINET_SRCS+=		\
412	if_ether.c	\
413	if_gif.c        \
414	igmp.c		\
415	in.c		\
416	in_mcast.c	\
417	in_pcb.c	\
418	in_proto.c	\
419	in_rmx.c	\
420	ip_carp.c	\
421	ip_divert.c     \
422	ip_ecn.c        \
423	ip_encap.c	\
424	ip_fastfwd.c	\
425	ip_icmp.c	\
426	ip_id.c		\
427	ip_input.c	\
428	ip_mroute.c     \
429	ip_options.c	\
430	ip_output.c	\
431	raw_ip.c	\
432	tcp_debug.c	\
433	tcp_hostcache.c	\
434	tcp_input.c	\
435	tcp_lro.c	\
436	tcp_offload.c	\
437	tcp_output.c	\
438	tcp_reass.c	\
439	tcp_sack.c	\
440	tcp_subr.c	\
441	tcp_syncache.c	\
442	tcp_timer.c	\
443	tcp_timewait.c	\
444	tcp_usrreq.c	\
445	udp_usrreq.c	\
446	cc.c		\
447	cc_newreno.c    \
448	cc_htcp.c       \
449	cc_cubic.c      \
450	alias.c         \
451	alias_db.c      \
452	alias_mod.c     \
453	alias_proxy.c   \
454	alias_sctp.c    \
455	alias_util.c
456
457ifdef FF_INET6
458NETINET6_SRCS+=		\
459	dest6.c		\
460	frag6.c		\
461	icmp6.c		\
462	in6.c		\
463	in6_ifattach.c	\
464	in6_mcast.c	\
465	in6_pcb.c	\
466	in6_pcbgroup.c	\
467	in6_proto.c	\
468	in6_rmx.c	\
469	in6_src.c	\
470	ip6_forward.c	\
471	ip6_id.c	\
472	ip6_input.c	\
473	ip6_fastfwd.c	\
474	ip6_mroute.c	\
475	ip6_output.c	\
476	mld6.c		\
477	nd6.c		\
478	nd6_nbr.c	\
479	nd6_rtr.c	\
480	raw_ip6.c	\
481	route6.c	\
482	scope6.c	\
483	send.c		\
484	udp6_usrreq.c	\
485	in6_cksum.c	\
486	in6_fib.c	\
487	in6_gif.c
488	#ip6_gre.c
489	#ip6_ipsec.c
490	#sctp6_usrreq.c
491	#in6_rss.c
492ifndef FF_KNI
493FF_HOST_SRCS+=         \
494        ff_dpdk_kni.c
495endif
496endif
497
498ifdef FF_IPFW
499NETIPFW_SRCS+=             \
500	ip_fw_dynamic.c \
501	ip_fw_eaction.c \
502	ip_fw_iface.c   \
503	ip_fw_log.c     \
504	ip_fw_nat.c     \
505	ip_fw_pfil.c    \
506	ip_fw_sockopt.c \
507	ip_fw_table.c   \
508	ip_fw_table_algo.c  \
509	ip_fw_table_value.c \
510	ip_fw2.c
511endif
512
513ifdef FF_IPSEC
514NETINET_SRCS+=		\
515	ip_ipsec.c
516ifdef FF_INET6
517NETINET6_SRCS+=		\
518	ip6_ipsec.c
519endif
520endif
521
522
523ifdef FF_IPSEC
524NETIPSEC_SRCS+=		\
525	ipsec.c		\
526	ipsec_input.c	\
527	ipsec_mbuf.c	\
528	ipsec_output.c	\
529	key.c		\
530	key_debug.c	\
531	keysock.c	\
532	xform_ah.c	\
533	xform_esp.c	\
534	xform_ipcomp.c
535endif
536
537# only if TCP_SIGNTAURE is defined
538#xform_tcp.c
539
540ifdef FF_IPSEC
541OPENCRYPTO_SRCS+=	\
542	cast.c		\
543	criov.c		\
544	crypto.c	\
545	cryptosoft.c	\
546	deflate.c	\
547	rmd160.c	\
548	skipjack.c	\
549	xform.c
550endif
551
552#	cryptodev.c
553
554OPENCRYPTO_MHEADERS= cryptodev_if.m
555OPENCRYPTO_MSRCS= cryptodev_if.m
556
557VM_SRCS+=		\
558	uma_core.c
559
560
561MHEADERS= $(patsubst %.m,%.h,${KERN_MHEADERS})
562MHEADERS+= vnode_if.h vnode_if_newproto.h vnode_if_typedef.h
563MHEADERS+= $(patsubst %.m,%.h,${OPENCRYPTO_MHEADERS})
564
565MSRCS= $(patsubst %.m,%.c,${KERN_MSRCS})
566MSRCS+= $(patsubst %.m,%.c,${OPENCRYPTO_MSRCS})
567
568ASM_SRCS = ${CRYPTO_ASM_SRCS}
569
570SRCS=  ${FF_SRCS} ${CRYPTO_SRCS} ${KERN_SRCS} ${LIBKERN_SRCS} ${MACHINE_SRCS}
571SRCS+= ${MSRCS} ${NET_SRCS} ${NETGRAPH_SRCS} ${NETINET_SRCS} ${NETINET6_SRCS}
572SRCS+= ${NETIPSEC_SRCS} ${NETIPFW_SRCS} ${OPENCRYPTO_SRCS} ${VM_SRCS}
573
574# If witness is enabled.
575# SRCS+= ${KERN_WITNESS_SRCS}
576
577# Extra FreeBSD kernel module srcs.
578SRCS+= ${KMOD_SRCS}
579
580HOST_SRCS = ${FF_HOST_SRCS}
581
582ASM_OBJS+= $(patsubst %.S,%.o,${ASM_SRCS})
583OBJS+= $(patsubst %.c,%.o,${SRCS})
584HOST_OBJS+= $(patsubst %.c,%.o,${HOST_SRCS})
585
586all: libfstack.a
587
588#
589# The library is built by first incrementally linking all the object
590# to resolve internal references.  Then, all symbols are made local.
591# Then, only the symbols that are part of the  API are made
592# externally available.
593#
594libfstack.a: machine_includes ff_api.symlist ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS}
595	${LD} -d -r -o $*.ro ${ASM_OBJS} ${OBJS}
596	nm $*.ro  | grep -v ' U ' | cut -d ' ' -f 3 > $*_localize_list.tmp
597	objcopy --localize-symbols=$*_localize_list.tmp $*.ro
598	rm $*_localize_list.tmp
599	objcopy --globalize-symbols=ff_api.symlist $*.ro
600	rm -f $@
601	ar -cqs $@ $*.ro ${HOST_OBJS}
602	rm -f $*.ro
603
604${HOST_OBJS}: %.o: %.c
605	${HOST_C}
606
607${ASM_OBJS}: %.o: %.S ${IMACROS_FILE}
608	${NORMAL_S}
609
610${OBJS}: %.o: %.c ${IMACROS_FILE}
611	${NORMAL_C}
612
613
614.SUFFIXES: .m
615
616.m.c:
617	${AWK} -f $S/tools/makeobjops.awk $< -c
618
619.m.h:
620	${AWK} -f $S/tools/makeobjops.awk $< -h
621
622.PHONY: clean
623clean:
624	rm -f libfstack.a
625	rm -f ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS} ${PROGRAM} ${IMACROS_FILE}
626	rm -rf ${MACHINE_INCLUDES_ROOT}
627
628
629.PHONY: machine_includes
630machine_includes:
631	@rm -rf ${MACHINE_INCLUDES_ROOT}
632	@mkdir -p ${MACHINE_INCLUDES_ROOT}/machine
633	@cp -r $S/${MACHINE_CPUARCH}/include/* ${MACHINE_INCLUDES_ROOT}/machine
634	@if [ "${X86_INCLUDES}" != "0" ]; then 				\
635		mkdir -p ${MACHINE_INCLUDES_ROOT}/x86;			\
636		cp -r $S/x86/include/* ${MACHINE_INCLUDES_ROOT}/x86;	\
637	fi
638
639#
640# Distilled from FreeBSD src/sys/conf/kern.post.mk
641#
642vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: $S/tools/vnode_if.awk \
643    $S/kern/vnode_if.src
644vnode_if.h: vnode_if_newproto.h vnode_if_typedef.h
645	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
646vnode_if_newproto.h:
647	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p
648vnode_if_typedef.h:
649	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q
650
651include ${TOPDIR}/mk/kern.mk
652
653install:
654	rm -rf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION}
655	rm -rf ${PREFIX_LIB}/libfstack.a
656	rm -rf ${PREFIX_INCLUDE}/ff_config.h
657	rm -rf ${PREFIX_INCLUDE}/ff_api.h
658	rm -rf ${PREFIX_INCLUDE}/ff_event.h
659	rm -rf ${PREFIX_INCLUDE}/ff_errno.h
660	rm -rf ${PREFIX_INCLUDE}/ff_epoll.h
661	rm -rf ${PREFIX_BIN}/ff_start
662
663	cp -f libfstack.a ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION}
664	ln -sf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION} ${PREFIX_LIB}/libfstack.a
665	cp -f ff_config.h ${PREFIX_INCLUDE}/ff_config.h
666	cp -f ff_api.h ${PREFIX_INCLUDE}/ff_api.h
667	cp -f ff_event.h ${PREFIX_INCLUDE}/ff_event.h
668	cp -f ff_errno.h ${PREFIX_INCLUDE}/ff_errno.h
669	cp -f ff_epoll.h ${PREFIX_INCLUDE}/ff_epoll.h
670	cp -f ${TOPDIR}/start.sh ${PREFIX_BIN}/ff_start
671	test -f '${F-STACK_CONF}' || cp -f ${TOPDIR}/config.ini ${F-STACK_CONF}
672
673uninstall:
674	rm -rf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION}
675	rm -rf ${PREFIX_LIB}/libfstack.a
676	rm -rf ${PREFIX_INCLUDE}/ff_config.h
677	rm -rf ${PREFIX_INCLUDE}/ff_api.h
678	rm -rf ${PREFIX_INCLUDE}/ff_event.h
679	rm -rf ${PREFIX_INCLUDE}/ff_errno.h
680	rm -rf ${PREFIX_INCLUDE}/ff_epoll.h
681	rm -rf ${PREFIX_BIN}/ff_start
682	rm -rf ${F-STACK_CONF}
683
684