Skip to content

Commit ab7aab7

Browse files
committed
Build fixes/support for C++ in appsec
1 parent 43abfc4 commit ab7aab7

File tree

8 files changed

+79
-29
lines changed

8 files changed

+79
-29
lines changed

appsec/cmake/boost.cmake

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,31 @@ set(BOOST_COMPONENTS
1919

2020
function(calculate_abi_hash OUT_HASH)
2121
set(ABI_COMPONENTS "")
22-
22+
2323
list(APPEND ABI_COMPONENTS "${CMAKE_CXX_COMPILER_ID}")
24-
24+
2525
list(APPEND ABI_COMPONENTS "${CMAKE_SYSTEM_PROCESSOR}")
2626
list(APPEND ABI_COMPONENTS "${CMAKE_SIZEOF_VOID_P}")
27-
27+
2828
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
2929
list(APPEND ABI_COMPONENTS "debug")
3030
else()
3131
list(APPEND ABI_COMPONENTS "release")
3232
endif()
33-
33+
3434
# Relevant compiler flags that might affect the ABI
3535
string(REGEX MATCHALL "-m[a-zA-Z0-9_-]+" MARCH_FLAGS "${CMAKE_CXX_FLAGS}")
3636
string(REGEX MATCHALL "-f[a-zA-Z0-9_-]+" FEATURE_FLAGS "${CMAKE_CXX_FLAGS}")
3737
string(REGEX MATCHALL "-std=[a-zA-Z0-9_+-]+" STD_FLAGS "${CMAKE_CXX_FLAGS}")
3838
string(REGEX MATCHALL "-D[a-zA-Z0-9_=]+" DEFINE_FLAGS "${CMAKE_CXX_FLAGS}")
3939
string(REGEX MATCHALL "-stdlib=[a-zA-Z0-9_+-]+" STDLIB_FLAGS "${CMAKE_CXX_FLAGS}")
40-
40+
4141
list(APPEND ABI_COMPONENTS ${MARCH_FLAGS})
4242
list(APPEND ABI_COMPONENTS ${FEATURE_FLAGS})
4343
list(APPEND ABI_COMPONENTS ${STD_FLAGS})
4444
list(APPEND ABI_COMPONENTS ${DEFINE_FLAGS})
4545
list(APPEND ABI_COMPONENTS ${STDLIB_FLAGS})
46-
46+
4747
# Platform-specific ABI settings
4848
if(WIN32)
4949
list(APPEND ABI_COMPONENTS "WIN32")
@@ -61,13 +61,13 @@ function(calculate_abi_hash OUT_HASH)
6161
else()
6262
list(APPEND ABI_COMPONENTS "UNIX")
6363
endif()
64-
64+
6565
list(APPEND ABI_COMPONENTS "${BOOST_VERSION}")
66-
66+
6767
string(JOIN ";" ABI_STRING ${ABI_COMPONENTS})
6868
string(SHA256 HASH_VALUE "${ABI_STRING}")
6969
string(SUBSTRING "${HASH_VALUE}" 0 12 SHORT_HASH)
70-
70+
7171
set(${OUT_HASH} "${SHORT_HASH}" PARENT_SCOPE)
7272
endfunction()
7373

@@ -88,7 +88,7 @@ if(EXISTS "${BOOST_BUILD_DIR}/lib" AND EXISTS "${BOOST_BUILD_DIR}/include")
8888
break()
8989
endif()
9090
endforeach()
91-
91+
9292
if(ALL_LIBS_EXIST)
9393
set(BOOST_ALREADY_BUILT TRUE)
9494
message(STATUS "Found cached Boost build, skipping compilation")
@@ -199,10 +199,10 @@ endif()
199199
function(create_boost_target component_name)
200200
set(LIB_PREFIX "lib")
201201
set(LIB_SUFFIX ".a")
202-
202+
203203
# Construct the expected library path
204204
set(EXPECTED_LIB_PATH "${BOOST_BUILD_DIR}/lib/${LIB_PREFIX}boost_${component_name}${LIB_SUFFIX}")
205-
205+
206206
# Don't use an imported library, as it's not available at configuration time
207207
add_library(boost_${component_name} INTERFACE)
208208
message(STATUS "boost_${component_name} will be imported from ${EXPECTED_LIB_PATH}")
@@ -212,9 +212,9 @@ function(create_boost_target component_name)
212212
target_include_directories(boost_${component_name} INTERFACE
213213
$<BUILD_INTERFACE:${BOOST_BUILD_DIR}/include>
214214
)
215-
215+
216216
add_dependencies(boost_${component_name} boost_build)
217-
217+
218218
# Set up component-specific dependencies
219219
if(component_name STREQUAL "coroutine")
220220
target_link_libraries(boost_${component_name} INTERFACE boost_context boost_system)
@@ -242,8 +242,15 @@ foreach(component IN LISTS BOOST_COMPONENTS)
242242
create_boost_target("stacktrace_basic")
243243

244244
if (UNIX AND NOT APPLE AND BOOST_TOOLSET STREQUAL "gcc")
245-
create_boost_target("stacktrace_backtrace")
246-
target_link_libraries(boost_stacktrace INTERFACE boost_stacktrace_backtrace)
245+
find_library(BACKTRACE_LIBRARY NAMES backtrace)
246+
if (BACKTRACE_LIBRARY)
247+
message(STATUS "libbacktrace found: ${BACKTRACE_LIBRARY}")
248+
create_boost_target("stacktrace_backtrace")
249+
target_link_libraries(boost_stacktrace INTERFACE boost_stacktrace_backtrace)
250+
else()
251+
message(STATUS "libbacktrace not found, using stacktrace_addr2line instead")
252+
target_link_libraries(boost_stacktrace INTERFACE boost_stacktrace_addr2line)
253+
endif()
247254
else()
248255
target_link_libraries(boost_stacktrace INTERFACE boost_stacktrace_basic)
249256
endif()

appsec/cmake/clang-format.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if(DD_APPSEC_BUILD_HELPER)
1212
endif()
1313

1414
if(DD_APPSEC_BUILD_EXTENSION)
15-
file(GLOB_RECURSE EXTENSION_FILES ${EXT_SOURCE_DIR}/*.c tests/helper/*.h tests/bench_helper/*.cc)
15+
file(GLOB_RECURSE EXTENSION_FILES ${EXT_SOURCE_DIR}/*.c ${EXT_SOURCE_DIR}/*.cpp tests/helper/*.h tests/bench_helper/*.cc)
1616
list(APPEND FILE_LIST ${EXTENSION_FILES})
1717
endif()
1818

appsec/cmake/ddtrace.cmake

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ if (PhpConfig_VERNUM GREATER_EQUAL 80000)
100100
else() # PHP 7
101101
list(REMOVE_ITEM FILES_DDTRACE "${CMAKE_SOURCE_DIR}/../ext/handlers_curl.c"
102102
"${CMAKE_SOURCE_DIR}/../ext/hook/uhook_attributes.c"
103+
"${CMAKE_SOURCE_DIR}/../ext/hook/uhook_otel.c"
103104
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php8/interceptor.c"
104105
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php8/resolver.c"
105106
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php8/resolver_pre-8_2.c"
@@ -120,6 +121,8 @@ list(REMOVE_ITEM FILES_DDTRACE "${CMAKE_SOURCE_DIR}/../ext/crashtracking_windows
120121
find_package(CURL REQUIRED)
121122
message(STATUS "CURL version: ${CURL_VERSION_STRING}")
122123

124+
include(cmake/pcre2.cmake)
125+
123126
add_library(ddtrace SHARED ${FILES_DDTRACE})
124127
set_target_properties(ddtrace PROPERTIES
125128
C_VISIBILITY_PRESET hidden
@@ -135,7 +138,7 @@ elseif(APPLE)
135138
else()
136139
message(FATAL_ERROR "Only Linux and Apple supported")
137140
endif()
138-
target_link_libraries(ddtrace PRIVATE PhpConfig components_rs ${CURL_LIBRARIES})
141+
target_link_libraries(ddtrace PRIVATE PhpConfig components_rs ${CURL_LIBRARIES} PCRE2::pcre2)
139142
if(CURL_DEFINITIONS)
140143
target_compile_definitions(ddtrace PRIVATE ${CURL_DEFINITIONS})
141144
endif()

appsec/cmake/ext_asan.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ endif()
1616

1717
if(ENABLE_ASAN)
1818
message(STATUS "Enabling ASAN")
19-
target_compile_options(PhpConfig INTERFACE -fsanitize=address)
19+
target_compile_options(PhpConfig INTERFACE -fsanitize=address -fno-omit-frame-pointer -g)
2020
target_compile_definitions(PhpConfig INTERFACE ZEND_TRACK_ARENA_ALLOC)
2121
target_link_options(PhpConfig INTERFACE -fsanitize=address)
2222
else()

appsec/cmake/extension.cmake

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,28 @@ configure_file(src/extension/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/extens
22

33
set(EXT_SOURCE_DIR src/extension)
44

5+
# Create controlled include directory with symlinks to avoid accidentally including
6+
# unrelated files from the root directory
7+
set(EXT_ROOT_INCLUDES ${CMAKE_BINARY_DIR}/ext_root_includes)
8+
file(MAKE_DIRECTORY ${EXT_ROOT_INCLUDES})
9+
file(CREATE_LINK ${CMAKE_CURRENT_SOURCE_DIR}/../zend_abstract_interface
10+
${EXT_ROOT_INCLUDES}/zend_abstract_interface SYMBOLIC)
11+
file(CREATE_LINK ${CMAKE_CURRENT_SOURCE_DIR}/../components-rs
12+
${EXT_ROOT_INCLUDES}/components-rs SYMBOLIC)
13+
514
file(GLOB_RECURSE ZAI_SOURCE ../zend_abstract_interface/config/*.c
615
../zend_abstract_interface/json/*.c ../zend_abstract_interface/env/*.c
716
../zend_abstract_interface/zai_string/*.c)
817

918
add_library(zai STATIC ${ZAI_SOURCE})
1019

1120
target_link_libraries(zai PRIVATE PhpConfig)
12-
target_include_directories(zai PUBLIC ../zend_abstract_interface ..)
21+
target_include_directories(zai PUBLIC ../zend_abstract_interface ${EXT_ROOT_INCLUDES})
1322
set_target_properties(zai PROPERTIES POSITION_INDEPENDENT_CODE 1)
1423

15-
file(GLOB_RECURSE EXT_SOURCE ${EXT_SOURCE_DIR}/*.c)
24+
include(cmake/pcre2.cmake)
25+
26+
file(GLOB_RECURSE EXT_SOURCE ${EXT_SOURCE_DIR}/*.c ${EXT_SOURCE_DIR}/*.cpp)
1627
add_library(extension SHARED ${EXT_SOURCE})
1728
set_target_properties(extension PROPERTIES
1829
C_VISIBILITY_PRESET hidden
@@ -30,20 +41,22 @@ if(ZAI_INCLUDE_DIRS)
3041
endif()
3142
target_link_libraries(extension PRIVATE zai)
3243

33-
target_link_libraries(extension PRIVATE mpack PhpConfig zai)
34-
target_include_directories(extension PRIVATE ..)
44+
target_link_libraries(extension PRIVATE mpack PhpConfig zai rapidjson_appsec PCRE2::pcre2)
45+
target_include_directories(extension PRIVATE ${EXT_ROOT_INCLUDES})
3546

36-
# we don't have any C++ now, but just so we don't forget in the future...
47+
# gnu unique prevents shared libraries from being unloaded from memory by dlclose
3748
check_cxx_compiler_flag("-fno-gnu-unique" COMPILER_HAS_NO_GNU_UNIQUE)
3849
if(COMPILER_HAS_NO_GNU_UNIQUE)
3950
target_compile_options(extension PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-gnu-unique>)
4051
endif()
41-
target_compile_options(extension PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-rtti -fno-exceptions>)
52+
target_compile_options(extension PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++17 -fno-rtti -fno-exceptions>)
4253
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13)
4354
target_compile_options(extension PRIVATE -Wall)
4455
else()
45-
target_compile_options(extension PRIVATE -Wall -Wextra -pedantic -Werror -Wno-nullability-extension
46-
-Wno-gnu-zero-variadic-macro-arguments -Wno-gnu-auto-type -Wno-language-extension-token)
56+
target_compile_options(extension PRIVATE -Wall -Wextra $<$<COMPILE_LANGUAGE:C>:-pedantic>
57+
-Werror -Wno-nullability-extension -Wno-gnu-zero-variadic-macro-arguments
58+
-Wno-gnu-auto-type -Wno-language-extension-token
59+
$<$<COMPILE_LANGUAGE:CXX>:-Wno-missing-field-initializers>)
4760
endif()
4861
# our thread local variables are only used by ourselves
4962
target_compile_options(extension PRIVATE -ftls-model=local-dynamic)
@@ -60,6 +73,10 @@ target_linker_flag_conditional(extension "-Wl,--version-script=${CMAKE_CURRENT_S
6073
target_linker_flag_conditional(extension -flat_namespace "-undefined suppress")
6174
target_linker_flag_conditional(extension -Wl,-exported_symbol -Wl,_get_module)
6275

76+
if(DD_APPSEC_EXTENSION_STATIC_LIBSTDCXX AND NOT APPLE)
77+
target_link_options(extension PRIVATE -static-libstdc++)
78+
endif()
79+
6380
patch_away_libc(extension)
6481

6582
if(DD_APPSEC_TESTING)

appsec/cmake/helper.cmake

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
configure_file(src/helper/version.hpp.in ${CMAKE_CURRENT_SOURCE_DIR}/src/helper/version.hpp)
1+
configure_file(src/helper/version.hpp.in ${CMAKE_CURRENT_BINARY_DIR}/src/helper/version.hpp)
22

33
set(HELPER_SOURCE_DIR src/helper)
44
set(HELPER_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/helper)
5+
set(HELPER_BUILD_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/helper)
56

67
file(GLOB_RECURSE HELPER_SOURCE CONFIGURE_DEPENDS
78
${HELPER_SOURCE_DIR}/*.cpp ${HELPER_SOURCE_DIR}/*.c)
@@ -15,6 +16,7 @@ set_target_properties(helper_objects PROPERTIES
1516
POSITION_INDEPENDENT_CODE 1)
1617
target_include_directories(helper_objects
1718
INTERFACE ${HELPER_INCLUDE_DIR}
19+
PUBLIC ${HELPER_BUILD_INCLUDE_DIR}
1820
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../components-rs
1921
)
2022
target_compile_definitions(helper_objects PUBLIC SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE)

appsec/cmake/pcre2.cmake

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
if(NOT TARGET PCRE2::pcre2)
2+
find_library(PCRE2_LIBRARY NAMES pcre2-8 pcre2
3+
HINTS ${PhpConfig_ROOT_DIR}/lib ${PhpConfig_LIBRARY_DIRS})
4+
find_path(PCRE2_INCLUDE_DIR NAMES pcre2.h
5+
HINTS ${PhpConfig_ROOT_DIR}/include ${PhpConfig_INCLUDE_DIRS})
6+
7+
if(NOT PCRE2_LIBRARY)
8+
message(FATAL_ERROR "Could not find pcre2 library. Set PCRE2_ROOT to specify location.")
9+
endif()
10+
if(NOT PCRE2_INCLUDE_DIR)
11+
message(FATAL_ERROR "Could not find pcre2.h. Set PCRE2_ROOT to specify location.")
12+
endif()
13+
14+
message(STATUS "Found PCRE2 library: ${PCRE2_LIBRARY}")
15+
message(STATUS "Found PCRE2 include dir: ${PCRE2_INCLUDE_DIR}")
16+
17+
add_library(PCRE2::pcre2 UNKNOWN IMPORTED)
18+
set_target_properties(PCRE2::pcre2 PROPERTIES
19+
IMPORTED_LOCATION "${PCRE2_LIBRARY}"
20+
INTERFACE_INCLUDE_DIRECTORIES "${PCRE2_INCLUDE_DIR}")
21+
endif()

appsec/src/helper/network/proto.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
#include "../remote_config/settings.hpp"
1111
#include "../sidecar_settings.hpp"
1212
#include "../telemetry_settings.hpp"
13-
#include "../version.hpp"
1413
#include "msgpack_helpers.hpp"
1514
#include <msgpack.hpp>
1615
#include <optional>
1716
#include <sstream>
1817
#include <type_traits>
1918
#include <typeinfo>
19+
#include <version.hpp>
2020

2121
using stream_packer = msgpack::packer<std::stringstream>;
2222

0 commit comments

Comments
 (0)