Browse Source

Migate to options-based parameters for qtprotobuf_generate

- Change MULTI, QML, COMMENTS parameters from one value to options
- Move add_test_target to separate cmake include file
- Extract_qt_variable helper function to extract Qt variables from
  qmake -query list
Alexey Edelev 5 years ago
parent
commit
b52f899d78

+ 10 - 5
README.md

@@ -96,7 +96,7 @@ cmake --build . [--config <RELEASE|DEBUG>] -- /m:<N>
 ### Direct usage of generator
                 
 ```bash
-[QT_PROTOBUF_OPTIONS="[SINGLE|MULTI]:QML"] protoc --plugin=protoc-gen-qtprotobuf=<path/to/bin/>qtprotobufgen --qtprotobuf_out=<output_dir> [-I/extra/proto/include/path] <protofile>.proto
+[QT_PROTOBUF_OPTIONS="[SINGLE|MULTI]:QML:COMMENTS"] protoc --plugin=protoc-gen-qtprotobuf=<path/to/bin/>qtprotobufgen --qtprotobuf_out=<output_dir> [-I/extra/proto/include/path] <protofile>.proto
 ```
 
 **QT_PROTOBUF_OPTIONS**
@@ -104,7 +104,7 @@ cmake --build . [--config <RELEASE|DEBUG>] -- /m:<N>
 For protoc command you also may specify extra options using QT_PROTOBUF_OPTIONS environment variable and colon-separated format:
 
 ``` bash
-[QT_PROTOBUF_OPTIONS="[SINGLE|MULTI]:QML"] protoc --plugin=protoc-gen-qtprotobuf=<path/to/bin/>qtprotobufgen --qtprotobuf_out=<output_dir> [-I/extra/proto/include/path] <protofile>.proto
+[QT_PROTOBUF_OPTIONS="[SINGLE|MULTI]:QML:COMMENTS"] protoc --plugin=protoc-gen-qtprotobuf=<path/to/bin/>qtprotobufgen --qtprotobuf_out=<output_dir> [-I/extra/proto/include/path] <protofile>.proto
 ```
 
 Following options are supported:
@@ -119,6 +119,9 @@ Following options are supported:
 
 *QML* - enables QML code generation in protobuf classes. If is set QML-related code for lists and QML registration to be generated.
 
+*COMMENTS* - enables comments copying from .proto files
+
+
 ### Integration with project
 
 You can integrate QtProtobuf as submodule in your project or as installed in system package. Add following line in your project CMakeLists.txt:
@@ -220,13 +223,15 @@ Due to cmake restrictions it's required to specify resulting artifacts manually
 
 *PROTO_FILES* - List of .proto files that will be used in generation procedure
 
-*MULTI* - Enables/disables multi-files generation mode. In case if this property is set to TRUE generator will create pair of header/source files for each message
+**Options**
+
+*MULTI* - Enables multi-files generation mode. If provided in parameter list generator will create pair of header/source files for each message
 
 **Note:** multi-files generation mode is defined as deprecated by QtProtobuf team, and might have poor support in future
 
-*QML* - Enables/disables QML code generation in protobuf classes. If set to TRUE QML related code for lists and QML registration to be generated.
+*QML* - Enables QML code generation in protobuf classes. If provided in parameter list QML related code for lists and QML registration to be generated.
 
-*COMMENTS* - Enables/disables comments copying from .proto files. If set to TRUE message and field related comments will be copied to generated header files.
+*COMMENTS* - Enables comments copying from .proto files. If provided in parameter list message and field related comments will be copied to generated header files.
 
 ### qtprotobuf_link_archive
 

+ 15 - 46
cmake/QtProtobufCommon.cmake

@@ -1,5 +1,3 @@
-find_package(QtProtobufProject COMPONENTS QtProtobuf QtGrpc REQUIRED)
-
 function(protobuf_generate_all)
     set(options)
     set(oneValueArgs OUT_DIR TARGET)
@@ -40,50 +38,6 @@ function(protobuf_generate_all)
     add_dependencies(${protobuf_generate_all_TARGET} ${GEN_TARGET})
 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 PROTO_INCLUDES)
-    cmake_parse_arguments(add_test_target "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
-
-    find_package(Threads REQUIRED)
-    find_package(Qt5 COMPONENTS Test REQUIRED)
-    ## test sources build
-    # policy enables automoc for generated files
-    if(${CMAKE_VERSION} VERSION_GREATER "3.10.0")
-        cmake_policy(SET CMP0071 NEW)
-    endif()
-
-    set(GENERATED_SOURCES_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
-
-    if(DEFINED add_test_target_PROTO_FILES)
-        file(GLOB PROTO_FILES ABSOLUTE ${add_test_target_PROTO_FILES})
-    else()
-        file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.proto)
-    endif()
-
-    add_executable(${add_test_target_TARGET} ${add_test_target_SOURCES})
-    qtprotobuf_generate(TARGET ${add_test_target_TARGET}
-        OUT_DIR ${GENERATED_SOURCES_DIR}
-        PROTO_FILES ${PROTO_FILES}
-        GENERATED_HEADERS ${add_test_target_GENERATED_HEADERS}
-        EXCLUDE_HEADERS ${add_test_target_EXCLUDE_HEADERS}
-        MULTI ${add_test_target_MULTI}
-        QML ${add_test_target_QML}
-        COMMENTS TRUE
-        PROTO_INCLUDES ${add_test_target_PROTO_INCLUDES})
-
-    if(Qt5_POSITION_INDEPENDENT_CODE)
-        set_target_properties(${add_test_target_TARGET} PROPERTIES POSITION_INDEPENDENT_CODE FALSE)
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
-    endif()
-    target_link_libraries(${add_test_target_TARGET} PUBLIC gtest_main gtest ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf ${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc Qt5::Core Qt5::Test Qt5::Network ${CMAKE_THREAD_LIBS_INIT})
-    if (${add_test_target_QML})
-        target_link_libraries(${add_test_target_TARGET} PUBLIC Qt5::Qml)
-    endif()
-
-endfunction(add_test_target)
-
 function(add_target_qml)
     set(options)
     set(oneValueArgs TARGET QMLDIR_FILE)
@@ -122,3 +76,18 @@ if(WIN32)
     endif()
 endif()
 endfunction()
+
+if(NOT DEFINED QT_QMAKE_EXECUTABLE)
+    find_program(QT_QMAKE_EXECUTABLE "qmake")
+    if(QT_QMAKE_EXECUTABLE STREQUAL QT_QMAKE_EXECUTABLE-NOTFOUND)
+        message(FATAL_ERROR "Could not find qmake executable")
+    endif()
+endif()
+
+function(extract_qt_variable VARIABLE)
+    execute_process(
+        COMMAND ${QT_QMAKE_EXECUTABLE} -query ${VARIABLE}
+        OUTPUT_VARIABLE ${VARIABLE}
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+endfunction()

+ 5 - 5
cmake/QtProtobufGen.cmake

@@ -17,8 +17,8 @@ function(qtprotobuf_link_archive TARGET GENERATED_TARGET)
 endfunction()
 
 function(qtprotobuf_generate)
-    set(options)
-    set(oneValueArgs OUT_DIR TARGET GENERATED_TARGET MULTI QML COMMENTS GENERATED_HEADERS_VAR)
+    set(options MULTI QML COMMENTS)
+    set(oneValueArgs OUT_DIR TARGET GENERATED_TARGET GENERATED_HEADERS_VAR)
     set(multiValueArgs GENERATED_HEADERS EXCLUDE_HEADERS PROTO_FILES PROTO_INCLUDES)
     cmake_parse_arguments(qtprotobuf_generate "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 
@@ -38,19 +38,19 @@ function(qtprotobuf_generate)
     endif()
 
     set(GENERATION_TYPE "SINGLE")
-    if("${qtprotobuf_generate_MULTI}" STREQUAL "TRUE")
+    if(qtprotobuf_generate_MULTI)
         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("${qtprotobuf_generate_QML}" STREQUAL "TRUE")
+    if(qtprotobuf_generate_QML)
         message(STATUS "Enabled QML generation for ${GENERATED_TARGET_NAME}")
         set(GENERATION_OPTIONS "${GENERATION_OPTIONS}:QML")
     endif()
 
-    if("${qtprotobuf_generate_COMMENTS}" STREQUAL "TRUE")
+    if(qtprotobuf_generate_COMMENTS)
         message(STATUS "Enabled COMMENTS generation for ${GENERATED_TARGET_NAME}")
         set(GENERATION_OPTIONS "${GENERATION_OPTIONS}:COMMENTS")
     endif()

+ 53 - 0
cmake/QtProtobufTest.cmake

@@ -0,0 +1,53 @@
+find_package(QtProtobufProject COMPONENTS QtProtobuf QtGrpc REQUIRED)
+
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
+
+function(add_test_target)
+    set(options MULTI QML)
+    set(oneValueArgs QML_DIR TARGET)
+    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)
+    find_package(Qt5 COMPONENTS Test REQUIRED)
+    ## test sources build
+    # policy enables automoc for generated files
+    if(${CMAKE_VERSION} VERSION_GREATER "3.10.0")
+        cmake_policy(SET CMP0071 NEW)
+    endif()
+
+    set(GENERATED_SOURCES_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
+
+    if(DEFINED add_test_target_PROTO_FILES)
+        file(GLOB PROTO_FILES ABSOLUTE ${add_test_target_PROTO_FILES})
+    else()
+        file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.proto)
+    endif()
+
+    add_executable(${add_test_target_TARGET} ${add_test_target_SOURCES})
+
+    set(EXTRA_OPTIONS COMMENTS)
+    if(add_test_target_MULTI)
+        set(EXTRA_OPTIONS ${EXTRA_OPTIONS} MULTI)
+    endif()
+    if(add_test_target_QML)
+        set(EXTRA_OPTIONS ${EXTRA_OPTIONS} QML)
+    endif()
+
+    qtprotobuf_generate(TARGET ${add_test_target_TARGET}
+        OUT_DIR ${GENERATED_SOURCES_DIR}
+        PROTO_FILES ${PROTO_FILES}
+        GENERATED_HEADERS ${add_test_target_GENERATED_HEADERS}
+        EXCLUDE_HEADERS ${add_test_target_EXCLUDE_HEADERS}
+        ${EXTRA_OPTIONS}
+        PROTO_INCLUDES ${add_test_target_PROTO_INCLUDES})
+
+    if(Qt5_POSITION_INDEPENDENT_CODE)
+        set_target_properties(${add_test_target_TARGET} PROPERTIES POSITION_INDEPENDENT_CODE FALSE)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
+    endif()
+    target_link_libraries(${add_test_target_TARGET} PUBLIC gtest_main gtest ${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobuf ${QTPROTOBUF_COMMON_NAMESPACE}::QtGrpc Qt5::Core Qt5::Test Qt5::Network ${CMAKE_THREAD_LIBS_INIT})
+    if (${add_test_target_QML})
+        target_link_libraries(${add_test_target_TARGET} PUBLIC Qt5::Qml)
+    endif()
+endfunction(add_test_target)

+ 1 - 1
examples/addressbook/CMakeLists.txt

@@ -16,7 +16,7 @@ add_executable(${TARGET} ${SOURCES} resources.qrc)
 qtprotobuf_generate(TARGET ${TARGET}
     OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
     PROTO_FILES ${PROTO_FILES}
-    QML TRUE)
+    QML)
 
 add_target_windeployqt(TARGET ${TARGET} QML_DIR ${CMAKE_CURRENT_SOURCE_DIR}/qml)
 

+ 1 - 1
examples/simplechat/CMakeLists.txt

@@ -19,7 +19,7 @@ add_executable(${TARGET} ${SOURCES} resources.qrc)
 qtprotobuf_generate(TARGET ${TARGET}
     OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated
     PROTO_FILES ${PROTO_FILES}
-    QML TRUE)
+    QML)
 
 add_target_windeployqt(TARGET ${TARGET} QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})
 

+ 2 - 12
src/grpc/CMakeLists.txt

@@ -13,6 +13,7 @@ set(CMAKE_AUTORCC ON)
 
 include(${QTPROTOBUF_CMAKE_DIR}/Coverage.cmake)
 include(${QTPROTOBUF_CMAKE_DIR}/GenerateQtHeaders.cmake)
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
 
 file(GLOB SOURCES qgrpcasyncoperationbase.cpp
     qgrpcasyncreply.cpp
@@ -44,18 +45,7 @@ protobuf_generate_qt_headers(PUBLIC_HEADERS ${HEADERS} COMPONENT ${TARGET})
 
 add_library(${TARGET} SHARED ${SOURCES})
 
-if(NOT DEFINED QT_QMAKE_EXECUTABLE)
-    find_program(QT_QMAKE_EXECUTABLE "qmake")
-    if(QT_QMAKE_EXECUTABLE STREQUAL QT_QMAKE_EXECUTABLE-NOTFOUND)
-        message(FATAL_ERROR "Could not find qmake executable")
-    endif()
-endif()
-
-execute_process(
-    COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_HOST_DATA
-    OUTPUT_VARIABLE QT_HOST_DATA
-    OUTPUT_STRIP_TRAILING_WHITESPACE
-)
+extract_qt_variable(QT_HOST_DATA)
 
 target_compile_definitions(${TARGET} PRIVATE QT_BUILD_GRPC_LIB)
 

+ 3 - 11
src/protobuf/CMakeLists.txt

@@ -15,6 +15,7 @@ find_package(Qt5 COMPONENTS Core Qml REQUIRED)
 
 include(${QTPROTOBUF_CMAKE_DIR}/Coverage.cmake)
 include(${QTPROTOBUF_CMAKE_DIR}/GenerateQtHeaders.cmake)
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
 
 file(GLOB SOURCES
     qtprotobuf.cpp
@@ -69,17 +70,8 @@ if(NOT DEFINED QT_QMAKE_EXECUTABLE)
     endif()
 endif()
 
-execute_process(
-    COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS
-    OUTPUT_VARIABLE QT_INSTALL_PLUGINS
-    OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-
-execute_process(
-    COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_HOST_DATA
-    OUTPUT_VARIABLE QT_HOST_DATA
-    OUTPUT_STRIP_TRAILING_WHITESPACE
-)
+extract_qt_variable(QT_INSTALL_PLUGINS)
+extract_qt_variable(QT_HOST_DATA)
 
 set_target_properties(${TARGET} PROPERTIES QT_PROTOBUF_PLUGIN_PATH "${QT_INSTALL_PLUGINS}/protobuf")
 target_compile_definitions(${TARGET} PUBLIC QT_PROTOBUF_PLUGIN_PATH="${QT_INSTALL_PLUGINS}/protobuf")

+ 3 - 12
src/protobuf/quick/CMakeLists.txt

@@ -7,20 +7,11 @@ set(CMAKE_AUTORCC ON)
 
 find_package(Qt5 COMPONENTS Core Qml REQUIRED)
 
-if(NOT DEFINED QT_QMAKE_EXECUTABLE)
-    find_program(QT_QMAKE_EXECUTABLE "qmake")
-    if(QT_QMAKE_EXECUTABLE STREQUAL QT_QMAKE_EXECUTABLE-NOTFOUND)
-        message(FATAL_ERROR "Could not find qmake executable")
-    endif()
-endif()
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
 
-execute_process(
-    COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_QML
-    OUTPUT_VARIABLE TARGET_IMPORTS_DIR
-    OUTPUT_STRIP_TRAILING_WHITESPACE
-)
+extract_qt_variable(QT_INSTALL_QML)
 
-set(TARGET_IMPORTS_DIR ${TARGET_IMPORTS_DIR}/QtProtobuf)
+set(TARGET_IMPORTS_DIR ${QT_INSTALL_QML}/QtProtobuf)
 
 file(GLOB SOURCES
     qtprotobufquickplugin.cpp)

+ 1 - 1
src/wellknowntypes/CMakeLists.txt

@@ -40,7 +40,7 @@ function(add_wellknowntype TYPENAME)
                 OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated/google/protobuf
                 PROTO_FILES ${PROTO_FILE}
                 PROTO_INCLUDES -I${INCLUDE_DIR}
-                QML TRUE)
+                QML)
             break()
         endif()
     endforeach()

+ 1 - 1
tests/test_grpc/CMakeLists.txt

@@ -1,4 +1,4 @@
-include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufTest.cmake)
 
 # clients
 add_test_target(TARGET qtgrpc_test

+ 2 - 2
tests/test_protobuf/CMakeLists.txt

@@ -1,6 +1,6 @@
 set(TARGET qtprotobuf_test)
 
-include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufTest.cmake)
 
 file(GLOB SOURCES
     simpletest.cpp
@@ -13,7 +13,7 @@ file(GLOB SOURCES
 add_test_target(TARGET ${TARGET}
     EXCLUDE_HEADERS nestedsimpleintmessage.h
     SOURCES ${SOURCES}
-    QML TRUE)
+    QML)
 add_target_windeployqt(TARGET ${TARGET}
     QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})
 

+ 3 - 3
tests/test_protobuf_multifile/CMakeLists.txt

@@ -1,6 +1,6 @@
 set(TARGET qtprotobuf_test_multifile)
 
-include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufTest.cmake)
 
 file(GLOB SOURCES
     simpletest.cpp)
@@ -11,8 +11,8 @@ add_test_target(TARGET ${TARGET}
     PROTO_FILES ${PROTO_FILES}
     EXCLUDE_HEADERS nestedsimpleintmessage.h
     SOURCES ${SOURCES}
-    QML TRUE
-    MULTI TRUE)
+    QML
+    MULTI)
 add_target_windeployqt(TARGET ${TARGET}
     QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})
 

+ 1 - 1
tests/test_qml/CMakeLists.txt

@@ -3,7 +3,7 @@ set(TARGET qtprotobuf_qml_test)
 find_package(Qt5 COMPONENTS Core Quick Network Test QuickTest REQUIRED)
 find_package(QtProtobufProject COMPONENTS QtProtobuf REQUIRED)
 
-include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufTest.cmake)
 
 file(GLOB SOURCES main.cpp)
 file(GLOB QML_FILES qml/tst_simple.qml)

+ 1 - 1
tests/test_qprotobuf_serializer_plugin/CMakeLists.txt

@@ -1,6 +1,6 @@
 set(TARGET qtprotobuf_plugin_test)
 
-include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufTest.cmake)
 
 find_package(Threads REQUIRED)
 find_package(Qt5 COMPONENTS Test REQUIRED)

+ 0 - 7
tests/test_qprotobuf_serializer_plugin/serialization/CMakeLists.txt

@@ -10,13 +10,6 @@ set(CMAKE_AUTORCC ON)
 
 find_package(Qt5 COMPONENTS Core REQUIRED)
 
-if(NOT DEFINED QT_QMAKE_EXECUTABLE)
-    find_program(QT_QMAKE_EXECUTABLE "qmake")
-    if(QT_QMAKE_EXECUTABLE STREQUAL QT_QMAKE_EXECUTABLE-NOTFOUND)
-        message(FATAL_ERROR "Could not find qmake executable")
-    endif()
-endif()
-
 file(GLOB SOURCES
     qtserializationplugin.cpp
     qprotobufjsonserializerimpl.cpp

+ 2 - 2
tests/test_wellknowntypes/CMakeLists.txt

@@ -1,6 +1,6 @@
 set(TARGET wellknowntypes_test)
 
-include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufCommon.cmake)
+include(${QTPROTOBUF_CMAKE_DIR}/QtProtobufTest.cmake)
 find_package(QtProtobufProject CONFIG COMPONENTS QtProtobuf QtGrpc QtProtobufWellKnownTypes REQUIRED)
 
 file(GLOB SOURCES
@@ -9,7 +9,7 @@ file(GLOB SOURCES
 add_test_target(TARGET ${TARGET}
     SOURCES ${SOURCES}
     PROTO_INCLUDES $<TARGET_PROPERTY:${QTPROTOBUF_COMMON_NAMESPACE}::QtProtobufWellKnownTypes,PROTO_INCLUDES>
-    QML TRUE)
+    QML)
 add_target_windeployqt(TARGET ${TARGET}
     QML_DIR ${CMAKE_CURRENT_SOURCE_DIR})