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