Hi,
Do you have cmake that works for the current version of protubuf?
I also do not understand the versioning logic, you are using v3.20 version
while one year later we have v32 version.
On Monday, 19 August 2024 at 15:49:47 UTC+2 Claude Robitaille wrote:
> I forgot that this is required in my main project top CMakeList.txt:
>
> find_package(protobuf REQUIRED PATHS
> $ENV{INSTALL}/protobuf/lib/cmake/protobuf)
> include($ENV{INSTALL}/protobuf/lib/cmake/protobuf/protobuf-module.cmake)
>
> Also, I am on Linux but I do not see why it would be different on macOS.
>
>
> On Monday, August 19, 2024 at 9:46:38 a.m. UTC-4 Claude Robitaille wrote:
>
>> I have been using protobuf with static linking for years and moved to
>> cmake a few months ago.
>>
>> Since I always cross-compile I never use the system installed library and
>> tools so my flow is this
>> 1 - Build, using cmake anything that must be using the local compiler (in
>> the case of protobuf because protoc is needed for later). ATM it is only
>> protobuf
>> 2 - Build all the dependencies, also using cmake
>> 3 - Build my project, including internal libraries.
>>
>> For the first step, ie building protobuf and produce a static archive (a
>> file ending with .a) I use this excerpt from the corresponding cmake:
>> include(ExternalProject)
>>
>> ExternalProject_Add(
>> protobuf
>> GIT_REPOSITORY https://github.com/protocolbuffers/protobuf.git
>> GIT_TAG v3.20.3
>> SOURCE_SUBDIR cmake
>> CMAKE_ARGS
>> -Dprotobuf_BUILD_TESTS=OFF
>> -Dprotobuf_BUILD_EXAMPLES=OFF
>> -DCMAKE_INSTALL_PREFIX=$ENV{INSTALL}/protobuf
>> -Dprotobuf_BUILD_CONFORMANCE=OFF
>> -Dprotobuf_BUILD_EXAMPLES=OFF
>> -Dprotobuf_BUILD_LIBPROTOC=ON
>> -Dprotobuf_BUILD_SHARED_LIBS=OFF
>> -Dprotobuf_MSVC_STATIC_RUNTIME=OFF
>> -Dprotobuf_WITH_ZLIB=OFF
>> BUILD_BYPRODUCTS
>> $ENV{INSTALL}/lib/libprotobuf.a
>> $ENV{INSTALL}/bin/protoc
>> )
>>
>> Note that the install prefix comes from an environment variable. It is
>> normally set to ./build In other word, protobuf and the cmake files are in
>> a child directory off the main build location (which is used by step 3
>> above). Also, SHARED_LIBS is Off meaning that a static library is created.
>>
>> And then in my main project (so step 3 above), I use this to process my
>> proto files (I use to only deal with c++ hence the name; I added python at
>> a later stage):
>>
>> set(GLOBAL_PROTO_FILES "" CACHE INTERNAL "")
>>
>> # Define the append function used by other CMakeList files
>> function(append_proto_file filename)
>> set(GLOBAL_PROTO_FILES ${GLOBAL_PROTO_FILES} ${filename} CACHE
>> INTERNAL "")
>> endfunction()
>>
>> #
>> # The proto file processing function
>> #
>>
>> function(CREATE_CPP_PROTO SRCS HDRS)
>> list(REMOVE_DUPLICATES GLOBAL_PROTO_FILES)
>>
>> set(${SRCS})
>> set(${HDRS})
>>
>> #printList(VAR ${PROTO_SRC_TREE} TITLE "Proto location location")
>> #printList(VAR ${GLOBAL_PROTO_FILES} TITLE "Proto files")
>>
>> add_library(proto-objects OBJECT ${GLOBAL_PROTO_FILES})
>> target_link_libraries(proto-objects PUBLIC protobuf::libprotobuf)
>> target_include_directories(proto-objects PUBLIC
>> "$<BUILD_INTERFACE:$ENV{GENERATED}>")
>>
>> make_directory($ENV{GENERATED})
>> make_directory($ENV{GENERATED}/python)
>>
>> # This is a function provided by the cmake binding for protobuf
>> # C++
>> protobuf_generate(
>> TARGET proto-objects
>> LANGUAGE cpp
>> PROTOC_OUT_DIR $ENV{GENERATED}
>> IMPORT_DIRS ${MODELS_DIR};${PROTO_SRC_TREE}
>> #IMPORT_DIRS ${MODELS_DIR}
>> #PROTOC_OPTIONS "--cpp_opt=paths=source_relative"
>> #PROTOC_OPTIONS "--proto_path=${MODELS_DIR}"
>> )
>>
>> # Python
>> protobuf_generate(
>> TARGET proto-objects
>> LANGUAGE python
>> PROTOC_OUT_DIR $ENV{GENERATED}/python
>> IMPORT_DIRS ${MODELS_DIR};${PROTO_SRC_TREE}
>> )
>>
>> target_include_directories(proto-objects PRIVATE $ENV{GENERATED})
>>
>> # Probably useless but other targets depends on it, so we keep it but
>> it does nothing. In future we could probably remove
>> # reference to it.
>> add_custom_target(PROTO_FILES_READY
>> COMMENT "Moving .pb.h and _pb2.py files to replicate source
>> directory structure"
>> )
>>
>> set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES
>> GENERATED TRUE)
>> set(${SRCS} ${${SRCS}} PARENT_SCOPE)
>> set(${HDRS} ${${HDRS}} PARENT_SCOPE)
>> endfunction()
>>
>>
>>
>> On Monday, August 19, 2024 at 2:32:25 a.m. UTC-4 Marcin Lewandowski wrote:
>>
>>> Hello,
>>>
>>> I am working on a library where I would use protobuf.
>>>
>>> I need to link it statically. The target platform is macOS.
>>>
>>> The usual way of fetching dependencies (brew install protobuf) is no go,
>>> as it comes only with shared libraries.
>>>
>>> I tried forcing homebrew to rebuild protobuf (brew install protobuf
>>> --build-from-source) but it fails as some tests are not passing (logs [1]
>>> at the end of this message).
>>>
>>> I fetched the source code (27.3) release from github, run
>>>
>>> bazel build :portico :protobuf
>>>
>>> inside the source directory, but while it compiles protoc compiler,
>>> there's no CMake/protobuf-lite library in the output.
>>>
>>> Apparently the runtime is based on CMake, so I run
>>>
>>> cmake -S . -B build -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_CXX_STANDARD=17
>>> -Dprotobuf_ABSL_PROVIDER=package -Dprotobuf_JSONCPP_PROVIDER=package
>>>
>>> and then issued compilation in build/ dir, and yay, it compiled protobuf.
>>>
>>> However, when I added the build/cmake to CMAKE_PREFIX_PATH it complains
>>> about missing build/cmake/protobuf/protobuf-targets.cmake
>>>
>>> So I tried adding the repository as git submodule, and adding it via
>>> add_subdirectory CMake command, then it fails with
>>>
>>> CMake Error: install(EXPORT "protobuf-targets" ...) includes target
>>> "libprotobuf-lite" which requires target "absl_absl_check" that is not in
>>> any export set.
>>> CMake Error: install(EXPORT "protobuf-targets" ...) includes target
>>> "libprotobuf-lite" which requires target "absl_absl_log" that is not in any
>>> export set.
>>> CMake Error: install(EXPORT "protobuf-targets" ...) includes target
>>> "libprotobuf-lite" which requires target "absl_algorithm" that is not in
>>> any export set.
>>> CMake Error: install(EXPORT "protobuf-targets" ...) includes target
>>> "libprotobuf-lite" which requires target "absl_base" that is not in any
>>> export set.
>>> ...
>>>
>>> abseil is added as add_subdirectory as well.
>>>
>>> I run into conclusion that I must be doing something fundamentally
>>> wrong, as I don't expect such popular piece of code to be so hard to
>>> integrate.
>>>
>>> Any suggestions on how to properly embed protobuf within such a project?
>>>
>>> Thanks in advance,
>>>
>>> Marcin
>>>
>>> [1] Failed tests:
>>>
>>> 2: [ RUN ] TextFormatParserTest.ParseFieldValueFromString
>>> 2: E0000 00:00:1723926116.158054 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected integer,
>>> got: a
>>> 2: E0000 00:00:1723926116.158063 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Integer out of
>>> range (999999999999999999999999999999999999)
>>> 2: E0000 00:00:1723926116.158079 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected integer,
>>> got: a
>>> 2: E0000 00:00:1723926116.158082 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Integer out of
>>> range (999999999999999999999999999999999999)
>>> 2: E0000 00:00:1723926116.158084 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected integer,
>>> got: -
>>> 2: E0000 00:00:1723926116.158085 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected integer,
>>> got: a
>>> 2: E0000 00:00:1723926116.158087 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Integer out of
>>> range (999999999999999999999999999999999999)
>>> 2: E0000 00:00:1723926116.158089 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected integer,
>>> got: -
>>> 2: E0000 00:00:1723926116.158090 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected integer,
>>> got: a
>>> 2: E0000 00:00:1723926116.158092 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Integer out of
>>> range (999999999999999999999999999999999999)
>>> 2: E0000 00:00:1723926116.158094 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected integer,
>>> got: -
>>> 2: E0000 00:00:1723926116.158095 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected integer,
>>> got: a
>>> 2: E0000 00:00:1723926116.158097 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Integer out of
>>> range (999999999999999999999999999999999999)
>>> 2: E0000 00:00:1723926116.158101 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:5: Invalid value for
>>> boolean field "optional_bool". Value: "tRue".
>>> 2: E0000 00:00:1723926116.158106 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:6: Invalid value for
>>> boolean field "optional_bool". Value: "faLse".
>>> 2: E0000 00:00:1723926116.158108 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Integer out of
>>> range (2)
>>> 2: E0000 00:00:1723926116.158109 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected
>>> identifier, got: -
>>> 2: E0000 00:00:1723926116.158111 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:3: Invalid value for
>>> boolean field "optional_bool". Value: "on".
>>> 2: E0000 00:00:1723926116.158113 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:2: Invalid value for
>>> boolean field "optional_bool". Value: "a".
>>> 2: E0000 00:00:1723926116.158130 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected double,
>>> got: a
>>> 2: E0000 00:00:1723926116.158132 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected double,
>>> got: a
>>> 2: E0000 00:00:1723926116.158134 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expect a decimal
>>> number, got: 0xf
>>> 2: E0000 00:00:1723926116.158136 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expect a decimal
>>> number, got: 012
>>> 2: E0000 00:00:1723926116.158138 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected string,
>>> got: hello
>>> 2: E0000 00:00:1723926116.158141 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:7: Unknown
>>> enumeration value of "FOOBAR" for field "optional_nested_enum".
>>> 2: E0000 00:00:1723926116.158143 5519321 text_format.cc:417] Error
>>> parsing text-format protobuf_unittest.TestAllTypes: 1:1: Expected "{",
>>> found "any".
>>>
>>>
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/protobuf/50117e7f-799a-4019-97c2-8817cf45e929n%40googlegroups.com.