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