1
# Copyright (c) 2014-present, The osquery authors
3
# This source code is licensed as defined by the LICENSE file found in the
4
# root directory of this source tree.
6
# SPDX-License-Identifier: (Apache-2.0 OR GPL-2.0-only)
8
# This function takes the global properties saved by addOsqueryExtensionEx and
9
# generates a single extension executable containing all the user code
10
function(generateOsqueryExtensionGroup)
11
get_property(extension_source_files GLOBAL PROPERTY OSQUERY_EXTENSION_GROUP_SOURCES)
12
if("${extension_source_files}" STREQUAL "")
16
if(DEFINED ENV{OSQUERY_EXTENSION_GROUP_NAME} OR ENV{OSQUERY_EXTENSION_GROUP_VERSION})
17
message(WARNING "ENV {OSQUERY_EXTENSION_GROUP_NAME/VERSION} has been deprecated. Please set cache variable!")
20
set(OSQUERY_EXTENSION_GROUP_NAME "osquery_extension_group" CACHE STRING "Overrides osquery extension group name")
22
set(OSQUERY_EXTENSION_GROUP_VERSION "1.0" CACHE STRING "Overrides osquery extension group version")
24
# Build the include list; this contains the files required to declare
25
# the classes used in the REGISTER_EXTERNAL directives
26
# Note: The variables in uppercase are used by the template
27
get_property(main_include_list GLOBAL PROPERTY OSQUERY_EXTENSION_GROUP_MAIN_INCLUDES)
28
foreach(include_file ${main_include_list})
29
set(OSQUERY_EXTENSION_GROUP_INCLUDES "${OSQUERY_EXTENSION_GROUP_INCLUDES}\n#include <${include_file}>")
32
# We need to generate the main.cpp file, containing all the required REGISTER_EXTERNAL directives
33
get_property(OSQUERY_EXTENSION_GROUP_INITIALIZERS GLOBAL PROPERTY OSQUERY_EXTENSION_GROUP_INITIALIZERS)
35
"${CMAKE_SOURCE_DIR}/tools/codegen/templates/osquery_extension_group_main.cpp.in"
36
"${CMAKE_CURRENT_BINARY_DIR}/osquery_extension_group_main.cpp"
39
# Extensions can no longer control which compilation flags to use here (as they are shared) so
40
# we are going to enforce sane defaults
41
if(DEFINED PLATFORM_POSIX)
42
set(extension_cxx_flags -DBOOST_ASIO_DISABLE_STD_STRING_VIEW)
44
set(extension_cxx_flags /W4)
47
# Generate the extension target
48
add_executable("${OSQUERY_EXTENSION_GROUP_NAME}"
49
"${CMAKE_CURRENT_BINARY_DIR}/osquery_extension_group_main.cpp"
50
${extension_source_files}
53
set_property(TARGET "${OSQUERY_EXTENSION_GROUP_NAME}" PROPERTY INCLUDE_DIRECTORIES "")
54
target_compile_options("${OSQUERY_EXTENSION_GROUP_NAME}" PRIVATE ${extension_cxx_flags})
56
target_link_libraries("${OSQUERY_EXTENSION_GROUP_NAME}" PRIVATE
60
if(DEFINED PLATFORM_LINUX)
61
target_link_libraries("${OSQUERY_EXTENSION_GROUP_NAME}" PRIVATE
66
set_target_properties("${OSQUERY_EXTENSION_GROUP_NAME}" PROPERTIES
67
OUTPUT_NAME "${OSQUERY_EXTENSION_GROUP_NAME}.ext"
70
get_property(include_folder_list GLOBAL PROPERTY OSQUERY_EXTENSION_GROUP_INCLUDE_FOLDERS)
71
if(NOT "${include_folder_list}" STREQUAL "")
72
target_include_directories("${OSQUERY_EXTENSION_GROUP_NAME}" PRIVATE ${include_folder_list})
75
# Apply the user (extension) settings
76
get_property(library_list GLOBAL PROPERTY OSQUERY_EXTENSION_GROUP_LIBRARIES)
77
if(NOT "${library_list}" STREQUAL "")
78
target_link_libraries("${OSQUERY_EXTENSION_GROUP_NAME}" PRIVATE ${library_list})
82
function(addOsqueryExtensionEx class_name extension_type extension_name ${ARGN})
83
# Make sure the extension type is valid
84
if(NOT "${extension_type}" STREQUAL "config" AND NOT "${extension_type}" STREQUAL "table")
85
message(FATAL_ERROR "Invalid extension type specified")
88
# Update the initializer list; this will be added to the main.cpp file of the extension group
89
set_property(GLOBAL APPEND_STRING PROPERTY
90
OSQUERY_EXTENSION_GROUP_INITIALIZERS
91
"REGISTER_EXTERNAL(${class_name}, \"${extension_type}\", \"${extension_name}\");\n"
94
# Loop through each argument
95
foreach(argument ${ARGN})
96
if("${argument}" STREQUAL "SOURCES" OR "${argument}" STREQUAL "LIBRARIES" OR
97
"${argument}" STREQUAL "INCLUDEDIRS" OR "${argument}" STREQUAL "MAININCLUDES")
98
set(current_scope "${argument}")
102
if("${current_scope}" STREQUAL "SOURCES")
103
if(NOT IS_ABSOLUTE "${argument}")
104
set(argument "${CMAKE_CURRENT_SOURCE_DIR}/${argument}")
106
list(APPEND source_file_list "${argument}")
108
elseif("${current_scope}" STREQUAL "INCLUDEDIRS")
109
if(NOT IS_ABSOLUTE "${argument}")
110
set(argument "${CMAKE_CURRENT_SOURCE_DIR}/${argument}")
112
list(APPEND include_folder_list "${argument}")
114
elseif("${current_scope}" STREQUAL "LIBRARIES")
115
list(APPEND library_list "${argument}")
117
elseif("${current_scope}" STREQUAL "MAININCLUDES")
118
list(APPEND main_include_list "${argument}")
120
message(FATAL_ERROR "Invalid scope")
124
# Validate the arguments
125
if("${source_file_list}" STREQUAL "")
126
message(FATAL_ERROR "Source files are missing")
129
if("${main_include_list}" STREQUAL "")
130
message(FATAL_ERROR "The main include list is missing")
133
# Update the global properties
134
set_property(GLOBAL APPEND PROPERTY OSQUERY_EXTENSION_GROUP_SOURCES
138
set_property(GLOBAL APPEND PROPERTY OSQUERY_EXTENSION_GROUP_MAIN_INCLUDES
142
if(NOT "${library_list}" STREQUAL "")
143
set_property(GLOBAL APPEND PROPERTY OSQUERY_EXTENSION_GROUP_LIBRARIES
148
if(NOT "${include_folder_list}" STREQUAL "")
149
set_property(GLOBAL APPEND PROPERTY OSQUERY_EXTENSION_GROUP_INCLUDE_FOLDERS
150
${include_folder_list}
155
function(add_osquery_extension_ex class_name extension_type extension_name ${ARGN})
156
message(WARNING "add_osquery_extension_ex has been deprecated. Please use addOsqueryExtensionEx!")
157
addOsqueryExtensionEx(${class_name} ${extension_type} ${extension_name} ${ARGN})
160
function(addOsqueryExtension TARGET)
161
add_executable(${TARGET} ${ARGN})
162
set_target_properties(${TARGET} PROPERTIES OUTPUT_NAME "${TARGET}.ext")
163
target_link_libraries(${TARGET} PRIVATE