Browse Source

Upgrade build procedure

- Make QtProtobufGen.cmake cmake variables independent
- Add explicit PROTO_INCLUDES option
- Fix issues in PROTO_INCLUDES generation
- Fix boolean-based checks for QML and MULTI flags
Alexey Edelev 5 years ago
parent
commit
9aa3f17a95

+ 1 - 0
CMakeLists.txt

@@ -6,6 +6,7 @@ project(QtProtobufProject VERSION ${QTPROTOBUF_PROJECT_VERSION} LANGUAGES CXX)
 include(GNUInstallDirs)
 
 set(QTPROTOBUF_CMAKE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+set(QTPROTOBUF_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
 set(QTPROTOBUF_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
 
 find_package(Qt5 COMPONENTS Core Network Qml REQUIRED)

+ 4 - 3
cmake/QtProtobufCommon.cmake

@@ -10,7 +10,7 @@ function(protobuf_generate_all)
 
     foreach(PROTO_FILE IN LISTS protobuf_generate_all_PROTO_FILES)
         get_filename_component(BASE_DIR ${PROTO_FILE} DIRECTORY)
-        set(PROTO_INCLUDES -I"${BASE_DIR}" ${PROTO_INCUDES})
+        set(PROTO_INCLUDES -I"${BASE_DIR}" ${PROTO_INCLUDES})
     endforeach()
 
     if(NOT DEFINED protobuf_generate_all_OUT_DIR)
@@ -43,7 +43,7 @@ endfunction(protobuf_generate_all)
 function(add_test_target)
     set(options)
     set(oneValueArgs QML_DIR TARGET MULTI QML)
-    set(multiValueArgs SOURCES GENERATED_HEADERS EXCLUDE_HEADERS PROTO_FILES)
+    set(multiValueArgs SOURCES GENERATED_HEADERS EXCLUDE_HEADERS PROTO_FILES PROTO_INCLUDES)
     cmake_parse_arguments(add_test_target "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 
     find_package(Threads REQUIRED)
@@ -68,7 +68,8 @@ function(add_test_target)
         GENERATED_HEADERS ${add_test_target_GENERATED_HEADERS}
         EXCLUDE_HEADERS ${add_test_target_EXCLUDE_HEADERS}
         MULTI ${add_test_target_MULTI}
-        QML ${add_test_target_QML})
+        QML ${add_test_target_QML}
+        PROTO_INCLUDES ${add_test_target_PROTO_INCLUDES})
 
     add_executable(${add_test_target_TARGET} ${add_test_target_SOURCES})
 

+ 16 - 9
src/protobuf/QtProtobufGen.cmake.in → cmake/QtProtobufGen.cmake

@@ -1,7 +1,7 @@
 function(generate_qtprotobuf)
     set(options)
     set(oneValueArgs OUT_DIR TARGET MULTI QML GENERATED_HEADERS_VAR)
-    set(multiValueArgs GENERATED_HEADERS EXCLUDE_HEADERS PROTO_FILES)
+    set(multiValueArgs GENERATED_HEADERS EXCLUDE_HEADERS PROTO_FILES PROTO_INCLUDES)
     cmake_parse_arguments(generate_qtprotobuf "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 
     set(QtProtobuf_GENERATED ${generate_qtprotobuf_TARGET}_qtprotobuf_gen PARENT_SCOPE)
@@ -11,18 +11,18 @@ function(generate_qtprotobuf)
     set(GENERATED_HEADERS ${generate_qtprotobuf_GENERATED_HEADERS})
 
     if(NOT DEFINED QTPROTOBUF_EXECUTABLE)
-        set(QTPROTOBUF_EXECUTABLE "@QTPROTOBUF_EXECUTABLE_INSTALL@")
+        set(QTPROTOBUF_EXECUTABLE "${QTPROTOBUF_EXECUTABLE_INSTALL}")
     endif()
 
     set(GENERATION_TYPE "SINGLE")
-    if(${generate_qtprotobuf_MULTI})
+    if("${generate_qtprotobuf_MULTI}" STREQUAL "TRUE")
         set(GENERATION_TYPE "MULTI")
         #TODO: add globalenums by default. But it's better to verify if proto file contains any global enum
         set(GENERATED_HEADERS ${GENERATED_HEADERS} globalenums.h)
     endif()
 
     set(GENERATION_OPTIONS ${GENERATION_TYPE})
-    if(${generate_qtprotobuf_QML})
+    if("${generate_qtprotobuf_QML}" STREQUAL "TRUE")
         message(STATUS "Enabled QML generation for ${generate_qtprotobuf_TARGET}")
         set(GENERATION_OPTIONS "${GENERATION_OPTIONS}:QML")
     endif()
@@ -31,13 +31,19 @@ function(generate_qtprotobuf)
     if (GO_EXECUTABLE STREQUAL GO_EXECUTABLE-NOTFOUND)
         message(FATAL_ERROR "Golang is mandatory dependency for QtProtobuf. Please install it and ensure that it's accessible by PATH environment variable")
     endif()
+
+    set(PROTO_INCLUDES ${generate_qtprotobuf_PROTO_INCLUDES})
     foreach(PROTO_FILE IN LISTS generate_qtprotobuf_PROTO_FILES)
         get_filename_component(BASE_DIR ${PROTO_FILE} DIRECTORY)
-        set(PROTO_INCLUDES -I"${BASE_DIR}" ${PROTO_INCUDES})
+        set(PROTO_INCLUDES -I"${BASE_DIR}" ${PROTO_INCLUDES})
         execute_process(COMMAND ${GO_EXECUTABLE} run ${PROTO_PARSER} ${PROTO_FILE} ${GENERATION_TYPE} OUTPUT_VARIABLE GENERATED_HEADERS_PART ERROR_VARIABLE PARSER_ERROR)
         set(GENERATED_HEADERS ${GENERATED_HEADERS} ${GENERATED_HEADERS_PART})
     endforeach()
 
+    if(NOT "${PARSER_ERROR}" STREQUAL "")
+        message(FATAL_ERROR "Go parser error ${PARSER_ERROR}")
+    endif()
+
     if(DEFINED generate_qtprotobuf_GENERATED_HEADERS)
         set(GENERATED_HEADERS ${generate_qtprotobuf_GENERATED_HEADERS})
     endif()
@@ -72,11 +78,12 @@ function(generate_qtprotobuf)
     else()
         set(PROTOC_COMMAND "QT_PROTOBUF_OPTIONS=${GENERATION_OPTIONS}" $<TARGET_FILE:protobuf::protoc>)
     endif()
+
     add_custom_command(
             OUTPUT ${QTPROTOBUF_GENERATED_SOURCES} ${QTPROTOBUF_GENERATED_HEADERS}
             COMMAND ${PROTOC_COMMAND}
-                --plugin=protoc-gen-@GENERATOR_TARGET@=${QTPROTOBUF_EXECUTABLE}
-                --@GENERATOR_TARGET@_out=${OUT_DIR}
+                --plugin=protoc-gen-${GENERATOR_TARGET}=${QTPROTOBUF_EXECUTABLE}
+                --${GENERATOR_TARGET}_out=${OUT_DIR}
                 ${PROTO_INCLUDES}
                 ${generate_qtprotobuf_PROTO_FILES}
             WORKING_DIRECTORY ${OUT_DIR}
@@ -94,7 +101,7 @@ function(generate_qtprotobuf)
     add_library(${QtProtobuf_GENERATED} ${QTPROTOBUF_GENERATED_SOURCES} ${MOC_SOURCES})
     add_dependencies(${QtProtobuf_GENERATED} ${GEN_TARGET})
     target_include_directories(${QtProtobuf_GENERATED} PUBLIC ${OUT_DIR} PRIVATE ${Qt5Core_INCLUDE_DIRS}
-        $<TARGET_PROPERTY:@QTPROTOBUF_COMMON_NAMESPACE@::QtProtobuf,INTERFACE_INCLUDE_DIRECTORIES>
-        $<TARGET_PROPERTY:@QTPROTOBUF_COMMON_NAMESPACE@::QtGrpc,INTERFACE_INCLUDE_DIRECTORIES> ${OUT_DIR})
+        $<TARGET_PROPERTY:${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf,INTERFACE_INCLUDE_DIRECTORIES>
+        $<TARGET_PROPERTY:${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc,INTERFACE_INCLUDE_DIRECTORIES> ${OUT_DIR})
 endfunction()
 

+ 1 - 1
src/protobuf/CMakeLists.txt

@@ -97,7 +97,7 @@ install(FILES "${QTPROTOBUF_BINARY_DIR}/${TARGET_CONFIG}.cmake" DESTINATION "${T
 
 export(TARGETS ${TARGET} NAMESPACE ${QTPROTOBUF_COMMON_NAMESPACE}:: FILE ${TARGET_EXPORT}.cmake)
 
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/QtProtobufGen.cmake.in" "${QTPROTOBUF_BINARY_DIR}/QtProtobufGen.cmake" @ONLY)
+configure_file("${QTPROTOBUF_CMAKE_DIR}/QtProtobufGen.cmake" "${QTPROTOBUF_BINARY_DIR}/QtProtobufGen.cmake" COPYONLY)
 install(FILES "${QTPROTOBUF_BINARY_DIR}/QtProtobufGen.cmake" DESTINATION "${TARGET_CMAKE_DIR}")
 
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/parsemessages.go" "${QTPROTOBUF_BINARY_DIR}/parsemessages.go" COPYONLY)

+ 3 - 0
src/protobuf/QtProtobufConfig.cmake.in

@@ -6,4 +6,7 @@ endif()
 
 @PACKAGE_INIT@
 set(PROTO_PARSER ${CMAKE_CURRENT_LIST_DIR}/parsemessages.go)
+set(GENERATOR_TARGET @GENERATOR_TARGET@)
+set(QTPROTOBUF_COMMON_NAMESPACE @QTPROTOBUF_COMMON_NAMESPACE@)
+set(QTPROTOBUF_EXECUTABLE_INSTALL @QTPROTOBUF_EXECUTABLE_INSTALL@)
 include("${CMAKE_CURRENT_LIST_DIR}/QtProtobufGen.cmake")