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