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