xref: /f-stack/lib/Makefile (revision 8cf1d457)
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
112VPATH+= $S/netinet
113VPATH+= $S/netinet/cc
114VPATH+= $S/netipsec
115VPATH+= $S/opencrypto
116VPATH+= $S/vm
117VPATH+= $S/libkern
118
119
120FF_SRCS+=			\
121	ff_compat.c    \
122	ff_glue.c      \
123	ff_freebsd_init.c      \
124	ff_init_main.c \
125	ff_kern_condvar.c \
126	ff_kern_environment.c  \
127	ff_kern_intr.c  \
128	ff_kern_subr.c \
129	ff_kern_synch.c \
130	ff_kern_timeout.c \
131	ff_lock.c      \
132	ff_syscall_wrapper.c \
133	ff_subr_prf.c    \
134	ff_vfs_ops.c  \
135	ff_veth.c  \
136	ff_route.c
137
138FF_HOST_SRCS+= \
139	ff_host_interface.c \
140	ff_config.c    \
141	ff_ini_parser.c  \
142	ff_dpdk_if.c \
143	ff_dpdk_kni.c \
144	ff_dpdk_pcap.c \
145	ff_epoll.c \
146	ff_init.c
147
148ifdef FF_IPSEC
149CRYPTO_ASM_SRCS+=			\
150	aesencdec_${MACHINE_CPUARCH}.S	\
151	aeskeys_${MACHINE_CPUARCH}.S
152
153CRYPTO_SRCS+=			\
154	aesni.c			\
155	aesni_wrap.c		\
156	bf_ecb.c		\
157	bf_enc.c		\
158	bf_skey.c		\
159	camellia.c		\
160	camellia-api.c		\
161	des_ecb.c		\
162	des_enc.c		\
163	des_setkey.c		\
164	rijndael-alg-fst.c	\
165	rijndael-api.c		\
166	sha1.c			    \
167	sha256c.c           \
168	sha512c.c           \
169	siphash.c
170else
171CRYPTO_SRCS+=			\
172	sha1.c              \
173	siphash.c
174endif
175
176KERN_SRCS+=			\
177	kern_descrip.c		\
178	kern_event.c		\
179	kern_fail.c		\
180	kern_khelp.c		\
181	kern_hhook.c		\
182	kern_linker.c		\
183	kern_mbuf.c		\
184	kern_module.c		\
185	kern_mtxpool.c		\
186	kern_ntptime.c		\
187	kern_osd.c		\
188	kern_sysctl.c		\
189	kern_tc.c		\
190	kern_uuid.c		\
191	link_elf.c		\
192	md5c.c			\
193	subr_capability.c   \
194	subr_counter.c      \
195	subr_eventhandler.c	\
196	subr_kobj.c		\
197	subr_lock.c		\
198	subr_module.c		\
199	subr_param.c		\
200	subr_pcpu.c		\
201	subr_sbuf.c		\
202	subr_taskqueue.c	\
203	subr_unit.c		\
204	sys_capability.c	\
205	sys_generic.c		\
206	sys_socket.c		\
207	uipc_accf.c		\
208	uipc_mbuf.c		\
209	uipc_mbuf2.c		\
210	uipc_domain.c		\
211	uipc_sockbuf.c		\
212	uipc_socket.c       \
213    uipc_syscalls.c
214
215
216KERN_MHEADERS+=		\
217	bus_if.m	\
218	device_if.m	\
219	linker_if.m
220
221
222KERN_MSRCS+=		\
223	linker_if.m
224
225
226LIBKERN_SRCS+=		\
227	bcd.c		\
228	inet_ntoa.c	\
229	jenkins_hash.c  \
230	strlcpy.c	\
231	strnlen.c
232
233
234MACHINE_SRCS+=		\
235	in_cksum.c
236
237
238NET_SRCS+=		\
239	bpf.c		\
240	bridgestp.c \
241	if.c		\
242	if_bridge.c \
243	if_clone.c	\
244	if_dead.c	\
245	if_ethersubr.c	\
246	if_loop.c	\
247	if_llatbl.c	\
248	in_fib.c	\
249	in_gif.c    \
250 	ip_reass.c	\
251	if_vlan.c   \
252	if_vxlan.c  \
253	netisr.c	\
254	pfil.c		\
255	radix.c		\
256	raw_cb.c	\
257	raw_usrreq.c	\
258	route.c		\
259	rtsock.c
260
261
262NETINET_SRCS+=		\
263	ip_carp.c	\
264	if_ether.c	\
265	if_gif.c    \
266	igmp.c		\
267	in.c		\
268	in_mcast.c	\
269	in_pcb.c	\
270	in_proto.c	\
271	in_rmx.c	\
272	ip_ecn.c    \
273	ip_encap.c	\
274	ip_fastfwd.c	\
275	ip_icmp.c	\
276	ip_id.c		\
277	ip_input.c	\
278	ip_mroute.c     \
279	ip_options.c	\
280	ip_output.c	\
281	raw_ip.c	\
282	tcp_debug.c	\
283	tcp_fastopen.c	\
284	tcp_hostcache.c	\
285	tcp_input.c	\
286	tcp_lro.c	\
287	tcp_offload.c	\
288	tcp_output.c	\
289	tcp_reass.c	\
290	tcp_sack.c	\
291	tcp_subr.c	\
292	tcp_syncache.c	\
293	tcp_timer.c	\
294	tcp_timewait.c	\
295	tcp_usrreq.c	\
296	udp_usrreq.c	\
297	cc.c		    \
298	cc_newreno.c    \
299	cc_htcp.c       \
300	cc_cubic.c
301
302ifdef FF_IPSEC
303NETINET_SRCS+=		\
304	ip_ipsec.c
305endif
306
307
308ifdef FF_IPSEC
309NETIPSEC_SRCS+=		\
310	ipsec.c		\
311	ipsec_input.c	\
312	ipsec_mbuf.c	\
313	ipsec_output.c	\
314	key.c		\
315	key_debug.c	\
316	keysock.c	\
317	xform_ah.c	\
318	xform_esp.c	\
319	xform_ipcomp.c
320endif
321
322# only if TCP_SIGNTAURE is defined
323#xform_tcp.c
324
325NETINET6_SRCS+=
326
327
328ifdef FF_IPSEC
329OPENCRYPTO_SRCS+=	\
330	cast.c		\
331	criov.c		\
332	crypto.c	\
333	cryptosoft.c	\
334	deflate.c	\
335	rmd160.c	\
336	skipjack.c	\
337	xform.c
338endif
339
340#	cryptodev.c
341
342OPENCRYPTO_MHEADERS= cryptodev_if.m
343OPENCRYPTO_MSRCS= cryptodev_if.m
344
345VM_SRCS+=		\
346	uma_core.c
347
348
349MHEADERS= $(patsubst %.m,%.h,${KERN_MHEADERS})
350MHEADERS+= vnode_if.h vnode_if_newproto.h vnode_if_typedef.h
351MHEADERS+= $(patsubst %.m,%.h,${OPENCRYPTO_MHEADERS})
352
353MSRCS= $(patsubst %.m,%.c,${KERN_MSRCS})
354MSRCS+= $(patsubst %.m,%.c,${OPENCRYPTO_MSRCS})
355
356ASM_SRCS = ${CRYPTO_ASM_SRCS}
357
358SRCS=  ${FF_SRCS} ${CRYPTO_SRCS} ${KERN_SRCS} ${LIBKERN_SRCS} ${MACHINE_SRCS}
359SRCS+= ${MSRCS} ${NET_SRCS} ${NETINET_SRCS} ${NETINET6_SRCS} ${NETIPSEC_SRCS} ${OPENCRYPTO_SRCS} ${VM_SRCS}
360
361# If witness is enabled.
362# SRCS+= ${KERN_WITNESS_SRCS}
363
364HOST_SRCS = ${FF_HOST_SRCS}
365
366ASM_OBJS+= $(patsubst %.S,%.o,${ASM_SRCS})
367OBJS+= $(patsubst %.c,%.o,${SRCS})
368HOST_OBJS+= $(patsubst %.c,%.o,${HOST_SRCS})
369
370all: libfstack.a
371
372#
373# The library is built by first incrementally linking all the object
374# to resolve internal references.  Then, all symbols are made local.
375# Then, only the symbols that are part of the  API are made
376# externally available.
377#
378libfstack.a: machine_includes ff_api.symlist ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS}
379	${LD} -d -r -o $*.ro ${ASM_OBJS} ${OBJS}
380	nm $*.ro  | grep -v ' U ' | cut -d ' ' -f 3 > $*_localize_list.tmp
381	objcopy --localize-symbols=$*_localize_list.tmp $*.ro
382	rm $*_localize_list.tmp
383	objcopy --globalize-symbols=ff_api.symlist $*.ro
384	rm -f $@
385	ar -cqs $@ $*.ro ${HOST_OBJS}
386	rm -f $*.ro
387
388${HOST_OBJS}: %.o: %.c
389	${HOST_C}
390
391${ASM_OBJS}: %.o: %.S ${IMACROS_FILE}
392	${NORMAL_S}
393
394${OBJS}: %.o: %.c ${IMACROS_FILE}
395	${NORMAL_C}
396
397
398.SUFFIXES: .m
399
400.m.c:
401	${AWK} -f $S/tools/makeobjops.awk $< -c
402
403.m.h:
404	${AWK} -f $S/tools/makeobjops.awk $< -h
405
406.PHONY: clean
407clean:
408	rm -f libfstack.a
409	rm -f ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS} ${PROGRAM} ${IMACROS_FILE}
410	rm -rf ${MACHINE_INCLUDES_ROOT}
411
412
413.PHONY: machine_includes
414machine_includes:
415	@rm -rf ${MACHINE_INCLUDES_ROOT}
416	@mkdir -p ${MACHINE_INCLUDES_ROOT}/machine
417	@cp -r $S/${MACHINE_CPUARCH}/include/* ${MACHINE_INCLUDES_ROOT}/machine
418	@if [ "${X86_INCLUDES}" != "0" ]; then 				\
419		mkdir -p ${MACHINE_INCLUDES_ROOT}/x86;			\
420		cp -r $S/x86/include/* ${MACHINE_INCLUDES_ROOT}/x86;	\
421	fi
422
423#
424# Distilled from FreeBSD src/sys/conf/kern.post.mk
425#
426vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: $S/tools/vnode_if.awk \
427    $S/kern/vnode_if.src
428vnode_if.h: vnode_if_newproto.h vnode_if_typedef.h
429	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
430vnode_if_newproto.h:
431	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p
432vnode_if_typedef.h:
433	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q
434
435include ${TOPDIR}/mk/kern.mk
436
437