Boost и CMake
От: пффф  
Дата: 06.07.24 12:24
Оценка:
Привет!

Кто как использует буст с симейком?

Пробовал по рецептуре отсюда — https://github.com/boostorg/cmake?tab=readme-ov-file#using-boost-with-add_subdirectory

Через FetchContent — это ужасно. Минут пять CMake качает буст и генерит сборочные скрипты, и так каждый раз при изменении CMakeLists.txt (а он часто меняется). При этом в каждом сгенеренном CMake build каталоге лежит копия буста (1.5Гб), т.ё, если я собираю MSVC x86/x64 — это уже 10 минут и 3 гига на один проект

Собрать буст при помощи CMake — что-то не пошло.

Раньше под MSVC/.vcxproj я делал так: собрал бутстрап, собрал буст под MSVC, сделал переменную окружения BOOST_ROOT, сделал boost.props, где настраиваются Include/Library пути на базе BOOST_ROOT, и одной строчкой boost.props подключаю в проект, и всё.

У кого-то есть рецепты получше?
Отредактировано 06.07.2024 13:56 пффф . Предыдущая версия . Еще …
Отредактировано 06.07.2024 13:53 пффф . Предыдущая версия .
Re: Boost и CMake
От: reversecode google
Дата: 06.07.24 12:31
Оценка:
только вчера хотел сказать что марти открыл для себя буст
теперь будет месяц буста на ктыве от марте
что, где, когда

я понимаю, что марти так устроены, что сами они никогда ни в чем разбираться не будут
они перекладут это на плечи других
поэтому для марти придумали и создали
https://discourse.cmake.org/
спамь там
если не обучен мануал к cmake читать
Re[2]: Boost и CMake
От: пффф  
Дата: 06.07.24 12:47
Оценка:
Здравствуйте, reversecode, Вы писали:

Если тебя марти в политике обидел, почему ты тут на мне срываешься?
Re[3]: Boost и CMake
От: reversecode google
Дата: 06.07.24 13:17
Оценка:
марти, покажи в сообщении выше хотя бы один отсыл к политике

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

потому что только шмыга насобирал 6Тб макулаторы
из которой он не прочитал и 10 страниц
но нагенерил 10 томов флуда на форуме по теме ИТ

вообщем идешь по ссылкам на cmake документацию
и внимательно читаешь
хватит бесплатно юзать форумчан
Re[4]: Boost и CMake
От: пффф  
Дата: 06.07.24 13:21
Оценка: +1 :)
Здравствуйте, reversecode, Вы писали:

R>марти, покажи в сообщении выше хотя бы один отсыл к политике


Ты меня принимаешь за марти, он тебя хорошо макал в политике, да и я этим не брезгую. И вместо того, чтобы ответить по существу, или просто пройти мимо, ты начинаешь тут устраивать помойку
Re[4]: Boost и CMake
От: LaptevVV Россия  
Дата: 06.07.24 13:40
Оценка:
R>просто признайся, ты со шмыгой встречался и он тебя покусал?
Татьяну Шмыгу не оскорбляй!
Выдающаяся певица и актриса
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Boost и CMake
От: пффф  
Дата: 06.07.24 15:00
Оценка:
Здравствуйте, пффф, Вы писали:

В общем, после ковыряния родилось несколько вариантов.

1) Девелоперский буст (boost-dev в терминах линуксовых пакетных менеджеров) можно скачать так:
git clone --single-branch --branch master --recurse-submodules -j8 https://github.com/boostorg/boost.git


2) Девелоперский буст содержит CMakeLists.txt и вроде как заточен под CMake, но CMake официально пока не поддерживается.

3) Релизный архив буста имеет другую структуру и там нет CMakeLists.txt и прочего симейкнутого, он собирается классически через bootstrap и bjam/b2


Итак, мои варианты:

Вариант первый, простой, для использования хидер-онли библиотек.
Качаем официальный архив, например, https://archives.boost.io/release/1.85.0/source/boost_1_85_0.zip.
Распаковываем, например, в D:\boost
Делаем переменную окружения BOOST_ROOT=D:\boost
В своём CMakeLists.txt делаем так:
if(NOT Boost_INCLUDE_DIR)
    if(DEFINED ENV{BOOST_ROOT})
        set(Boost_INCLUDE_DIR "$ENV{BOOST_ROOT}")
    endif()
endif()
find_package(Boost)
include_directories(${Boost_INCLUDE_DIRS})



Вариант второй, жирный.
Boost выкачивается и конфигурируется каждый раз при перегенерации сборочных скриптов, и в каждом конфиге занимает полтора гига и минут пять времени (на шустрой машине может наверное и за пару минут управится).
Таким образом, если я хочу собирать MSVC x86/x64 и MinGW x86/x64 — это занимает 20 минут времени и 6 гигов места на проект на диске.
Зато в этом варианте вроде как можно любые бустовые либы использовать, но мне пока не надо.
В своём CMakeLists.txt делаем так:
include(FetchContent)
FetchContent_Declare(
  Boost
  URL https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.xz
  URL_MD5 893b5203b862eb9bbd08553e24ff146a
  DOWNLOAD_EXTRACT_TIMESTAMP ON
)
FetchContent_MakeAvailable(Boost)


По FetchContent_Declare.
Рецепт брал тут — https://github.com/boostorg/cmake?tab=readme-ov-file#using-boost-with-fetchcontent
Тут буст предпоследний.
URL_MD5 — не обязательно, и можно записать по-другому, как "URL_HASH MD5:893b5203b862eb9bbd08553e24ff146a"
Можно через WGET (или как удобнее) скачать архив, и положить локально, и подсовывать путь вместо URL. Хз сколько времени экономит, этот XZ всего 90 метров, но похоже, там есть всё что надо, и можно жить без сети.

У меня так работает
FetchContent_Declare(
  Boost
  URL D:/boost-1.84.0.tar.xz
  DOWNLOAD_EXTRACT_TIMESTAMP ON
)


В этом варианте вроде как можно юзать любую бустовую либу, но я не проверял.
Моя проверка была минимальной, соберётся или нет:
#include <boost/container/static_vector.hpp>



Третий вариант: собрать девелоперский вариант буста с симейком, сделать install и типа всё будет шоколадно. У меня не получилось, в итоге накопал первые два.

Комментарии, предложения, замечания — приветствуются.

Все обратные тихонечко проходят мимо, не расплёскивая своё говно
Отредактировано 06.07.2024 15:06 пффф . Предыдущая версия . Еще …
Отредактировано 06.07.2024 15:04 пффф . Предыдущая версия .
Отредактировано 06.07.2024 15:03 пффф . Предыдущая версия .
Re[2]: Boost и CMake
От: andrey.desman  
Дата: 06.07.24 19:36
Оценка:
Здравствуйте, пффф, Вы писали:

П>Комментарии, предложения, замечания — приветствуются.


А момент про EXCLUDE_FROM_ALL и BOOST_INCLUDE_LIBRARIES в доке пропустил?
Отредактировано 06.07.2024 19:37 andrey.desman . Предыдущая версия .
Re[3]: Boost и CMake
От: пффф  
Дата: 06.07.24 19:39
Оценка:
Здравствуйте, andrey.desman, Вы писали:

П>>Комментарии, предложения, замечания — приветствуются.


AD>А момент про EXCLUDE_FROM_ALL и BOOST_INCLUDE_LIBRARIES в доке пропустил?


Особо не углублялся, мне заработало и ладно. Есть настроение — можешь раскрыть
Re[4]: Boost и CMake
От: andrey.desman  
Дата: 06.07.24 19:56
Оценка:
Здравствуйте, пффф, Вы писали:

AD>>А момент про EXCLUDE_FROM_ALL и BOOST_INCLUDE_LIBRARIES в доке пропустил?

П>Особо не углублялся, мне заработало и ладно. Есть настроение — можешь раскрыть

Наверное, это из мэйкфайлов пошло. make, если ему не указать явный таргет, собирает первый таргет в мейкфайле. Обычно это таргет all, который зависит от всего. То есть, чтобы собрать всё.
В cmake есть что-то похожее. Отсутствие таргета в командной строке — это таргет all. Когда в cmake ты делаешь add_subdirectory, то все таргеты из этой сабдиректори добавляются в список таргета all, и они будут безусловно собираться, используешь ты их или нет.
EXCLUDE_FROM_ALL явно говорит не добавлять все под-таргеты таргету all, так что будет собираться только то, на что есть явная зависимость. Например,
target_link_libraries(mysuperexe Boost::filesystem Boost::regex)

Тогда cmake соберет только filesystem и regex.

Каким образом и на что влияет BOOST_INCLUDE_LIBRARIES я хз, не пользовался.
Re[5]: Boost и CMake
От: пффф  
Дата: 06.07.24 20:15
Оценка:
Здравствуйте, andrey.desman, Вы писали:

П>>Особо не углублялся, мне заработало и ладно. Есть настроение — можешь раскрыть


AD>Наверное, это из мэйкфайлов пошло. make, если ему не указать явный таргет, собирает первый таргет в мейкфайле. Обычно это таргет all, который зависит от всего. То есть, чтобы собрать всё.

AD>В cmake есть что-то похожее. Отсутствие таргета в командной строке — это таргет all. Когда в cmake ты делаешь add_subdirectory, то все таргеты из этой сабдиректори добавляются в список таргета all, и они будут безусловно собираться, используешь ты их или нет.
AD>EXCLUDE_FROM_ALL явно говорит не добавлять все под-таргеты таргету all, так что будет собираться только то, на что есть явная зависимость. Например,
AD>
AD>target_link_libraries(mysuperexe Boost::filesystem Boost::regex)
AD>

AD>Тогда cmake соберет только filesystem и regex.

AD>Каким образом и на что влияет BOOST_INCLUDE_LIBRARIES я хз, не пользовался.


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


AD>Когда в cmake ты делаешь add_subdirectory, то все таргеты из этой сабдиректори добавляются в список таргета all, и они будут безусловно собираться, используешь ты их или нет.


Вот по этому — не уверен. Я делаю для каждого таргета отдельно
add_executable(MYEXE "${SRC_ROOT}/MYEXE.cpp" ${sources} ${headers})
target_link_libraries(MYEXE PRIVATE lib1 lib2 lib3)


И когда в MSVC генерю, то вроде как ничего лишнего в зависимостях там нет
Re[6]: Boost и CMake
От: andrey.desman  
Дата: 06.07.24 20:29
Оценка:
Здравствуйте, пффф, Вы писали:

П>Ну, у меня не того масштаба проекты пока, чтоб это играло какую-то роль, и я пока использую хидер-онли вариант, там ничего лишнего не собирается, потому и не ковырял


А,типа find_package на несобранный и не проинсталленый boost. Ну, может и сработать, хз.
Я про вариант add_subdirectory (который у тебя Жырный). В жырном варианте можно ограничить список собираемого.
Re[7]: Boost и CMake
От: пффф  
Дата: 06.07.24 20:55
Оценка:
Здравствуйте, andrey.desman, Вы писали:

П>>Ну, у меня не того масштаба проекты пока, чтоб это играло какую-то роль, и я пока использую хидер-онли вариант, там ничего лишнего не собирается, потому и не ковырял


AD>А,типа find_package на несобранный и не проинсталленый boost. Ну, может и сработать, хз.

AD>Я про вариант add_subdirectory (который у тебя Жырный). В жырном варианте можно ограничить список собираемого.

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

Да, add_subdirectory не нужен был, собралось и без этого. И в VSCode+CMakeTools там был список бустовых либ.

Но я не ковырял всё это глубоко
Re[7]: Boost и CMake
От: пффф  
Дата: 06.07.24 21:09
Оценка:
Здравствуйте, andrey.desman, Вы писали:

П>>Ну, у меня не того масштаба проекты пока, чтоб это играло какую-то роль, и я пока использую хидер-онли вариант, там ничего лишнего не собирается, потому и не ковырял


AD>А,типа find_package на несобранный и не проинсталленый boost. Ну, может и сработать, хз.

AD>Я про вариант add_subdirectory (который у тебя Жырный). В жырном варианте можно ограничить список собираемого.

Да, в жЫрном варианте ничего лишнего тоже вроде не собиралась, компиляция проскочила так же быстро, как и в обезжиренном варианте
Re: Boost и CMake
От: _NN_ www.nemerleweb.com
Дата: 07.07.24 09:20
Оценка: +1
Здравствуйте, пффф, Вы писали:

П>У кого-то есть рецепты получше?


Использование vcpkg с кешированием не подойдёт случайно ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Boost и CMake
От: пффф  
Дата: 07.07.24 13:54
Оценка:
Здравствуйте, _NN_, Вы писали:


П>>У кого-то есть рецепты получше?


_NN>Использование vcpkg с кешированием не подойдёт случайно ?



Может и подойдёт, если ты поподробнее расскажешь об этом способе
Re[3]: Boost и CMake
От: SaZ  
Дата: 07.07.24 21:38
Оценка: +1
Здравствуйте, пффф, Вы писали:

П>Здравствуйте, _NN_, Вы писали:



П>>>У кого-то есть рецепты получше?


_NN>>Использование vcpkg с кешированием не подойдёт случайно ?



П>Может и подойдёт, если ты поподробнее расскажешь об этом способе


А что там рассказывать. Ставишь vcpkg, делаешь vcpkg install boost:x64-windows. Когда дёргаешь cmake для проекта — добавляешь тулчейн из vcpkg (всё по туториалу, который краткий и простой). В самом проекте тупо find_package
Re[4]: Boost и CMake
От: пффф  
Дата: 07.07.24 22:24
Оценка:
Здравствуйте, SaZ, Вы писали:


П>>Может и подойдёт, если ты поподробнее расскажешь об этом способе


SaZ>А что там рассказывать. Ставишь vcpkg, делаешь vcpkg install boost:x64-windows.


А если надо собирать и x86? И "boost:x64-windows" — это для вижуалки или MinGW? Какая версия?
А одновременно еще arm-none-eabi можно собрать?


SaZ>Когда дёргаешь cmake для проекта — добавляешь тулчейн из vcpkg (всё по туториалу, который краткий и простой). В самом проекте тупо find_package


А если уже есть свой тулчейн файл, два тулчейн файла можно задавать? В настройках VSCode CMake:Tools для кита вроде только один файл можно задать
Re[5]: Boost и CMake
От: SaZ  
Дата: 08.07.24 00:10
Оценка: +1
Здравствуйте, пффф, Вы писали:

П>...


П>А если надо собирать и x86? И "boost:x64-windows" — это для вижуалки или MinGW? Какая версия?

П>А одновременно еще arm-none-eabi можно собрать?

Можно собирать сразу под несколько компиляторов. Там есть триплеты для mingw. Главное не бояться минимально почитать документацию. Представь, что нет интернета/гугла/стэковерфлоу/рсдн, но есть репозиторий vcpkg склонированный с гитхаба. Как в старые добрые времена. Там всё достаточно хорошо разложено.

Эх, совсем у людей любознательность пропала. Если совсем лень даже минимально напрячься, то можно спросить чатгпт, он объяснит.

SaZ>>Когда дёргаешь cmake для проекта — добавляешь тулчейн из vcpkg (всё по туториалу, который краткий и простой). В самом проекте тупо find_package


П>А если уже есть свой тулчейн файл, два тулчейн файла можно задавать? В настройках VSCode CMake:Tools для кита вроде только один файл можно задать


Можно через соответствующую переменную для cmake — VCPKG_CHAINLOAD_TOOLCHAIN_FILE
Re[6]: Boost и CMake
От: пффф  
Дата: 08.07.24 00:24
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Эх, совсем у людей любознательность пропала. Если совсем лень даже минимально напрячься, то можно спросить чатгпт, он объяснит.


Если честно, люди уже просто задолбались изучать новое
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.