LINUX.ORG.RU

Modern CMake пакеты и их <package>-config.cmake

 


1

2

Если раньше после успешного выполнения find_package появлялось множество переменных вида <package_name>_..., как например у libarchive:

-- LIBARCHIVE_CFLAGS=
-- LIBARCHIVE_CFLAGS_I=
-- LIBARCHIVE_CFLAGS_OTHER=
-- LIBARCHIVE_FOUND=1
-- LIBARCHIVE_INCLUDEDIR=/usr/include
-- LIBARCHIVE_INCLUDE_DIRS=
-- LIBARCHIVE_LDFLAGS=-larchive
-- LIBARCHIVE_LDFLAGS_OTHER=
-- LIBARCHIVE_LIBDIR=/usr/lib64
-- LIBARCHIVE_LIBRARIES=archive
-- LIBARCHIVE_LIBRARY_DIRS=
-- LIBARCHIVE_LIBS=
-- LIBARCHIVE_LIBS_L=
-- LIBARCHIVE_LIBS_OTHER=
-- LIBARCHIVE_LIBS_PATHS=
-- LIBARCHIVE_LINK_LIBRARIES=/usr/lib64/libarchive.so
-- LIBARCHIVE_MODULE_NAME=libarchive
-- LIBARCHIVE_PREFIX=/usr
-- LIBARCHIVE_STATIC_CFLAGS=
-- LIBARCHIVE_STATIC_CFLAGS_I=
-- LIBARCHIVE_STATIC_CFLAGS_OTHER=
-- LIBARCHIVE_STATIC_INCLUDE_DIRS=
-- LIBARCHIVE_STATIC_LDFLAGS=-larchive;-lcrypto;-lacl;-llzo2;-llzma;-lzstd;-llz4;-lbz2;-lz;-lxml2
-- LIBARCHIVE_STATIC_LDFLAGS_OTHER=
-- LIBARCHIVE_STATIC_LIBDIR=
-- LIBARCHIVE_STATIC_LIBRARIES=archive;crypto;acl;lzo2;lzma;zstd;lz4;bz2;z;xml2
-- LIBARCHIVE_STATIC_LIBRARY_DIRS=
-- LIBARCHIVE_STATIC_LIBS=
-- LIBARCHIVE_STATIC_LIBS_L=
-- LIBARCHIVE_STATIC_LIBS_OTHER=
-- LIBARCHIVE_STATIC_LIBS_PATHS=
-- LIBARCHIVE_VERSION=3.5.1
-- LIBARCHIVE_libarchive_INCLUDEDIR=
-- LIBARCHIVE_libarchive_LIBDIR=
-- LIBARCHIVE_libarchive_PREFIX=
-- LIBARCHIVE_libarchive_VERSION=

Т.е. делаешь target_link_libraries(target ${LIBARCHIVE_LIBRARIES}) или там target_include_directories и вроде всё понятно что откуда берётся с чем линкуется. Теперь же многие переходят на -config.cmake и там вообще толком никаких переменных не объявляется. Как например у libfmt:

-- fmt_CONFIG=/usr/lib64/cmake/fmt/fmt-config.cmake
-- fmt_CONSIDERED_CONFIGS=/usr/lib64/cmake/fmt/fmt-config.cmake
-- fmt_CONSIDERED_VERSIONS=7.0.3
-- fmt_DIR=/usr/lib64/cmake/fmt
-- fmt_FOUND=1
-- fmt_VERSION=7.0.3
-- fmt_VERSION_COUNT=3
-- fmt_VERSION_MAJOR=7
-- fmt_VERSION_MINOR=0
-- fmt_VERSION_PATCH=3
-- fmt_VERSION_TWEAK=0

Т.е. ни _INCLUDEDIR, ни _LIBRARIES нет. И вот как с этим работать? Как мне линковать мой таргет с libfmt? Кто-нибудь может подсказать?

★★★★★

Modern CMake — это синтетические таргеты.

target_link_libraries(target fmt)

Там ещё в каких-то случаях нужно указать видимость/транзитивность зависимости, но если ты пишешь не библиотеку, скорее всего это не требуется.

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

Если там (в самой библиотеке) всё сделано правильно, то include paths будут прописаны там же (в синтетическом таргете) и CMake их должен подцепить.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от WatchCat
$ cat /usr/lib/cmake/fmt/fmt-config.cmake
<...>
include(${CMAKE_CURRENT_LIST_DIR}/fmt-targets.cmake)
<...>
$ cat /usr/lib/cmake/fmt/fmt-targets.cmake
<...>
# Create imported target fmt::fmt
add_library(fmt::fmt SHARED IMPORTED)

set_target_properties(fmt::fmt PROPERTIES
  INTERFACE_COMPILE_DEFINITIONS "FMT_LOCALE;FMT_SHARED"
  INTERFACE_COMPILE_FEATURES "cxx_variadic_templates"
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
  INTERFACE_LINK_LIBRARIES "-Wl,--as-needed"
)
<...>

Посмотрел — да, там imported targets. Они примерно вот так работают. Только цель называется fmt::fmt.

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

Меня смущает, что libfmt использует имя fmt::fmt, а например nanodbc просто nanodbc. Ещё не смотрел что там у boost, всё по старому или по новому.

Все эти разброды и шатания…

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

Нет тут никаких шатаний - просто есть возможность предоставлять несколько целей внутри неймспейса, её могут пользоваться, могут не пользоваться. boost насколько я помню пользуется.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Как раз шатания и есть. Одни так представляют, другие этак. А есть ещё третий вариант через pkgconfig.

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

Одни так представляют, другие этак

Чтобы такого не было, нужно запретить именовать сущности буквами, а вместо этого централизованно выдавать id’шники. А то ишь ты, одни пишут foo_bar, другие foo-bar, третьи foobar.

А есть ещё третий вариант через pkgconfig

pkg-config вообще ортогонален и нужен чтобы библиотекой могли пользоваться проекты которые сами не собираются симейком.

slovazap ★★★★★
()
Ответ на: комментарий от WatchCat

Ещё не смотрел что там у boost, всё по старому или по новому.

По-новому, boost::system. Если делать по старому, а потому твою библиотеку экспортировать в SDK, то всё сломается, ибо пути будут соответствовать машине сборки. Если делать по-новому, то всё автоматом подцепится через target’ы.

UVV ★★★★★
()

Вернитесь к божественным автотулзам, заблудшие дети, и да прибудет с вами благодать свободного программного обеспечения!

Harald ★★★★★
()
Ответ на: комментарий от Harald
mycoolproject: main.o util.o funktsional.o
    gcc -o mycoolproject -lkrutayaliba main.o util.o funktsional.o

main.o: main.c
    gcc -o main.o -c main.c -I/usr/include/krutayaliba -O2

util.o: util.c
    gcc -o main.o -c main.c -I/usr/include/krutayaliba -O2

funktsional.o: func.c
    gcc -o funktsional.o -c func.c -I/usr/inclde/krutayaliba

Так победим.

anonymous
()
Ответ на: комментарий от slovazap

pkg-config вообще ортогонален

Ортогонален, да.

Но в CMake есть pkg_check_modules который так же примерно определяет переменные, как и старые модули cmake.

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

Выкинь CMake-парашу, возьми Meson как это сделал Red Hat.

А он может искать сторонние библиотеки, проверять их версии на соответствие или мне придётся самому ему подсовывать?

Т.к. 100500 библиотек не знают про этот ваш Meson.

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

Если делать по старому, а потому твою библиотеку экспортировать в SDK, то всё сломается, ибо пути будут соответствовать машине сборки. Если делать по-новому, то всё автоматом подцепится через target’ы.

Мне кажется, или ТС здесь говорит про стиль именования, а не про imported targets vs. переменные?

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

Но в CMake есть pkg_check_modules который так же примерно определяет переменные, как и старые модули cmake.

Необязательно, его можно заставить генерить imported targets. Я всегда так и делаю.

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

А мне и того и другого и можно без хлеба.

Большой проект который имеет зависимости от внешних библиотек, но при этом ещё и свои либы экспортирует, которые использует другой проект.

Просто несколько лет его не трогали, а тут понадобилось обновить и переползти на новые либы.

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

Нда, давно я не читал доку по многим функциям. Столько всего появилось.

WatchCat ★★★★★
() автор топика

и да прибудет с вами благодать свободного программного обеспечения!

-прибудет
+пребудет

посыпаю голову граммарнацевым пеплом

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

Не всё то полезно, что формально СПО. Симейк бессмысленно усложняет сборку и поэтому уводит в сторону от истинного пути единственно верного программного обеспечения и юникс-вея.

Harald ★★★★★
()
Ответ на: комментарий от EXL

Выкинь CMake-парашу, возьми Meson как это сделал Red Hat.

Как он разовьётся до уровня cmake, так можно будет.

UVV ★★★★★
()
Ответ на: комментарий от Harald

Симейк бессмысленно усложняет сборку и поэтому уводит в сторону от истинного пути единственно верного программного обеспечения и юникс-вея.

Ты либо бухнул сегодня, либо потроллить зашёл. Одно не исключает другого, правда, я вот бухнул =)

UVV ★★★★★
()
Ответ на: комментарий от UVV

Я всегда трезв и проповедую истинный путь сборки свободного программного обеспечения только на ясную голову!

Harald ★★★★★
()
Ответ на: комментарий от Harald

Я не для того уходил от автотулзов чтобы к ним возвращаться. Нет, спасибо, накушалися в своё время. Больше нее надо.

Уж лучше с CMake’ом повожусь. Всего-то надо освежить свои знания о нём.

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

автотулзы радикально не меняют своё поведение с каждым релизом

Ну т.е. они как были УГ так и остались. И смысл к ним возвращаться?

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

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

Harald ★★★★★
()
Ответ на: комментарий от Harald

Не ну если кому-то нравится дрочить на циферки версии

Это может быть ты гонишься за цифрами, я же за удобством применения. На CMake в своё время перешёл с автотулзов как на меньшее зло. А ты мне предлагаешь вернутся опять на то от чего ушёл, потому что оно не поменялось с древних времён. Где логика?

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

На CMake в своё время перешёл с автотулзов как на меньшее зло.

А вдруг оно на самом деле бОльшее зло? Иначе бы и этого треда не было.

Harald ★★★★★
()
Ответ на: комментарий от Harald

Иначе бы и этого треда не было.

Следуя такой логике, не зло только старьё которое не развивается, никому не интересно и не нужно.

WatchCat ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.