-
Notifications
You must be signed in to change notification settings - Fork 49
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Generate messages in downstream builds #338
Changes from all commits
5ddcd8e
007512e
7467ace
b9ea260
64af2b5
de3daa3
ce3c64e
168ea5b
792f265
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,77 @@ | ||||||||||||||||
################################################## | ||||||||||||||||
# A function that calls protoc on a protobuf file | ||||||||||||||||
# Options: | ||||||||||||||||
# One value arguments: | ||||||||||||||||
# FACTORY_GEN_SCRIPT - Location of the factory generator script | ||||||||||||||||
# PROTO_PACKAGE - Protobuf package the file belongs to (e.g. ".gz.msgs") | ||||||||||||||||
# PROTOC_EXEC - Path to protoc | ||||||||||||||||
# INPUT_PROTO - Path to the input .proto file | ||||||||||||||||
# OUTPUT_CPP_DIR - Path where C++ files are saved | ||||||||||||||||
# OUTPUT_INCLUDES - A CMake variable name containing a list that the C++ header path should be appended to | ||||||||||||||||
# OUTPUT_CPP_HH_VAR - A CMake variable name containing a list that the C++ header path should be appended to | ||||||||||||||||
# OUTPUT_CPP_CC_VAR - A Cmake variable name containing a list that the C++ source path should be appended to | ||||||||||||||||
# Multi value arguments | ||||||||||||||||
# INPUT_PROTOS - Passed to protoc --proto_path | ||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. indent comment |
||||||||||||||||
# PROTO_PATH - Passed to protoc --proto_path | ||||||||||||||||
function(gz_msgs_factory) | ||||||||||||||||
set(options "") | ||||||||||||||||
set(oneValueArgs | ||||||||||||||||
FACTORY_GEN_SCRIPT | ||||||||||||||||
PROTO_PACKAGE | ||||||||||||||||
OUTPUT_CPP_DIR | ||||||||||||||||
OUTPUT_CPP_HH_VAR | ||||||||||||||||
OUTPUT_CPP_CC_VAR) | ||||||||||||||||
set(multiValueArgs INPUT_PROTOS PROTO_PATH) | ||||||||||||||||
|
||||||||||||||||
cmake_parse_arguments(gz_msgs_factory "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||||||||||||||||
|
||||||||||||||||
set(proto_package_dir ".") | ||||||||||||||||
if(gz_msgs_factory_PROTO_PACKAGE) | ||||||||||||||||
string(REPLACE "." "/" proto_package_dir ${gz_msgs_factory_PROTO_PACKAGE}) | ||||||||||||||||
endif() | ||||||||||||||||
|
||||||||||||||||
set(output_header "${gz_msgs_factory_OUTPUT_CPP_DIR}/${proto_package_dir}/MessageTypes.hh") | ||||||||||||||||
set(output_source "${gz_msgs_factory_OUTPUT_CPP_DIR}/${proto_package_dir}/register.cc") | ||||||||||||||||
|
||||||||||||||||
list(APPEND ${gz_msgs_factory_OUTPUT_CPP_HH_VAR} ${output_header}) | ||||||||||||||||
list(APPEND ${gz_msgs_factory_OUTPUT_CPP_CC_VAR} ${output_source}) | ||||||||||||||||
|
||||||||||||||||
list(APPEND output_files ${output_header}) | ||||||||||||||||
list(APPEND output_files ${output_source}) | ||||||||||||||||
|
||||||||||||||||
set(${gz_msgs_factory_OUTPUT_CPP_HH_VAR} ${${gz_msgs_factory_OUTPUT_CPP_HH_VAR}} PARENT_SCOPE) | ||||||||||||||||
set(${gz_msgs_factory_OUTPUT_CPP_CC_VAR} ${${gz_msgs_factory_OUTPUT_CPP_CC_VAR}} PARENT_SCOPE) | ||||||||||||||||
|
||||||||||||||||
set(depends_index) | ||||||||||||||||
|
||||||||||||||||
# Full path to an index file, which contains all defined message types for that proto file | ||||||||||||||||
foreach(proto_file ${generate_messages_MSGS_PROTOS}) | ||||||||||||||||
get_filename_component(FIL_WE ${proto_file} NAME_WE) | ||||||||||||||||
string(REPLACE "." "_" PACKAGE_UNDER ${gz_msgs_factory_PROTO_PACKAGE}) | ||||||||||||||||
string(REPLACE "." "_" MESSAGE_UNDER ${FIL_WE}) | ||||||||||||||||
set(input_index "${gz_msgs_factory_OUTPUT_CPP_DIR}/${PACKAGE_UNDER}_${MESSAGE_UNDER}.pb_index") | ||||||||||||||||
list(APPEND depends_index ${input_index}) | ||||||||||||||||
endforeach() | ||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
set(GENERATE_ARGS | ||||||||||||||||
Comment on lines
+54
to
+57
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||
--output-cpp-path "${gz_msgs_factory_OUTPUT_CPP_DIR}" | ||||||||||||||||
--proto-package "${gz_msgs_factory_PROTO_PACKAGE}" | ||||||||||||||||
--proto-path "${gz_msgs_factory_PROTO_PATH}" | ||||||||||||||||
--protos "${gz_msgs_factory_INPUT_PROTOS}" | ||||||||||||||||
) | ||||||||||||||||
|
||||||||||||||||
add_custom_command( | ||||||||||||||||
OUTPUT ${output_files} | ||||||||||||||||
COMMAND Python3::Interpreter | ||||||||||||||||
ARGS ${gz_msgs_factory_FACTORY_GEN_SCRIPT} ${GENERATE_ARGS} | ||||||||||||||||
DEPENDS | ||||||||||||||||
${depends_index} | ||||||||||||||||
Comment on lines
+68
to
+69
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. style
Suggested change
|
||||||||||||||||
# While the script is executed in the source directory, it does not write | ||||||||||||||||
# to the source tree. All outputs are stored in the build directory. | ||||||||||||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} | ||||||||||||||||
COMMENT "Running factory generator" | ||||||||||||||||
VERBATIM | ||||||||||||||||
) | ||||||||||||||||
|
||||||||||||||||
endfunction() |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,107 @@ | ||||||||||||||||||||||||
################################################## | ||||||||||||||||||||||||
# A function that calls protoc on a protobuf file | ||||||||||||||||||||||||
# Options: | ||||||||||||||||||||||||
# GENERATE_CPP - generates c++ code for the message if specified | ||||||||||||||||||||||||
# One value arguments: | ||||||||||||||||||||||||
# PROTO_PACKAGE - Protobuf package the file belongs to (e.g. ".gz.msgs") | ||||||||||||||||||||||||
# PROTOC_EXEC - Path to protoc | ||||||||||||||||||||||||
# INPUT_PROTO - Path to the input .proto file | ||||||||||||||||||||||||
# OUTPUT_CPP_DIR - Path where C++ files are saved | ||||||||||||||||||||||||
# OUTPUT_INCLUDES - A CMake variable name containing a list that the C++ header path should be appended to | ||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
# OUTPUT_CPP_HH_VAR - A CMake variable name containing a list that the C++ header path should be appended to | ||||||||||||||||||||||||
# OUTPUT_CPP_CC_VAR - A Cmake variable name containing a list that the C++ source path should be appended to | ||||||||||||||||||||||||
# Multi value arguments | ||||||||||||||||||||||||
# PROTO_PATH - Passed to protoc --proto_path | ||||||||||||||||||||||||
function(gz_msgs_protoc) | ||||||||||||||||||||||||
set(options GENERATE_CPP) | ||||||||||||||||||||||||
set(oneValueArgs | ||||||||||||||||||||||||
MSGS_GEN_SCRIPT | ||||||||||||||||||||||||
PROTO_PACKAGE | ||||||||||||||||||||||||
PROTOC_EXEC | ||||||||||||||||||||||||
GZ_PROTOC_PLUGIN | ||||||||||||||||||||||||
INPUT_PROTO | ||||||||||||||||||||||||
OUTPUT_CPP_DIR | ||||||||||||||||||||||||
OUTPUT_INCLUDES | ||||||||||||||||||||||||
OUTPUT_CPP_HH_VAR | ||||||||||||||||||||||||
OUTPUT_DETAIL_CPP_HH_VAR | ||||||||||||||||||||||||
OUTPUT_CPP_CC_VAR) | ||||||||||||||||||||||||
set(multiValueArgs PROTO_PATH DEPENDENCY_PROTO_PATHS) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
cmake_parse_arguments(gz_msgs_protoc "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
get_filename_component(ABS_FIL ${gz_msgs_protoc_INPUT_PROTO} ABSOLUTE) | ||||||||||||||||||||||||
get_filename_component(FIL_WE ${gz_msgs_protoc_INPUT_PROTO} NAME_WE) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
set(protoc_args) | ||||||||||||||||||||||||
set(output_files) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
set(proto_package_dir ".") | ||||||||||||||||||||||||
if(gz_msgs_protoc_PROTO_PACKAGE) | ||||||||||||||||||||||||
string(REPLACE "." "/" proto_package_dir ${gz_msgs_protoc_PROTO_PACKAGE}) | ||||||||||||||||||||||||
endif() | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
if(gz_msgs_protoc_GENERATE_CPP) | ||||||||||||||||||||||||
# Full path to generated header (${PROJECT_BINARY_DIR}/include/gz/msgs/foo.pb.h) | ||||||||||||||||||||||||
set(output_header "${gz_msgs_protoc_OUTPUT_CPP_DIR}/${proto_package_dir}/${FIL_WE}.pb.h") | ||||||||||||||||||||||||
# Full path to generated detail header (${PROJECT_BINARY_DIR}/include/gz/msgs/details/foo.pb.h) | ||||||||||||||||||||||||
set(output_detail_header "${gz_msgs_protoc_OUTPUT_CPP_DIR}/${proto_package_dir}/details/${FIL_WE}.pb.h") | ||||||||||||||||||||||||
# Full path to generated ignition header (${PROJECT_BINARY_DIR}/include/foo.pb.cc) | ||||||||||||||||||||||||
set(output_source "${gz_msgs_protoc_OUTPUT_CPP_DIR}/${proto_package_dir}/${FIL_WE}.pb.cc") | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
# Full path to an index file, which contains all defined message types for that proto file | ||||||||||||||||||||||||
string(REPLACE "." "_" PACKAGE_UNDER ${gz_msgs_protoc_PROTO_PACKAGE}) | ||||||||||||||||||||||||
string(REPLACE "." "_" MESSAGE_UNDER ${FIL_WE}) | ||||||||||||||||||||||||
set(output_index "${gz_msgs_protoc_OUTPUT_CPP_DIR}/${PACKAGE_UNDER}_${MESSAGE_UNDER}.pb_index") | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
# Generate a clean relative path (gz/msgs/foo.pb.h) | ||||||||||||||||||||||||
string(REPLACE "${PROJECT_BINARY_DIR}/include/" "" output_include ${output_header}) | ||||||||||||||||||||||||
list(APPEND ${gz_msgs_protoc_OUTPUT_INCLUDES} "${output_include}") | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
list(APPEND ${gz_msgs_protoc_OUTPUT_CPP_HH_VAR} ${output_header}) | ||||||||||||||||||||||||
list(APPEND ${gz_msgs_protoc_OUTPUT_CPP_CC_VAR} ${output_source}) | ||||||||||||||||||||||||
list(APPEND ${gz_msgs_protoc_OUTPUT_DETAIL_CPP_HH_VAR} ${output_detail_header}) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
list(APPEND output_files ${output_header}) | ||||||||||||||||||||||||
list(APPEND output_files ${output_detail_header}) | ||||||||||||||||||||||||
list(APPEND output_files ${output_source}) | ||||||||||||||||||||||||
list(APPEND output_files ${output_index}) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
set(${gz_msgs_protoc_OUTPUT_INCLUDES} ${${gz_msgs_protoc_OUTPUT_INCLUDES}} PARENT_SCOPE) | ||||||||||||||||||||||||
set(${gz_msgs_protoc_OUTPUT_DETAIL_CPP_HH_VAR} ${${gz_msgs_protoc_OUTPUT_DETAIL_CPP_HH_VAR}} PARENT_SCOPE) | ||||||||||||||||||||||||
set(${gz_msgs_protoc_OUTPUT_CPP_HH_VAR} ${${gz_msgs_protoc_OUTPUT_CPP_HH_VAR}} PARENT_SCOPE) | ||||||||||||||||||||||||
set(${gz_msgs_protoc_OUTPUT_CPP_CC_VAR} ${${gz_msgs_protoc_OUTPUT_CPP_CC_VAR}} PARENT_SCOPE) | ||||||||||||||||||||||||
endif() | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
set(GENERATE_ARGS | ||||||||||||||||||||||||
--protoc-exec "$<TARGET_FILE:${gz_msgs_protoc_PROTOC_EXEC}>" | ||||||||||||||||||||||||
--gz-generator-bin "${gz_msgs_protoc_GZ_PROTOC_PLUGIN}" | ||||||||||||||||||||||||
--proto-path "${gz_msgs_protoc_PROTO_PATH}" | ||||||||||||||||||||||||
--input-path "${ABS_FIL}" | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
if(gz_msgs_protoc_DEPENDENCY_PROTO_PATHS) | ||||||||||||||||||||||||
list(APPEND GENERATE_ARGS | ||||||||||||||||||||||||
--dependency-proto-paths "${gz_msgs_protoc_DEPENDENCY_PROTO_PATHS}" | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
endif() | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
if(${gz_msgs_protoc_GENERATE_CPP}) | ||||||||||||||||||||||||
list(APPEND GENERATE_ARGS | ||||||||||||||||||||||||
--generate-cpp | ||||||||||||||||||||||||
--output-cpp-path "${gz_msgs_protoc_OUTPUT_CPP_DIR}") | ||||||||||||||||||||||||
endif() | ||||||||||||||||||||||||
Comment on lines
+88
to
+92
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. style
Suggested change
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
add_custom_command( | ||||||||||||||||||||||||
OUTPUT ${output_files} | ||||||||||||||||||||||||
COMMAND Python3::Interpreter | ||||||||||||||||||||||||
ARGS ${gz_msgs_protoc_MSGS_GEN_SCRIPT} ${GENERATE_ARGS} | ||||||||||||||||||||||||
DEPENDS | ||||||||||||||||||||||||
${ABS_FIL} | ||||||||||||||||||||||||
Comment on lines
+98
to
+99
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. style
Suggested change
|
||||||||||||||||||||||||
# While the script is executed in the source directory, it does not write | ||||||||||||||||||||||||
# to the source tree. All outputs are stored in the build directory. | ||||||||||||||||||||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} | ||||||||||||||||||||||||
COMMENT "Running protoc on ${gz_msgs_protoc_INPUT_PROTO}" | ||||||||||||||||||||||||
VERBATIM | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
endfunction() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
gz_get_libsources_and_unittests(sources tests) | ||
|
||
add_subdirectory(include/gz/msgs) | ||
|
||
#gz_add_component(compiled SOURCES ${sources}) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. remove? |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
gz_install_all_headers() |
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,41 @@ | ||||||||||||||||
# Build a custom protoc plugin | ||||||||||||||||
################################################## | ||||||||||||||||
gz_add_executable(${PROJECT_NAME}_protoc_plugin | ||||||||||||||||
${CMAKE_CURRENT_SOURCE_DIR}/generator/Generator.cc | ||||||||||||||||
${CMAKE_CURRENT_SOURCE_DIR}/generator/generator_main.cc) | ||||||||||||||||
target_link_libraries(${PROJECT_NAME}_protoc_plugin | ||||||||||||||||
protobuf::libprotoc | ||||||||||||||||
protobuf::libprotobuf) | ||||||||||||||||
target_include_directories(${PROJECT_NAME}_protoc_plugin PRIVATE ${PROTOBUF_INCLUDE_DIR}) | ||||||||||||||||
target_compile_features(${PROJECT_NAME}_protoc_plugin PRIVATE ${GZ_CXX_11_FEATURES}) | ||||||||||||||||
|
||||||||||||||||
if (UNIX) | ||||||||||||||||
target_link_libraries(${PROJECT_NAME}_protoc_plugin pthread) | ||||||||||||||||
endif() | ||||||||||||||||
|
||||||||||||||||
install( | ||||||||||||||||
TARGETS ${PROJECT_NAME}_protoc_plugin | ||||||||||||||||
DESTINATION ${GZ_BIN_INSTALL_DIR}) | ||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
gz_get_libsources_and_unittests(sources tests) | ||||||||||||||||
Comment on lines
+18
to
+21
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||
|
||||||||||||||||
# Create the library target | ||||||||||||||||
gz_create_core_library( | ||||||||||||||||
SOURCES ${sources} | ||||||||||||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/DynamicFactory.cc | ||||||||||||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/MessageFactory.cc | ||||||||||||||||
) | ||||||||||||||||
|
||||||||||||||||
target_link_libraries(${PROJECT_LIBRARY_TARGET_NAME} | ||||||||||||||||
PUBLIC | ||||||||||||||||
protobuf::libprotobuf | ||||||||||||||||
gz-utils${GZ_UTILS_VER}::gz-utils${GZ_UTILS_VER} | ||||||||||||||||
) | ||||||||||||||||
|
||||||||||||||||
# Build the unit tests | ||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. remove? |
||||||||||||||||
#gz_build_tests( | ||||||||||||||||
# TYPE UNIT | ||||||||||||||||
# SOURCES ${tests}) | ||||||||||||||||
|
||||||||||||||||
add_subdirectory(include/gz/msgs) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
gz_install_all_headers() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.