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