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