xref: /aosp_15_r20/external/protobuf/cmake/protobuf-config.cmake.in (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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