Browse Source

Add autogenerator of expected headers

- Add proto files preparser, to avoid manual specifying of
  autogenerated files
- Keep compatibility with old interface
- Cleanup CMakeLists where applicable
Alexey Edelev 5 years ago
parent
commit
507511aef6

+ 20 - 7
README.md

@@ -74,11 +74,6 @@ You can integrate QtProtobuf as submodule in your project or as installed in sys
 ```cmake
 ...
 find_package(QtProtobufProject CONFIG REQUIRED COMPONENTS QtProtobuf QtGrpc)
-set(GENERATED_HEADERS
-    # List of artifacts expected after qtprotobufgen job done.
-    # Usually it's full list of messages in all packages with .h header suffix
-    ...
-    )
 file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/path/to/protofile1.proto
                                ${CMAKE_CURRENT_SOURCE_DIR}/path/to/protofile2.proto
                                ...
@@ -88,11 +83,29 @@ file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/path/to/protofile1.pr
 # ${QtProtobuf_GENERATED} variable
 generate_qtprotobuf(TARGET MyTarget
     OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
-    PROTO_FILES ${PROTO_FILES}
-    GENERATED_HEADERS ${GENERATED_HEADERS})
+    PROTO_FILES ${PROTO_FILES})
 add_executable(MyTarget main.cpp) # Add your target here
 target_link_libraries(MyTarget ${QtProtobuf_GENERATED})
 
+```
+
+**Optional:**
+
+You also may pre-specify expected generated headers to prevent dummy-parser mistakes
+
+```cmake
+...
+set(GENERATED_HEADERS
+    # List of artifacts expected after qtprotobufgen job done.
+    # Usually it's full list of messages in all packages with .h header suffix
+    ...
+    )
+...
+generate_qtprotobuf(TARGET MyTarget
+    OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
+    PROTO_FILES ${PROTO_FILES}
+    GENERATED_HEADERS ${GENERATED_HEADERS})
+...
 ```
 ## CMake functions reference
 

+ 1 - 14
examples/addressbook/CMakeLists.txt

@@ -7,24 +7,11 @@ set(CMAKE_AUTORCC ON)
 find_package(Qt5 COMPONENTS Core Quick Network REQUIRED)
 find_package(QtProtobufProject CONFIG REQUIRED COMPONENTS QtProtobuf QtGrpc)
 
-set(GENERATED_HEADERS
-    addressbookclient.h
-    address.h
-    contact.h
-    contacts.h
-    globalenums.h
-    job.h
-    listframe.h
-    phonenumber.h
-    none.h
-    callstatus.h)
-
 file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/proto/addressbook.proto)
 
 generate_qtprotobuf(TARGET ${TARGET}
     OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
-    PROTO_FILES ${PROTO_FILES}
-    GENERATED_HEADERS ${GENERATED_HEADERS})
+    PROTO_FILES ${PROTO_FILES})
 
 file(GLOB SOURCES main.cpp
     addressbookengine.cpp)

+ 1 - 10
examples/simplechat/CMakeLists.txt

@@ -7,20 +7,11 @@ set(CMAKE_AUTORCC ON)
 find_package(Qt5 COMPONENTS Core Quick Network REQUIRED)
 find_package(QtProtobufProject CONFIG REQUIRED COMPONENTS QtProtobuf QtGrpc)
 
-set(GENERATED_HEADERS
-    chatmessage.h
-    chatmessages.h
-    user.h
-    users.h
-    none.h
-    simplechatclient.h)
-
 file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/proto/simplechat.proto)
 
 generate_qtprotobuf(TARGET ${TARGET}
     OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
-    PROTO_FILES ${PROTO_FILES}
-    GENERATED_HEADERS ${GENERATED_HEADERS})
+    PROTO_FILES ${PROTO_FILES})
 
 file(GLOB SOURCES main.cpp
     simplechatengine.cpp

+ 3 - 0
src/protobuf/CMakeLists.txt

@@ -98,6 +98,9 @@ export(TARGETS ${TARGET} NAMESPACE ${QTPROTOBUF_COMMON_NAMESPACE}:: FILE ${TARGE
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/QtProtobufGen.cmake.in" "${QTPROTOBUF_BINARY_DIR}/QtProtobufGen.cmake" @ONLY)
 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)
+install(FILES "${QTPROTOBUF_BINARY_DIR}/parsemessages.go" DESTINATION "${TARGET_CMAKE_DIR}")
+
 configure_file("${QTPROTOBUF_CMAKE_DIR}/ProtobufLookup.cmake" "${QTPROTOBUF_BINARY_DIR}/ProtobufLookup.cmake" COPYONLY)
 install(FILES "${QTPROTOBUF_BINARY_DIR}/ProtobufLookup.cmake" DESTINATION "${TARGET_CMAKE_DIR}")
 

+ 1 - 1
src/protobuf/QtProtobufConfig.cmake.in

@@ -5,5 +5,5 @@ if(NOT TARGET @TARGET@ AND NOT @TARGET@_BINARY_DIR)
 endif()
 
 @PACKAGE_INIT@
-
+set(PROTO_PARSER ${CMAKE_CURRENT_LIST_DIR}/parsemessages.go)
 include("${CMAKE_CURRENT_LIST_DIR}/QtProtobufGen.cmake")

+ 10 - 1
src/protobuf/QtProtobufGen.cmake.in

@@ -12,11 +12,20 @@ function(generate_qtprotobuf)
     if(NOT DEFINED QTPROTOBUF_EXECUTABLE)
         set(QTPROTOBUF_EXECUTABLE @QTPROTOBUF_EXECUTABLE_INSTALL@)
     endif()
+    find_program(GO_EXECUTABLE "go")
     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})
+        execute_process(COMMAND ${GO_EXECUTABLE} run ${PROTO_PARSER} ${PROTO_FILE} OUTPUT_VARIABLE GENERATED_HEADERS_PART ERROR_VARIABLE PARSER_ERROR)
+        set(GENERATED_HEADERS ${GENERATED_HEADERS} ${GENERATED_HEADERS_PART})
     endforeach()
 
+    #message("${PARSER_ERROR} Generated files list: ${GENERATED_HEADERS} ${GENERATED_HEADERS_PART}")
+
+    if(DEFINED generate_qtprotobuf_GENERATED_HEADERS)
+        set(GENERATED_HEADERS ${generate_qtprotobuf_GENERATED_HEADERS})
+    endif()
+
     if(NOT DEFINED generate_qtprotobuf_OUT_DIR)
         set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
     else()
@@ -27,7 +36,7 @@ function(generate_qtprotobuf)
 
     unset(QTPROTOBUF_GENERATED_SOURCES)
     unset(QTPROTOBUF_GENERATED_HEADERS)
-    foreach(GENERATED_HEADER IN LISTS generate_qtprotobuf_GENERATED_HEADERS)
+    foreach(GENERATED_HEADER IN LISTS GENERATED_HEADERS)
         get_filename_component(GENERATED_BASENAME ${GENERATED_HEADER} NAME_WE)
 
         list(APPEND QTPROTOBUF_GENERATED_SOURCES ${OUT_DIR}/${GENERATED_BASENAME}.cpp)

+ 47 - 0
src/protobuf/parsemessages.go

@@ -0,0 +1,47 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"log"
+	"os"
+	"regexp"
+	"strings"
+)
+
+func main() {
+	if len(os.Args) < 2 {
+		os.Exit(1)
+	}
+
+	file, err := os.Open(os.Args[1])
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer file.Close()
+
+	messageFinder, err := regexp.Compile("^message\\s+([a-zA-Z0-9_]+)")
+	if err != nil {
+		log.Fatalf("Invalid regexp %s\n", err)
+	}
+	
+    serviceFinder, err := regexp.Compile("^service\\s+([a-zA-Z0-9_]+)")
+
+	scanner := bufio.NewScanner(file)
+	for scanner.Scan() {
+		capture := messageFinder.FindStringSubmatch(scanner.Text())
+		if len(capture) == 2 {
+            fmt.Printf("%s.h;", strings.ToLower(capture[1]))
+		}
+
+        
+		capture = serviceFinder.FindStringSubmatch(scanner.Text())
+		if len(capture) == 2 {
+            fmt.Printf("%sclient.h;", strings.ToLower(capture[1]))
+		}
+	}
+
+	if err := scanner.Err(); err != nil {
+		log.Fatal(err)
+	}
+}

+ 0 - 9
tests/test_grpc/CMakeLists.txt

@@ -1,21 +1,12 @@
 include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
 
-set(GENERATED_HEADERS
-    simplestringmessage.h
-    testserviceclient.h
-    blobmessage.h
-#   testserviceserver.h
-)
-
 # clients
 add_test_target(TARGET qtgrpc_test
-    GENERATED_HEADERS ${GENERATED_HEADERS}
     SOURCES clienttest.cpp)
 add_target_windeployqt(TARGET qtgrpc_test
     QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})
 
 add_test_target(TARGET qtgrpc_secure_test
-    GENERATED_HEADERS ${GENERATED_HEADERS}
     SOURCES sslclienttest.cpp)
 add_target_windeployqt(TARGET qtgrpc_secure_test
     QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})