1*1b3f573fSAndroid Build Coastguard Worker# User options 2*1b3f573fSAndroid Build Coastguard Workerinclude("${CMAKE_CURRENT_LIST_DIR}/protobuf-options.cmake") 3*1b3f573fSAndroid Build Coastguard Worker 4*1b3f573fSAndroid Build Coastguard Worker# Depend packages 5*1b3f573fSAndroid Build Coastguard Worker@_protobuf_FIND_ZLIB@ 6*1b3f573fSAndroid Build Coastguard Worker 7*1b3f573fSAndroid Build Coastguard Worker# Imported targets 8*1b3f573fSAndroid Build Coastguard Workerinclude("${CMAKE_CURRENT_LIST_DIR}/protobuf-targets.cmake") 9*1b3f573fSAndroid Build Coastguard Worker 10*1b3f573fSAndroid Build Coastguard Workerfunction(protobuf_generate) 11*1b3f573fSAndroid Build Coastguard Worker include(CMakeParseArguments) 12*1b3f573fSAndroid Build Coastguard Worker 13*1b3f573fSAndroid Build Coastguard Worker set(_options APPEND_PATH) 14*1b3f573fSAndroid Build Coastguard Worker set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO PROTOC_OUT_DIR PLUGIN PLUGIN_OPTIONS) 15*1b3f573fSAndroid Build Coastguard Worker if(COMMAND target_sources) 16*1b3f573fSAndroid Build Coastguard Worker list(APPEND _singleargs TARGET) 17*1b3f573fSAndroid Build Coastguard Worker endif() 18*1b3f573fSAndroid Build Coastguard Worker set(_multiargs PROTOS IMPORT_DIRS GENERATE_EXTENSIONS PROTOC_OPTIONS) 19*1b3f573fSAndroid Build Coastguard Worker 20*1b3f573fSAndroid Build Coastguard Worker cmake_parse_arguments(protobuf_generate "${_options}" "${_singleargs}" "${_multiargs}" "${ARGN}") 21*1b3f573fSAndroid Build Coastguard Worker 22*1b3f573fSAndroid Build Coastguard Worker if(NOT protobuf_generate_PROTOS AND NOT protobuf_generate_TARGET) 23*1b3f573fSAndroid Build Coastguard Worker message(SEND_ERROR "Error: protobuf_generate called without any targets or source files") 24*1b3f573fSAndroid Build Coastguard Worker return() 25*1b3f573fSAndroid Build Coastguard Worker endif() 26*1b3f573fSAndroid Build Coastguard Worker 27*1b3f573fSAndroid Build Coastguard Worker if(NOT protobuf_generate_OUT_VAR AND NOT protobuf_generate_TARGET) 28*1b3f573fSAndroid Build Coastguard Worker message(SEND_ERROR "Error: protobuf_generate called without a target or output variable") 29*1b3f573fSAndroid Build Coastguard Worker return() 30*1b3f573fSAndroid Build Coastguard Worker endif() 31*1b3f573fSAndroid Build Coastguard Worker 32*1b3f573fSAndroid Build Coastguard Worker if(NOT protobuf_generate_LANGUAGE) 33*1b3f573fSAndroid Build Coastguard Worker set(protobuf_generate_LANGUAGE cpp) 34*1b3f573fSAndroid Build Coastguard Worker endif() 35*1b3f573fSAndroid Build Coastguard Worker string(TOLOWER ${protobuf_generate_LANGUAGE} protobuf_generate_LANGUAGE) 36*1b3f573fSAndroid Build Coastguard Worker 37*1b3f573fSAndroid Build Coastguard Worker if(NOT protobuf_generate_PROTOC_OUT_DIR) 38*1b3f573fSAndroid Build Coastguard Worker set(protobuf_generate_PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) 39*1b3f573fSAndroid Build Coastguard Worker endif() 40*1b3f573fSAndroid Build Coastguard Worker 41*1b3f573fSAndroid Build Coastguard Worker if(protobuf_generate_EXPORT_MACRO AND protobuf_generate_LANGUAGE STREQUAL cpp) 42*1b3f573fSAndroid Build Coastguard Worker set(_dll_export_decl "dllexport_decl=${protobuf_generate_EXPORT_MACRO}") 43*1b3f573fSAndroid Build Coastguard Worker endif() 44*1b3f573fSAndroid Build Coastguard Worker 45*1b3f573fSAndroid Build Coastguard Worker foreach(_option ${_dll_export_decl} ${protobuf_generate_PLUGIN_OPTIONS}) 46*1b3f573fSAndroid Build Coastguard Worker # append comma - not using CMake lists and string replacement as users 47*1b3f573fSAndroid Build Coastguard Worker # might have semicolons in options 48*1b3f573fSAndroid Build Coastguard Worker if(_plugin_options) 49*1b3f573fSAndroid Build Coastguard Worker set( _plugin_options "${_plugin_options},") 50*1b3f573fSAndroid Build Coastguard Worker endif() 51*1b3f573fSAndroid Build Coastguard Worker set(_plugin_options "${_plugin_options}${_option}") 52*1b3f573fSAndroid Build Coastguard Worker endforeach() 53*1b3f573fSAndroid Build Coastguard Worker 54*1b3f573fSAndroid Build Coastguard Worker if(protobuf_generate_PLUGIN) 55*1b3f573fSAndroid Build Coastguard Worker set(_plugin "--plugin=${protobuf_generate_PLUGIN}") 56*1b3f573fSAndroid Build Coastguard Worker endif() 57*1b3f573fSAndroid Build Coastguard Worker 58*1b3f573fSAndroid Build Coastguard Worker if(NOT protobuf_generate_GENERATE_EXTENSIONS) 59*1b3f573fSAndroid Build Coastguard Worker if(protobuf_generate_LANGUAGE STREQUAL cpp) 60*1b3f573fSAndroid Build Coastguard Worker set(protobuf_generate_GENERATE_EXTENSIONS .pb.h .pb.cc) 61*1b3f573fSAndroid Build Coastguard Worker elseif(protobuf_generate_LANGUAGE STREQUAL python) 62*1b3f573fSAndroid Build Coastguard Worker set(protobuf_generate_GENERATE_EXTENSIONS _pb2.py) 63*1b3f573fSAndroid Build Coastguard Worker else() 64*1b3f573fSAndroid Build Coastguard Worker message(SEND_ERROR "Error: protobuf_generate given unknown Language ${LANGUAGE}, please provide a value for GENERATE_EXTENSIONS") 65*1b3f573fSAndroid Build Coastguard Worker return() 66*1b3f573fSAndroid Build Coastguard Worker endif() 67*1b3f573fSAndroid Build Coastguard Worker endif() 68*1b3f573fSAndroid Build Coastguard Worker 69*1b3f573fSAndroid Build Coastguard Worker if(protobuf_generate_TARGET) 70*1b3f573fSAndroid Build Coastguard Worker get_target_property(_source_list ${protobuf_generate_TARGET} SOURCES) 71*1b3f573fSAndroid Build Coastguard Worker foreach(_file ${_source_list}) 72*1b3f573fSAndroid Build Coastguard Worker if(_file MATCHES "proto$") 73*1b3f573fSAndroid Build Coastguard Worker list(APPEND protobuf_generate_PROTOS ${_file}) 74*1b3f573fSAndroid Build Coastguard Worker endif() 75*1b3f573fSAndroid Build Coastguard Worker endforeach() 76*1b3f573fSAndroid Build Coastguard Worker endif() 77*1b3f573fSAndroid Build Coastguard Worker 78*1b3f573fSAndroid Build Coastguard Worker if(NOT protobuf_generate_PROTOS) 79*1b3f573fSAndroid Build Coastguard Worker message(SEND_ERROR "Error: protobuf_generate could not find any .proto files") 80*1b3f573fSAndroid Build Coastguard Worker return() 81*1b3f573fSAndroid Build Coastguard Worker endif() 82*1b3f573fSAndroid Build Coastguard Worker 83*1b3f573fSAndroid Build Coastguard Worker if(protobuf_generate_APPEND_PATH) 84*1b3f573fSAndroid Build Coastguard Worker # Create an include path for each file specified 85*1b3f573fSAndroid Build Coastguard Worker foreach(_file ${protobuf_generate_PROTOS}) 86*1b3f573fSAndroid Build Coastguard Worker get_filename_component(_abs_file ${_file} ABSOLUTE) 87*1b3f573fSAndroid Build Coastguard Worker get_filename_component(_abs_dir ${_abs_file} DIRECTORY) 88*1b3f573fSAndroid Build Coastguard Worker list(FIND _protobuf_include_path ${_abs_dir} _contains_already) 89*1b3f573fSAndroid Build Coastguard Worker if(${_contains_already} EQUAL -1) 90*1b3f573fSAndroid Build Coastguard Worker list(APPEND _protobuf_include_path -I ${_abs_dir}) 91*1b3f573fSAndroid Build Coastguard Worker endif() 92*1b3f573fSAndroid Build Coastguard Worker endforeach() 93*1b3f573fSAndroid Build Coastguard Worker endif() 94*1b3f573fSAndroid Build Coastguard Worker 95*1b3f573fSAndroid Build Coastguard Worker foreach(DIR ${protobuf_generate_IMPORT_DIRS}) 96*1b3f573fSAndroid Build Coastguard Worker get_filename_component(ABS_PATH ${DIR} ABSOLUTE) 97*1b3f573fSAndroid Build Coastguard Worker list(FIND _protobuf_include_path ${ABS_PATH} _contains_already) 98*1b3f573fSAndroid Build Coastguard Worker if(${_contains_already} EQUAL -1) 99*1b3f573fSAndroid Build Coastguard Worker list(APPEND _protobuf_include_path -I ${ABS_PATH}) 100*1b3f573fSAndroid Build Coastguard Worker endif() 101*1b3f573fSAndroid Build Coastguard Worker endforeach() 102*1b3f573fSAndroid Build Coastguard Worker 103*1b3f573fSAndroid Build Coastguard Worker if(NOT _protobuf_include_path) 104*1b3f573fSAndroid Build Coastguard Worker set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR}) 105*1b3f573fSAndroid Build Coastguard Worker endif() 106*1b3f573fSAndroid Build Coastguard Worker 107*1b3f573fSAndroid Build Coastguard Worker set(_generated_srcs_all) 108*1b3f573fSAndroid Build Coastguard Worker foreach(_proto ${protobuf_generate_PROTOS}) 109*1b3f573fSAndroid Build Coastguard Worker get_filename_component(_abs_file ${_proto} ABSOLUTE) 110*1b3f573fSAndroid Build Coastguard Worker get_filename_component(_abs_dir ${_abs_file} DIRECTORY) 111*1b3f573fSAndroid Build Coastguard Worker 112*1b3f573fSAndroid Build Coastguard Worker get_filename_component(_file_full_name ${_proto} NAME) 113*1b3f573fSAndroid Build Coastguard Worker string(FIND "${_file_full_name}" "." _file_last_ext_pos REVERSE) 114*1b3f573fSAndroid Build Coastguard Worker string(SUBSTRING "${_file_full_name}" 0 ${_file_last_ext_pos} _basename) 115*1b3f573fSAndroid Build Coastguard Worker 116*1b3f573fSAndroid Build Coastguard Worker set(_suitable_include_found FALSE) 117*1b3f573fSAndroid Build Coastguard Worker foreach(DIR ${_protobuf_include_path}) 118*1b3f573fSAndroid Build Coastguard Worker if(NOT DIR STREQUAL "-I") 119*1b3f573fSAndroid Build Coastguard Worker file(RELATIVE_PATH _rel_dir ${DIR} ${_abs_dir}) 120*1b3f573fSAndroid Build Coastguard Worker string(FIND "${_rel_dir}" "../" _is_in_parent_folder) 121*1b3f573fSAndroid Build Coastguard Worker if (NOT ${_is_in_parent_folder} EQUAL 0) 122*1b3f573fSAndroid Build Coastguard Worker set(_suitable_include_found TRUE) 123*1b3f573fSAndroid Build Coastguard Worker break() 124*1b3f573fSAndroid Build Coastguard Worker endif() 125*1b3f573fSAndroid Build Coastguard Worker endif() 126*1b3f573fSAndroid Build Coastguard Worker endforeach() 127*1b3f573fSAndroid Build Coastguard Worker 128*1b3f573fSAndroid Build Coastguard Worker if(NOT _suitable_include_found) 129*1b3f573fSAndroid Build Coastguard Worker message(SEND_ERROR "Error: protobuf_generate could not find any correct proto include directory.") 130*1b3f573fSAndroid Build Coastguard Worker return() 131*1b3f573fSAndroid Build Coastguard Worker endif() 132*1b3f573fSAndroid Build Coastguard Worker 133*1b3f573fSAndroid Build Coastguard Worker set(_generated_srcs) 134*1b3f573fSAndroid Build Coastguard Worker foreach(_ext ${protobuf_generate_GENERATE_EXTENSIONS}) 135*1b3f573fSAndroid Build Coastguard Worker list(APPEND _generated_srcs "${protobuf_generate_PROTOC_OUT_DIR}/${_rel_dir}/${_basename}${_ext}") 136*1b3f573fSAndroid Build Coastguard Worker endforeach() 137*1b3f573fSAndroid Build Coastguard Worker list(APPEND _generated_srcs_all ${_generated_srcs}) 138*1b3f573fSAndroid Build Coastguard Worker 139*1b3f573fSAndroid Build Coastguard Worker set(_comment "Running ${protobuf_generate_LANGUAGE} protocol buffer compiler on ${_proto}") 140*1b3f573fSAndroid Build Coastguard Worker if(protobuf_generate_PROTOC_OPTIONS) 141*1b3f573fSAndroid Build Coastguard Worker set(_comment "${_comment}, protoc-options: ${protobuf_generate_PROTOC_OPTIONS}") 142*1b3f573fSAndroid Build Coastguard Worker endif() 143*1b3f573fSAndroid Build Coastguard Worker if(_plugin_options) 144*1b3f573fSAndroid Build Coastguard Worker set(_comment "${_comment}, plugin-options: ${_plugin_options}") 145*1b3f573fSAndroid Build Coastguard Worker endif() 146*1b3f573fSAndroid Build Coastguard Worker 147*1b3f573fSAndroid Build Coastguard Worker add_custom_command( 148*1b3f573fSAndroid Build Coastguard Worker OUTPUT ${_generated_srcs} 149*1b3f573fSAndroid Build Coastguard Worker COMMAND protobuf::protoc 150*1b3f573fSAndroid Build Coastguard Worker ARGS ${protobuf_generate_PROTOC_OPTIONS} --${protobuf_generate_LANGUAGE}_out ${_plugin_options}:${protobuf_generate_PROTOC_OUT_DIR} ${_plugin} ${_protobuf_include_path} ${_abs_file} 151*1b3f573fSAndroid Build Coastguard Worker DEPENDS ${_abs_file} protobuf::protoc 152*1b3f573fSAndroid Build Coastguard Worker COMMENT ${_comment} 153*1b3f573fSAndroid Build Coastguard Worker VERBATIM ) 154*1b3f573fSAndroid Build Coastguard Worker endforeach() 155*1b3f573fSAndroid Build Coastguard Worker 156*1b3f573fSAndroid Build Coastguard Worker set_source_files_properties(${_generated_srcs_all} PROPERTIES GENERATED TRUE) 157*1b3f573fSAndroid Build Coastguard Worker if(protobuf_generate_OUT_VAR) 158*1b3f573fSAndroid Build Coastguard Worker set(${protobuf_generate_OUT_VAR} ${_generated_srcs_all} PARENT_SCOPE) 159*1b3f573fSAndroid Build Coastguard Worker endif() 160*1b3f573fSAndroid Build Coastguard Worker if(protobuf_generate_TARGET) 161*1b3f573fSAndroid Build Coastguard Worker target_sources(${protobuf_generate_TARGET} PRIVATE ${_generated_srcs_all}) 162*1b3f573fSAndroid Build Coastguard Worker endif() 163*1b3f573fSAndroid Build Coastguard Worker 164*1b3f573fSAndroid Build Coastguard Workerendfunction() 165*1b3f573fSAndroid Build Coastguard Worker 166*1b3f573fSAndroid Build Coastguard Worker# CMake FindProtobuf module compatible file 167*1b3f573fSAndroid Build Coastguard Workerif(protobuf_MODULE_COMPATIBLE) 168*1b3f573fSAndroid Build Coastguard Worker include("${CMAKE_CURRENT_LIST_DIR}/protobuf-module.cmake") 169*1b3f573fSAndroid Build Coastguard Workerendif() 170