blob: de5de7a432eb3f43a93016ef2183d4a19fe571f2 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# This function is partially based on a similar one from FindProtobuf.cmake,
# but it adds the ability to scan .proto files for imports and automatically
# set the proper dependencies.
#
# QS_PROTOBUF_GENERATE_CPP(SRCS HDRS [PROTOFILES ...])
#
# - Example
#
# include(QsProtobufGenerateCpp) NOTE: already included in /CMakeLists.txt
# QsProtobufGenerateCpp(storage_AggregationOperationState_proto_srcs
# storage_AggregationOperationState_proto_hdrs
# AggregationOperationState.proto)
# Requires CMake 2.6+
function(QS_PROTOBUF_GENERATE_CPP SRCS HDRS)
if (NOT ARGN)
message(SEND_ERROR "Error: QS_PROTOBUF_GENERATE_CPP() called without any proto files")
return()
endif ()
set(${SRCS})
set(${HDRS})
foreach (FIL ${ARGN})
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
# Scan for other protos imported in the .proto file.
set(PROTO_IMPORT_TARGETS)
file(STRINGS ${ABS_FIL} PROTO_SRC)
foreach (PROTO_SRC_LINE ${PROTO_SRC})
string(REGEX MATCH "import \"(.*)[.]proto\"" TMPMATCH ${PROTO_SRC_LINE})
if (CMAKE_MATCH_1)
string(REPLACE "/" "_" IMPORTED_PROTO_FLAT "${CMAKE_BINARY_DIR}/${CMAKE_MATCH_1}")
string(REPLACE ":" "_" IMPORTED_PROTO_FLAT ${IMPORTED_PROTO_FLAT})
list(APPEND PROTO_IMPORT_TARGETS "protoc_${IMPORTED_PROTO_FLAT}")
endif ()
endforeach ()
list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
# Note that this adds dependencies for the .proto file itself, as well as
# for any proto imports and the protobuf library if we have to build it
# ourselves.
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
ARGS --cpp_out ${CMAKE_BINARY_DIR} -I${PROJECT_SOURCE_DIR} ${ABS_FIL}
DEPENDS ${ABS_FIL} ${PROTO_IMPORT_TARGETS} ${PROTOBUF_GLOBAL_DEPS}
COMMENT "Running C++ protocol buffer compiler on ${FIL}"
VERBATIM)
# Make a custom global target so that we have something that protos in
# other directories can depend on for imports.
string(REPLACE "/" "_" PROTOC_TARGET_NAME "protoc_${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}")
string(REPLACE ":" "_" PROTOC_TARGET_NAME ${PROTOC_TARGET_NAME})
add_custom_target(${PROTOC_TARGET_NAME} DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
endforeach ()
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
set(${SRCS} ${${SRCS}} PARENT_SCOPE)
set(${HDRS} ${${HDRS}} PARENT_SCOPE)
endfunction()