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