CMake find_package и NO_SYSTEM_ENVIRONMENT_PATH - PullRequest
       1

CMake find_package и NO_SYSTEM_ENVIRONMENT_PATH

0 голосов
/ 22 февраля 2019

Я использую cmake find_package, чтобы найти библиотеку JPEG, которая будет использоваться в моем приложении.У меня есть две установки этой библиотеки: системная, расположенная по адресу:

libjpeg: /usr/lib/x86_64-linux-gnu/libjpeg.a /usr/lib/x86_64-linux-gnu/libjpeg.so

, и другая пользовательская, расположенная по адресу:

/my/jpeg/instalation/lib/libjpeg.so

, и я хочу решить, какую версию следует использоватьпо командной строке.

Например, для использования пользовательской команды my cmake:

cmake .. -DCMAKE_PREFIX_PATH=/my/jpeg/instalation

и для поиска только системных команд команда cmake будет:

cmake ..

и мой CMakeLists.txt имеет что-то вроде этого, когда определено CMAKE_PREFIX_PATH:

find_package(JPEG NO_SYSTEM_ENVIRONMENT_PATH REQUIRED)

и когда не определено CMAKE_PREFIX_PATH:

find_package(JPEG REQUIRED)

Но с NO_SYSTEM_ENVIRONMENT_PATH не найдено ни одной библиотекиЯ предполагал, что с этим флагом системные пути были проигнорированы, но кажется, что те, которые объявлены в CMAKE_PREFIX_PATH, также отбрасываются ...

В основном я хочу, когда CMAKE_PREFIX_PATH указано, что системные библиотеки не рассматриваются икогда CMAKE_PREFIX_PATH не указан, системные библиотеки должны быть рассмотрены ...

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

find_package(JPEG PATHS ${CMAKE_PREFIX_PATH} NO_DEFAULT_PATH)

но это также не находит ... я полностью потерян с этим поведением find_package ...

PS: я использую версию cmake3.10.2 и ошибка всегда:

    CMake Error at CMakeLists.txt:7 (find_package):                             
  Could not find a package configuration file provided by "JPEG" with any of
  the following names:                                                      

    JPEGConfig.cmake                                                        
    jpeg-config.cmake                                                       

  Add the installation prefix of "JPEG" to CMAKE_PREFIX_PATH or set         
  "JPEG_DIR" to a directory containing one of the above files.  If "JPEG"   
  provides a separate development package or SDK, be sure it has been       
  installed.  

Обновление

Я не смог понять, что значения find_package предназначены только для функции find_package, то есть для поиска FindJPEG.сценарии cmake или JPEGconfig.cmake, а не содержимое этих сценариев.То, что я хочу, выполняется только с использованием определенных функций, которые находят пути или файлы, как, например, в примере с Томом, но с использованием find_library следующим образом:

set(CUSTOM_JPEG_PATH ON CACHE BOOL "use only custom paths")
set(JPEG_NAMES ${JPEG_NAMES} jpeg libjpeg)
if(CUSTOM_JPEG_PATH)
        #find_package(JPEG REQUIRED
        find_library(JPEG_LIBRARY NAMES ${JPEG_NAMES}
           NO_SYSTEM_ENVIRONMENT_PATH
           NO_CMAKE_SYSTEM_PATH
        )
else()
        #find_package(JPEG REQUIRED
        find_library(JPEG_LIBRARY NAMES ${JPEG_NAMES}
                )
endif()

И это работает как ожидалось (вместо того, чтобы задавать корневую папкуВыборочная установка Мне нужно указать точное местоположение - / my / jpeg / instalation / lib - чтобы работать).Но это не то, что я хочу, я не хочу переписывать все сценарии FindXXX.cmake, чтобы получить то, что я хочу, эти сценарии поиска содержат более подробную информацию о их зависимостях, флагах компиляции и т. Д., Поэтому я предполагаю,нет способа делать то, что я хочу, используя только find_package (...) ...

1 Ответ

0 голосов
/ 22 февраля 2019

Я бы ожидал, что это сработает просто без вашего NO_SYSTEM_ENVIRONMENT_PATH подхода.Просто используйте find_package(JPEG REQUIRED).Если установлено CMAKE_PREFIX_PATH, то find_package сначала изучит этот каталог.

Если вы хотите конкретно, вы можете указать PATHS или HINTS для вашего find_package -звука:

set(CUSTOM_JPEG_PATH "" CACHE STRING "path to custom installation of libjpeg")
if(CUSTOM_JPEG_PATH)
        find_package(JPEG REQUIRED 
            PATHS ${CUSTOM_JPEG_PATH} 
            NO_SYSTEM_ENVIRONMENT_PATH
        )
else()
        find_package(JPEG REQUIRED) #default search
endif()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...