Интеграция Intel Threading Building Blocks в ваш CMake проект

в 6:47, , рубрики: c++, cmake, integration, intel, intel tbb, open source, Блог компании Intel, Программирование

Интеграция Intel Threading Building Blocks в ваш CMake проект - 1

Привет, уважаемые читатели habrahabr. В этом блоге мы хотели бы анонсировать, что теперь у нас появились CMake модули, которые позволяют скачивать, собирать и просто использовать Intel Threading Building Blocks (Intel TBB) в ваших CMake проектах. Модули доступны в репозитории проекта Intel TBB на GitHub, а также в бинарных пакетах для Linux* OS, Windows* OS и macOS*, начиная с релиза Intel TBB 2017 Update 7.

Использование Intel TBB CMake модулей

Новые модули позволяют осуществлять как простую интеграцию бинарных пакетов Intel TBB в проект, так и более сложные варианты со скачиванием определённых версий с GitHub и сборкой библиотеки из исходного кода. Подробное техническое описание модулей можно найти в документации.

Интеграция библиотеки в проект

Конфигурационные файлы TBBConfig.cmake и TBBConfigVersion.cmake позволяют получить необходимые переменные и импортированные цели для использования Intel TBB. Файлы находятся в папке <tbb_root>/cmake в бинарных пакетах для Linux* OS, Windows* OS или macOS*, начиная с релиза Intel TBB 2017 Update 7.
Алгоритм:

  1. Скачать и распаковать бинарный пакет.
  2. Добавить расположение корневой папки подключаемой библиотеки в переменную CMAKE_PREFIX_PATH или путь до конфигурационных файлов в переменную TBB_DIR.
  3. Вызвать функцию find_package (TBB), добавив нужные параметры при необходимости.
  4. Использовать полученные переменные и/или импортированные цели.

Необходимые компоненты библиотеки могут быть перечислены после ключевого слова COMPONENTS или REQUIRED при вызове функции find_package, например, tbb, tbbmalloc, tbb_preview и т.д. По умолчанию доступны компоненты tbb, tbbmalloc и tbbmalloc_proxy. Для каждого компонента создаётся импортированная цель формата TBB::<component>.
Определяются следующие переменные:

TBB_FOUND флаг успешности поиска Intel TBB
TBB_<component>_FOUND флаг успешности поиска отдельного компонента
TBB_IMPORTED_TARGETS все созданные импортированные цели
TBB_VERSION версия Intel TBB (формат: <major>.<minor>)
TBB_INTERFACE_VERSION версия интерфейса Intel TBB

На данный момент при указании желаемой версии библиотеки есть ограничение: автоматически проверяется только совместимость самих версий формата <major>.<minor>, но не проверяется совместимость различных апдейтов в рамках одной версии. Версия интерфейса может быть проверена с использованием переменной TBB_INTERFACE_VERSION.

Сборка Intel TBB из исходного кода с помощью TBBBuild

Модуль TBBBuild.cmake предоставляет функцию tbb_build, которая позволяет собрать библиотеку из исходного кода с использованием родной инфраструктуры библиотеки (Makefile). Для сборки на Linux* OS и macOS* необходимо наличие make-утилиты, а на Windows* OS – gmake. После непосредственно сборки создаются нужные конфигурационные файлы в папке <tbb_root>/cmake.
Функция tbb_build принимает следующие параметры:

TBB_ROOT <variable> путь до корневой папки бибилотеки, которую нужно собрать
CONFIG_DIR <variable> переменная, в которую запишется полный путь к папке с созданными конфигурационными файлами;
значение <variable>-NOTFOUND будет возвращено в случае ошибки при сборке
MAKE_ARGS <custom_make_arguments> настраиваемые аргументы для make-команды;
следующие аргументы определяются и передаются автоматически, если они не переопределены в <custom_make_arguments>:

  • compiler=<compiler>
  • tbb_build_dir=<tbb_build_dir>
  • tbb_build_prefix=<tbb_build_prefix>
  • -j<n>

Пример использования модуля:

include(<path-to-tbb-cmake-modules>/TBBBuild.cmake)
tbb_build(TBB_ROOT <tbb_root> CONFIG_DIR TBB_DIR)
find_package(TBB <options>)

Скачивание Intel TBB с помощью TBBGet

Модуль TBBGet.cmake предоставляет функцию tbb_get, которая позволяет скачивать и распаковывать бинарные пакеты и пакеты с исходным кодом для официальных релизов Intel TBB с GitHub. Для бинарных пакетов старше Intel TBB 2017 Update 7 конфигурационные файлы создаются автоматически в папке <tbb_root>/cmake.
Функция tbb_get принимает следующие параметры:

TBB_ROOT <variable> переменная, в которую будет записан полный путь к корневой папке скачанного и распакованного пакета;
значение <variable>-NOTFOUND будет возвращено в случае ошибки при скачивании
RELEASE_TAG <release_tag>|LATEST тег релиза для скачивания;
по умолчанию используется значение LATEST
SAVE_TO <path> путь для распаковки скачанного пакета;
по умолчанию используется ${CMAKE_CURRENT_BINARY_DIR}/tbb_downloaded
SYSTEM_NAME Linux|Windows|Darwin ОС, для которой необходимо скачать бинарный пакет;
по умолчанию используется значение переменной CMAKE_SYSTEM_NAME
CONFIG_DIR <variable> переменная, в которую будет записан полный путь до конфигурационных файлов;
параметр игнорируется, если указан флаг SOURCE_CODE
SOURCE_CODE флаг, сигнализирующий о необходимости скачивания пакета с исходным кодом вместо бинарного пакета

Примеры использования модуля:

  1. Скачивание и подключение самого свежего бинарного пакета для текущей ОС
    include(<path-to-tbb-cmake-modules>/TBBGet.cmake)
    tbb_get(TBB_ROOT tbb_root CONFIG_DIR TBB_DIR)
    find_package(TBB <options>)

  2. Скачивание, сборка и подключение самого свежего пакета с исходным кодом
    include(<path-to-tbb-cmake-modules>/TBBGet.cmake)
    include(<path-to-tbb-cmake-modules>/TBBBuild.cmake)
    tbb_get(TBB_ROOT tbb_root SOURCE_CODE)
    tbb_build(TBB_ROOT ${tbb_root} CONFIG_DIR TBB_DIR)
    find_package(TBB <options>)
    

Демо-проекты на базе примера GettingStarted/sub_string_finder с подключением Intel TBB

Подключение бинарного пакета на Windows* OS

В этом примере мы создадим CMake проект на базе GettingStarted/sub_string_finder с подключением бинарного пакета Intel TBB. Пример написан для Windows* OS (Microsoft* Visual Studio), но с незначительными изменениями может быть использован для других ОС.
Ключевые слова <version> и <date> должны быть заменены на актуальные значения для загруженного пакета.

Минимальные требования:

  • CMake 3.0.0
  • Microsoft* Visual Studio 11 (для Intel TBB 2017 Update 7)
  • Intel TBB 2017 Update 7

Инструкция:

  1. Скачайте Intel TBB для Windows* OS и распакуйте его в C:demo_tbb_cmake
  2. В папке C:demo_tbb_cmaketbb<version>_<date>ossexamplesGettingStartedsub_string_finder создайте файл CMakeLists.txt следующего содержания:
    cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
    project(sub_string_finder CXX)
    add_executable(sub_string_finder sub_string_finder.cpp)
    # Функция find_package ищет TBBConfig, используя переменные
    # CMAKE_PREFIX_PATH и TBB_DIR.
    find_package(TBB REQUIRED tbb)
    # "TBB::tbb" можно использовать вместо "${TBB_IMPORTED_TARGETS}"
    target_link_libraries(sub_string_finder ${TBB_IMPORTED_TARGETS})
     
  3. Запустите CMake GUI и
    • Заполните поля (можно использовать кнопки «Browse Source...» и «Browse Build...»):
      «Where is the source сode»:
      C:/demo_tbb_cmake/tbb<version>_<date>oss/examples/GettingStarted/sub_string_finder
      «Where to build the binaries»:
      C:/demo_tbb_cmake/tbb<version>_<date>oss/examples/GettingStarted/sub_string_finder/build
    • Добавьте в кэш новую переменную кнопкой «Add Entry»:
      Name: CMAKE_PREFIX_PATH
      Type: PATH
      Value: C:/demo_tbb_cmake/tbb<version>_<date>oss
    • Cоздайте проект Microsoft* Visual Studio, нажав кнопку «Generate».
  4. Теперь полученный проект можно открыть в Microsoft* Visual Studio (например, нажав кнопку «Open Project» в CMake GUI) и построить. Путь до сгенерированного проекта:
    C:demo_tbb_cmaketbb<version>_<date>ossexamplesGettingStartedsub_string_finderbuildsub_string_finder.sln.
    Окно CMake GUI после генерации проекта:
    Интеграция Intel Threading Building Blocks в ваш CMake проект - 2
Сборка библиотеки из исходного кода и подключение в проект

В этом примере мы создадим CMake проект на базе GettingStarted/sub_string_finder, в котором произведём сборку и подключение Intel TBB с включенными Community Preview Features (CPF). Пример написан для Linux* OS, но с незначительными изменениями может быть использован для других ОС.
Минимальные требования:

  • CMake 3.0.0

Инструкция:

  1. Склонируйте репозиторий Intel TBB в папку ~/demo_tbb_cmake:
    mkdir ~/demo_tbb_cmake
    cd ~/demo_tbb_cmake
    git clone https://github.com/01org/tbb.git
    

  2. В папке ~/demo_tbb_cmake/tbb/examples/GettingStarted/sub_string_finder создайте файл CMakeLists.txt следующего содержания:
    cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
    project(sub_string_finder CXX)
    add_executable(sub_string_finder sub_string_finder.cpp)
     include(${TBB_ROOT}/cmake/TBBBuild.cmake)
     # Строим Intel TBB с включенными Community Preview Features (CPF).
    tbb_build(TBB_ROOT ${TBB_ROOT} CONFIG_DIR TBB_DIR MAKE_ARGS tbb_cpf=1)
     find_package(TBB REQUIRED tbb_preview)
     # "TBB::tbb_preview" можно использовать вместо "${TBB_IMPORTED_TARGETS}".
    target_link_libraries(sub_string_finder ${TBB_IMPORTED_TARGETS})
    

  3. Создайте папку для сборки вашего проекта и перейдите туда:
    mkdir ~/demo_tbb_cmake/tbb/examples/GettingStarted/sub_string_finder/build
    cd ~/demo_tbb_cmake/tbb/examples/GettingStarted/sub_string_finder/build
  4. Запустите CMake, указав корневую папку библиотеки Intel TBB:
    cmake -DTBB_ROOT=${HOME}/demo_tbb_cmake/tbb ..
  5. Соберите и запустите проект:
    make
    ./sub_string_finder
    

Заключение

Команда Intel TBB заинтересована в удобной интеграции библиотеки в пользовательские CMake проекты. Новые модули созданы как раз для решения этой задачи. Они предоставляют простой и гибкий интерфейс со множеством вариантов использования. Надеемся, вы попробуете эти модули, и ждём ваших отзывов.
Ссылки и контакты:

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

Автор: Intel

Источник

Поделиться

* - обязательные к заполнению поля