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