Как автоматически связать локальную сгенерированную библиотеку или импортированную библиотеку в CMake - PullRequest
0 голосов
/ 26 мая 2020

Ниже представлена ​​простая версия нашего проекта:

project/
├── CMakeLists.txt
├── dependency
│   └── CMakeLists.txt
├── factory_test
│   ├── CMakeLists.txt
│   └── FactoryTest.cpp
├── install
│   ├── include
│   │   └── locator
│   └── lib
│       └── locator
└── locator
    ├── CMakeLists.txt
    ├── Locator.cpp
    └── Locator.h

Содержимое CMakeLists.txt зависимости:

cmake_minimum_required(VERSION 3.12)

project(dependency)

function(import_lib lib_name lib_dir_name)
    add_library(${lib_name} STATIC IMPORTED GLOBAL)
    set_target_properties(${lib_name} PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/install/include
        IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/install/lib/${lib_dir_name}
        IMPORTED_IMPLIB ${CMAKE_SOURCE_DIR}/install/lib/${lib_dir_name})
endfunction()

import_lib(import_locator locator/liblocator.a)

Содержимое CMakeLists.txt из factory_test:

cmake_minimum_required(VERSION 3.12)

project(factory_test)

add_library(factory_test FactoryTest.cpp)
target_link_library(factory_test PUBLIC import_locator)

Содержимое CMakeLists.txt локатора:

cmake_minimum_required(VERSION 3.12)

project(locator)

add_libary(locator Locator.cpp)

install(FILES Locator.h ${CMAKE_SOURCE_DIR}/install/include/locator)
install(TARGET locator ${CMAKE_SOURCE_DIR}/install/lib/locator)

Содержимое верхнего CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)

project(test_project)

add_subdirectory(dependency)
add_subdirectory(locator)
add_subdirectory(factory_test)

Иерархия зависимостей - factory_test в зависимости от зависимости. И мы хотим построить проект в верхнем каталоге. Цель, которую мы пишем CMake, состоит в том, чтобы все подкаталоги зависели от каталога установки, чтобы мы могли построить любой из подкаталогов без зависимого подкаталога.

Наша проблема с этим предложением CMake заключается в том, что если интерфейс of locator изменен, и мы хотим построить проект в каталоге верхнего уровня, он не удастся. Поскольку библиотека локатора все еще не экспортируется в каталог установки. Наш текущий метод - сначала построить локатор и экспортировать его для установки, а затем построить все остальные цели.

Поэтому мне было интересно, возможно ли для CMake, что factory_test может динамически связываться с локально сгенерированной библиотекой локатора, если каталог локатора существует или ссылка на импортированную библиотеку локаторов, если каталог не существует или есть лучшее предложение CMake для этой проблемы?

Надеюсь, кто-то, знакомый с этим, может дать нам несколько советов. Спасибо за аванс.

1 Ответ

0 голосов
/ 27 мая 2020

Вы можете поместить оператор if в свой factory_test/CMakeLists.txt, чтобы проверить наличие каталога locator. Это определит, следует ли ссылаться на цель locator CMake напрямую или на импортированную цель локатора.

cmake_minimum_required(VERSION 3.12)

project(factory_test)

add_library(factory_test FactoryTest.cpp)

# Check if the 'locator' directory exists.
if(EXISTS ${CMAKE_SOURCE_DIR}/locator)
    target_link_library(factory_test PUBLIC locator)
else()
    target_link_library(factory_test PUBLIC import_locator)
endif()

Возможно, вам придется настроить проверку в операторе if, поскольку это не было ясно из ваше описание, какие каталоги / файлы доступны, а какие нет. Кроме того, я полагаю, вам может потребоваться аналогичная проверка в файле CMake верхнего уровня, поскольку по умолчанию он будет перемещаться в каталог locator.

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