-
Notifications
You must be signed in to change notification settings - Fork 60
/
BifCl.cmake
141 lines (121 loc) · 6.97 KB
/
BifCl.cmake
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
if (NOT TARGET Zeek::BifCl)
message(FATAL_ERROR "BifCl.cmake needs Zeek::BifCl")
endif ()
# A macro to define a command that uses the BIF compiler to produce C++
# segments and Zeek language declarations from a .bif file. The outputs
# are returned in BIF_OUTPUT_{CC,H,BRO}. By default, it runs bifcl in
# alternative mode (-a; suitable for standalone compilation). If
# an additional parameter "standard" is given, it runs it in standard mode
# for inclusion in NetVar.*. If an additional parameter "plugin" is given,
# it runs it in plugin mode (-p). In the latter case, one more argument
# is required with the plugin's name.
#
# The macro also creates a target that can be used to define depencencies on
# the generated files. The name of the target depends on the mode and includes
# a normalized path to the input bif to make it unique. The target is added
# automatically to bro_ALL_GENERATED_OUTPUTS.
macro (bif_target bifInput)
set(target "")
get_filename_component(bifInputBasename "${bifInput}" NAME)
set(BRO_PLUGIN_LIB "${CMAKE_CURRENT_BINARY_DIR}/lib")
set(BRO_PLUGIN_BIF "${BRO_PLUGIN_LIB}/bif")
if ("${ARGV1}" STREQUAL "standard")
set(bifcl_args "")
set(target "bif-std-${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}")
set(bifOutputs
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.func_def
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.func_h
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.func_init
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.netvar_def
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.netvar_h
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.netvar_init)
set(BIF_OUTPUT_CC ${bifInputBasename}.func_def ${bifInputBasename}.func_init
${bifInputBasename}.netvar_def ${bifInputBasename}.netvar_init)
set(BIF_OUTPUT_H ${bifInputBasename}.func_h ${bifInputBasename}.netvar_h)
set(BIF_OUTPUT_BRO ${CMAKE_BINARY_DIR}/scripts/base/bif/${bifInputBasename}.zeek)
# Register this BIF in the base BIFs load script.
file(APPEND "${CMAKE_BINARY_DIR}/scripts/base/bif/__load__.zeek"
"@load ./${bifInputBasename}.zeek\n")
# Do this here so that all of the necessary files for each individual BIF get added to clang-tidy
add_clang_tidy_files(${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.func_def)
elseif ("${ARGV1}" STREQUAL "plugin")
set(plugin_name ${ARGV2})
set(plugin_name_canon ${ARGV3})
set(plugin_is_static ${ARGV4})
set(target "bif-plugin-${plugin_name_canon}-${bifInputBasename}")
set(bifcl_args "-p;${plugin_name}")
set(bifOutputs
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.h
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.cc
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.init.cc
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.register.cc)
if (plugin_is_static)
set(BIF_OUTPUT_CC ${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.cc
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.init.cc)
# Register the generated C++ files.
file(APPEND "${CMAKE_BINARY_DIR}/src/__all__.bif.cc"
"#include \"${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.register.cc\"\n")
else ()
set(BIF_OUTPUT_CC
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.cc
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.init.cc
${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.register.cc)
endif ()
# Do this here so that all of the necessary files for each individual BIF get added to clang-tidy
foreach (bif_cc_file ${BIF_OUTPUT_CC})
add_clang_tidy_files(${CMAKE_CURRENT_BINARY_DIR}/${bif_cc_file})
endforeach (bif_cc_file)
set(BIF_OUTPUT_H ${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.h)
if (NOT ZEEK_PLUGIN_BUILD_DYNAMIC)
set(BIF_OUTPUT_BRO
${CMAKE_BINARY_DIR}/scripts/base/bif/plugins/${plugin_name_canon}.${bifInputBasename}.zeek
)
# Register this BIF in the plugins BIFs load script.
file(APPEND "${CMAKE_BINARY_DIR}/scripts/base/bif/plugins/__load__.zeek"
"@load ./${plugin_name_canon}.${bifInputBasename}.zeek\n")
else ()
set(BIF_OUTPUT_BRO ${BRO_PLUGIN_BIF}/${bifInputBasename}.zeek)
endif ()
else ()
# Alternative mode. These will get compiled in automatically.
set(bifcl_args "-s")
set(target "bif-alt-${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}")
set(bifOutputs ${bifInputBasename}.h ${bifInputBasename}.cc ${bifInputBasename}.init.cc)
set(BIF_OUTPUT_CC ${bifInputBasename}.cc)
set(BIF_OUTPUT_H ${bifInputBasename}.h)
# Do this here so that all of the necessary files for each individual BIF get added to clang-tidy
foreach (bif_cc_file ${BIF_OUTPUT_CC})
add_clang_tidy_files(${CMAKE_CURRENT_BINARY_DIR}/${bif_cc_file})
endforeach (bif_cc_file)
# In order be able to run Zeek from the build directory, the
# generated Zeek script needs to be inside a directory tree
# named the same way it will be referenced from an @load.
set(BIF_OUTPUT_BRO ${CMAKE_BINARY_DIR}/scripts/base/bif/${bifInputBasename}.zeek)
# Register this BIF in the builtin-plugins BIFs load script.
file(APPEND "${CMAKE_BINARY_DIR}/scripts/base/bif/__load__.zeek"
"@load ./${bifInputBasename}.zeek\n")
# Register the generated C++ files.
file(APPEND "${CMAKE_BINARY_DIR}/src/__all__.bif.cc"
"#include \"${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.cc\"\n")
file(APPEND "${CMAKE_BINARY_DIR}/src/__all__.bif.init.cc"
"#include \"${CMAKE_CURRENT_BINARY_DIR}/${bifInputBasename}.init.cc\"\n")
endif ()
# Make sure to escape a bunch of special characters in the path before trying to use it as a
# regular expression below.
string(REGEX REPLACE "([][+.*()^])" "\\\\\\1" escaped_path "${CMAKE_BINARY_DIR}/src/")
string(REGEX REPLACE "${escaped_path}" "" target "${target}")
string(REGEX REPLACE "/" "-" target "${target}")
string(REGEX REPLACE ":" "" target "${target}")
add_custom_command(
OUTPUT ${bifOutputs} ${BIF_OUTPUT_BRO}
COMMAND Zeek::BifCl ${bifcl_args} ${CMAKE_CURRENT_SOURCE_DIR}/${bifInput}
COMMAND "${CMAKE_COMMAND}" -E copy ${bifInputBasename}.zeek ${BIF_OUTPUT_BRO}
COMMAND "${CMAKE_COMMAND}" -E remove -f ${bifInputBasename}.zeek
DEPENDS ${bifInput} Zeek::BifCl
COMMENT "[BIFCL] Processing ${CMAKE_CURRENT_SOURCE_DIR}/${bifInput}")
add_custom_target(${target} DEPENDS ${bifOutputs} ${BIF_OUTPUT_BRO})
if (ZEEK_PLUGIN_INTERNAL_BUILD)
# Note: target is defined in Zeek's top-level CMake.
add_dependencies(zeek_autogen_files ${target})
endif ()
endmacro (bif_target)