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