Подтвердить что ты не робот

Есть ли поддерживаемая, обновленная сборка на основе CMake для Boost?

Было бы неплохо создать библиотеки Boost с помощью CMake. Вот несколько проектов, которые пытались или пытались сделать это:

  • Проект Boost.CMake, который не обновлялся с версии v1.41.0.
  • Проект Ryppl (http://ryppl.org/), но веб-сайт теперь мертв. Большинство репозиториев Ryppl Github не обновлялись с 2013 года. Ryppl Группа Google не имела большого трафика с 2013 года.
  • На странице wiki CMakeModularizationStatus указано, что она устарела и перенаправляется на несуществующий список рассылки ryppl-dev.
  • https://github.com/boost-cmake, по-видимому, активно поддерживается (с начала 2017 года). Его страница документации очень светлая; неясно, нужно ли загружать или клонировать библиотеки Boost по отдельности. Он показывает логотип "Предложенные для С++ Libraries", поэтому мы можем предположить, что он еще не является официальным компонентом библиотеки Boost.

Вопрос: существует ли поддерживаемая, обновленная сборка на основе CMake для Boost, которая в настоящее время работает?


[Из исходного вопроса, датированного августом 2013 года]

Я не нашел "лучший" способ сделать это. Но 2 хорошие способы:

  • просто включите источники, которые вам нужны, если это не большая проблема для вас и слишком много источников. Тогда не забудьте определить как "-DBOOST_XXXXX_SOURCE", которые сообщают источникам ускорения, что они не должны связывать библиотеку. (Предупреждения появятся, так как этот макрос переопределяется в источниках когда-нибудь, вы можете игнорировать C4005 в этих файлах на MSVC, на CLang, к сожалению, вы не можете сделать это предупреждение тихим)
  • используйте внешнюю функцию проекта CMake и используйте bjam build system boost (у этого есть большое неудобство длинного времени компиляции, поэтому вы должны пойти на это только в том случае, если используете много дополнительных библиотек).

поблагодарить всех за вашу помощь

4b9b3361

Ответ 1

Мы боролись с этим слишком честно на моем рабочем месте. Хотя я, конечно, не могу утверждать, что знаю "лучший" способ, я могу предложить следующие мысли о своем опыте.

Мы изначально просто требовали, чтобы разработчики устанавливали boost отдельно, и CMake выполнял свои обычные проверки в виде вызова find_package(Boost...). Это было легко, но не автоматизировано и вызвало проблемы для разработчиков, у которых уже установлены более старые версии boost.

Затем мы изменили галочку и добавили копию источников повышения, которые мы клонировали из одного из проектов, упомянутых выше. Я не могу вспомнить специфику, но я думаю, что это был предшественник того, над которым сейчас работает проект Ryppl. Главное было то, что он уже поддерживал CMake; библиотеки boost были действительными целями CMake, добавленными через вызовы add_library, что упростило их работу в коде CMake.

В то время как это решило предыдущие проблемы, автоматизируя использование boost в нашем проекте, это в конечном итоге стало кошмаром для обслуживания. Проект по ускорению, от которого мы клонировали, радикально изменился и в настоящее время очень сильно зависит от функций CMake, специфичных для Ryppl. Мы не хотели добавлять Ryppl в качестве зависимости, поэтому мы снова изменили настройку!

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

В нашей текущей настройке используется модуль CMake ExternalProject. Это позволяет нам загружать и строить boost для нашего дерева сборки.

Преимущества:

  • Низкое техническое обслуживание
  • Автоматизировано, поэтому все разработчики используют ту же версию, что и те же флаги
  • Сохраняет наше собственное исходное дерево без стороннего кода
  • Несколько копий boost могут успешно сосуществовать (поэтому нет возможности случайно связать копию, созданную с помощью другой комбинации компилятора /stdlib ).

Недостатки

  • Удаление дерева сборки означает необходимость загрузки и наращивания с нуля. Это может быть улучшено, например, (например, system temp dir), поэтому шаг загрузки/распаковки может быть пропущен, если найдена существующая копия источников повышения.
  • Библиотеки повышения не являются надлежащими мишенями CMake (т.е. они не добавлены через вызовы add_library)

Здесь ссылка на наш код CMake. Есть несколько способов, в которых это нуждается в улучшении, но в настоящее время он работает достаточно хорошо для нас.

Я надеюсь, что вскоре этот ответ станет устаревшим и станет доступным достойное, модульное, совместимое с CMake решение.

Ответ 2

Я нашел ответ Фрейзера выше, чтобы быть хорошей отправной точкой, но столкнулся с некоторыми проблемами, используя Boost 1.55.0 в нашей системе.

Сначала мы хотели иметь автономный исходный код для наших приложений, поэтому предпочитаем не использовать CMake ExternalProject. Мы использовали только потоковые библиотеки date_time из Boost, поэтому мы использовали bcp для создания подмножества Boost с инструментами построения, потоком и другими зависимыми библиотеками:

$ bcp tools/build thread system date_time ../boost_1_55_0_threads_only

и проверили это в нашем репозитории svn.

Затем я смог адаптировать файл Fraser CMake для создания на Linux, но столкнулся с проблемами с запуском файла bootstrap.bat в Windows с помощью команды CMake execute_process. Для запуска bootstrap.bat нам сначала понадобилось запустить соответствующую Visual Studio vcvarsall.bat script для установки переменных среды (мы могли бы, вероятно, выяснить, какие отдельные переменные необходимо установить, но было проще запустить весь script), Чтобы запустить два .bat файла в одной оболочке с помощью execult_process, мы использовали cmd /c и перечисляли файлы, разделенные & как аргумент.

Также bootstrap.bat не установил код выхода на ненулевое значение в случае сбоя, поэтому использование функции execute_process RESULT_VARIABLE для проверки успеха не помогло. Вместо этого мы проверили, что исполняемый файл b2.exe был создан после выполнения команды.

Одна последняя проблема: bootstrap.sh поддерживает параметр --prefix=, который bootstrap.bat не поддерживает. Я также обнаружил, что указание опции --prefix для b2.exe на окнах работало, но используя опцию --prefix для b2 в Linux, без указания ее для bootstrap.sh. (Пока я еще не понял).

Итак, соответствующая часть нашего файла CMake выглядит так:

  #
  # run bootstrap
  #
  if(WIN32)
    if(MSVC10)
      set(VCVARS_CMD "C:\\Program^ Files^ ^(x86^)\\Microsoft^ Visual^ Studio^ 10.0\\VC\\vcvarsall.bat")
    elseif(MSVC11)
      set(VCVARS_CMD "C:\\Program^ Files^ ^(x86^)\\Microsoft^ Visual^ Studio^ 11.0\\VC\\vcvarsall.bat")
    elseif(MSVC12)
      set(VCVARS_CMD "C:\\Program^ Files^ ^(x86^)\\Microsoft^ Visual^ Studio^ 12.0\\VC\\vcvarsall.bat")
    # elseif(...)
     # add more options here
    endif(MSVC10)
    set(BOOTSTRAP_CMD "${VCVARS_CMD} & bootstrap.bat")
    message("Executing command: ${BOOTSTRAP_CMD}")
    execute_process(COMMAND cmd /c "${BOOTSTRAP_CMD}" WORKING_DIRECTORY ${APT_BOOST_SRC}
                  RESULT_VARIABLE BS_RESULT OUTPUT_VARIABLE BS_OUTPUT ERROR_VARIABLE BS_ERROR)
    if(NOT EXISTS ${APT_BOOST_SRC}/b2.exe)
      message(FATAL_ERROR "Failed running cmd /c ${BOOTSTRAP_CMD} in ${APT_BOOST_SRC}:\n${BS_OUTPUT}\n${BS_ERROR}\n")
    else(NOT EXISTS ${APT_BOOST_SRC}/b2.exe)
      message("bootstrap output:\n${BS_OUTPUT}")
    endif(NOT EXISTS ${APT_BOOST_SRC}/b2.exe)
  else(WIN32)
    set(BOOTSTRAP_CMD "./bootstrap.sh")
    set(BOOTSTRAP_ARGS "--prefix=${APT_BOOST_BIN}")
    message("Executing command: ${BOOTSTRAP_CMD} ${BOOTSTRAP_ARGS}")
    execute_process(COMMAND "${BOOTSTRAP_CMD}" ${BOOTSTRAP_ARGS} WORKING_DIRECTORY ${APT_BOOST_SRC}
                  RESULT_VARIABLE BS_RESULT OUTPUT_VARIABLE BS_OUTPUT ERROR_VARIABLE BS_ERROR)
    if(NOT BS_RESULT EQUAL 0)
      message(FATAL_ERROR "Failed running ${BOOTSTRAP_CMD} ${BOOTSTRAP_ARGS} in ${APT_BOOST_SRC}:\n${BS_OUTPUT}\n${BS_ERROR}\n")
    endif()
  endif(WIN32)
  #
  # run b2
  #
  set(B2_ARGS "link=static" "threading=multi" "runtime-link=static" "variant=release")
  foreach(COMP IN LISTS APT_BOOST_COMPONENTS)
    set(B2_ARGS "--with-${COMP}" ${B2_ARGS})
  endforeach(COMP IN LISTS APT_BOOST_COMPONENTS)
  if(WIN32)
    if(MSVC11)
      set(B2_ARGS "--toolset=msvc-11.0" ${B2_ARGS})
    elseif(MSVC12)
      set(B2_ARGS "--toolset=msvc-12.0" ${B2_ARGS})
    endif(MSVC11)
    file(TO_NATIVE_PATH ${APT_BOOST_BIN} APT_BOOST_BIN_WIN)
    set(B2_ARGS "--prefix=${APT_BOOST_BIN_WIN}" ${B2_ARGS} "architecture=x86" "address-model=64")
  endif(WIN32)
  set(B2_ARGS ${B2_ARGS} install)
  set(B2_CMD "./b2")
  message("Executing command: ${B2_CMD} ${B2_ARGS}")
  execute_process(COMMAND ${B2_CMD} ${B2_ARGS} WORKING_DIRECTORY ${APT_BOOST_SRC}
                  RESULT_VARIABLE B2_RESULT OUTPUT_VARIABLE B2_OUTPUT ERROR_VARIABLE B2_ERROR)
  if(NOT B2_RESULT EQUAL 0)
    message(FATAL_ERROR "Failed running ${B2_CMD} in ${APT_BOOST_SRC}:\n${B2_OUTPUT}\n${B2_ERROR}\n")
  endif()

В приведенном выше APT_BOOST_SRC есть расположение подкаталога Boost в нашем исходном каталоге, APT_BOOST_BIN - это место, которое мы используем для хранения библиотек в нашем каталоге сборки CMake, а APT_BOOST_COMPONENTS - список библиотек Boost мы используем.