company_banner

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

  • Tutorial


Привет, уважаемые читатели 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_cmake\tbb<version>_<date>oss\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)
    # Функция 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_cmake\tbb<version>_<date>oss\examples\GettingStarted\sub_string_finder\build\sub_string_finder.sln.

    Окно CMake GUI после генерации проекта:



Сборка библиотеки из исходного кода и подключение в проект
В этом примере мы создадим 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 проекты. Новые модули созданы как раз для решения этой задачи. Они предоставляют простой и гибкий интерфейс со множеством вариантов использования. Надеемся, вы попробуете эти модули, и ждём ваших отзывов.

Ссылки и контакты:


* прочие названия и бренды могут быть объявлены интеллектуальной собственностью других лиц
  • +11
  • 2,7k
  • 1
Intel 182,91
Компания
Поделиться публикацией
Комментарии 1
  • 0
    В разделе про сборку через TBBBuild не указано как выбрать стандарт С++, с которым следует собираться. Для этого в <custom_make_arguments> надо добавить stdver=c++11 для 11 стандарта, к примеру.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое