Поддержка Cap’n Proto CMake: НЕ НАЙДЕН CAPNP_LIB_CAPNP-JSON

#c #cmake #capnproto

#c #cmake #capnproto

Вопрос:

Почему я должен устанавливать

set(CAPNP_LIB_CAPNP-JSON "")

в моем CMakeLists.txt для того, чтобы не получить ошибку? Ошибка следующего вида:

 CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CAPNP_LIB_CAPNP-JSON (ADVANCED)
    linked by target "client" in directory <...>
    linked by target "server" in directory <...>
 

Способ, которым я использую поддержку capnproto CMake, заключается в копировании файла cmake, включенного в исходный код capnproto, в мой проект и включении его вручную. (Есть ли лучший / стандартный способ сделать это? Кажется хакерским.) Остальное просто взято из инструкций файла CMake.

Фрагмент CMake:

 # so capnp cmake plugin is found
set(CapnProto_DIR "${CMAKE_CURRENT_SOURCE_DIR}/etc/cmake")
# for some reason there is some json lib or something that isn't found?
#set(CAPNP_LIB_CAPNP-JSON "")
find_package(CapnProto REQUIRED)
include_directories(${CAPNP_INCLUDE_DIRS})
add_definitions(${CAPNP_DEFINITIONS})
set(CAPNPC_SRC_PREFIX "src/capnp")
# capnp out of source config
set(CAPNPC_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
include_directories(${CAPNPC_OUTPUT_DIR})
# gen cpp
capnp_generate_cpp(CAPNP_SRCS CAPNP_HDRS
        src/capnp/schema.capnp
)
 

CMake 3.6.2, сборка с использованием встроенных команд сборки CLion. capnp устанавливается через homebrew, последнюю версию.

Почему я получаю сообщение об ошибке с битом JSON? О чем это?

Кроме того, есть ли лучший способ включить официальный файл Cap’n Proto CMake? Казалось, что он не распространяется вместе с заголовочными и библиотечными файлами при установке через homebrew.

Комментарии:

1. The way I'm using capnproto CMake support is by copying the cmake file included in the capnproto source into my project and including it manually. — Естественный способ — настроить путь поиска, чтобы найти файл на месте. Например, установив . CapnProto_DIR Why am I getting the error about the JSON bit? What is that about? — Это зависит от содержимого .cmake вашего скрипта. Кстати, сообщение об ошибке дает вам подсказку, где выполняется связывание, почему бы не проверить эти каталоги?

2. Добавлена ссылка на сценарий cmake, на который я ссылаюсь: github.com/sandstorm-io/capnproto/blob/master/c++/cmake /… Повторная ссылка: сообщение, похоже, просто сообщает мне, в основном, какие цели используют сгенерированные файлы capnp, что совсем не кажется полезным. Я вообще не понимаю, что CAPNP_LIB_CAPNP-JSON это такое — на данный момент мне не очень удобно копаться в файлах сценариев CMake!

3. Итак, это скрипт, который использует эту переменную, см. Строку find_library(CAPNP_LIB_CAPNP-JSON capnp-json . Я не знаю, зачем ему нужна эта библиотека, можно погуглить другие FindCapnp.cmake скрипты, которые не используют json. Вы спрашиваете в начале Why do I have to set ... — вам нужно определить пустую переменную для преодоления использования json.

4. Хорошо, я понимаю эту механику. Вопрос в том, что, поскольку я использую «официальный» CMake-файл Cap’n Protos, это должно работать без применения такого обходного пути, верно? Потому что, если я не определяю эту переменную, я получаю предупреждение, что наводит меня на мысль, что я использую что-то неправильно. Что заставляет меня спросить — что я здесь делаю не так? Я понимаю, что для ответа на этот вопрос требуется углубиться в файл CMake дальше или иметь более глубокие знания о том, как Cap’n Proto работает здесь, что он делает, что ему здесь нужно.

5. И хорошо, по сути, это означает, что скрипт не может найти библиотеку «capnp-json», т. Е. В моей системе отсутствует файл .dylib (я на OS X)? В противном случае переменная была бы определена скриптом, и мне не пришлось бы устанавливать ее самостоятельно?

Ответ №1:

Оказывается, поддержка кодирования / декодирования json является еще (октябрь 2016 г.) неизданной функцией Cap’n Proto, и попытка использовать файл .cmake из главной ветки с последней выпущенной версией приводит к этому конфликту.

Возможные решения:

1) Используйте обходной путь, опубликованный в вопросе, т. е.

 set(CAPNP_LIB_CAPNP-JSON "") # add this before next line
find_package(CapnProto REQUIRED)
 

2) Используйте выпущенную версию скрипта .cmake здесь: FindCapnProto.cmake

3) Создайте и установите Cap’n Proto из исходного кода, используйте с последним скриптом .cmake.