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