blob: 1184ca1e59d43619f1aedde4407354b00b016115 [file] [log] [blame]
cmake_minimum_required(VERSION 3.4.1)
# Note that you will need to install protobuf from this directory for this default to work,
# and use the same version of protoc below.
# If autogen.sh complains about gmock, comment out the check for it
if( NOT DEFINED PROTOBUF_SRC_DIR)
set( PROTOBUF_SRC_DIR "${EXTERNAL_ROOT}/protobuf/src")
endif()
# To use this default, you'll need to run 'protoc-gen-nanopb'
# in external/nanopb-c/generator
if( NOT DEFINED PROTOBUF_NANO_SRC_DIR)
set( PROTOBUF_NANO_SRC_DIR "${EXTERNAL_ROOT}/nanopb-c")
endif()
if( DEFINED ENV{PROTOBUF_INSTALL_DIR})
set( PROTOBUF_INSTALL_DIR $ENV{PROTOBUF_INSTALL_DIR})
endif()
if( NOT DEFINED PROTOBUF_INSTALL_DIR)
set(PROTOC_EXE protoc)
set( PROTOBUF_INCLUDE_DIR ${PROTOBUF_SRC_DIR} )
else()
set(PROTOC_EXE ${PROTOBUF_INSTALL_DIR}/bin/protoc)
set( PROTOBUF_INCLUDE_DIR ${PROTOBUF_INSTALL_DIR}/include )
endif()
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Werror -Wthread-safety" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -Os -fPIC" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGOOGLE_PROTOBUF_NO_RTTI -DHAVE_PTHREAD")
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections" )
function(set_link_options libname versionscript)
if (${CMAKE_BUILD_TYPE} STREQUAL "Release")
set_target_properties( ${libname} PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_SOURCE_DIR}/${versionscript}")
endif (${CMAKE_BUILD_TYPE} STREQUAL "Release")
endfunction()
function(extra_pb_link_options libname)
set_link_options(${libname} "protobuf/protobuf_version.script")
endfunction()
function(extra_pb_nano_link_options libname)
set_link_options(${libname} "protobuf/protobuf_nano_version.script")
endfunction()
set(PROTO_GENS_DIR ${CMAKE_BINARY_DIR}/gens)
set(PROTO_GENS_DIR ${_PROTO_GENS_DIR} PARENT_SCOPE)
set(PROTOC_EXE ${PROTOC_EXE} PARENT_SCOPE)
set(PROTOBUF_SRC_DIR ${PROTOBUF_SRC_DIR} PARENT_SCOPE)
set(PROTOBUF_NANO_SRC_DIR ${PROTOBUF_NANO_SRC_DIR} PARENT_SCOPE)
file(MAKE_DIRECTORY ${PROTO_GENS_DIR}/full)
file(MAKE_DIRECTORY ${PROTO_GENS_DIR}/lite)
file(MAKE_DIRECTORY ${PROTO_GENS_DIR}/nano)
function(protobuf_generate_base)
if(NOT ARGN)
message(SEND_ERROR "Error: PROTOBUF_GENERATE_CPP() called without any proto files")
return()
endif()
set(_extension ${ARGV0})
set(_out_opt ${ARGV1})
set(_extra_opts ${ARGV2})
set(_gens_subdir ${ARGV3})
set(_working_dir ${ARGV4})
list(REMOVE_AT ARGN 0)
list(REMOVE_AT ARGN 0)
list(REMOVE_AT ARGN 0)
list(REMOVE_AT ARGN 0)
list(REMOVE_AT ARGN 0)
set(_protobuf_include_path -I .)
set(_PROTO_GENS_DIR ${CMAKE_BINARY_DIR}/gens${_gens_subdir})
message(STATUS "protobuf_generate_base._working_dir=${_working_dir}")
message(STATUS "protobuf_generate_base._PROTO_GENS_DIR=${_PROTO_GENS_DIR}")
message(STATUS "protobuf_generate_base._extension=${_extension}")
message(STATUS "protobuf_generate_base.PROTOC_EXE=${PROTOC_EXE}")
foreach(FIL ${ARGN})
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
file(RELATIVE_PATH REL_FIL ${_working_dir} ${ABS_FIL})
get_filename_component(REL_DIR ${REL_FIL} DIRECTORY)
set(RELFIL_WE "${REL_DIR}/${FIL_WE}")
add_custom_command(
OUTPUT "${_PROTO_GENS_DIR}${RELFIL_WE}.pb.${_extension}"
"${_PROTO_GENS_DIR}${RELFIL_WE}.pb.h"
COMMAND ${PROTOC_EXE}
ARGS ${_out_opt}=${_PROTO_GENS_DIR}
${_extra_opts}
${_protobuf_include_path}
${REL_FIL}
WORKING_DIRECTORY ${_working_dir}
COMMENT "Running C++ protocol buffer compiler on ${FIL}"
VERBATIM)
message(STATUS "${PROTOC_EXE} will generate ${_PROTO_GENS_DIR}${RELFIL_WE}.pb.*")
set_source_files_properties(
"${_PROTO_GENS_DIR}${RELFIL_WE}.pb.${_extension}"
"${_PROTO_GENS_DIR}${RELFIL_WE}.pb.h" PROPERTIES GENERATED TRUE)
endforeach()
endfunction()
get_filename_component(ABS_PROTOBUF_NANO_SRC_DIR ${PROTOBUF_NANO_SRC_DIR} ABSOLUTE)
function(protobuf_generate_nano_c)
protobuf_generate_base("c" "--nanopb_out"
"--plugin=protoc-gen-nanopb=${ABS_PROTOBUF_NANO_SRC_DIR}/generator/protoc-gen-nanopb"
"/nano" ${ARGN})
endfunction()
function(protobuf_generate_full_cpp)
protobuf_generate_base("cc" "--cpp_out" "" "/full" ${ARGN})
endfunction()
function(protobuf_generate_lite_cpp)
protobuf_generate_base("cc" "--cpp_out" "" "/lite" ${ARGN})
endfunction()
set(GP_SRC_DIR ${PROTOBUF_SRC_DIR}/google/protobuf)
set(PROTOBUF_LITE_SRCS
${GP_SRC_DIR}/arena.cc
${GP_SRC_DIR}/arenastring.cc
${GP_SRC_DIR}/extension_set.cc
${GP_SRC_DIR}/generated_message_util.cc
${GP_SRC_DIR}/io/coded_stream.cc
${GP_SRC_DIR}/io/zero_copy_stream.cc
${GP_SRC_DIR}/io/zero_copy_stream_impl_lite.cc
${GP_SRC_DIR}/message_lite.cc
${GP_SRC_DIR}/repeated_field.cc
${GP_SRC_DIR}/stubs/atomicops_internals_x86_gcc.cc
${GP_SRC_DIR}/stubs/atomicops_internals_x86_msvc.cc
${GP_SRC_DIR}/stubs/bytestream.cc
${GP_SRC_DIR}/stubs/common.cc
${GP_SRC_DIR}/stubs/int128.cc
${GP_SRC_DIR}/stubs/once.cc
${GP_SRC_DIR}/stubs/status.cc
${GP_SRC_DIR}/stubs/statusor.cc
${GP_SRC_DIR}/stubs/stringpiece.cc
${GP_SRC_DIR}/stubs/stringprintf.cc
${GP_SRC_DIR}/stubs/structurally_valid.cc
${GP_SRC_DIR}/stubs/strutil.cc
${GP_SRC_DIR}/stubs/time.cc
${GP_SRC_DIR}/wire_format_lite.cc)
set(PROTOBUF_SRCS
${GP_SRC_DIR}/any.cc
${GP_SRC_DIR}/any.pb.cc
${GP_SRC_DIR}/api.pb.cc
${GP_SRC_DIR}/compiler/importer.cc
${GP_SRC_DIR}/compiler/parser.cc
${GP_SRC_DIR}/descriptor.cc
${GP_SRC_DIR}/descriptor.pb.cc
${GP_SRC_DIR}/descriptor_database.cc
${GP_SRC_DIR}/duration.pb.cc
${GP_SRC_DIR}/dynamic_message.cc
${GP_SRC_DIR}/empty.pb.cc
${GP_SRC_DIR}/extension_set_heavy.cc
${GP_SRC_DIR}/field_mask.pb.cc
${GP_SRC_DIR}/generated_message_reflection.cc
${GP_SRC_DIR}/io/gzip_stream.cc
${GP_SRC_DIR}/io/printer.cc
${GP_SRC_DIR}/io/strtod.cc
${GP_SRC_DIR}/io/tokenizer.cc
${GP_SRC_DIR}/io/zero_copy_stream_impl.cc
${GP_SRC_DIR}/map_field.cc
${GP_SRC_DIR}/message.cc
${GP_SRC_DIR}/reflection_ops.cc
${GP_SRC_DIR}/service.cc
${GP_SRC_DIR}/source_context.pb.cc
${GP_SRC_DIR}/struct.pb.cc
${GP_SRC_DIR}/stubs/mathlimits.cc
${GP_SRC_DIR}/stubs/substitute.cc
${GP_SRC_DIR}/text_format.cc
${GP_SRC_DIR}/timestamp.pb.cc
${GP_SRC_DIR}/type.pb.cc
${GP_SRC_DIR}/unknown_field_set.cc
${GP_SRC_DIR}/util/field_comparator.cc
${GP_SRC_DIR}/util/field_mask_util.cc
${GP_SRC_DIR}/util/internal/datapiece.cc
${GP_SRC_DIR}/util/internal/default_value_objectwriter.cc
${GP_SRC_DIR}/util/internal/error_listener.cc
${GP_SRC_DIR}/util/internal/field_mask_utility.cc
${GP_SRC_DIR}/util/internal/json_escaping.cc
${GP_SRC_DIR}/util/internal/json_objectwriter.cc
${GP_SRC_DIR}/util/internal/json_stream_parser.cc
${GP_SRC_DIR}/util/internal/object_writer.cc
${GP_SRC_DIR}/util/internal/proto_writer.cc
${GP_SRC_DIR}/util/internal/protostream_objectsource.cc
${GP_SRC_DIR}/util/internal/protostream_objectwriter.cc
${GP_SRC_DIR}/util/internal/type_info.cc
${GP_SRC_DIR}/util/internal/type_info_test_helper.cc
${GP_SRC_DIR}/util/internal/utility.cc
${GP_SRC_DIR}/util/json_util.cc
${GP_SRC_DIR}/util/message_differencer.cc
${GP_SRC_DIR}/util/time_util.cc
${GP_SRC_DIR}/util/type_resolver_util.cc
${GP_SRC_DIR}/wire_format.cc
${GP_SRC_DIR}/wrappers.pb.cc)
set(PROTOBUF_NANO_SRCS
${PROTOBUF_NANO_SRC_DIR}/pb_encode.c
${PROTOBUF_NANO_SRC_DIR}/pb_decode.c
${PROTOBUF_NANO_SRC_DIR}/pb_common.c)