В cmake, как указать зависимости подкаталогов в масштабируемой форме? - PullRequest
3 голосов
/ 25 февраля 2012

Предположим, что исходное дерево находится в этой структуре:

/
 |- lib1
 |  |- src.cpp
 |  |- lib1.h
 |  |- CMakeLists.txt
 |
 |- lib2
 |  |- src.cpp
 |  |- lib2.h
 |  |- CMakeLists.txt
 |
 |- lib3
 |  |- src.cpp
 |  |- lib3.h
 |  |- CMakeLists.txt
 |
 |- app
 |  |- src.cpp
 |  |- CMakeLists.txt
 |
 |- CMakeLists.txt

Предположим:

  1. lib1 имеет функцию f ();
  2. lib2 имеет функцию g () который использует f ();
  3. app / src.cpp использует функцию g ();
  4. Никто не использует lib3.

Я хочу:

  1. в app / CMakeLists.txt, это только ссылка на lib2.Логика здесь в том, что app / src.cpp использует только g (), поэтому при написании app / src.cpp мы не можем указать зависимость от lib1, потому что это деталь реализации lib2.Таким образом, согласно этой логике, в app / CMakeLists.txt он не может иметь ничего, связанного с lib1, то есть он не включает ни include_directories из lib1, ни add_subdirectory из lib1, ни target_link_libraries из lib1 и т. Д.
  2. Поскольку никто не используетlib3, он даже не будет построен.Это должно быть сделано автоматически.Так что вручную добавить add_subdirectory для lib1 и lib2, но не для lib3, не очень разумно.Вы можете себе представить, если у нас очень большое исходное дерево со сложной древовидной структурой и зависимостями, а также сотни исполняемых файлов в сотнях различных подкаталогов.Если я хочу создать только несколько из них, то я вообще не хочу создавать неиспользуемые библиотеки.

Так что мой вопрос: есть ли способ записи файлов CMakeLists.txt вмасштабируемый способ удовлетворить вышеуказанные требования?Если нет, то есть ли подобные инструменты, которые могут это сделать?

Спасибо.

1 Ответ

4 голосов
/ 25 февраля 2012

Для 1 вопроса:

В lib2/CMakeLists.txt вы должны поместить это:

target_link_libraries(lib2 lib1)

И в app / CMakeLists.txt:

target_link_libraries(app lib2)

Теперь, если вы попытаетесь собрать приложение, CMake проверит, обновлена ​​ли lib2, а если нет - перестройте lib1 и lib2.

Для вопроса 2:

Вы можете защитить add_subdirectory(lib3) вызов с помощью блока if() на основе переменной option().

Другой способ - в lib3 / CMakeLists.txt:

add_library(lib3 ${SRCS} EXCLUDE_FROM_ALL)

Это будетзаставить CMake не добавлять цель lib3 в цель all.Эта цель все еще будет создана, если вы пытаетесь что-то построить в зависимости от нее, или выполните make lib3 вручную.

...