Как мне вызвать двоичный файл вывода ExternalProject из cmake?

#cmake #cmake-modules

#cmake #cmake-модули

Вопрос:

Я пытаюсь использовать следующий подход для встраивания плоских буферов в мой проект:

 ExternalProject_Add(
    googleflatbuf
    GIT_REPOSITORY "https://github.com/google/flatbuffers"
    GIT_TAG "v1.12.0"
    PREFIX "${CMAKE_BINARY_DIR}/googleflatbuf"
    INSTALL_DIR "${CMAKE_BINARY_DIR}"
    CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}"
)
 

flatbuf построен, как и ожидалось, поэтому здесь нет проблем.
Затем я попытаюсь использовать его для реальной генерации кода подобным образом:

 file(GLOB PROTOCOL_SRC "${CMAKE_CURRENT_SOURCE_DIR}/*.fbs")

string (REPLACE ";" " " PROTOCOL_SRC_STR "${PROTOCOL_SRC}")

add_custom_target(
    protocol_src_gen
        COMMAND "${FLATC} --cpp -o ${CMAKE_CURRENT_BINARY_DIR} ${PROTOCOL_SRC_STR}"
        DEPENDS googleflatbuf
        SOURCES ${PROTOCOL_SRC}
)
 

Где FLATC "${CMAKE_BINARY_DIR}/bin/flatc"
Я уверен, что это был бы не лучший способ получить плоский путь, даже если бы он работал. На самом деле я получаю FLATC == ../bin/flatc .

Поэтому у меня есть два вопроса:

  1. Как мне получить абсолютный путь CMAKE_BINARY_DIR ?
  2. Как правильно вызывать исполняемые файлы, созданные ExternalProject?

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

1. Да, этот способ должен работать (при условии, что вы удалите двойные кавычки вокруг параметров после COMMAND ). Вы пробовали это? «Как мне получить абсолютный путь CMAKE_BINARY_DIR ? — CMAKE_BINARY_DIR это уже абсолютный путь. Не уверен, в чем проблема.

2. Да, это работает. Помогло удаление кавычек. Я все еще вижу, что flatc вызывается как ../bin/flatc, но это работает. Не уверен, что здесь происходит, но может быть, что строка в кавычках обрабатывается как путь к исполняемому файлу целиком. Что было бы довольно странно. @Tsyvarev, напишите ответ, пожалуйста, чтобы я мог его принять.