Browse Source

Rework static build

- Make static build depend only on BUILD_SHARED_LIBS option
- Remove unecessary dependencies from conan build
- Migrate to microjson 0.1.0
- Fix potential static build issue in windows
Alexey Edelev 4 years ago
parent
commit
fee65ec1e5

+ 1 - 1
.ci/Dockerfile.opensuse

@@ -3,7 +3,7 @@ ADD . /sources
 RUN mkdir -p /build
 WORKDIR /build
 ENV PATH=/qt/5.13.2/gcc_64/bin:$PATH
-RUN cmake ../sources -DCMAKE_PREFIX_PATH="/qt/5.13.2/gcc_64/lib/cmake"
+RUN cmake ../sources -DCMAKE_PREFIX_PATH="/qt/5.13.2/gcc_64/lib/cmake" -DBUILD_SHARED_LIBS=ON
 RUN cmake --build . --config RELEASE
 ENV QT_PLUGIN_PATH=/qt/5.13.2/gcc_64/plugins
 ENV QT_QPA_PLATFORM=minimal

+ 1 - 1
.ci/Dockerfile.opensuse_rpm

@@ -2,5 +2,5 @@ FROM qtprotobuf/opensuse-latest-builtin-qt:latest
 ADD . /sources
 RUN mkdir -p /build && mkdir -p /artifacts
 WORKDIR /build
-RUN PATH=$PATH:/usr/lib64/qt5/bin cmake ../sources -DQT_PROTOBUF_MAKE_TESTS=FALSE -DQT_PROTOBUF_MAKE_EXAMPLES=FALSE -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
+RUN PATH=$PATH:/usr/lib64/qt5/bin cmake ../sources -DQT_PROTOBUF_MAKE_TESTS=FALSE -DQT_PROTOBUF_MAKE_EXAMPLES=FALSE -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS=ON
 RUN cpack -G RPM

+ 1 - 1
.ci/Dockerfile.opensuse_static

@@ -3,7 +3,7 @@ ADD . /sources
 RUN mkdir -p /build
 WORKDIR /build
 ENV PATH=/qt/5.13.2/gcc_64/bin:$PATH
-RUN cmake ../sources -DCMAKE_PREFIX_PATH="/qt/5.13.2/gcc_64/lib/cmake" -DQT_PROTOBUF_STATIC=ON
+RUN cmake ../sources -DCMAKE_PREFIX_PATH="/qt/5.13.2/gcc_64/lib/cmake" -DBUILD_SHARED_LIBS=OFF
 RUN cmake --build . --config RELEASE
 ENV QT_PLUGIN_PATH=/qt/5.13.2/gcc_64/plugins
 ENV QT_QPA_PLATFORM=minimal

+ 1 - 1
.ci/Dockerfile.ubuntu

@@ -3,7 +3,7 @@ ADD . /sources
 RUN mkdir -p /build
 WORKDIR /build
 ENV PATH=/qt/5.13.2/gcc_64/bin:$PATH
-RUN cmake ../sources -DCMAKE_PREFIX_PATH="/qt/5.13.2/gcc_64/lib/cmake"
+RUN cmake ../sources -DCMAKE_PREFIX_PATH="/qt/5.13.2/gcc_64/lib/cmake" -DBUILD_SHARED_LIBS=ON
 RUN cmake --build . --config RELEASE
 ENV QT_PLUGIN_PATH=/qt/5.13.2/gcc_64/plugins
 ENV QT_QPA_PLATFORM=minimal

+ 1 - 1
.ci/Dockerfile.ubuntu_deb

@@ -2,5 +2,5 @@ FROM qtprotobuf/ubuntu-latest-builtin-qt:latest
 ADD . /sources
 RUN mkdir -p /build && mkdir -p /artifacts
 WORKDIR /build
-RUN cmake ../sources -DQT_PROTOBUF_MAKE_TESTS=FALSE -DQT_PROTOBUF_MAKE_EXAMPLES=FALSE -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
+RUN cmake ../sources -DQT_PROTOBUF_MAKE_TESTS=FALSE -DQT_PROTOBUF_MAKE_EXAMPLES=FALSE -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS=ON
 RUN cpack -G DEB

+ 1 - 1
.ci/Dockerfile.ubuntu_static

@@ -3,7 +3,7 @@ ADD . /sources
 RUN mkdir -p /build
 WORKDIR /build
 ENV PATH=/qt/5.13.2/gcc_64/bin:$PATH
-RUN cmake ../sources -DCMAKE_PREFIX_PATH="/qt/5.13.2/gcc_64/lib/cmake" -DQT_PROTOBUF_STATIC=ON
+RUN cmake ../sources -DCMAKE_PREFIX_PATH="/qt/5.13.2/gcc_64/lib/cmake" -DBUILD_SHARED_LIBS=OFF
 RUN cmake --build . --config RELEASE
 ENV QT_PLUGIN_PATH=/qt/5.13.2/gcc_64/plugins
 ENV QT_QPA_PLATFORM=minimal

+ 1 - 1
.travis.yml

@@ -21,6 +21,6 @@ script:
   - setx path "%path%;C:\Qt\5.13.2\msvc2017\bin;C:\Go\bin;C:\ProgramData\chocolatey\lib\yasm\tools"
   - set GOROOT="c:\Go"
   - set PATH="%PATH%;C:\Qt\5.13.2\msvc2017\bin;C:\Go\bin;C:\ProgramData\chocolatey\lib\yasm\tools"
-  - cmake -DCMAKE_PREFIX_PATH="C:\Qt\5.13.2\msvc2017;C:\Go\bin;C:\ProgramData\chocolatey\lib\yasm\tools" ..
+  - cmake -DCMAKE_PREFIX_PATH="C:\Qt\5.13.2\msvc2017;C:\Go\bin;C:\ProgramData\chocolatey\lib\yasm\tools" -DBUILD_SHARED_LIBS=OFF ..
   - cmake --build .
   - ctest -C DEBUG -E qtgrpc_* --output-on-failure

+ 1 - 1
3rdparty/microjson

@@ -1 +1 @@
-Subproject commit 37f8b9b99732003ada616f33d702b184a9b89258
+Subproject commit b1b37757a36f19399e38088609bc63312c50137f

+ 4 - 6
CMakeLists.txt

@@ -16,15 +16,13 @@ include(GNUInstallDirs)
 set(QT_PROTOBUF_CMAKE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
 set(QT_PROTOBUF_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
 set(QT_PROTOBUF_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
-set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
 
 find_package(Qt5 COMPONENTS Core Network Qml REQUIRED)
 
-set(MICROJSON_MAKE_TESTS OFF)
-if(NOT EXISTS "${QT_PROTOBUF_SOURCE_DIR}/3rdparty/microjson/CMakeLists.txt")
-    message(FATAL_ERROR "microjson is not found. Please initialize microjson module: git submodule update --init 3rdparty/microjson")
-else()
+if(EXISTS "${QT_PROTOBUF_SOURCE_DIR}/3rdparty/microjson/CMakeLists.txt")
+    set(MICROJSON_MAKE_TESTS OFF)
     add_subdirectory("${QT_PROTOBUF_SOURCE_DIR}/3rdparty/microjson" EXCLUDE_FROM_ALL)
+    message(STATUS "Using microjson from 3rdparty")
 endif()
 
 if(Qt5Core_VERSION VERSION_LESS "5.12.4")
@@ -118,8 +116,8 @@ endif()
 
 set(QT_PROTOBUF_MAKE_TESTS ON CACHE BOOL "Enable QtProtobuf tests build")
 set(QT_PROTOBUF_MAKE_EXAMPLES ON CACHE BOOL "Enable QtProtobuf examples build")
-set(QT_PROTOBUF_STATIC OFF CACHE BOOL "Enable QtProtobuf static library build (disables shared library build)")
 set(QT_PROTOBUF_MAKE_COVERAGE OFF CACHE BOOL "Enable QtProtobuf build for profiler (gcov)")
+set(BUILD_SHARED_LIBS ON CACHE BOOL "Enable QtProtobuf static library build (disables shared library build)")
 
 if(NOT gRPC_FOUND)
     message(WARNING "gRPC not found: some tests and examples cannot be built.")

+ 2 - 4
README.md

@@ -258,12 +258,10 @@ qtprotobuf_link_target is cmake helper function that links generated protobuf ta
 
 *QT_PROTOBUF_MAKE_EXAMPLES* - if **TRUE/ON** for QtProtobuf project build, built-in examples will be built. **TRUE** by default
 
-*QT_PROTOBUF_STATIC* - if **TRUE/ON** for QtProtobuf project build, static libraries will be produced for all QtProtobuf targets except qml plugin. **FALSE** by default
-
->**Note:** In case if you use static QtProtobuf not with cmake/qmake build system, you additionaly **need manually** add QT_PROTOBUF_STATIC compiler definition
+*QT_PROTOBUF_EXECUTABLE* - contains full path to QtProtobuf generator add_executable
 
 </br>
-*QT_PROTOBUF_EXECUTABLE* - contains full path to QtProtobuf generator add_executable
+>**Note:** In case if you use static QtProtobuf not with cmake/qmake build system, you additionaly **need manually** add QT_PROTOBUF_STATIC compiler definition
 
 ## Integration with qmake project
 

+ 1 - 2
conanfile.py

@@ -21,8 +21,7 @@ class QtProtobufConan(ConanFile):
         "protobuf/3.9.1",
         "protoc_installer/3.9.1@bincrafters/stable",
         "qt/5.14.2@bincrafters/stable",
-        "grpc/1.25.0@inexorgame/stable",
-        "openssl/1.1.1d",
+        "microjson/0.1.0@semlanik/stable",
     ]
     scm = {
         "type": "git",

+ 5 - 8
src/grpc/CMakeLists.txt

@@ -42,14 +42,14 @@ file(GLOB HEADERS qgrpcasyncoperationbase_p.h
 
 protobuf_generate_qt_headers(PUBLIC_HEADER ${HEADERS} COMPONENT ${TARGET})
 
-if(QT_PROTOBUF_STATIC)
+add_library(${TARGET} ${SOURCES})
+
+if(NOT BUILD_SHARED_LIBS)
     if(WIN32)
-        message(WARNING "Static version of QtProtobuf is not fully tested on Win32 platforms")
+        message(WARNING "Static version of QtGrpc is not fully tested on Win32 platforms")
     endif()
-    add_library(${TARGET} STATIC ${SOURCES})
     target_compile_definitions(${TARGET} PRIVATE QT_PROTOBUF_STATIC)
-else()
-    add_library(${TARGET} SHARED ${SOURCES})
+    set(QT_PROTOBUF_EXTRA_CONFIG "staticlib") #extra config for .pri file in case if static build enabled
 endif()
 
 extract_qt_variable(QT_HOST_DATA)
@@ -95,9 +95,6 @@ export(TARGETS ${TARGET} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT
 configure_file("${QT_PROTOBUF_CMAKE_DIR}/gRPCLookup.cmake" "${QT_PROTOBUF_BINARY_DIR}/gRPCLookup.cmake" COPYONLY)
 install(FILES "${QT_PROTOBUF_BINARY_DIR}/gRPCLookup.cmake" DESTINATION "${TARGET_CMAKE_DIR}" COMPONENT dev)
 
-if(QT_PROTOBUF_STATIC) #extra config for .pri file in case if static build enabled
-    set(QT_PROTOBUF_EXTRA_CONFIG "staticlib")
-endif()
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/qt_lib_grpc.pri.in" "${QT_PROTOBUF_BINARY_DIR}/qt_lib_grpc.pri" @ONLY)
 install(FILES "${QT_PROTOBUF_BINARY_DIR}/qt_lib_grpc.pri" DESTINATION "${QT_HOST_DATA}/mkspecs/modules" COMPONENT dev)
 

+ 4 - 10
src/grpc/quick/CMakeLists.txt

@@ -25,15 +25,12 @@ file(GLOB HEADERS
     qquickgrpcsubscription_p.h
     qtgrpcquick_global.h)
 
-if(QT_PROTOBUF_STATIC)
+add_library(${TARGET} ${SOURCES})
+if(NOT BUILD_SHARED_LIBS)
     if(WIN32)
         message(WARNING "Static version of QtProtobuf is not fully tested on Win32 platforms")
     endif()
-    add_library(${TARGET} STATIC ${SOURCES})
     target_compile_definitions(${TARGET} PRIVATE QT_PROTOBUF_STATIC QT_STATICPLUGIN PUBLIC QT_GRPC_QUICK_PLUGIN_NAME="QtGrpcQuickPlugin")
-    set(QT_PROTOBUF_EXTRA_COMPILE_DIFINITIONS QT_PROTOBUF_STATIC)
-else()
-    add_library(${TARGET} SHARED ${SOURCES})
 endif()
 
 target_link_libraries(${TARGET} PRIVATE Qt5::Core Qt5::Qml ${QT_PROTOBUF_PROJECT}::QtGrpc)
@@ -44,7 +41,7 @@ set_target_properties(${TARGET} PROPERTIES
     RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_BINARY_DIR}/QtGrpc")
 target_compile_definitions(${TARGET} PRIVATE QT_GRPC_QUICK_LIB)
 
-if(QT_PROTOBUF_STATIC)
+if(NOT BUILD_SHARED_LIBS)
     add_library(${QT_PROTOBUF_PROJECT}::${TARGET} ALIAS ${TARGET})
     install(TARGETS ${TARGET} COMPONENT lib
         EXPORT ${TARGET_EXPORT} COMPONENT dev
@@ -52,6 +49,7 @@ if(QT_PROTOBUF_STATIC)
         RUNTIME DESTINATION "${TARGET_IMPORTS_DIR}" COMPONENT lib
         LIBRARY DESTINATION "${TARGET_IMPORTS_DIR}" COMPONENT lib)
     install(EXPORT ${TARGET_EXPORT} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake DESTINATION ${TARGET_CMAKE_DIR} COMPONENT dev)
+    export(TARGETS ${TARGET} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake)
 else()
     install(TARGETS ${TARGET} COMPONENT lib
         ARCHIVE DESTINATION "${TARGET_IMPORTS_DIR}" COMPONENT lib
@@ -64,7 +62,3 @@ add_custom_command(TARGET ${TARGET}
     COMMENT "Copying qmldir to binary directory")
 
 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/qmldir DESTINATION "${TARGET_IMPORTS_DIR}" COMPONENT lib)
-
-if(QT_PROTOBUF_STATIC)
-    export(TARGETS ${TARGET} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake)
-endif()

+ 7 - 3
src/grpc/quick/qtgrpcquick_global.h

@@ -27,8 +27,12 @@
 
 #include <QtCore/QtGlobal>
 
-#ifdef QT_GRPC_QUICK_LIB
-    #define QT_GRPC_QUICK_SHARED_EXPORT Q_DECL_EXPORT
+#ifndef QT_PROTOBUF_STATIC
+    #ifdef QT_GRPC_QUICK_LIB
+        #define QT_GRPC_QUICK_SHARED_EXPORT Q_DECL_EXPORT
+    #else
+        #define QT_GRPC_QUICK_SHARED_EXPORT Q_DECL_IMPORT
+    #endif
 #else
-    #define QT_GRPC_QUICK_SHARED_EXPORT Q_DECL_IMPORT
+    #define QT_GRPC_QUICK_SHARED_EXPORT
 #endif

+ 7 - 9
src/protobuf/CMakeLists.txt

@@ -63,15 +63,17 @@ file(GLOB PUBLIC_HEADER
 
 protobuf_generate_qt_headers(PUBLIC_HEADER ${PUBLIC_HEADER} COMPONENT ${TARGET})
 
-if(QT_PROTOBUF_STATIC)
+add_library(${TARGET} ${SOURCES})
+
+set(QT_PROTOBUF_STATIC OFF)
+if(NOT BUILD_SHARED_LIBS)
+    set(QT_PROTOBUF_STATIC ON)
     if(WIN32)
         message(WARNING "Static version of QtProtobuf is not fully tested on Win32 platforms")
     endif()
-    add_library(${TARGET} STATIC ${SOURCES})
     target_compile_definitions(${TARGET} PRIVATE QT_PROTOBUF_STATIC)
     set(QT_PROTOBUF_EXTRA_COMPILE_DIFINITIONS QT_PROTOBUF_STATIC)
-else()
-    add_library(${TARGET} SHARED ${SOURCES})
+    set(QT_PROTOBUF_EXTRA_CONFIG "staticlib") #extra config for .pri file in case if static build enabled
 endif()
 
 if(NOT DEFINED QT_QMAKE_EXECUTABLE)
@@ -106,7 +108,7 @@ target_compile_features(${TARGET} PUBLIC cxx_std_14
                                          cxx_lambdas
                                          cxx_func_identifier)
 
-target_link_libraries(${TARGET} PUBLIC Qt5::Core Qt5::Qml PRIVATE microjson)
+target_link_libraries(${TARGET} PUBLIC Qt5::Core Qt5::Qml microjson)
 
 add_library(${QT_PROTOBUF_PROJECT}::${TARGET} ALIAS ${TARGET})
 
@@ -137,10 +139,6 @@ install(FILES "${QT_PROTOBUF_BINARY_DIR}/parsemessages.go" DESTINATION "${TARGET
 configure_file("${QT_PROTOBUF_CMAKE_DIR}/ProtobufLookup.cmake" "${QT_PROTOBUF_BINARY_DIR}/ProtobufLookup.cmake" COPYONLY)
 install(FILES "${QT_PROTOBUF_BINARY_DIR}/ProtobufLookup.cmake" DESTINATION "${TARGET_CMAKE_DIR}" COMPONENT dev)
 
-if(QT_PROTOBUF_STATIC) #extra config for .pri file in case if static build enabled
-    set(QT_PROTOBUF_EXTRA_CONFIG "staticlib")
-endif()
-
 set(QT_PROTOBUF_EXECUTABLE_INSTALL ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/${GENERATOR_TARGET})
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/qt_lib_protobuf.pri.in" "${QT_PROTOBUF_BINARY_DIR}/qt_lib_protobuf.pri" @ONLY)
 install(FILES "${QT_PROTOBUF_BINARY_DIR}/qt_lib_protobuf.pri" DESTINATION "${QT_HOST_DATA}/mkspecs/modules" COMPONENT dev)

+ 5 - 10
src/protobuf/quick/CMakeLists.txt

@@ -23,15 +23,13 @@ file(GLOB HEADERS
     qtprotobufquickplugin.h
     qtprotobufquick_global.h)
 
-if(QT_PROTOBUF_STATIC)
+add_library(${TARGET} ${SOURCES})
+
+if(NOT BUILD_SHARED_LIBS)
     if(WIN32)
         message(WARNING "Static version of QtProtobuf is not fully tested on Win32 platforms")
     endif()
-    add_library(${TARGET} STATIC ${SOURCES})
     target_compile_definitions(${TARGET} PRIVATE QT_PROTOBUF_STATIC QT_STATICPLUGIN PUBLIC QT_PROTOBUF_QUICK_PLUGIN_NAME="QtProtobufQuickPlugin")
-    set(QT_PROTOBUF_EXTRA_COMPILE_DIFINITIONS QT_PROTOBUF_STATIC)
-else()
-    add_library(${TARGET} SHARED ${SOURCES})
 endif()
 
 target_link_libraries(${TARGET} PRIVATE Qt5::Core Qt5::Qml ${QT_PROTOBUF_PROJECT}::QtProtobuf)
@@ -56,7 +54,7 @@ endforeach()
 
 target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../ ${Qt5Qml_PRIVATE_INCLUDE_DIRS})
 
-if(QT_PROTOBUF_STATIC)
+if(NOT BUILD_SHARED_LIBS)
     add_library(${QT_PROTOBUF_PROJECT}::${TARGET} ALIAS ${TARGET})
     install(TARGETS ${TARGET} COMPONENT lib
         EXPORT ${TARGET_EXPORT} COMPONENT dev
@@ -64,6 +62,7 @@ if(QT_PROTOBUF_STATIC)
         RUNTIME DESTINATION "${TARGET_IMPORTS_DIR}" COMPONENT lib
         LIBRARY DESTINATION "${TARGET_IMPORTS_DIR}" COMPONENT lib)
     install(EXPORT ${TARGET_EXPORT} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake DESTINATION ${TARGET_CMAKE_DIR} COMPONENT dev)
+    export(TARGETS ${TARGET} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake)
 else()
     install(TARGETS ${TARGET} COMPONENT lib
         ARCHIVE DESTINATION "${TARGET_IMPORTS_DIR}" COMPONENT lib
@@ -76,7 +75,3 @@ add_custom_command(TARGET ${TARGET}
     COMMENT "Copying qmldir to binary directory")
 
 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/qmldir DESTINATION "${TARGET_IMPORTS_DIR}" COMPONENT lib)
-
-if(QT_PROTOBUF_STATIC)
-    export(TARGETS ${TARGET} NAMESPACE ${QT_PROTOBUF_PROJECT}:: FILE ${TARGET_EXPORT}.cmake)
-endif()

+ 7 - 3
src/protobuf/quick/qtprotobufquick_global.h

@@ -27,8 +27,12 @@
 
 #include <QtCore/QtGlobal>
 
-#ifdef QT_PROTOBUF_QUICK_LIB
-    #define QT_PROTOBUF_QUICK_SHARED_EXPORT Q_DECL_EXPORT
+#ifndef QT_PROTOBUF_STATIC
+    #ifdef QT_PROTOBUF_QUICK_LIB
+        #define QT_PROTOBUF_QUICK_SHARED_EXPORT Q_DECL_EXPORT
+    #else
+        #define QT_PROTOBUF_QUICK_SHARED_EXPORT Q_DECL_IMPORT
+    #endif
 #else
-    #define QT_PROTOBUF_QUICK_SHARED_EXPORT Q_DECL_IMPORT
+    #define QT_PROTOBUF_QUICK_SHARED_EXPORT
 #endif

+ 1 - 5
src/wellknowntypes/CMakeLists.txt

@@ -43,11 +43,7 @@ function(add_wellknowntype TYPENAME)
     endforeach()
 endfunction()
 
-if(QT_PROTOBUF_STATIC)
-    add_library(${TARGET} STATIC ${SOURCES})
-else()
-    add_library(${TARGET} SHARED ${SOURCES})
-endif()
+add_library(${TARGET} ${SOURCES})
 
 add_wellknowntype(any)
 add_wellknowntype(duration)