xref: /f-stack/lib/Makefile (revision 744d7fa8)
1#
2# Copyright (c) 2013 Patrick Kelsey. All rights reserved.
3# Copyright (C) 2017-2021 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
14C=${TOPDIR}/freebsd/contrib/ck/include
15MACHINE_INCLUDES_ROOT:=${CURDIR}/machine_include
16OVERRIDE_INCLUDES_ROOT:=${CURDIR}/include
17X86_INCLUDES=0
18PREFIX=/usr/local
19PREFIX_LIB=${PREFIX}/lib
20PREFIX_INCLUDE=/usr/local/include
21PREFIX_BIN=/usr/local/bin
22F-STACK_CONF=/etc/f-stack.conf
23F-STACK_VERSION=1.22
24
25HOST_OS:=$(shell uname -s)
26
27DEBUG=-O0 -gdwarf-2 -g3 -Wno-format-truncation
28
29FF_KNI=1
30
31#FF_FLOW_ISOLATE=1
32
33# NETGRAPH drivers ipfw
34#FF_NETGRAPH=1
35#FF_IPFW=1
36
37#FF_USE_PAGE_ARRAY=1
38#FF_ZC_SEND=1
39FF_INET6=1
40
41# TCPHPTS drivers rack and bbr
42FF_TCPHPTS=1
43FF_EXTRA_TCP_STACKS=1
44
45include ${TOPDIR}/mk/kern.pre.mk
46
47ifneq ($(shell pkg-config --exists libdpdk && echo 0),0)
48$(error "no installation of DPDK found, maybe you shuld export environment variable `PKG_CONFIG_PATH`")
49endif
50
51PKGCONF ?= pkg-config
52
53DPDK_CFLAGS= -Wall -Wno-deprecated-declarations -Werror $(shell $(PKGCONF) --cflags libdpdk)
54
55KERNPREINCLUDES:= ${INCLUDES}
56INCLUDES= -I${OVERRIDE_INCLUDES_ROOT} ${KERNPREINCLUDES}
57INCLUDES+= -I./machine_include
58INCLUDES+= -I./opt
59
60# Include search path for files that only include host OS headers
61HOST_INCLUDES= -I.
62ifndef DEBUG
63HOST_CFLAGS = -O2 -frename-registers  -funswitch-loops -fweb -Wno-format-truncation
64else
65HOST_CFLAGS = ${DEBUG}
66endif
67
68ifdef FF_KNI
69HOST_CFLAGS+= -DFF_KNI
70endif
71
72HOST_CFLAGS+= ${DPDK_CFLAGS}
73HOST_CFLAGS+= ${CONF_CFLAGS}
74
75ifdef FF_FLOW_ISOLATE
76HOST_CFLAGS+= -DFF_FLOW_ISOLATE
77endif
78
79ifdef FF_NETGRAPH
80HOST_CFLAGS+= -DFF_NETGRAPH
81endif
82
83ifdef FF_IPFW
84HOST_CFLAGS+= -DFF_IPFW
85endif
86
87ifdef FF_USE_PAGE_ARRAY
88HOST_CFLAGS+= -DFF_USE_PAGE_ARRAY
89endif
90
91HOST_CFLAGS+= -DINET
92CFLAGS+= -DINET
93
94ifdef FF_INET6
95HOST_CFLAGS+= -DINET6
96CFLAGS+= -DINET6
97endif
98
99ifdef FF_TCPHPTS
100CFLAGS+= -DTCPHPTS -DRATELIMIT
101endif
102
103HOST_C= ${CC} -c $(HOST_CFLAGS) ${HOST_INCLUDES} ${WERROR} ${PROF} $<
104
105
106ifneq ($(filter amd64 i386,${MACHINE_CPUARCH}),)
107X86_INCLUDES=1
108endif
109
110
111#
112# Distilled from FreeBSD src/sys/conf/Makefile.amd64
113#
114ifeq (${MACHINE_CPUARCH},amd64)
115endif
116
117#
118# Distilled from FreeBSD src/sys/conf/Makefile.arm
119#
120ifeq (${MACHINE_CPUARCH},arm)
121
122ifneq (${COMPILER_TYPE},clang)
123CFLAGS += -mno-thumb-interwork
124endif
125
126endif
127
128#
129# fix the MACHINE_CPUARCH to match the FreeBSD directory name
130#
131ifeq (${MACHINE_CPUARCH},aarch64)
132MACHINE_CPUARCH=arm64
133endif
134
135
136#
137# Distilled from FreeBSD src/sys/conf/Makefile.i386
138#
139ifeq (${MACHINE_CPUARCH},i386)
140MACHINE=i386
141endif
142
143#
144# Distilled from FreeBSD src/sys/conf/Makefile.mips
145#
146ifeq (${MACHINE_CPUARCH},mips)
147
148# We default to the MIPS32 ISA, if none specified in the
149# kernel configuration file.
150ARCH_FLAGS?=-march=mips32
151
152HACK_EXTRA_FLAGS=-shared
153
154CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
155HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
156endif
157
158CFLAGS+= -DFSTACK
159
160ifdef FF_ZC_SEND
161CFLAGS+= -DFSTACK_ZC_SEND
162endif
163
164# add for LVS tcp option toa, disabled by default
165# CFLAGS+= -DLVS_TCPOPT_TOA
166
167VPATH+= $S/${MACHINE_CPUARCH}/${MACHINE_CPUARCH}
168VPATH+= $S/kern
169VPATH+= $S/x86
170VPATH+= $S/crypto
171VPATH+= $S/crypto/aesni
172VPATH+= $S/crypto/blowfish
173VPATH+= $S/crypto/camellia
174VPATH+= $S/crypto/des
175VPATH+= $S/crypto/rijndael
176VPATH+= $S/crypto/sha2
177VPATH+= $S/crypto/siphash
178VPATH+= $S/net
179VPATH+= $S/net/route
180ifdef FF_NETGRAPH
181VPATH+= $S/netgraph
182endif
183VPATH+= $S/netinet
184VPATH+= $S/netinet/libalias
185VPATH+= $S/netinet/cc
186ifdef FF_INET6
187VPATH+= $S/netinet6
188endif
189ifdef FF_EXTRA_TCP_STACKS
190VPATH+= $S/netinet/tcp_stacks
191endif
192VPATH+= $S/netipsec
193ifdef FF_IPFW
194VPATH+= $S/netpfil/ipfw
195endif
196VPATH+= $S/opencrypto
197VPATH+= $S/vm
198VPATH+= $S/libkern
199
200
201FF_SRCS+=                     \
202	ff_compat.c           \
203	ff_glue.c             \
204	ff_freebsd_init.c     \
205	ff_init_main.c        \
206	ff_kern_condvar.c     \
207	ff_kern_environment.c \
208	ff_kern_intr.c        \
209	ff_kern_subr.c        \
210	ff_kern_synch.c       \
211	ff_kern_timeout.c     \
212	ff_subr_epoch.c       \
213	ff_lock.c             \
214	ff_syscall_wrapper.c  \
215	ff_subr_prf.c         \
216	ff_vfs_ops.c          \
217	ff_veth.c             \
218	ff_route.c
219
220ifdef FF_NETGRAPH
221FF_SRCS+=                   \
222        ff_ng_base.c        \
223        ff_ngctl.c
224endif
225
226FF_HOST_SRCS+=              \
227	ff_host_interface.c \
228	ff_config.c         \
229	ff_ini_parser.c     \
230	ff_dpdk_if.c        \
231	ff_dpdk_pcap.c      \
232	ff_epoll.c          \
233	ff_init.c
234
235ifdef FF_KNI
236FF_HOST_SRCS+=              \
237	ff_dpdk_kni.c
238endif
239
240ifdef FF_USE_PAGE_ARRAY
241FF_HOST_SRCS+=              \
242  ff_memory.c
243endif
244
245ifdef FF_IPSEC
246CRYPTO_ASM_SRCS+=                       \
247	aesencdec_${MACHINE_CPUARCH}.S  \
248	aeskeys_${MACHINE_CPUARCH}.S
249
250CRYPTO_SRCS+=               \
251	aesni.c	            \
252	aesni_wrap.c        \
253	bf_ecb.c            \
254	bf_enc.c            \
255	bf_skey.c           \
256	camellia.c          \
257	camellia-api.c      \
258	des_ecb.c           \
259	des_enc.c           \
260	des_setkey.c        \
261	rijndael-alg-fst.c  \
262	rijndael-api.c      \
263	sha1.c              \
264	sha256c.c           \
265	sha512c.c           \
266	siphash.c
267else
268CRYPTO_SRCS+=               \
269	sha1.c              \
270	siphash.c
271endif
272
273KERN_SRCS+=                 \
274	kern_descrip.c      \
275	kern_event.c        \
276	kern_fail.c         \
277	kern_khelp.c        \
278	kern_hhook.c        \
279	kern_linker.c       \
280	kern_mbuf.c         \
281	kern_module.c       \
282	kern_mtxpool.c      \
283	kern_ntptime.c      \
284	kern_osd.c          \
285	kern_sysctl.c       \
286	kern_tc.c           \
287	kern_uuid.c         \
288	link_elf.c          \
289	md5c.c              \
290	subr_capability.c   \
291	subr_counter.c      \
292	subr_eventhandler.c \
293	subr_kobj.c         \
294	subr_lock.c         \
295	subr_module.c       \
296	subr_param.c        \
297	subr_pcpu.c         \
298	subr_sbuf.c         \
299	subr_taskqueue.c    \
300	subr_unit.c         \
301	subr_smr.c          \
302	sys_capability.c    \
303	sys_generic.c       \
304	sys_socket.c        \
305	uipc_accf.c         \
306	uipc_mbuf.c         \
307	uipc_mbuf2.c        \
308	uipc_domain.c       \
309	uipc_sockbuf.c      \
310	uipc_socket.c       \
311	uipc_syscalls.c
312
313
314KERN_MHEADERS+=		\
315	bus_if.m	\
316	device_if.m	\
317	linker_if.m
318
319
320KERN_MSRCS+=		\
321	linker_if.m
322
323ifeq (${MACHINE_CPUARCH},arm64)
324LIBKERN_SRCS+=		 \
325	bcd.c		 \
326	inet_ntoa.c	 \
327	jenkins_hash.c   \
328	strlcpy.c	 \
329	strnlen.c        \
330	fls.c		 \
331	flsl.c
332else
333LIBKERN_SRCS+=		 \
334	bcd.c		 \
335	gsb_crc32.c	 \
336	inet_ntoa.c	 \
337	jenkins_hash.c   \
338	strlcpy.c	 \
339	strnlen.c
340endif
341
342
343MACHINE_SRCS+=		 \
344	in_cksum.c
345
346
347NET_SRCS+=		 \
348	bpf.c		 \
349	bridgestp.c      \
350	if.c		 \
351	if_bridge.c      \
352	if_clone.c	 \
353	if_dead.c	 \
354	if_ethersubr.c	 \
355	if_loop.c	 \
356	if_llatbl.c	 \
357	if_media.c       \
358	if_spppfr.c      \
359	if_spppsubr.c    \
360	if_vlan.c        \
361	if_vxlan.c       \
362	in_fib.c	 \
363	in_gif.c         \
364	ip_reass.c	 \
365	netisr.c	 \
366	pfil.c		 \
367	radix.c		 \
368	raw_cb.c	 \
369	raw_usrreq.c	 \
370	route.c		 \
371	route_ctl.c	 \
372	route_tables.c	 \
373	route_helpers.c	 \
374	route_ifaddrs.c	 \
375	route_temporal.c \
376	nhop_utils.c	 \
377	nhop.c		 \
378	nhop_ctl.c	 \
379	rtsock.c         \
380	slcompress.c
381
382ifdef FF_NETGRAPH
383NETGRAPH_SRCS +=         \
384	ng_async.c       \
385	ng_atmllc.c      \
386	ng_bridge.c      \
387	ng_car.c         \
388	ng_cisco.c       \
389	ng_deflate.c     \
390	ng_echo.c        \
391	ng_eiface.c      \
392	ng_etf.c         \
393	ng_ether.c       \
394	ng_ether_echo.c  \
395	ng_frame_relay.c \
396	ng_gif.c         \
397	ng_gif_demux.c   \
398	ng_hole.c        \
399	ng_hub.c         \
400	ng_iface.c       \
401	ng_ip_input.c    \
402	ng_ipfw.c        \
403	ng_ksocket.c     \
404	ng_l2tp.c        \
405	ng_lmi.c         \
406	ng_nat.c         \
407	ng_one2many.c    \
408	ng_parse.c       \
409	ng_patch.c       \
410	ng_pipe.c        \
411	ng_ppp.c         \
412	ng_pppoe.c       \
413	ng_pptpgre.c     \
414	ng_pred1.c       \
415	ng_rfc1490.c     \
416	ng_sample.c      \
417	ng_socket.c      \
418	ng_source.c      \
419	ng_split.c       \
420	ng_sppp.c        \
421	ng_tag.c         \
422	ng_tcpmss.c      \
423	ng_tee.c         \
424	ng_UI.c          \
425	ng_vjc.c         \
426	ng_vlan.c
427endif
428
429NETINET_SRCS+=		\
430	if_ether.c	\
431	if_gif.c        \
432	igmp.c		\
433	in.c		\
434	in_mcast.c	\
435	in_pcb.c	\
436	in_proto.c	\
437	in_rmx.c	\
438	ip_carp.c	\
439	ip_divert.c     \
440	ip_ecn.c        \
441	ip_encap.c	\
442	ip_fastfwd.c	\
443	ip_icmp.c	\
444	ip_id.c		\
445	ip_input.c	\
446	ip_mroute.c     \
447	ip_options.c	\
448	ip_output.c	\
449	raw_ip.c	\
450	tcp_debug.c	\
451	tcp_hostcache.c	\
452	tcp_input.c	\
453	tcp_lro.c	\
454	tcp_offload.c	\
455	tcp_output.c	\
456	tcp_reass.c	\
457	tcp_sack.c	\
458	tcp_subr.c	\
459	tcp_syncache.c	\
460	tcp_timer.c	\
461	tcp_timewait.c	\
462	tcp_usrreq.c	\
463	udp_usrreq.c	\
464	cc.c		\
465	cc_newreno.c    \
466	cc_htcp.c       \
467	cc_cubic.c      \
468	alias.c         \
469	alias_db.c      \
470	alias_mod.c     \
471	alias_proxy.c   \
472	alias_sctp.c    \
473	alias_util.c
474
475ifdef FF_INET6
476NETINET6_SRCS+=		\
477	dest6.c		\
478	frag6.c		\
479	icmp6.c		\
480	in6.c		\
481	in6_ifattach.c	\
482	in6_mcast.c	\
483	in6_pcb.c	\
484	in6_pcbgroup.c	\
485	in6_proto.c	\
486	in6_rmx.c	\
487	in6_src.c	\
488	ip6_forward.c	\
489	ip6_id.c	\
490	ip6_input.c	\
491	ip6_fastfwd.c	\
492	ip6_mroute.c	\
493	ip6_output.c	\
494	mld6.c		\
495	nd6.c		\
496	nd6_nbr.c	\
497	nd6_rtr.c	\
498	raw_ip6.c	\
499	route6.c	\
500	scope6.c	\
501	send.c		\
502	udp6_usrreq.c	\
503	in6_cksum.c	\
504	in6_fib.c	\
505	in6_gif.c
506	#ip6_gre.c
507	#ip6_ipsec.c
508	#sctp6_usrreq.c
509	#in6_rss.c
510
511ifdef FF_TCPHPTS
512EXTRA_TCP_STACKS_SRCS+=		\
513	tcp_hpts.c
514endif
515
516ifdef FF_EXTRA_TCP_STACKS
517EXTRA_TCP_STACKS_SRCS+=		\
518	subr_filter.c		\
519	tcp_ratelimit.c		\
520	arc4random_uniform.c	\
521	sack_filter.c		\
522	rack_bbr_common.c	\
523	rack.c			\
524	bbr.c
525endif
526
527ifndef FF_KNI
528FF_HOST_SRCS+=         \
529        ff_dpdk_kni.c
530endif
531endif
532
533ifdef FF_IPFW
534NETIPFW_SRCS+=             \
535	ip_fw_dynamic.c \
536	ip_fw_eaction.c \
537	ip_fw_iface.c   \
538	ip_fw_log.c     \
539	ip_fw_nat.c     \
540	ip_fw_pfil.c    \
541	ip_fw_sockopt.c \
542	ip_fw_table.c   \
543	ip_fw_table_algo.c  \
544	ip_fw_table_value.c \
545	ip_fw2.c
546endif
547
548ifdef FF_IPSEC
549NETINET_SRCS+=		\
550	ip_ipsec.c
551ifdef FF_INET6
552NETINET6_SRCS+=		\
553	ip6_ipsec.c
554endif
555endif
556
557
558ifdef FF_IPSEC
559NETIPSEC_SRCS+=		\
560	ipsec.c		\
561	ipsec_input.c	\
562	ipsec_mbuf.c	\
563	ipsec_output.c	\
564	key.c		\
565	key_debug.c	\
566	keysock.c	\
567	xform_ah.c	\
568	xform_esp.c	\
569	xform_ipcomp.c
570endif
571
572# only if TCP_SIGNTAURE is defined
573#xform_tcp.c
574
575ifdef FF_IPSEC
576OPENCRYPTO_SRCS+=	\
577	cast.c		\
578	criov.c		\
579	crypto.c	\
580	cryptosoft.c	\
581	deflate.c	\
582	rmd160.c	\
583	skipjack.c	\
584	xform.c
585endif
586
587#	cryptodev.c
588
589OPENCRYPTO_MHEADERS= cryptodev_if.m
590OPENCRYPTO_MSRCS= cryptodev_if.m
591
592VM_SRCS+=		\
593	uma_core.c
594
595
596MHEADERS= $(patsubst %.m,%.h,${KERN_MHEADERS})
597MHEADERS+= vnode_if.h vnode_if_newproto.h vnode_if_typedef.h
598MHEADERS+= $(patsubst %.m,%.h,${OPENCRYPTO_MHEADERS})
599
600MSRCS= $(patsubst %.m,%.c,${KERN_MSRCS})
601MSRCS+= $(patsubst %.m,%.c,${OPENCRYPTO_MSRCS})
602
603ASM_SRCS = ${CRYPTO_ASM_SRCS}
604
605SRCS=  ${FF_SRCS} ${CRYPTO_SRCS} ${KERN_SRCS} ${LIBKERN_SRCS} ${MACHINE_SRCS}
606SRCS+= ${MSRCS} ${NET_SRCS} ${NETGRAPH_SRCS} ${NETINET_SRCS} ${NETINET6_SRCS} ${EXTRA_TCP_STACKS_SRCS}
607SRCS+= ${NETIPSEC_SRCS} ${NETIPFW_SRCS} ${OPENCRYPTO_SRCS} ${VM_SRCS}
608
609# If witness is enabled.
610# SRCS+= ${KERN_WITNESS_SRCS}
611
612# Extra FreeBSD kernel module srcs.
613SRCS+= ${KMOD_SRCS}
614
615HOST_SRCS = ${FF_HOST_SRCS}
616
617ASM_OBJS+= $(patsubst %.S,%.o,${ASM_SRCS})
618OBJS+= $(patsubst %.c,%.o,${SRCS})
619HOST_OBJS+= $(patsubst %.c,%.o,${HOST_SRCS})
620
621all: libfstack.a
622
623#
624# The library is built by first incrementally linking all the object
625# to resolve internal references.  Then, all symbols are made local.
626# Then, only the symbols that are part of the  API are made
627# externally available.
628#
629libfstack.a: machine_includes ff_api.symlist ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS}
630	${LD} -d -r -o $*.ro ${ASM_OBJS} ${OBJS}
631	nm $*.ro  | grep -v ' U ' | cut -d ' ' -f 3 > $*_localize_list.tmp
632	objcopy --localize-symbols=$*_localize_list.tmp $*.ro
633	rm $*_localize_list.tmp
634	objcopy --globalize-symbols=ff_api.symlist $*.ro
635	rm -f $@
636	ar -cqs $@ $*.ro ${HOST_OBJS}
637	rm -f $*.ro
638
639${HOST_OBJS}: %.o: %.c
640	${HOST_C}
641
642${ASM_OBJS}: %.o: %.S ${IMACROS_FILE}
643	${NORMAL_S}
644
645${OBJS}: %.o: %.c ${IMACROS_FILE}
646	${NORMAL_C}
647
648
649.SUFFIXES: .m
650
651.m.c:
652	${AWK} -f $S/tools/makeobjops.awk $< -c
653
654.m.h:
655	${AWK} -f $S/tools/makeobjops.awk $< -h
656
657.PHONY: clean
658clean:
659	rm -f libfstack.a
660	rm -f ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS} ${PROGRAM} ${IMACROS_FILE}
661	rm -rf ${MACHINE_INCLUDES_ROOT}
662
663
664.PHONY: machine_includes
665machine_includes:
666	@rm -rf ${MACHINE_INCLUDES_ROOT}
667	@mkdir -p ${MACHINE_INCLUDES_ROOT}/machine
668	@cp -r $S/${MACHINE_CPUARCH}/include/* ${MACHINE_INCLUDES_ROOT}/machine
669	@if [ "${X86_INCLUDES}" != "0" ]; then 				\
670		mkdir -p ${MACHINE_INCLUDES_ROOT}/x86;			\
671		cp -r $S/x86/include/* ${MACHINE_INCLUDES_ROOT}/x86;	\
672	fi
673
674#
675# Distilled from FreeBSD src/sys/conf/kern.post.mk
676#
677vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: $S/tools/vnode_if.awk \
678    $S/kern/vnode_if.src
679vnode_if.h: vnode_if_newproto.h vnode_if_typedef.h
680	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h
681vnode_if_newproto.h:
682	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p
683vnode_if_typedef.h:
684	${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q
685
686include ${TOPDIR}/mk/kern.mk
687
688install:
689	rm -rf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION}
690	rm -rf ${PREFIX_LIB}/libfstack.a
691	rm -rf ${PREFIX_INCLUDE}/ff_config.h
692	rm -rf ${PREFIX_INCLUDE}/ff_api.h
693	rm -rf ${PREFIX_INCLUDE}/ff_event.h
694	rm -rf ${PREFIX_INCLUDE}/ff_errno.h
695	rm -rf ${PREFIX_INCLUDE}/ff_epoll.h
696	rm -rf ${PREFIX_BIN}/ff_start
697
698	cp -f libfstack.a ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION}
699	ln -sf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION} ${PREFIX_LIB}/libfstack.a
700	cp -f ff_config.h ${PREFIX_INCLUDE}/ff_config.h
701	cp -f ff_api.h ${PREFIX_INCLUDE}/ff_api.h
702	cp -f ff_event.h ${PREFIX_INCLUDE}/ff_event.h
703	cp -f ff_errno.h ${PREFIX_INCLUDE}/ff_errno.h
704	cp -f ff_epoll.h ${PREFIX_INCLUDE}/ff_epoll.h
705	cp -f ${TOPDIR}/start.sh ${PREFIX_BIN}/ff_start
706	test -f '${F-STACK_CONF}' || cp -f ${TOPDIR}/config.ini ${F-STACK_CONF}
707
708uninstall:
709	rm -rf ${PREFIX_LIB}/libfstack.a.${F-STACK_VERSION}
710	rm -rf ${PREFIX_LIB}/libfstack.a
711	rm -rf ${PREFIX_INCLUDE}/ff_config.h
712	rm -rf ${PREFIX_INCLUDE}/ff_api.h
713	rm -rf ${PREFIX_INCLUDE}/ff_event.h
714	rm -rf ${PREFIX_INCLUDE}/ff_errno.h
715	rm -rf ${PREFIX_INCLUDE}/ff_epoll.h
716	rm -rf ${PREFIX_BIN}/ff_start
717	rm -rf ${F-STACK_CONF}
718
719