2015-03-30 10 views
6

La mia configurazione cmake non sta generando alcun protobuf src e file di intestazione. Ho già controllato se è possibile trovare i file di proto.PROTOBUF_GENERATE_CPP non genera file src e header

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}) 

Ho controllato il FindProtobuf.cmake e metà:

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() 

Si può vedere ho aggiunto i comandi il messaggio 4, lo script raggiunge questo punto e le variabili mostrano buoni valori. I file di proto hanno una depenenza nella libreria, quindi il comando dovrebbe essere eseguito!?

Qualche idea su questo problema?

aggiornamento

sostituendo l'add_custom_command con

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

non generare i file sorgente e intestazione, devo attivare manualmente le custom_commmands?

saluti Auke

risposta

3

L'add_custom_command viene licenziato (per il mio progetto) durante il tempo di compilazione. Aggiunta

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

dà informazioni CMake che i file saranno generati.

1

alternativa se si dispone di una cartella di proto esterna:

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()