summaryrefslogtreecommitdiff
path: root/support/CMakeLists.txt
blob: f0fca1257129bd86382ece75f497cbc110b548de (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# CMakeFiles for 3rd vendor library

include(ExternalProject)

#### GoogleTest
ExternalProject_Add(googletest PREFIX googletest
    URL ${CMAKE_CURRENT_SOURCE_DIR}/googletest-release-1.8.0.tar.gz
    URL_MD5 16877098823401d1bf2ed7891d7dce36
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})

ExternalProject_Get_Property(googletest INSTALL_DIR)
file(MAKE_DIRECTORY ${INSTALL_DIR}/include)

add_library(gtest STATIC IMPORTED GLOBAL)
add_dependencies(gtest googletest)
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libgtest.a)
set_property(TARGET gtest PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)
set_property(TARGET gtest PROPERTY INTERFACE_LINK_LIBRARIES pthread)

add_library(gtest_main STATIC IMPORTED GLOBAL)
add_dependencies(gtest_main googletest)
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libgtest_main.a)
set_property(TARGET gtest_main PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)
set_property(TARGET gtest_main PROPERTY INTERFACE_LINK_LIBRARIES pthread gtest)

add_library(gmock STATIC IMPORTED GLOBAL)
add_dependencies(gmock googletest)
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libgmock.a)
set_property(TARGET gmock PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)

add_library(gmock_main STATIC IMPORTED GLOBAL)
add_dependencies(gmock_main googletest)
set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libgmock_main.a)
set_property(TARGET gmock_main PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)

### MESA_htable
ExternalProject_Add(MESA_htable PREFIX MESA_htable
    URL ${CMAKE_CURRENT_SOURCE_DIR}/MESA_htable-master-503cac1d141ae15f2ab6c7a889a5361dd85842aa.zip
    URL_MD5 4e245d8dc70920f9a4d3ad87a30da9f7
    CONFIGURE_COMMAND ""
    BUILD_COMMAND make
    INSTALL_COMMAND ""
    BUILD_IN_SOURCE 1)

ExternalProject_Get_Property(MESA_htable SOURCE_DIR)
file(MAKE_DIRECTORY ${SOURCE_DIR}/include)

add_library(MESA_htable_static STATIC IMPORTED GLOBAL)
add_dependencies(MESA_htable_static MESA_htable)
set_property(TARGET MESA_htable_static PROPERTY IMPORTED_LOCATION ${SOURCE_DIR}/lib/libMESA_htable.a)
set_property(TARGET MESA_htable_static PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}/include)

### MESA_prof_load
ExternalProject_Add(MESA_prof_load PREFIX MESA_prof_load
    URL ${CMAKE_CURRENT_SOURCE_DIR}/MESA_prof_load-master-3b2bfdfecdcf2cf9a400237007f0b09dd5b3d685.zip
    URL_MD5 a946d9d42f96d8c79585a84b1918a3bf
    CONFIGURE_COMMAND ""
    BUILD_COMMAND make
    INSTALL_COMMAND ""
    BUILD_IN_SOURCE 1)

ExternalProject_Get_Property(MESA_prof_load SOURCE_DIR)
file(MAKE_DIRECTORY ${SOURCE_DIR}/inc)

add_library(MESA_prof_load_static STATIC IMPORTED GLOBAL)
add_dependencies(MESA_prof_load_static MESA_prof_load)
set_property(TARGET MESA_prof_load_static PROPERTY IMPORTED_LOCATION ${SOURCE_DIR}/lib/libMESA_prof_load.a)
set_property(TARGET MESA_prof_load_static PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}/inc)

ExternalProject_Add(libevent PREFIX libevent
        URL ${CMAKE_CURRENT_SOURCE_DIR}/libevent-2.1.12-stable.tar.bz2
        URL_MD5 977fb199eb49d46e2c3a924143e5f570
        CONFIGURE_COMMAND ./configure --prefix=<INSTALL_DIR> --disable-shared --disable-samples --disable-openssl
        BUILD_COMMAND make LDFLAGS="-ldl"
        BUILD_IN_SOURCE 1)

ExternalProject_Get_Property(libevent INSTALL_DIR)
file(MAKE_DIRECTORY ${INSTALL_DIR}/include)

add_library(libevent-static STATIC IMPORTED GLOBAL)
add_dependencies(libevent-static libevent)
set_property(TARGET libevent-static PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libevent.a)
set_property(TARGET libevent-static PROPERTY IMPORTED_INTERFACE_LINK_LIBRARIES pthread crypto)
set_property(TARGET libevent-static PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)

add_library(libevent-static-pthreads STATIC IMPORTED GLOBAL)
add_dependencies(libevent-static-pthreads libevent)
set_property(TARGET libevent-static-pthreads PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libevent_pthreads.a)
set_property(TARGET libevent-static-pthreads PROPERTY IMPORTED_INTERFACE_LINK_LIBRARIES pthread crypto)
set_property(TARGET libevent-static-pthreads PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)

# libcmocka
ExternalProject_Add(cmocka PREFIX cmocka
        URL ${CMAKE_CURRENT_SOURCE_DIR}/cmocka-1.1.7.tar.xz
        URL_MD5 dc23f4870eb7dfa6da065f3056e815b0
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DBUILD_SHARED_LIBS=OFF -DUNIT_TESTING=OFF -DWITH_EXAMPLES=OFF)

ExternalProject_Get_Property(cmocka INSTALL_DIR)
file(MAKE_DIRECTORY ${INSTALL_DIR}/include)

add_library(libcmocka STATIC IMPORTED GLOBAL)
add_dependencies(libcmocka cmocka)
set_property(TARGET libcmocka PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib64/libcmocka.a)
set_property(TARGET libcmocka PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)

# Merge multiple patches into one patch file
set(DPDK_VERSION 23.11.1)
set(DPDK_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dpdk)
set(DPDK_PATCH_DIR ${DPDK_SOURCE_DIR})
set(MERGED_PATCH_FILE "${CMAKE_BINARY_DIR}/merged_patches.patch")
set(DPDK_PATCH_FILES ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-memzone-namesize.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-fm10k-rxtx-vec.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-mempool-ops-get-count.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-bypass-flow-err-func.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-fix-dup-msl-name-sec-process.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-fix-af-packet-run-as-slave-of-bond.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-mp-max-fds.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-dpdk-devbind-dump.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-dpdk-hugepages-path.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-dpdk-pcapng-path.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-dpdk-pdum-offset-c.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-dpdk-pdum-offset-h.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-dpdk-pdum-offset-app.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-mlx5_glue_dlopen_info.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-revert-fix-devargs-in-secondary-process.patch
                    ${DPDK_PATCH_DIR}/dpdk-${DPDK_VERSION}-fix-legacy_mem_init.patch
)
execute_process(COMMAND cat ${DPDK_PATCH_FILES} OUTPUT_FILE ${MERGED_PATCH_FILE})

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(DPDK_BUILD_TYPE debug)
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(DPDK_BUILD_TYPE release)
else()
    set(DPDK_BUILD_TYPE debugoptimized)
endif()

if(MACHINE STREQUAL ${AARCH64})
    set(DPDK_MESON_MACHINE generic)
else()
    set(DPDK_MESON_MACHINE ${MACHINE})
endif()

set(DPDK_C_ARGS "['-DRTE_ETHDEV_PROFILE_WITH_VTUNE']")
# Previously, when compiling the dpdk aarch64 debug version, "relocation truncated to fit" would be triggered. 
# However, this problem does not exist in the current environment. 
# Therefore, commenting out this code will ensure that the dpdk debug version can be compiled.
# if((MACHINE STREQUAL ${AARCH64}) AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
#     # arm unrecognized argument in option ‘-mcmodel=medium’
# 	# set(DPDK_C_ARGS "['-DRTE_ETHDEV_PROFILE_WITH_VTUNE','-mcmodel=large']")
#     set(DPDK_BUILD_TYPE debugoptimized)
# endif()

message(STATUS "dpdk build machine: ${DPDK_MESON_MACHINE}")
message(STATUS "dpdk c args: ${DPDK_C_ARGS}")
message(STATUS "dpdk build type: ${DPDK_BUILD_TYPE}")


set(DPDK_MESON_ENABLE_APPS "pdump,proc-info,test-pmd")

set(DPDK_MESON_DISABLED_DRIVERS "common/cpt,common/dpaax,common/octeontx,common/octeontx2,common/sfc_efx,\
common/qat,bus/dpaa,bus/fslmc,bus/ifpga,bus/vmbus,mempool/bucket,mempool/dpaa,\
mempool/dpaa2,mempool/octeontx,mempool/octeontx2,mempool/stack,raw/ifpga,raw/ioat,\
raw/ntb,raw/octeontx2_dma,raw/octeontx2_ep,raw/skeleton,compress/zlib,regex/octeontx2,\
vdpa/ifc,event/skeleton,event/dlb,event/dlb2,event/opdl,sevent/keleton,event/sw,event/dsw,\
baseband/null,baseband/turbo_sw,baseband/fpga_lte_fec,baseband/fpga_5gnr_fec,baseband/acc100,\
crypto/bcmfs,crypto/ccp,crypto/nitrox,crypto/null,crypto/openssl,crypto/scheduler,crypto/virtio")

# Although default_library=static has been set, both dynamic and static libraries are compiled. a little strange
ExternalProject_Add(dpdk PREFIX dpdk
        URL ${DPDK_SOURCE_DIR}/dpdk-${DPDK_VERSION}.tar.xz
        URL_MD5 382d5fdd8ecb1d8e0be6d70dfc5eec96
        PATCH_COMMAND
                COMMAND patch -Ns -p1 -i ${MERGED_PATCH_FILE}
                COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR> bash ${DPDK_SOURCE_DIR}/dpdk-config-set.sh
        CONFIGURE_COMMAND
                COMMAND meson -Dmax_lcores=256 -Dc_args=${DPDK_C_ARGS} -Ddisable_drivers=${DPDK_MESON_DISABLED_DRIVERS} -Dprefix=<INSTALL_DIR> -Dplatform=generic -Dcpu_instruction_set=${DPDK_MESON_MACHINE} -Dibverbs_link=dlopen -Dbuildtype=${DPDK_BUILD_TYPE} -Denable_apps=${DPDK_MESON_ENABLE_APPS} build
        BUILD_COMMAND  ${CMAKE_COMMAND} -E chdir <SOURCE_DIR>/build ninja
        INSTALL_COMMAND  
                COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR>/build ninja install 
                COMMAND ${CMAKE_COMMAND} -E chdir <INSTALL_DIR>/lib64 rm -f libdpdk.a
                COMMAND ${CMAKE_COMMAND} -E chdir <INSTALL_DIR>/lib64 sh -c "ar crsT libdpdk.a ./*.a"
        BUILD_IN_SOURCE 1)

ExternalProject_Get_Property(dpdk INSTALL_DIR)
file(MAKE_DIRECTORY ${INSTALL_DIR}/include)
set(DPDK_ROOT_DIR ${INSTALL_DIR} CACHE PATH "DPDK root path")
message(STATUS "DPDK_ROOT_DIR: ${DPDK_ROOT_DIR}")

find_library(M_LIB m)

add_library(libdpdk STATIC IMPORTED GLOBAL)
add_dependencies(libdpdk dpdk)
set_target_properties(libdpdk PROPERTIES
    IMPORTED_LOCATION ${M_LIB}
    INTERFACE_LINK_DIRECTORIES ${INSTALL_DIR}/lib64
    INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include
    INTERFACE_LINK_LIBRARIES "-Wl,--whole-archive;${INSTALL_DIR}/lib64/libdpdk.a;-Wl,--no-whole-archive;rt;m;dl;pcap;numa;ibverbs;mlx5;mtcr_ul"
)