FindProtobuf

Locate and configure the Google Protocol Buffers library.

New in version 3.6: Support for find_package() version checks.

Changed in version 3.6: All input and output variables use the Protobuf_ prefix. Variables with PROTOBUF_ prefix are still supported for compatibility.

The following variables can be set and are optional:

Protobuf_SRC_ROOT_FOLDER

When compiling with MSVC, if this cache variable is set the protobuf-default VS project build locations (vsprojects/Debug and vsprojects/Release or vsprojects/x64/Debug and vsprojects/x64/Release) will be searched for libraries and binaries.

Protobuf_IMPORT_DIRS

List of additional directories to be searched for imported .proto files.

Protobuf_DEBUG

New in version 3.6.

Show debug messages.

Protobuf_USE_STATIC_LIBS

New in version 3.9.

Set to ON to force the use of the static libraries. Default is OFF.

Defines the following variables:

Protobuf_FOUND

Found the Google Protocol Buffers library (libprotobuf & header files)

Protobuf_VERSION

New in version 3.6.

Version of package found.

Protobuf_INCLUDE_DIRS

Include directories for Google Protocol Buffers

Protobuf_LIBRARIES

The protobuf libraries

Protobuf_PROTOC_LIBRARIES

The protoc libraries

Protobuf_LITE_LIBRARIES

The protobuf-lite libraries

New in version 3.9: The following IMPORTED targets are also defined:

protobuf::libprotobuf

The protobuf library.

protobuf::libprotobuf-lite

The protobuf lite library.

protobuf::libprotoc

The protoc library.

protobuf::protoc

New in version 3.10: The protoc compiler.

The following cache variables are also available to set or use:

Protobuf_LIBRARY

The protobuf library

Protobuf_PROTOC_LIBRARY

The protoc library

Protobuf_INCLUDE_DIR

The include directory for protocol buffers

Protobuf_PROTOC_EXECUTABLE

The protoc compiler

Protobuf_LIBRARY_DEBUG

The protobuf library (debug)

Protobuf_PROTOC_LIBRARY_DEBUG

The protoc library (debug)

Protobuf_LITE_LIBRARY

The protobuf lite library

Protobuf_LITE_LIBRARY_DEBUG

The protobuf lite library (debug)

Example:

find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT foo.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS DESCRIPTORS PROTO_DESCS foo.proto)
protobuf_generate_python(PROTO_PY foo.proto)
add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(bar ${Protobuf_LIBRARIES})

Note

The protobuf_generate_cpp and protobuf_generate_python functions and add_executable() or add_library() calls only work properly within the same directory.

protobuf_generate_cpp

Add custom commands to process .proto files to C++:

protobuf_generate_cpp (<SRCS> <HDRS>
    [DESCRIPTORS <DESC>] [EXPORT_MACRO <MACRO>] [<ARGN>...])
SRCS

Variable to define with autogenerated source files

HDRS

Variable to define with autogenerated header files

DESCRIPTORS

New in version 3.10: Variable to define with autogenerated descriptor files, if requested.

EXPORT_MACRO

is a macro which should expand to __declspec(dllexport) or __declspec(dllimport) depending on what is being compiled.

ARGN

.proto files

protobuf_generate_python

New in version 3.4.

Add custom commands to process .proto files to Python:

protobuf_generate_python (<PY> [<ARGN>...])
PY

Variable to define with autogenerated Python files

ARGN

.proto files

protobuf_generate

New in version 3.13.

Automatically generate source files from .proto schema files at build time:

protobuf_generate (
    TARGET <target>
    [LANGUAGE <lang>]
    [OUT_VAR <out_var>]
    [EXPORT_MACRO <macro>]
    [PROTOC_OUT_DIR <dir>]
    [PLUGIN <plugin>]
    [PLUGIN_OPTIONS <plugin_options>]
    [DEPENDENCIES <depends]
    [PROTOS <protobuf_files>]
    [IMPORT_DIRS <dirs>]
    [GENERATE_EXTENSIONS <extensions>]
    [PROTOC_OPTIONS <protoc_options>]
    [APPEND_PATH])
APPEND_PATH

A flag that causes the base path of all proto schema files to be added to IMPORT_DIRS.

LANGUAGE

A single value: cpp or python. Determines what kind of source files are being generated. Defaults to cpp.

OUT_VAR

Name of a CMake variable that will be filled with the paths to the generated source files.

EXPORT_MACRO

Name of a macro that is applied to all generated Protobuf message classes and extern variables. It can, for example, be used to declare DLL exports.

PROTOC_OUT_DIR

Output directory of generated source files. Defaults to CMAKE_CURRENT_BINARY_DIR.

PLUGIN

New in version 3.21.

An optional plugin executable. This could, for example, be the path to grpc_cpp_plugin.

PLUGIN_OPTIONS

New in version 3.28.

Additional options provided to the plugin, such as generate_mock_code=true for the gRPC cpp plugin.

DEPENDENCIES

New in version 3.28.

Arguments forwarded to the DEPENDS of the underlying add_custom_command invocation.

TARGET

CMake target that will have the generated files added as sources.

PROTOS

List of proto schema files. If omitted, then every source file ending in proto of TARGET will be used.

IMPORT_DIRS

A common parent directory for the schema files. For example, if the schema file is proto/helloworld/helloworld.proto and the import directory proto/ then the generated files are ${PROTOC_OUT_DIR}/helloworld/helloworld.pb.h and ${PROTOC_OUT_DIR}/helloworld/helloworld.pb.cc.

GENERATE_EXTENSIONS

If LANGUAGE is omitted then this must be set to the extensions that protoc generates.

PROTOC_OPTIONS

New in version 3.28.

Additional arguments that are forwarded to protoc.

Example:

find_package(gRPC CONFIG REQUIRED)
find_package(Protobuf REQUIRED)
add_library(ProtoTest Test.proto)
target_link_libraries(ProtoTest PUBLIC gRPC::grpc++)
protobuf_generate(TARGET ProtoTest)
protobuf_generate(
    TARGET ProtoTest
    LANGUAGE grpc
    PLUGIN protoc-gen-grpc=$<TARGET_FILE:gRPC::grpc_cpp_plugin>
    PLUGIN_OPTIONS generate_mock_code=true
    GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc)