Я выложу так далеко, как только смог, и, возможно, это будет полезно. Если у кого-то есть недостающие части, я обновлю это.
Документация, описывающая порядок поиска, находится здесь:
https://cmake.org/cmake/help/v3.12/command/find_package.html?highlight=%3Cprefix%3E
Существует довольно много поддерживаемых перестановок, поэтому я начну с исключения некоторых:
- Игнорируйте варианты Apple, потому что это для фреймворков.
- Игнорировать только пути Windows, потому что это не совсем идиоматично для любой другой платформы.
- Наконец, у каждого есть варианты, связанные с тем, где находится скрипт cmake. Я просто выберу стиль
.../cmake/<name>*/
.
То есть (** добавлено дополнительное пространство, чтобы показать сходство):
<prefix>/ (lib/<arch>|lib*|share)/cmake/<name>*/ (U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/ (W/U)
В документе указано, что определенные пути поиска предназначены для определенных платформ, но технически я думаю, что все пути поиска опробованы. Это просто вопрос того, что идиоматично для платформы. Тем не менее, вы не можете использовать разные стили в качестве дифференциатора платформы. Фактически это должно означать, что опция Unix также действительна для Windows.
Как вы можете видеть выше, единственное различие для дружественного к Windows формата Unix - это дополнительный префикс имени. Либо это правильный выбор, так что сейчас я буду ссылаться только на стиль Unix, так как он соответствует моим предпочтениям. Наконец, меня не волнует папка «share», потому что мы говорим о библиотеках C / C ++.
Итак, наконец мы подошли к этим двум вариантам:
<prefix>/lib/<arch>/cmake/<name>*/
<prefix>/lib*/cmake/<name>*/
Вариант 1: многоарочный
Пути с lib/<arch>
разрешены, если установлена переменная CMAKE_LIBRARY_ARCHITECTURE
. CMAKE_<LANG>_LIBRARY_ARCHITECTURE
говорится:
Если компилятор <LANG>
передает компоновщику специфическую архитектуру
каталог поиска системной библиотеки, такой как <prefix>/lib/<arch>
this
переменная содержит имя <arch>
, если / как обнаружено CMake.
Я знаю, что это более конкретно для определенных дистрибутивов, которые поддерживают multiarch, и предназначено для автоматической установки. Тем не менее, я не могу понять, может ли это быть легко использовано с помощью cmake для достижения цели; что бы вы установили, чтобы контролировать это в cmake? В многоархивной системе библиотеки Foo и Bar могут выглядеть так:
<prefix>/lib/x86_64-linux-gnu/
foo-1.1/
cmake/FooConfig.cmake
bar/
cmake/BarConfig.cmake
foo-1.1.so
foo-1.1.lib
foo-1.1.dll
foo-1.1.dylib
bar.so
bar.lib
bar.dll
bar.dylib
Если мы сможем контролировать значение multiarch, этот параметр можно легко использовать для других платформ, таких как: Darwin_x86_64, Windows_x86_64 и т. Д. И он, вероятно, будет совместим с режимом модуля find_package, где все включения будут найдены, без необходимости режим конфигурации для перенаправления на какой-то нестандартный каталог.
Вариант 2: вариации lib
Частичное решение состоит в том, чтобы в префиксе были полностью разделены платформы, но по крайней мере 64-битную и 32-битную архитектуры можно объединить, просто разделив библиотеки.
lib*
включает одно или несколько значений lib64
, lib32
, libx32
или lib
(поиск в таком порядке).
- Пути с lib64 ищутся на 64-битных платформах, если
FIND_LIBRARY_USE_LIB64_PATHS
свойство установлено в TRUE.
- Пути с lib32 ищутся на 32-битных платформах, если
FIND_LIBRARY_USE_LIB32_PATHS
свойство установлено в TRUE.
- Пути с libx32 ищутся на платформах с использованием x32 ABI, если
Для свойства
FIND_LIBRARY_USE_LIBX32_PATHS
установлено значение TRUE.
- Путь к lib всегда ищется.
Это хотя бы частично помогает. Я бы продолжал использовать lib как 64-битную версию, а затем просто использовал lib32 для 32-битных нужд.