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