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 27#DEBUG=-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