2015-03-30 5 views
6

Моя конфигурация cmake не генерирует файлы protobuf src и header. Я уже проверил, можно ли найти прото-файлы.PROTOBUF_GENERATE_CPP не генерирует файлы src и заголовков

Cmakelists.txt 

cmake_minimum_required(VERSION 3.0.2) 
.. 
include(FindProtobuf REQUIRED) 
file(GLOB PROTO_DEF "${CMAKE_CURRENT_SOURCE_DIR}/protobuf/*/*.proto") 

foreach(file ${PROTO_DEF})  
    if(EXISTS ${file}) 
     MESSAGE("YES") 
    else() 
     MESSAGE("NO") 
    endif() 
endforeach() 
SET(PROTOBUF_GENERATE_CPP_APPEND_PATH PROTOBUF) 
SET(PROTOBUF_PROTOC_EXECUTABLE protoc.exe) 

.. 
PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_INCL ${PROTO_DEF}) 
.. 
add_library(${PROJECT_NAME} STATIC ${INCLUDES} ${INTERNAL_INCLUDES} ${SRC} ${PROTO_SRC} ${PROTO_INCL}) 
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES}) 

Я проверил FindProtobuf.cmake и половину пути через:

foreach(FIL ${ARGN}) 
    get_filename_component(ABS_FIL ${FIL} ABSOLUTE) 
    get_filename_component(FIL_WE ${FIL} NAME_WE) 

    list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc") 
    list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h") 

    MESSAGE(1 ${CMAKE_CURRENT_BINARY_DIR}) 
    MESSAGE(2 ${_protobuf_include_path}) 
    MESSAGE(3 ${ABS_FIL}) 
    MESSAGE(4 ${PROTOBUF_PROTOC_EXECUTABLE}) 

    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_CURRENT_BINARY_DIR} ${_protobuf_include_path} ${ABS_FIL} 
     DEPENDS ${ABS_FIL} 
     COMMENT "Running C++ protocol buffer compiler on ${FIL}" 
     VERBATIM) 

    endforeach() 

Вы можете увидеть, я добавил команды сообщение 4, сценарий достигнет этой точки и переменные показывают хорошие значения. Протольные файлы имеют библиотеку, поэтому команда должна быть выполнена!?

Любые идеи по этой проблеме?

обновление

замена add_custom_command с

EXEC_PROGRAM(${PROTOBUF_PROTOC_EXECUTABLE} ARGS --cpp_out ${CMAKE_CURRENT_BINARY_DIR} ${_protobuf_include_path} ${ABS_FIL} 

ли генерировать исходные файлы и заголовок, должен я вручную активировать custom_commmands?

С уважением Auke

ответ

3

add_custom_command обжигают (для моего проекта) во время компиляции. Добавление

SET_SOURCE_FILES_PROPERTIES(${PROTO_SRC} ${PROTO_INCL} PROPERTIES GENERATED TRUE) 

дает информацию CMake, что файлы будут генерироваться.

1

Alternative, если у вас есть внешняя папка прота:

file(GLOB PROTOBUF_FILELIST ${PROTO_INCLUDE_DIR}/*.proto) 
foreach(proto_file ${PROTOBUF_FILELIST}) 
    get_filename_component(proto_name ${proto_file} NAME_WE) 
    get_filename_component(proto_path ${PROTO_INCLUDE_DIR} ABSOLUTE) 
    set_source_files_properties("${proto_path}/${proto_name}.pb.cc" 
           "${proto_path}/${proto_name}.pb.h" 
           PROPERTIES GENERATED TRUE) 
endforeach()