Синтаксический анализ нелогичного пути CMake?

#c #cmake

#c #cmake

Вопрос:

Я пытаюсь включить этот проект в свою базу кода cmake. Я клонировал репозиторий в свой include / dir и добавил эту строку в свои CMakeLists.txtx:

 add_subdirectory(${DIVISIBLE_INSTALL_INCLUDE_DIR}/cc.ublox.commsdsl)
include_directories(${DIVISIBLE_INSTALL_INCLUDE_DIR})
link_directories(${DIVISIBLE_INSTALL_INCLUDE_DIR})
  

Но когда я пытаюсь перестроить свой проект, он говорит, что не может найти определенные файлы схемы:

 [WARNING]: failed to load external entity "/Users/pete/Documents/projekte/simple-dgps/dsl/main.xml"
  

Если я добавлю префикс проекта (PROJECT_SOURCE_DIR) к пути к файлам схемы, путь появится дважды.

 ERROR: Failed to parse/Users/pete/Documents/projekte/simple-dgps/Users/pete/Documents/projekte/simple-dgps/include/cc.ublox.commsdsl/dsl/main.xml
  

И если я заполню недостающую часть между simple-dgps и dsl (что было бы include/cc.ublox.commsdsl ), я получу эту ошибку:

 make[2]: *** No rule to make target `include/cc.ublox.commsdsl/include/cc.ublox.commsdsl/dsl/main.xml', needed by `output.tmp'.  Stop.
make[1]: *** [include/cc.ublox.commsdsl/CMakeFiles/cc.ublox.commsdsl.dir/all] Error 2
make: *** [all] Error 2
  

Предполагая, что первая ошибка связана с неправильным расположением файла, что тогда означает вторая (хотя у нее явно неправильный путь, потому что она существует дважды)

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

1. Этот CMakeLists.txt проект написан для запуска как автономный, а не для включения через add_subdirectory . Вы можете сказать, потому что он использует CMAKE_SOURCE_DIR повсюду, где вы не размещаете проект, эта переменная указывает на ваш проект. Это можно исправить, используя что-то вроде <PROJECT-NAME>_SOURCE_DIR вместо этого, потому что определен новый проект. Это не будет прямолинейно, вам нужно изменить cc.ublox.commsdsl CMakeLists.txt . Может быть проще рассматривать его как внешний проект вместо этого.

2. Я сделал это, но путь по-прежнему вводится дважды

Ответ №1:

Проблема, безусловно, заключается в определении пути проекта для cc.ublox.commsdsl по сравнению с путем проекта для вашего проекта.

Если я добавлю префикс проекта (PROJECT_SOURCE_DIR) к пути к файлам схемы, путь появится дважды.

Можете ли вы поделиться тем, что вы добавили? /Users/pete/Documents/projekte/simple-dgps/include/cc.ublox.commsdsl/dsl/main.xml выглядит правильно для cc.ublox.commsdsl пути — но, похоже, вы, возможно, добавили путь таким образом, что он дублируется. Трудно сказать, что не так, не глядя на то, что вы добавили.

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

1. Я изменил его на это: set (schema_files ${CMAKE_SOURCE_DIR}/dsl/main.xml

2. Ах, так, может быть, ${CMAKE_SOURCE_DIR} в этом и заключается дублирование. Где CMAKE_SOURCE_DIR определено?

3. CMAKE_SOURCE_DIR является The path to the top level of the source tree. и определяется CMake при запуске CMake в командной строке.

4. И почему тогда он дважды вставляется в мой path? (спасибо за rply)

5. Из-за внесенных вами изменений; но это трудно определить, потому что вы не показали нам, что именно вы изменили.

Ответ №2:

Найдена проблема с проблемой двойного пути. Я добавил проект в качестве subdir из моего основного проекта, добавив эту строку:

 add_subdirectory(${DIVISIBLE_INSTALL_INCLUDE_DIR}/cc.ublox.commsdsl)
  

Проблема в том, что DIVISIBLE_INSTALL_INCLUDE_DIR является абсолютным путем и, следовательно, добавляется в каталог исходного кода cmake вложенного каталога.
Это может быть исправлено с помощью:

 add_subdirectory(include/cc.ublox.commsdsl)
  

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

1. Пожалуйста, покажите, какая переменная CMake устанавливается неправильно при использовании абсолютного пути с add_subdirectory() . Простое тестирование показывает, что CMAKE_SOURCE_DIR и PROJECT_SOURCE_DIR и CMAKE_CURRENT_SOURCE_DIR все показывают правильный абсолютный путь.