summaryrefslogtreecommitdiff
path: root/cmake/GetDPDKSupport.cmake
blob: a18d2081c0e8fb457ea4c5762377ff3a1835aca9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#############################################################################
#	DPDK Envoirment Support based on CMake 2.6+
#   Author	: Lu Qiuwen
#   E-mail	: [email protected]
#   Date	: 2016-01-03
#############################################################################

set(DPDK_RTE_SDK $ENV{RTE_SDK})
set(DPDK_RTE_TARGET $ENV{RTE_TARGET})

# DPDK CPU Flags
if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") 
	set(DPDK_MACHINE_FLAGS "-march=armv8-a")
else()
	set(DPDK_MACHINE_FLAGS "-march=native")
endif()

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})