LINUX.ORG.RU

cmake, как заставить find_package искать только в поддиректории?

 


0

1

делаю простой Cmake файл в главной директории и создаю в ней поддиректорию «./zlib-1.3» с последней версией zlib. Как сделать так чтобы во всех других подпроектах zlib был доступен?

cmake_minimum_required(VERSION 3.24 FATAL_ERROR)
set(CMAKE_CXX_STANDARD 23)
project(MyLib LANGUAGES CXX)
#set (ZLIB_DIR «./zlib-1.3»)
#find_package (ZLIB PATHS «./zlib-1.3» NO_DEFAULT_PATH)
find_package (ZLIB)

Результаты всегда одни и те же:
Could NOT find ZLIB (missing: ZLIB_DIR)

Как заставить этого монстра найти пакет в поддиректории и чтобы он был доступен в других подпроектах?



Последнее исправление: Hunter1972 (всего исправлений: 6)

Ответ на: комментарий от intelfx

Другие подпроекты с исходниками и своими cmake файлами не имеют своей версии zlib, но зависят от нее и тоже ее ищут. А я ее специально не поставил в общую директорию и хочу чтобы была использована именно моя версия Zlib. Но в итоге ее никто найти не может

Hunter1972
() автор топика
Ответ на: комментарий от intelfx

Вопрос у тебя был по существу, а я его и не понял, да ZLIB Был в исходниках. Я уже вроде сам сообразил что find_package не для скачанных гитом исходников а для библиотек которые установлены в виде пакетов -dev/-devel или самостоятельно скомпилированых. А для исходников надо использовать add_subdirectory и еще как то похимичить чтобы их интегрировать в третьи библиотеки. Не могу читать документацию по cmake, какой-то жуткий канцелярит вполне могущий дать фору плюсовому. Ощущение что сам язык придумывали художники а документацию писали юристы.

Hunter1972
() автор топика

Не могу читать документацию по cmake, какой-то жуткий канцелярит вполне могущий дать фору плюсовому

не знаю, что ты там читал.

https://cmake.org/cmake/help/latest/module/FindZLIB.html

Hints

A user may set ZLIB_ROOT to a zlib installation root to tell this module where to look.

использовать модуль через add_subdirectory() можно, только если разработчики этим озаботились. Что бывает далеко не всегда.

Lrrr ★★★★★
()
Последнее исправление: Lrrr (всего исправлений: 1)
Ответ на: комментарий от Lrrr

У меня просто только исходники были, а find_package подразумевает что там все уже есть скомпилированное, ZLIB_ROOT я тоже ставил, он при поиске его ставит на первое место, все равно не находит, и поэтому потом прогоняется по всем стандартным путям

Hunter1972
() автор топика
Ответ на: комментарий от Hunter1972

Но что делать если другая библиотека в поддиректории сама использует find_package(ZLIB) а я хочу ей предложить исходники, вот приимерно так:

----CMakeList.txt (что здесь писать чтобы find_package в LibA нашел исходники в "zlib-1.3?")     |
 |--zlib-1.3
 |    |
 |    |--ZLib исходники
 |
 |--LibA подпроект который вызывает find_package (ZLIB)
      |
      |--LibA исходники
Hunter1972
() автор топика
Ответ на: комментарий от Hunter1972

в cmake 3.24+ можно использовать FetchContent с опцией OVERRIDE_FIND_PACKAGE.

FetchContent_Declare(ZLIB
    GIT_REPOSITORY ...
    GIT_TAG ...
    OVERRIDE_FIND_PACKAGE
)

FetchContent_MakeAvailable(ZLIB)

тогда последующие вызовы find_package(ZLIB) должны будут найти то, что скачается по FetchContent_Declare(ZLIB ...)

Lrrr ★★★★★
()