Browse Source

Cleanup CMakeLists

- Test source code is generated in subdir to separate it from executable
- Find_package(Qt) moved to root CMake (except for example)
- Lib headers are made propagated to in-build consumers
- Several target_link_libraries merged from win32 and unix as identical
Viktor Kopp 5 years ago
parent
commit
87b93eb710
5 changed files with 40 additions and 52 deletions
  1. 2 3
      CMakeLists.txt
  2. 2 12
      examples/addressbook/CMakeLists.txt
  3. 7 9
      src/grpc/CMakeLists.txt
  4. 7 5
      src/protobuf/CMakeLists.txt
  5. 22 23
      tests/CMakeLists.txt

+ 2 - 3
CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.1)
 
 project(qtprotobuf)
 
@@ -18,8 +18,7 @@ endif()
 
 # grpc target requires QT version not less than 5.11
 # earlier versions do not provide required Http2DirectAttribute: https://doc.qt.io/qt-5/whatsnew511.html
-find_package(Qt5 COMPONENTS Core REQUIRED)
-
+find_package(Qt5 COMPONENTS Core Network Qml REQUIRED)
 if (Qt5Core_VERSION VERSION_LESS "5.11.0")
     message(FATAL_ERROR "Required Qt version is 5.11+")
 endif()

+ 2 - 12
examples/addressbook/CMakeLists.txt

@@ -73,22 +73,12 @@ list(APPEND GENERATED_SOURCES
 )
 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/globalenums.h PROPERTIES GENERATED TRUE)
 
+# FIXME: protobuf and grpc headers should be propagated from corresponding targets
 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src/protobuf ${CMAKE_SOURCE_DIR}/src/grpc)
 
-if(WIN32)
-    #Set  path to GTest build libraries
-    set(GTEST_BOTH_LIBRARIES "")
-    #Set  path to GTest include directory
-    include_directories(${GTEST_INCLUDE_PATHS} "/")
-endif()
-
 file(GLOB SOURCES main.cpp addressbookengine.cpp universallistmodel.cpp universallistmodelbase.cpp)
 
 set(addressbook "addressbook_example")
 add_executable(${addressbook} ${SOURCES} ${GENERATED_SOURCES} resources.qrc)
-if(WIN32)
-    target_link_libraries(${addressbook} qtgrpc qtprotobufsupport Qt5::Quick Qt5::Qml)
-elseif(UNIX)
-    target_link_libraries(${addressbook} qtgrpc qtprotobufsupport Qt5::Quick)
-endif()
+target_link_libraries(${addressbook} qtgrpc qtprotobufsupport Qt5::Quick Qt5::Qml)
 add_dependencies(${addressbook} ${addressbookgeneration})

+ 7 - 9
src/grpc/CMakeLists.txt

@@ -1,5 +1,3 @@
-set(GRPC_SUPPORT_LIBRARY_TARGET qtgrpc)
-
 # FIXME: replace with 'target_include_directories'
 include_directories(${CMAKE_SOURCE_DIR}/src/protobuf)
 
@@ -21,15 +19,15 @@ file(GLOB HEADERS asyncreply.h
     http2channel.h
     abstractclient.h)
 
-find_package(Qt5 COMPONENTS Core Network REQUIRED)
-
+set(GRPC_SUPPORT_LIBRARY_TARGET qtgrpc)
 add_library(${GRPC_SUPPORT_LIBRARY_TARGET} ${SOURCES})
 set_target_properties(${GRPC_SUPPORT_LIBRARY_TARGET} PROPERTIES PUBLIC_HEADER "${HEADERS}")
-if(WIN32)
-    target_link_libraries(${GRPC_SUPPORT_LIBRARY_TARGET} PRIVATE qtprotobufsupport PUBLIC Qt5::Network Qt5::Core)
-elseif(UNIX)
-    target_link_libraries(${GRPC_SUPPORT_LIBRARY_TARGET} PRIVATE qtprotobufsupport PUBLIC Qt5::Network)
-endif()
+target_link_libraries(${GRPC_SUPPORT_LIBRARY_TARGET} PRIVATE qtprotobufsupport PUBLIC Qt5::Network Qt5::Core)
+target_include_directories(${GRPC_SUPPORT_LIBRARY_TARGET}
+    PUBLIC
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+)
+
 install(TARGETS ${GRPC_SUPPORT_LIBRARY_TARGET}
     ARCHIVE DESTINATION lib
     PUBLIC_HEADER DESTINATION include)

+ 7 - 5
src/protobuf/CMakeLists.txt

@@ -1,10 +1,8 @@
-set(SUPPORT_LIBRARY_TARGET qtprotobufsupport)
+
 
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 set(CMAKE_AUTOMOC ON)
 set(CMAKE_AUTORCC ON)
-set(CMAKE_CXX_STANDARD 14)
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
 if(Qt5_POSITION_INDEPENDENT_CODE)
   set(CMAKE_POSITION_INDEPENDENT_CODE ON)
@@ -23,11 +21,15 @@ file(GLOB HEADERS
     qtprotobuftypes.h
     qtprotobuf.h)
 
-find_package(Qt5 COMPONENTS Core Qml REQUIRED)
-
+set(SUPPORT_LIBRARY_TARGET qtprotobufsupport)
 add_library(${SUPPORT_LIBRARY_TARGET} ${SOURCES})
 set_target_properties(${SUPPORT_LIBRARY_TARGET} PROPERTIES PUBLIC_HEADER "${HEADERS}")
 target_link_libraries(${SUPPORT_LIBRARY_TARGET} PUBLIC Qt5::Core Qt5::Qml)
+# FIXME: in order to make separation between private and public headers, they should reside in different directories
+target_include_directories(${SUPPORT_LIBRARY_TARGET}
+    PUBLIC
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+)
 
 install(TARGETS ${SUPPORT_LIBRARY_TARGET}
     ARCHIVE DESTINATION lib

+ 22 - 23
tests/CMakeLists.txt

@@ -1,6 +1,7 @@
-set(testgeneration "test_generation")
-set(TESTS_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
-file(MAKE_DIRECTORY ${TESTS_OUT_DIR})
+set(PROTO_FILES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/proto/)
+set(GENERATED_SOURCES_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
+
+file(MAKE_DIRECTORY ${GENERATED_SOURCES_DIR})
 file(GLOB PROTO_FILES ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.proto)
 ## test sources generation
 if(WIN32)
@@ -9,17 +10,15 @@ if(WIN32)
     set(Protobuf_PROTOC_EXECUTABLE ${PROTOBUF_INSTALATION_PATH}/bin/protoc.exe)
 endif()
 
-add_custom_target(${testgeneration})
-add_custom_command(TARGET ${testgeneration}
-        COMMAND ${Protobuf_PROTOC_EXECUTABLE} --${PROJECT_NAME}_opt=out=${TESTS_OUT_DIR} --plugin=protoc-gen-${PROJECT_NAME}=$<TARGET_FILE:${PROJECT_NAME}> --qtprotobuf_out=${TESTS_OUT_DIR} -I=${CMAKE_CURRENT_SOURCE_DIR}/proto/ ${PROTO_FILES}
-        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/proto/
+set(test_sources_generation "test_generation")
+add_custom_target(${test_sources_generation})
+add_custom_command(TARGET ${test_sources_generation}
+        COMMAND ${Protobuf_PROTOC_EXECUTABLE} --${PROJECT_NAME}_opt=out=${GENERATED_SOURCES_DIR} --plugin=protoc-gen-${PROJECT_NAME}=$<TARGET_FILE:${PROJECT_NAME}> --qtprotobuf_out=${GENERATED_SOURCES_DIR} -I=${PROTO_FILES_DIR} ${PROTO_FILES}
+        WORKING_DIRECTORY ${PROTO_FILES_DIR}
         DEPENDS ${PROTO_FILES}
         COMMENT "Generating test headers"
 )
-
-add_dependencies(${testgeneration} ${PROJECT_NAME})
-
-find_package(Qt5 COMPONENTS Core Network Qml REQUIRED)
+add_dependencies(${test_sources_generation} ${PROJECT_NAME})
 
 ## test sources build
 # policy enables automoc for generated files
@@ -171,10 +170,10 @@ set(EXPECTED_GENERATED_HEADERS
 foreach(EXPECTED_GENERATED_HEADER ${EXPECTED_GENERATED_HEADERS})
     get_filename_component(GENERATED_HEADER_BASENAME ${EXPECTED_GENERATED_HEADER} NAME_WE)
 
-    list(APPEND GENERATED_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${GENERATED_HEADER_BASENAME}.cpp)
-    list(APPEND GENERATED_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/${GENERATED_HEADER_BASENAME}.h)
+    list(APPEND GENERATED_SOURCES ${GENERATED_SOURCES_DIR}/${GENERATED_HEADER_BASENAME}.cpp)
+    list(APPEND GENERATED_HEADERS ${GENERATED_SOURCES_DIR}/${GENERATED_HEADER_BASENAME}.h)
 
-    set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${GENERATED_HEADER_BASENAME}.cpp PROPERTY SKIP_AUTOMOC ON)
+    set_property(SOURCE ${GENERATED_SOURCES_DIR}/${GENERATED_HEADER_BASENAME}.cpp PROPERTY SKIP_AUTOMOC ON)
 endforeach(EXPECTED_GENERATED_HEADER)
 
 qt5_wrap_cpp(MOC_SOURCES ${GENERATED_HEADERS})
@@ -182,21 +181,19 @@ list(APPEND GENERATED_SOURCES ${MOC_SOURCES})
 
 # TODO: so far the following cpp files are not generated 
 list(REMOVE_ITEM GENERATED_SOURCES
-    ${CMAKE_CURRENT_BINARY_DIR}/testserviceserver.cpp
-    ${CMAKE_CURRENT_BINARY_DIR}/globalenums.cpp
+    ${GENERATED_SOURCES_DIR}/testserviceserver.cpp
+    ${GENERATED_SOURCES_DIR}/globalenums.cpp
 )
 set_source_files_properties(${GENERATED_SOURCES} PROPERTIES GENERATED TRUE)
 
 # TODO: but their headers should be included in sources for executable to be processed by moc
 list(APPEND GENERATED_SOURCES
-    ${CMAKE_CURRENT_BINARY_DIR}/testserviceserver.h
-    ${CMAKE_CURRENT_BINARY_DIR}/globalenums.h
+    ${GENERATED_SOURCES_DIR}/testserviceserver.h
+    ${GENERATED_SOURCES_DIR}/globalenums.h
 )
 
-set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/globalenums.h PROPERTIES GENERATED TRUE)
-set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/testserviceserver.h PROPERTIES GENERATED TRUE)
-
-include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src/protobuf ${CMAKE_SOURCE_DIR}/src/grpc)
+set_source_files_properties(${GENERATED_SOURCES_DIR}/globalenums.h PROPERTIES GENERATED TRUE)
+set_source_files_properties(${GENERATED_SOURCES_DIR}/testserviceserver.h PROPERTIES GENERATED TRUE)
 
 if(WIN32)
     #Set  path to GTest build libraries
@@ -222,4 +219,6 @@ if(WIN32)
 elseif(UNIX)
     target_link_libraries(${testtarget} gtest qtgrpc qtprotobufsupport)
 endif()
-add_dependencies(${testtarget} ${testgeneration})
+
+target_include_directories(${testtarget} PRIVATE ${GENERATED_SOURCES_DIR})
+add_dependencies(${testtarget} ${test_sources_generation})