проблема зависимости cmake - PullRequest
       14

проблема зависимости cmake

1 голос
/ 15 декабря 2009

У меня есть 3 маленьких зависимых инструмента:

main-tool/
    tool1/
    tool2/ 

       * ----- main-tool ----- *
       |                       |
      tool1   ---------- >    tool2

Основной инструмент зависит от tool1 и tool2.
Инструмент1 зависит от инструмента2.
Файлы CMakeFiles выглядят так:

main-tool/CMakeLists.txt
   SUBDIRS{"tool1"}
   SUBDIRS{"tool2"}

main-tool/tool1/CMakeLists.txt
   SUBDIRS("../tool2"}

Я могу скомпилировать tool1 плавно. Однако всякий раз, когда я хочу скомпилировать main-tool, tool2 включается дважды и выдает ошибку. Как я могу избежать этого?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 10 февраля 2010

Прежде всего, вы должны использовать add_subdirectory() вместо subdirs(), что устарело . Таким образом вы получаете более точный контроль над порядком обработки.

Во-вторых, поскольку все зависит от инструмента2, сначала вы должны собрать инструмент2.

main-tool/CMakeLists.txt:
   add_subdirectory{"tool2"}
   add_subdirectory{"tool1"}

Не добавляйте еще одну команду add_subdirectory в каталог tool1. Есть два подхода, которые вы можете использовать для доступа к tool2 из сборки tool1.

  1. Сначала вы можете определить некоторые переменные cmake в главном CMakeLists.txt верхнего уровня, связанные с tool2, а затем заполнить эти переменные в сборке tool2. Возможно, вам придется использовать директиву PARENT_SCOPE для set этих переменных из подкаталога tool2. Затем используйте эти переменные для доступа к tool2 из подкаталога tool1.
  2. Кроме того, вы можете собрать все три инструмента (tool2, tool1 и main tool, в указанном порядке) из файла CMakeLists верхнего уровня. Файл сборки может быть длинным, но он избавляет от головной боли, пытаясь управлять областью действия переменных cmake. Такой подход я обычно использую и рекомендую.

Подводя итог, я рекомендую "один большой файл CMakeLists.txt". Если это не становится действительно, действительно большим.

0 голосов
/ 23 декабря 2009

Вы действительно должны использовать SUBDIRS только для подкаталогов. Что вы на самом деле подразумеваете под зависимостью? Если вы объедините несколько библиотек вместе, используйте TARGET_LINK_LIBRARIES, CMake найдет их в вашем проекте независимо от каталога. Если это зависимость во время выполнения, вы обычно заботитесь об этом только после установки или можете использовать "${CMAKE_CURRENT_BINARY_DIR}/../tool2/tool2" в качестве пути к двоичному файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...