xref: /f-stack/lib/Makefile (revision 5af66259)
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.20
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
32
33
34include ${TOPDIR}/mk/kern.pre.mk
35
36ifeq ($(FF_DPDK),)
37ifeq (${MACHINE_CPUARCH},aarch64)
38    FF_DPDK=${TOPDIR}/dpdk/build
39else
40    FF_DPDK=${TOPDIR}/dpdk/x86_64-native-linuxapp-gcc
41endif
42endif
43
44ifdef RTE_SDK
45ifeq (${MACHINE_CPUARCH},aarch64)
46    FF_DPDK=${RTE_SDK}/build
47else
48    FF_DPDK=${RTE_SDK}/x86_64-native-linuxapp-gcc
49endif
50endif
51
52DPDK_CFLAGS= -Wall -Wno-deprecated-declarations -Werror -include ${FF_DPDK}/include/rte_config.h
53DPDK_CFLAGS+= -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
54DPDK_CFLAGS+= -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2
55DPDK_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
56DPDK_CFLAGS+= -I${FF_DPDK}/include
57
58KERNPREINCLUDES:= ${INCLUDES}
59INCLUDES= -I${OVERRIDE_INCLUDES_ROOT} ${KERNPREINCLUDES}
60INCLUDES+= -I./machine_include
61INCLUDES+= -I./opt
62
63# Include search path for files that only include host OS headers
64HOST_INCLUDES= -I.
65ifndef DEBUG
66HOST_CFLAGS = -O2 -frename-registers  -funswitch-loops -fweb -Wno-format-truncation
67else
68HOST_CFLAGS = ${DEBUG}
69endif
70
71ifdef FF_KNI
72HOST_CFLAGS+= -DFF_KNI
73endif
74
75HOST_CFLAGS+= ${DPDK_CFLAGS}
76HOST_CFLAGS+= ${CONF_CFLAGS}
77
78ifdef FF_NETGRAPH
79HOST_CFLAGS+= -DFF_NETGRAPH
80endif
81
82ifdef FF_IPFW
83HOST_CFLAGS+= -DFF_IPFW
84endif
85
86ifdef FF_USE_PAGE_ARRAY
87HOST_CFLAGS+= -DFF_USE_PAGE_ARRAY
88endif
89
90HOST_C= ${CC} -c $(HOST_CFLAGS) ${HOST_INCLUDES} ${WERROR} ${PROF} $<
91
92
93ifneq ($(filter amd64 i386,${MACHINE_CPUARCH}),)
94X86_INCLUDES=1
95endif
96
97
98#
99# Distilled from FreeBSD src/sys/conf/Makefile.amd64
100#
101ifeq (${MACHINE_CPUARCH},amd64)
102endif
103
104#
105# Distilled from FreeBSD src/sys/conf/Makefile.arm
106#
107ifeq (${MACHINE_CPUARCH},arm)
108
109ifneq (${COMPILER_TYPE},clang)
110CFLAGS += -mno-thumb-interwork
111endif
112
113endif
114
115#
116# fix the MACHINE_CPUARCH to match the FreeBSD directory name
117#
118ifeq (${MACHINE_CPUARCH},aarch64)
119MACHINE_CPUARCH=arm64
120endif
121
122
123#
124# Distilled from FreeBSD src/sys/conf/Makefile.i386
125#
126ifeq (${MACHINE_CPUARCH},i386)
127MACHINE=i386
128endif
129
130
131#
132# Distilled from FreeBSD src/sys/conf/Makefile.mips
133#
134ifeq (${MACHINE_CPUARCH},mips)
135
136# We default to the MIPS32 ISA, if none specified in the
137# kernel configuration file.
138ARCH_FLAGS?=-march=mips32
139
140HACK_EXTRA_FLAGS=-shared
141
142CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
143HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
144endif
145
146CFLAGS+= -DFSTACK
147
148# add for LVS tcp option toa, disabled by default
149# CFLAGS+= -DLVS_TCPOPT_TOA
150
151VPATH+= $S/${MACHINE_CPUARCH}/${MACHINE_CPUARCH}
152VPATH+= $S/kern
153VPATH+= $S/crypto
154VPATH+= $S/crypto/aesni
155VPATH+= $S/crypto/blowfish
156VPATH+= $S/crypto/camellia
157VPATH+= $S/crypto/des
158VPATH+= $S/crypto/rijndael
159VPATH+= $S/crypto/sha2
160VPATH+= $S/crypto/siphash
161VPATH+= $S/net
162ifdef FF_NETGRAPH
163VPATH+= $S/netgraph
164endif
165VPATH+= $S/netinet
166VPATH+= $S/netinet/libalias
167VPATH+= $S/netinet/cc
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_IPFW
446NETIPFW_SRCS+=             \
447	ip_fw_dynamic.c \
448	ip_fw_eaction.c \
449	ip_fw_iface.c   \
450	ip_fw_log.c     \
451	ip_fw_nat.c     \
452	ip_fw_pfil.c    \
453	ip_fw_sockopt.c \
454	ip_fw_table.c   \
455	ip_fw_table_algo.c  \
456	ip_fw_table_value.c \
457	ip_fw2.c
458endif
459
460ifdef FF_IPSEC
461NETINET_SRCS+=		\
462	ip_ipsec.c
463endif
464
465
466ifdef FF_IPSEC
467NETIPSEC_SRCS+=		\
468	ipsec.c		\
469	ipsec_input.c	\
470	ipsec_mbuf.c	\
471	ipsec_output.c	\
472	key.c		\
473	key_debug.c	\
474	keysock.c	\
475	xform_ah.c	\
476	xform_esp.c	\
477	xform_ipcomp.c
478endif
479
480# only if TCP_SIGNTAURE is defined
481#xform_tcp.c
482
483NETINET6_SRCS+=
484
485
486ifdef FF_IPSEC
487OPENCRYPTO_SRCS+=	\
488	cast.c		\
489	criov.c		\
490	crypto.c	\
491	cryptosoft.c	\
492	deflate.c	\
493	rmd160.c	\
494	skipjack.c	\
495	xform.c
496endif
497
498#	cryptodev.c
499
500OPENCRYPTO_MHEADERS= cryptodev_if.m
501OPENCRYPTO_MSRCS= cryptodev_if.m
502
503VM_SRCS+=		\
504	uma_core.c
505
506
507MHEADERS= $(patsubst %.m,%.h,${KERN_MHEADERS})
508MHEADERS+= vnode_if.h vnode_if_newproto.h vnode_if_typedef.h
509MHEADERS+= $(patsubst %.m,%.h,${OPENCRYPTO_MHEADERS})
510
511MSRCS= $(patsubst %.m,%.c,${KERN_MSRCS})
512MSRCS+= $(patsubst %.m,%.c,${OPENCRYPTO_MSRCS})
513
514ASM_SRCS = ${CRYPTO_ASM_SRCS}
515
516SRCS=  ${FF_SRCS} ${CRYPTO_SRCS} ${KERN_SRCS} ${LIBKERN_SRCS} ${MACHINE_SRCS}
517SRCS+= ${MSRCS} ${NET_SRCS} ${NETGRAPH_SRCS} ${NETINET_SRCS} ${NETINET6_SRCS}
518SRCS+= ${NETIPSEC_SRCS} ${NETIPFW_SRCS} ${OPENCRYPTO_SRCS} ${VM_SRCS}
519
520# If witness is enabled.
521# SRCS+= ${KERN_WITNESS_SRCS}
522
523# Extra FreeBSD kernel module srcs.
524SRCS+= ${KMOD_SRCS}
525
526HOST_SRCS = ${FF_HOST_SRCS}
527
528ASM_OBJS+= $(patsubst %.S,%.o,${ASM_SRCS})
529OBJS+= $(patsubst %.c,%.o,${SRCS})
530HOST_OBJS+= $(patsubst %.c,%.o,${HOST_SRCS})
531
532all: libfstack.a
533
534#
535# The library is built by first incrementally linking all the object
536# to resolve internal references.  Then, all symbols are made local.
537# Then, only the symbols that are part of the  API are made
538# externally available.
539#
540libfstack.a: machine_includes ff_api.symlist ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS}
541	${LD} -d -r -o $*.ro ${ASM_OBJS} ${OBJS}
542	nm $*.ro  | grep -v ' U ' | cut -d ' ' -f 3 > $*_localize_list.tmp
543	objcopy --localize-symbols=$*_localize_list.tmp $*.ro
544	rm $*_localize_list.tmp
545	objcopy --globalize-symbols=ff_api.symlist $*.ro
546	rm -f $@
547	ar -cqs $@ $*.ro ${HOST_OBJS}
548	rm -f $*.ro
549
550${HOST_OBJS}: %.o: %.c
551	${HOST_C}
552
553${ASM_OBJS}: %.o: %.S ${IMACROS_FILE}
554	${NORMAL_S}
555
556${OBJS}: %.o: %.c ${IMACROS_FILE}
557	${NORMAL_C}
558
559
560.SUFFIXES: .m
561
562.m.c:
563	${AWK} -f $S/tools/makeobjops.awk $< -c
564
565.m.h:
566	${AWK} -f $S/tools/makeobjops.awk $< -h
567
568.PHONY: clean
569clean:
570	rm -f libfstack.a
571	rm -f ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS} ${PROGRAM} ${IMACROS_FILE}
572	rm -rf ${MACHINE_INCLUDES_ROOT}
573
574
575.PHONY: machine_includes
576machine_includes:
577	@rm -rf ${MACHINE_INCLUDES_ROOT}
578	@mkdir -p ${MACHINE_INCLUDES_ROOT}/machine
579	@cp -r $S/${MACHINE_CPUARCH}/include/* ${MACHINE_INCLUDES_ROOT}/machine
580	@if [ "${X86_INCLUDES}" != "0" ]; then 				\
581		mkdir -p ${MACHINE_INCLUDES_ROOT}/x86;			\
582		cp -r $S/x86/include/* ${MACHINE_INCLUDES_ROOT}/x86;	\
583	fi
584
585#
586# Distilled from FreeBSD src/sys/conf/kern.post.mk
587#
588vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: $S/tools/vnode_if.awk \
589    $S/kern/vnode_if.src
590vnode_if.h: vnode_if_newproto.h vnode_if_typedef.h
591	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
592vnode_if_newproto.h:
593	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p
594vnode_if_typedef.h:
595	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q
596
597include ${TOPDIR}/mk/kern.mk
598
599install:
600	rm -rf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION}
601	rm -rf ${PREFIX_LIB}/libfstack.a
602	rm -rf ${PREFIX_INCLUDE}/ff_config.h
603	rm -rf ${PREFIX_INCLUDE}/ff_api.h
604	rm -rf ${PREFIX_INCLUDE}/ff_event.h
605	rm -rf ${PREFIX_INCLUDE}/ff_errno.h
606	rm -rf ${PREFIX_INCLUDE}/ff_epoll.h
607	rm -rf ${PREFIX_BIN}/ff_start
608
609	cp -f libfstack.a ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION}
610	ln -sf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION} ${PREFIX_LIB}/libfstack.a
611	cp -f ff_config.h ${PREFIX_INCLUDE}/ff_config.h
612	cp -f ff_api.h ${PREFIX_INCLUDE}/ff_api.h
613	cp -f ff_event.h ${PREFIX_INCLUDE}/ff_event.h
614	cp -f ff_errno.h ${PREFIX_INCLUDE}/ff_errno.h
615	cp -f ff_epoll.h ${PREFIX_INCLUDE}/ff_epoll.h
616	cp -f ${TOPDIR}/start.sh ${PREFIX_BIN}/ff_start
617	test -f '${F-STACK_CONF}' || cp -f ${TOPDIR}/config.ini ${F-STACK_CONF}
618
619uninstall:
620	rm -rf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION}
621	rm -rf ${PREFIX_LIB}/libfstack.a
622	rm -rf ${PREFIX_INCLUDE}/ff_config.h
623	rm -rf ${PREFIX_INCLUDE}/ff_api.h
624	rm -rf ${PREFIX_INCLUDE}/ff_event.h
625	rm -rf ${PREFIX_INCLUDE}/ff_errno.h
626	rm -rf ${PREFIX_INCLUDE}/ff_epoll.h
627	rm -rf ${PREFIX_BIN}/ff_start
628	rm -rf ${F-STACK_CONF}
629
630