-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathCMakeLists.txt
281 lines (249 loc) · 10.9 KB
/
CMakeLists.txt
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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
cmake_minimum_required(VERSION 3.10)
string(TIMESTAMP APPMESH_BUILD_DATE "%Y-%m-%dT%H:%M:%SZ")
##########################################################################
# project
##########################################################################
cmake_policy(SET CMP0048 NEW)
project(appmesh LANGUAGES CXX VERSION 2.1.2)
##########################################################################
# C++ flag
##########################################################################
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(BUILD_TAG ${PROJECT_NAME}_${PROJECT_VERSION}_${APPMESH_BUILD_DATE})
add_compile_options(-DBUILD_TAG=${BUILD_TAG})
message(BUILD_TAG=${BUILD_TAG})
# set(CMAKE_C_COMPILER "/usr/bin/gcc")
# set(CMAKE_CXX_COMPILER "/usr/bin/g++")
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/gen/)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/gen/)
##########################################################################
# debug / release
##########################################################################
# Set the default build type if not specified
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UPPERCASE)
message(STATUS "CMAKE_BUILD_TYPE: ${BUILD_TYPE_UPPERCASE}")
# Set compiler flags based on the build type
if (BUILD_TYPE_UPPERCASE STREQUAL "DEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -ggdb3 -O0")
elseif (BUILD_TYPE_UPPERCASE STREQUAL "RELEASE")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")
elseif (BUILD_TYPE_UPPERCASE STREQUAL "MINSIZEREL")
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
elseif (BUILD_TYPE_UPPERCASE STREQUAL "ASAN")
# https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
set(CMAKE_CXX_FLAGS_ASAN "${CMAKE_CXX_FLAGS_ASAN} -Wall -ggdb3 -O0 -g -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_EXE_LINKER_FLAGS_ASAN "${CMAKE_EXE_LINKER_FLAGS_ASAN} -fsanitize=address -lasan -lstdc++")
else ()
message(FATAL_ERROR "Invalid build type: ${CMAKE_BUILD_TYPE}")
endif()
# Print compile parameters: FLAGS = CMAKE_CXX_FLAGS + CMAKE_CXX_FLAGS_RELEASE
set(CMAKE_CXX_FLAGS_NAME "CMAKE_CXX_FLAGS_${BUILD_TYPE_UPPERCASE}")
message(STATUS "${CMAKE_CXX_FLAGS_NAME}: ${CMAKE_CXX_FLAGS} ${${CMAKE_CXX_FLAGS_NAME}}")
# Set the library path to prioritize /usr/local/lib64
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /usr/local/lib64)
##########################################################################
# boost
##########################################################################
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
set(BOOST_ALL_DYN_LINK ON)
find_package(Boost REQUIRED COMPONENTS
system
filesystem
regex
thread
program_options
date_time
)
if (Boost_FOUND)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})
message(STATUS "boost include dir: ${Boost_INCLUDE_DIRS}")
message(STATUS "boost library dir: ${Boost_LIBRARIES}")
message(STATUS "boost library ver: ${Boost_LIB_VERSION}.")
else()
message(FATAL_ERROR "boost library not found")
endif()
##########################################################################
# MessagePack https://msgpack.org/
##########################################################################
find_package(msgpack-cxx REQUIRED)
##########################################################################
# libcurl
##########################################################################
if (APPLE)
# Explicitly set paths for Homebrew curl
set(CURL_ROOT "/opt/homebrew/opt/curl")
set(CURL_INCLUDE_DIR "${CURL_ROOT}/include")
set(CURL_LIB "${CURL_ROOT}/lib/libcurl.dylib")
# Verify paths manually
find_path(CURL_INCLUDE_DIR curl/curl.h PATHS ${CURL_INCLUDE_DIR})
find_library(CURL_LIB NAMES curl PATHS ${CURL_ROOT}/lib)
if(NOT CURL_INCLUDE_DIR OR NOT CURL_LIB)
message(FATAL_ERROR "Could not find CURL. Ensure CURL is installed via Homebrew.")
endif()
message(STATUS "CURL include dir: ${CURL_INCLUDE_DIR}")
message(STATUS "CURL library dir: ${CURL_LIB}")
# Include directories and link libraries
include_directories(${CURL_INCLUDE_DIR})
link_directories(${CURL_LIBRARY})
else()
find_library(CURL_LIB NAMES libcurl.a PATHS /usr/local/lib NO_DEFAULT_PATH)
if (NOT CURL_LIB)
find_package(CURL REQUIRED)
message(STATUS "Found system libcurl: ${CURL_INCLUDE_DIRS} ${CURL_LIBRARIES}")
set(CURL_LIB ${CURL_LIBRARIES})
endif()
endif()
message("Found CURL_LIB: ${CURL_LIB}")
##########################################################################
# openssl
##########################################################################
find_package(OpenSSL REQUIRED)
message("OPENSSL_FOUND: ${OPENSSL_FOUND}")
if (OPENSSL_FOUND)
include_directories(${OPENSSL_INCLUDE_DIR})
message(STATUS "openssl include dir: ${OPENSSL_INCLUDE_DIR}")
message(STATUS "openssl library dir: ${OPENSSL_LIBRARIES}")
message(STATUS "openssl library ver: ${OPENSSL_VERSION}.")
else()
message(FATAL_ERROR "openssl library not found")
endif()
##########################################################################
# openldap
##########################################################################
set(LDAP_LIBRARIES ldap lber)
find_library(${LDAP_LIBRARIES} REQUIRED)
##########################################################################
# pthread
##########################################################################
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
##########################################################################
# Include dir
##########################################################################
if(EXISTS /usr/local/include)
include_directories(/usr/local/include)
endif()
##########################################################################
# Library dir
##########################################################################
if(EXISTS /usr/local/lib64)
link_directories(/usr/local/lib64)
endif()
if(EXISTS /usr/local/lib)
link_directories(/usr/local/lib)
endif()
if(APPLE)
# Detect Apple Silicon vs Intel
if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")
set(HOMEBREW_PREFIX "/opt/homebrew")
set(CMAKE_INSTALL_RPATH "/opt/homebrew/lib;/opt/appmesh/lib64")
else()
set(HOMEBREW_PREFIX "/usr/local")
set(CMAKE_INSTALL_RPATH "/usr/local/lib;/opt/appmesh/lib64")
endif()
# Enable C++17 (used for ACE 8.0)
# set(CMAKE_CXX_STANDARD 17)
# set(CMAKE_CXX_STANDARD_REQUIRED ON)
# set(CMAKE_CXX_EXTENSIONS OFF)
# Add Homebrew include and library paths
include_directories(${HOMEBREW_PREFIX}/include)
link_directories(${HOMEBREW_PREFIX}/lib)
# Add Homebrew path to CMAKE_PREFIX_PATH
list(APPEND CMAKE_PREFIX_PATH ${HOMEBREW_PREFIX})
# Ignore warning: 'vsprintf' is deprecated
add_compile_options(-Wno-deprecated-declarations)
# Optional: Add pkg-config path if needed
set(ENV{PKG_CONFIG_PATH} "${HOMEBREW_PREFIX}/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}")
endif()
##########################################################################
# sub dir
##########################################################################
add_subdirectory(src)
##########################################################################
# Test
# cmake -APPMESH_NO_TESTS=1 ..
# make & make test ARGS="-V"
# https://cmake.org/pipermail/cmake/2005-December/007778.html
# https://stackoverflow.com/questions/49923562/how-to-force-cmake-to-write-test-output-after-make-test?r=SearchResults
##########################################################################
macro(add_catch_test name)
if (TEST_REPORT_FORMAT)
add_test(NAME ${name} COMMAND ${name} -r ${TEST_REPORT_FORMAT} -o "${name}.test_out.xml")
else()
add_test(NAME ${name} COMMAND ${name})
endif()
if(APPLE)
set(LIB_PATH_VAR DYLD_LIBRARY_PATH)
else()
set(LIB_PATH_VAR LD_LIBRARY_PATH)
endif()
set_tests_properties(${name} PROPERTIES ENVIRONMENT "${LIB_PATH_VAR}=/usr/local/lib64:/usr/local/lib:$ENV{${LIB_PATH_VAR}}")
endmacro()
if(NOT APPMESH_NO_TESTS)
enable_testing()
# add_subdirectory(test)
# Python test
#add_test(
# NAME python_tests
# COMMAND python3 -m unittest ${CMAKE_SOURCE_DIR}/src/sdk/python/test/test_appmesh_client.py
#)
# Golang test
#add_test(
# NAME go_tests
# COMMAND go test ${CMAKE_SOURCE_DIR}/src/sdk/go/ -test.v
#)
add_custom_target(python_tests
COMMAND python3 -m unittest
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/sdk/python/test/
COMMENT "Running Python tests..."
VERBATIM
)
add_custom_target(go_tests
COMMAND go test ${CMAKE_SOURCE_DIR}/src/sdk/go/ -test.v
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Running Golang tests..."
VERBATIM
)
endif()
##########################################################################
# package [make pack]
##########################################################################
add_custom_target(pack
COMMENT "Packing ${CMAKE_CURRENT_BINARY_DIR}"
COMMAND make install
COMMAND ${CMAKE_COMMAND} -E env PROJECT_NAME=${PROJECT_NAME} PROJECT_VERSION=${PROJECT_VERSION} CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR} bash ${CMAKE_SOURCE_DIR}/script/build_package.sh
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS appc appsvc agent
)
##########################################################################
# Golang agent build
##########################################################################
add_custom_target(agent
COMMENT "Golang build agent"
COMMAND go build -buildvcs=false -o ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/agent ${CMAKE_CURRENT_SOURCE_DIR}/src/sdk/agent/cmd
)
file(REMOVE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/agent)
##########################################################################
# cppcheck
##########################################################################
add_custom_target(cppcheck
COMMENT "code static check ${CMAKE_CURRENT_SOURCE_DIR}"
COMMAND cppcheck --enable=all --quiet --std=c++11 --platform=native ${CMAKE_CURRENT_SOURCE_DIR}
)
##########################################################################
# SBOM
# in-order to include Python packages:
# create venv under home and use pip install appmesh
##########################################################################
add_custom_target(sbom
COMMENT "Generate SBOM file: ${CMAKE_BINARY_DIR}/home/ with configuration file: ${CMAKE_CURRENT_SOURCE_DIR}/script/syft.yaml"
COMMAND syft ${CMAKE_BINARY_DIR}/home/ -c ${CMAKE_CURRENT_SOURCE_DIR}/script/syft.yaml --source-name ${PROJECT_NAME} --source-version ${PROJECT_VERSION}
)