Ниже представлена простая версия нашего проекта:
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 для этой проблемы?
Надеюсь, кто-то, знакомый с этим, может дать нам несколько советов. Спасибо за аванс.