Make them more flexible, reusable. This is a precursor to porting over python md provider code from another branch.
62 lines
2.5 KiB
CMake
62 lines
2.5 KiB
CMake
include_guard(GLOBAL)
|
|
|
|
function(protobuf_generate_cpp_config)
|
|
set(_options)
|
|
set(_one_value_args
|
|
PROTO_SOURCES_HEADER
|
|
PROTO_DEFAULTS_HEADER
|
|
)
|
|
set(_multi_value_args
|
|
PROTO_SOURCES
|
|
PROTO_DEFAULTS
|
|
)
|
|
cmake_parse_arguments(_ARGS "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
|
|
|
|
# Configure the 'config_proto_files' header. It provides an array of strings populated with the
|
|
# files in PROTO_SOURCES. At runtime, we use this array to generate a special 'config' proto
|
|
# message with fields for each message defined in said files. A global instance of this 'config'
|
|
# proto is then constructed, and populated with [compile-time] defaults, and [runtime] overrides
|
|
# (i.e., in spark.conf). Calls to `bts::config::get<T>()` retrieve the value from the field
|
|
# associated with type `T` in this global instance.
|
|
message(STATUS "PROTO_SOURCES: ${_ARGS_PROTO_SOURCES}")
|
|
message(STATUS "PROTO_SOURCES_HEADER: ${_ARGS_PROTO_SOURCES_HEADER}")
|
|
message(STATUS "PROTO_DEFAULTS_HEADER: ${_ARGS_PROTO_DEFAULTS_HEADER}")
|
|
if (_ARGS_PROTO_SOURCES_HEADER)
|
|
set(PROTO_SOURCES)
|
|
set(PROTO_SOURCES_CXX_ARRAY_ITEMS "")
|
|
foreach(_proto_path ${_ARGS_PROTO_SOURCES})
|
|
list(APPEND PROTO_SOURCES ${_proto_path})
|
|
string(APPEND PROTO_SOURCES_CXX_ARRAY_ITEMS "\"${_proto_path}\",\n")
|
|
endforeach()
|
|
list(LENGTH PROTO_SOURCES PROTO_SOURCES_LENGTH)
|
|
message(STATUS "CONFIGURING PROTO_SOURCES_HEADER): ${_ARGS_PROTO_SOURCES_HEADER}")
|
|
configure_file(${CMAKE_SOURCE_DIR}/cmake/config_proto_files.h.in ${_ARGS_PROTO_SOURCES_HEADER})
|
|
endif()
|
|
|
|
# Generate static defaults. Ideally, this would be a single string, but we use an array because
|
|
# the compiler complains if the string is longer than 65k.
|
|
set(_cfg_defaults_str "inline const char * config_static_defaults[] = { ")
|
|
|
|
foreach(_cfg_file_path ${_ARGS_PROTO_DEFAULTS})
|
|
file(READ ${_cfg_file_path} _cfg_file_content)
|
|
string(REPLACE "\"" "\\\"" _cfg_file_content_escaped ${_cfg_file_content})
|
|
string(REPLACE "\n" ";" _cfg_lines ${_cfg_file_content_escaped})
|
|
|
|
foreach(_line ${_cfg_lines})
|
|
string(APPEND _cfg_defaults_str "\n \"${_line}\",")
|
|
endforeach(_line)
|
|
endforeach(_cfg_file_path)
|
|
|
|
string(APPEND _cfg_defaults_str "};")
|
|
set(_old_cfg_defaults_str "")
|
|
|
|
if(EXISTS ${_ARGS_PROTO_DEFAULTS_HEADER})
|
|
file(READ ${_ARGS_PROTO_DEFAULTS_HEADER} _old_cfg_defaults_str)
|
|
endif()
|
|
|
|
if(NOT _cfg_defaults_str STREQUAL _old_cfg_defaults_str)
|
|
file(WRITE "${_ARGS_PROTO_DEFAULTS_HEADER}" "${_cfg_defaults_str}")
|
|
endif()
|
|
endfunction()
|
|
|