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