2016-06-09 3 views
2

У меня есть проект библиотеки C++, который поставляется с папкой examples. Примеры являются автономными, то есть они могут быть скомпилированы без остальной части исходного дерева, как если бы они были реальными приложениями, использующими библиотеку. Они используют предоставленный FindMyLib.cmake, чтобы найти установленную библиотеку в системе.Можно ли связать проект cmake с подпроектами?

Я хотел бы также иметь возможность построить их вместе со всей библиотекой. Сначала я добавил их в подкаталоги:

if(MYLIB_BUILD_EXAMPLES) 
    add_subdirectory(examples/fooexample) 
    add_subdirectory(examples/barexample) 
endif() 

Но это не будет работать, потому что я не могу использовать find_package перед установкой библиотеки. Я могу добавить каталог по умолчанию в путь поиска, но этого недостаточно, потому что библиотека еще не построена, пока выполняется cmake (очевидно).

Что делать, чтобы решить эту проблему? Есть ли способ прозрачно связывать библиотеку с этими подпроектами при ее создании (а также «отключить» find_package, поскольку она обязательно завершится без установки).

ответ

2

Просто подготовить поддельногоFindMyLib.cmake, что ссылки на библиотеку с помощью сборки дерева, а не установить один. Например, он может установить переменную MyLib_LIBRARY переменного в библиотеку цели:

CMake-сборке/FindMyLib.cmake:

set(MyLib_LIBRARY MyLib) 
set(MyLib_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/include) 
... 

Затем предварять CMAKE_MODULE_PATH список с каталогом, содержал фальшивый сценарий. Такой способ будет использоваться на примерах:

if(MYLIB_BUILD_EXAMPLES) 
    set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake-build ${CMAKE_MODULE_PATH}) 
    add_subdirectory(examples/fooexample) 
    add_subdirectory(examples/barexample) 
endif() 
+0

Если я не пропустил что-то, это не будет работать: шаг конфигурации примеров приведет к ошибке, потому что библиотека не будет построена еще, – piwi

+0

Если библиотека добавляется (с 'add_library (MyLib)') * before * 'add_subdirectory (examples/...)', тогда 'target_link_libraries (fooexample $ {MyLib_LIBRARY})' работает как обычная связь с ** target **. На этом этапе не требуется создание целевой библиотеки. – Tsyvarev

+0

Мой плохой, спасибо за разъяснение. – piwi

1

Решение может быть, чтобы проверить, в ваших примерах, существует ли цель, которая строит MyLib, и использовать его в качестве зависимости, если он делает; invoke find_library() в противном случае.

add_library(MyLib ...) 

# examples/fooexample 
if(NOT TARGET MyLib) 
    find_library(MyLib) 
endif() 

add_executable(foo) 

if(TARGET MyLib) 
    add_dependencies(foo MyLib) 
endif() 
Смежные вопросы