############################################################################# # DPDK Envoirment Support based on CMake 2.6+ # Author : Lu Qiuwen # E-mail : luqiuwen@gmail.com # Date : 2016-01-03 ############################################################################# set(DPDK_RTE_SDK $ENV{RTE_SDK}) set(DPDK_RTE_TARGET $ENV{RTE_TARGET}) # DPDK CPU Flags set(DPDK_MACHINE_FLAGS "-march=native") exec_program(${CMAKE_C_COMPILER} ARGS "${DPDK_MACHINE_FLAGS} -dM -E - < /dev/null" OUTPUT_VARIABLE DPDK_AUTOFLAGS) if(DPDK_AUTOFLAGS MATCHES "__SSE__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} SSE) endif() if(DPDK_AUTOFLAGS MATCHES "__SSE2__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} SSE2) endif() if(DPDK_AUTOFLAGS MATCHES "__SSE3__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} SSE3) endif() if(DPDK_AUTOFLAGS MATCHES "__SSSE3__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} SSSE3) endif() if(DPDK_AUTOFLAGS MATCHES "__SSE4_1__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} SSE4_1) endif() if(DPDK_AUTOFLAGS MATCHES "__SSE4_2__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} SSE4_2) endif() if(DPDK_AUTOFLAGS MATCHES "__AES__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} AES) endif() if(DPDK_AUTOFLAGS MATCHES "__PCLMUL__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} PCLMULQDQ) endif() if(DPDK_AUTOFLAGS MATCHES "__AVX__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} AVX) endif() if(DPDK_AUTOFLAGS MATCHES "__RDRND__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} RDRAND) endif() if(DPDK_AUTOFLAGS MATCHES "__FSGSBASE__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} FSGSBASE) endif() if(DPDK_AUTOFLAGS MATCHES "__F16C__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} F16C) endif() if(DPDK_AUTOFLAGS MATCHES "__AVX2__") set(DPDK_CPUFLAGS ${DPDK_CPUFLAGS} AVX2) endif() foreach(LOOP_VAR ${DPDK_CPUFLAGS}) set(DPDK_MACHINE_FLAGS ${DPDK_MACHINE_FLAGS} "-DRTE_MACHINE_CPUFLAG_${LOOP_VAR}") set(DPDK_COMPILE_TIME_CPUFLAGS ${DPDK_COMPILE_TIME_CPUFLAGS} "RTE_CPUFLAG_${LOOP_VAR}") endforeach() string(REPLACE ";" "," DPDK_COMPILE_TIME_CPUFLAGS_STR "${DPDK_COMPILE_TIME_CPUFLAGS}") set(DPDK_MACHINE_FLAGS ${DPDK_MACHINE_FLAGS} "-DRTE_COMPILE_TIME_CPUFLAGS=${DPDK_COMPILE_TIME_CPUFLAGS_STR}") # Target Platform Detective # Platform Bit if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") set(DPDK_ARCH_FLAGS "-m64") endif() if(CMAKE_SYSTEM_PROCESSOR MATCHES "i686") set(DPDK_ARCH_FLAGS "-m32") endif() # Force Include set(DPDK_FORCE_INCLUDE "-include ${DPDK_RTE_SDK}/${DPDK_RTE_TARGET}/include/rte_config.h") # Library Path set(DPDK_LIBRARY_PATH "-L${DPDK_RTE_SDK}/${DPDK_RTE_TARGET}/lib") set(DPDK_LIBRARY_LINK -Wl,--whole-archive rte_distributor rte_reorder rte_kni rte_pipeline rte_table rte_port rte_timer rte_hash rte_jobstats rte_lpm rte_power rte_acl rte_meter rte_sched rte_vhost -Wl,--start-group rte_kvargs rte_mbuf rte_ip_frag ethdev rte_mempool rte_ring rte_eal rte_cmdline rte_cfgfile rte_pmd_bond rte_pmd_vmxnet3_uio rte_pmd_virtio rte_pmd_cxgbe rte_pmd_enic rte_pmd_i40e rte_pmd_fm10k rte_pmd_ixgbe rte_pmd_e1000 rte_pmd_ring rte_pmd_af_packet rte_pmd_null rt m dl -Wl,--end-group -Wl,--no-whole-archive ) # Output set(DPDK_C_PREDEFINED ${DPDK_ARCH_FLAGS} ${DPDK_MACHINE_FLAGS} ${DPDK_FORCE_INCLUDE}) set(DPDK_CXX_PREDEFINED ${DPDK_ARCH_FLAGS} ${DPDK_MACHINE_FLAGS} ${DPDK_FORCE_INCLUDE}) set(DPDK_INCLUDE_DIR "${DPDK_RTE_SDK}/${DPDK_RTE_TARGET}/include") set(DPDK_LIBRARY ${DPDK_LIBRARY_PATH} ${DPDK_LIBRARY_LINK})