From e79f7d3ac627d0f0bf2b02f7085e0ff90e5cf692 Mon Sep 17 00:00:00 2001 From: Ilya Lipnitskiy Date: Fri, 12 Mar 2021 15:59:33 -0800 Subject: [PATCH] cmake: use static build by default, fix MSVC build Matches protobuf default behavior: https://github.com/protocolbuffers/protobuf/tree/master/cmake#dlls-vs-static-linking Bump min cmake version to use Protobuf_USE_STATIC_LIBS: https://cmake.org/cmake/help/latest/module/FindProtobuf.html --- build-cmake/CMakeLists.txt | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/build-cmake/CMakeLists.txt b/build-cmake/CMakeLists.txt index 4b73a3e..bc79329 100644 --- a/build-cmake/CMakeLists.txt +++ b/build-cmake/CMakeLists.txt @@ -4,12 +4,11 @@ SET(PACKAGE_VERSION 1.3.3) SET(PACKAGE_URL https://github.com/protobuf-c/protobuf-c) SET(PACKAGE_DESCRIPTION "Protocol Buffers implementation in C") -CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) +CMAKE_MINIMUM_REQUIRED(VERSION 3.10 FATAL_ERROR) PROJECT(protobuf-c) #options -option(MSVC_STATIC_BUILD "MSVC_STATIC_BUILD" OFF) option(BUILD_PROTO3 "BUILD_PROTO3" ON) option(BUILD_PROTOC "Build protoc-gen-c" ON) if(CMAKE_BUILD_TYPE MATCHES Debug) @@ -28,6 +27,10 @@ if (${WORDS_BIGENDIAN}) ADD_DEFINITIONS(-DWORDS_BIGENDIAN) endif() +IF (MSVC AND BUILD_SHARED_LIBS) + ADD_DEFINITIONS(-DPROTOBUF_C_USE_SHARED_LIB) +ENDIF (MSVC AND BUILD_SHARED_LIBS) + if(MSVC) # using Visual Studio C++ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4267 /wd4244") @@ -45,6 +48,9 @@ SET (PC_SOURCES ADD_LIBRARY(protobuf-c ${PC_SOURCES}) set_target_properties(protobuf-c PROPERTIES COMPILE_PDB_NAME protobuf-c) +IF (MSVC AND BUILD_SHARED_LIBS) + TARGET_COMPILE_DEFINITIONS(protobuf-c PRIVATE -DPROTOBUF_C_EXPORT) +ENDIF (MSVC AND BUILD_SHARED_LIBS) INCLUDE_DIRECTORIES(${MAIN_DIR}) INCLUDE_DIRECTORIES(${MAIN_DIR}/protobuf-c) @@ -52,6 +58,10 @@ INCLUDE_DIRECTORIES(${MAIN_DIR}/protobuf-c) IF(BUILD_PROTOC) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) # for generated files +if (MSVC AND NOT BUILD_SHARED_LIBS) + SET(Protobuf_USE_STATIC_LIBS ON) +endif (MSVC AND NOT BUILD_SHARED_LIBS) + FIND_PACKAGE(Protobuf REQUIRED) INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIR}) @@ -60,7 +70,7 @@ if (BUILD_PROTO3) endif() ENDIF() -if (MSVC AND MSVC_STATIC_BUILD) +if (MSVC AND NOT BUILD_SHARED_LIBS) # In case we are building static libraries, link also the runtime library statically # so that MSVCR*.DLL is not required at runtime. # https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx @@ -75,7 +85,7 @@ if (MSVC AND MSVC_STATIC_BUILD) string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") endif(${flag_var} MATCHES "/MD") endforeach(flag_var) -endif (MSVC AND MSVC_STATIC_BUILD) +endif (MSVC AND NOT BUILD_SHARED_LIBS) IF(BUILD_PROTOC) SET(CMAKE_CXX_STANDARD 11) @@ -86,6 +96,13 @@ ADD_EXECUTABLE(protoc-gen-c ${PROTOC_GEN_C_SRC}) TARGET_LINK_LIBRARIES(protoc-gen-c ${PROTOBUF_PROTOC_LIBRARY} ${PROTOBUF_LIBRARY}) +IF (MSVC AND BUILD_SHARED_LIBS) + TARGET_COMPILE_DEFINITIONS(protoc-gen-c PRIVATE -DPROTOBUF_USE_DLLS) + GET_FILENAME_COMPONENT(PROTOBUF_DLL_DIR ${PROTOBUF_PROTOC_EXECUTABLE} DIRECTORY) + FILE(GLOB PROTOBUF_DLLS ${PROTOBUF_DLL_DIR}/*.dll) + FILE(COPY ${PROTOBUF_DLLS} DESTINATION ${CMAKE_BINARY_DIR}) +ENDIF (MSVC AND BUILD_SHARED_LIBS) + IF(CMAKE_HOST_UNIX) ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ln -sf protoc-gen-c protoc-c @@ -117,6 +134,9 @@ GENERATE_TEST_SOURCES(${TEST_DIR}/test-full.proto t/test-full.pb-c.c t/test-full ADD_EXECUTABLE(cxx-generate-packed-data ${TEST_DIR}/generated-code2/cxx-generate-packed-data.cc t/test-full.pb.h t/test-full.pb.cc) TARGET_LINK_LIBRARIES(cxx-generate-packed-data ${PROTOBUF_LIBRARY}) +IF (MSVC AND BUILD_SHARED_LIBS) + TARGET_COMPILE_DEFINITIONS(cxx-generate-packed-data PRIVATE -DPROTOBUF_USE_DLLS) +ENDIF (MSVC AND BUILD_SHARED_LIBS) FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/t/generated-code2) ADD_CUSTOM_COMMAND(OUTPUT t/generated-code2/test-full-cxx-output.inc @@ -161,7 +181,7 @@ ENDIF() INSTALL(TARGETS protoc-gen-c RUNTIME DESTINATION bin) ENDIF() # BUILD_PROTOC -INSTALL(TARGETS protobuf-c LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) +INSTALL(TARGETS protobuf-c LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin) INSTALL(FILES ${MAIN_DIR}/protobuf-c/protobuf-c.h DESTINATION include/protobuf-c) INSTALL(FILES ${MAIN_DIR}/protobuf-c/protobuf-c.h DESTINATION include) INSTALL(FILES ${CMAKE_BINARY_DIR}/protobuf-c.pdb DESTINATION lib OPTIONAL)