1
DIVIDE AND MANAGE WITHDIVIDE AND MANAGE WITH
CONAN.IOCONAN.IO
Pavel.Filonov@kaspersky.com
2
C++ PROVIDES CONTROLC++ PROVIDES CONTROL
Example: parameter passing
f(X)1.
f(X&)2.
f(const X&)3.
f(X*)4.
f(const X*)5.
f(X&&)6.
template<class T> f(T&&)7.
f(owner<X*>)8.
f(not_null<X*>)9.
f(unique_ptr<X>)10.
f(shared_ptr<X>)11.
3
C++ PROVIDES PORTABILITYC++ PROVIDES PORTABILITY
But how we could build all of this!
4
C++ BUILD TOOLSC++ BUILD TOOLS
CMake
qmake
bazel
ninja
meson
maiken
Scons
...
Ok. But who will manage our dependencies?
5
C++ PACKAGE MANAGERSC++ PACKAGE MANAGERS
Linux
apt, yum, portage, pacman, ...
Macos
MacPorts, Fink, Homebrew, ...
Windows
Nuget, Chocolatey
Cross-plarform
cpm, hunter, ExternalProject_Add
<self-written scripts on python, perl, bash, cmake>
biicode
conan
6
"HELLO, WORLD" IN TDD STYLE"HELLO, WORLD" IN TDD STYLE
hello.h
#ifndef HELLO_H
#define HELLO_H
#include <ostream>
std::ostream& hello(std::ostream&);
#endif
test_hello.cpp
void test_hello() {
std::stringstream ss;
hello(ss);
assert("Hello, world" == ss.str());
}
7
BUILD CONFIGURATIONBUILD CONFIGURATION
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
project(hello CXX)
set(${PROJECT_NAME}_SOURCES
${CMAKE_SOURCE_DIR}/src/hello.cpp
)
set(${PROJECT_NAME}_HEADERS
${CMAKE_SOURCE_DIR}/include/hello.h
)
include_directories(include)
add_executable(${PROJECT_NAME}
${CMAKE_SOURCE_DIR}/src/main.cpp
${${PROJECT_NAME}_SOURCES}
${${PROJECT_NAME}_HEADERS}
)
enable_testing()
add_subdirectory(test)
TRAVIS CI CONFIGURATIONTRAVIS CI CONFIGURATION
.travis.yml
sudo: required
dist: trusty
script:
- mkdir build && cd build
- cmake ..
- cmake --build .
- ctest
matrix:
include:
- os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.9
env: CXX=g++-4.9
- os: linux
addons:
8
packages:
- g++-5
env: CXX=g++-5
- os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-6
env: CXX=g++-6
- os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
9
PROFIT!PROFIT!
10
APPVEYOR CONFIGURATIONAPPVEYOR CONFIGURATION
appveyor.yml
build:
build_script:
- mkdir build && cd build
- cmake -G "%TOOLCHAIN_VERSION%" ..
- cmake --build . --config release
test_script:
- cmd: ctest -C release -VV
environment:
matrix:
- TOOLCHAIN_VERSION: Visual Studio 14 2015
- TOOLCHAIN_VERSION: Visual Studio 12 2013
- TOOLCHAIN_VERSION: Visual Studio 11 2012
11
WE NEED MORE BUILDSWE NEED MORE BUILDS
12
NOW WE WANT TO USE GOOGLETESTNOW WE WANT TO USE GOOGLETEST
#include <sstream>
#include <iostream>
#include <gtest/gtest.h>
#include <hello.h>
TEST(hello, simple) {
std::stringstream ss;
hello(ss);
ASSERT_EQ("Hello, world", ss.str());
}
But how build it on CI?
13
HERE COMES CONANHERE COMES CONAN
pip install conan
conanfile.txt
[requires]
gtest/1.7.0@lasote/stable
[generators]
cmake
CMakeLists.txt
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS})
14
INSTALL DEPENDENCIESINSTALL DEPENDENCIES
$conan install
Requirements
gtest/1.7.0@lasote/stable from conan.io
Packages
gtest/1.7.0@lasote/stable:ee666ea2ce
gtest/1.7.0@lasote/stable: Installing package ee666ea2ce
gtest/1.7.0@lasote/stable: Looking for package ee666ea2ce in remote 'conan.io'
Downloading conan_package.tgz
[==================================================]
Downloading conanmanifest.txt
[==================================================]
Downloading conaninfo.txt
[==================================================]
gtest/1.7.0@lasote/stable: Package installed ee666ea2ce
PROJECT: Generated cmake created conanbuildinfo.cmake
PROJECT: Generated conaninfo.txt
15
IF NO BINARY PACKAGE FOUNDIF NO BINARY PACKAGE FOUND
$conan install --build=missing
gtest/1.7.0: WARN: Binary for ad55876aa not in remote: Package not found!
gtest/1.7.0: Building your package in ~/.conan/data/gtest/1.7.0/lasote
gtest/1.7.0: Configuring sources in ~/.conan/data/gtest/1.7.0/lasote/stable/
[==================================================]
Unzipping 4.8 MB, this can take a while
gtest/1.7.0: Copying sources to build folder
gtest/1.7.0: Generated cmake created conanbuildinfo.cmake
-- The C compiler identification is GNU 6.1.1
-- The CXX compiler identification is GNU 6.1.1
...
gtest/1.7.0 package(): Copied 20 '.h' files
gtest/1.7.0 package(): Copied 2 '.so' files: libgtest_main.so, libgtest.so
gtest/1.7.0: Package 'ad55876aa' created
PROJECT: Generated cmake created conanbuildinfo.cmake
PROJECT: Generated conaninfo.txt
16
USING CONAN ON CIUSING CONAN ON CI
.travis.yml
before_install:
- sudo pip install conan
install:
- conan install --build=missing
appveyor.yml
install:
- set PATH=%PATH%;%PYTHON%/Scripts/
- pip.exe install conan # It install conan too
- conan install --build=missing
17
CONAN REPOSITORY PACKAGE LISTCONAN REPOSITORY PACKAGE LIST
18
HOW TO BUILD OWN PACKAGEHOW TO BUILD OWN PACKAGE
conanfile.py
class LibrabbitmqConan(ConanFile):
name = "librabbitmq"
version = "0.8.1"
def source(self):
self.run("git clone https://github.com/alanxz/rabbitmq-c.git")
def build(self):
cmake = CMake(self.settings)
self.run("cmake -DENABLE_SSL_SUPPORT=OFF "
"%s/rabbitmq-c %s" % (self.conanfile_directory,
cmake.command_line))
self.run("cmake --build . %s" % cmake.build_config)
def package(self):
self.copy("*.h", dst="include", src="rabbitmq-c/librabbitmq")
conan export demo/testing
19
CONAN PRIVATE REPOSITORYCONAN PRIVATE REPOSITORY
Get sources
$ git clone https://github.com/conan-io/conan.git
$ cd conan
$ git checkout master
$ pip install -r conans/requirements.txt
$ pip install -r conans/requirements_server.txt
$ pip install gunicorn
Run server
gunicorn -b 0.0.0.0:9300 -w 4 -t 120 
conans.server.server_launcher:app
Upload packages
$ conan upload librabbitmq/0.8.1@demo/testing
20
CONAN BUILD PACKAGE TOOLSCONAN BUILD PACKAGE TOOLS
build.py
from conan.packager import ConanMultiPackager
if __name__ == "__main__":
builder = ConanMultiPackager()
builder.add_common_builds(pure_c=True)
builder.run()
CONAN BUILD PACKAGE TOOLSCONAN BUILD PACKAGE TOOLS
.travis.yml
os: linux
services:
- docker
sudo: required
language: python
env:
matrix:
- CONAN_GCC_VERSIONS=4.6 CONAN_USE_DOCKER=1
- CONAN_GCC_VERSIONS=4.8 CONAN_USE_DOCKER=1
- CONAN_GCC_VERSIONS=4.9 CONAN_USE_DOCKER=1
- CONAN_GCC_VERSIONS=5.2 CONAN_USE_DOCKER=1
- CONAN_GCC_VERSIONS=5.3 CONAN_USE_DOCKER=1
global:
- CONAN_UPLOAD=1
- CONAN_REFERENCE="librabbitmq/0.8.1"
- CONAN_USERNAME="filonovpv"
- CONAN_CHANNEL="testing"
- CONAN_TOTAL_PAGES=1
- CONAN_CURRENT_PAGE=1 21
osx_image: xcode7.3 # apple-clang 7.3
language: generic
env:
- os: osx
osx_image: xcode7.1 # apple-clang 7.0
language: generic
env:
- os: osx
osx_image: xcode6.4 # apple-clang 6.1
language: generic
env:
- os: osx
osx_image: xcode6.2 # apple-clang 6.0
language: generic
env:
CONAN BUILD PACKAGE TOOLSCONAN BUILD PACKAGE TOOLS
appveyor.yml
build: false
environment:
PYTHON: "C:Python27"
PYTHON_VERSION: "2.7.8"
PYTHON_ARCH: "32"
CONAN_UPLOAD: 1
CONAN_REFERENCE: "librabbitmq/0.8.1"
CONAN_USERNAME: "filonovpv"
CONAN_CHANNEL: "testing"
CONAN_TOTAL_PAGES: 4
matrix:
- CONAN_CURRENT_PAGE: 1
- CONAN_CURRENT_PAGE: 2
- CONAN_CURRENT_PAGE: 3
- CONAN_CURRENT_PAGE: 4
install:
# Workaround for CMake not wanting sh.exe on PATH for MinGW
- set PATH=%PATH:C:Program FilesGitusrbin;=%
22
test_script:
- python build.py
CREATED PACKAGESCREATED PACKAGES
24
CREATED PACKAGESCREATED PACKAGES
25
CREATED PACKAGESCREATED PACKAGES
26
CONCLUSIONSCONCLUSIONS
Positive points
build scripts on python
public repository
private repository
build matrix
Negative points
build scripts on python
small number of packages in the official repository
small amount of documentation
27
REFERENCESREFERENCES
Conan - C/C++ package manager - ,1.
conan.io c++ package manager demo with sfml -2.
CppCon 2014: Lightning Talks - Boris Kolpackov "C++
Package Manager" -
3.
Diego Rodriguez-Losada: Biicode, a C/C++ dependency
manager with a hosting service -
4.
Diego Rodriguez-Losada: Why in heaven is there no
dependency management for C++? -
5.
Arne Mertz, Using Conan for Third Party Libraries -6.
Programming C++ With The 4 Cs: Clang, Cmake, Clion
And Conan -
7.
Site Source
Video
Video
Video
Video
Blogpost
Blogpost
28
THANK YOU FOR YOUR ATTENTION!THANK YOU FOR YOUR ATTENTION!
Contacts:
email Pavel.Filonov@kaspersky.com
github
twitter @filonovpv
sdukshis

More Related Content

PDF
Installation of lammps-5Nov14 on Mac OS X Yosemite
PDF
L'odyssée de la log
PDF
How to ride a whale
PPTX
Getting started with python on Windows
DOCX
How to install squid proxy on server or how to install squid proxy on centos o
PDF
Nginx2
PPTX
Mongo db tailable cursors
PPTX
Cyclone + Eventsource (realtime push-сообщения)
Installation of lammps-5Nov14 on Mac OS X Yosemite
L'odyssée de la log
How to ride a whale
Getting started with python on Windows
How to install squid proxy on server or how to install squid proxy on centos o
Nginx2
Mongo db tailable cursors
Cyclone + Eventsource (realtime push-сообщения)

What's hot (20)

PDF
Building a network emulator with Docker and Open vSwitch
PDF
[MeetUp][2nd] 컭on턺
PDF
Service Discovery for Continuous Delivery with Docker
DOCX
DockerCoreNet
PDF
GoLang & GoatCore
PDF
Connecting to the network
PPTX
Quick Start Guide using Virtuozzo 7 (β) on AWS EC2
DOCX
Lamp configuration u buntu 10.04
PDF
Puppet Camp Berlin 2015: Pedro Pessoa | Puppet at the center of everything - ...
PDF
DevOps(2) : Vagrant - (MOSG)
PDF
Docker 1.11 Meetup: Containerd and runc, by Arnaud Porterie and Michael Crosby
PDF
Instruction: dev environment
PDF
nginxをソースからインストールしてみたよ
PDF
OpenCSW - What is the project about?
PDF
Linux administration ii-parti
PPTX
Advanced Replication
PPT
Montreal On Rails 5 : Rails deployment using : Nginx, Mongrel, Mongrel_cluste...
PDF
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)
PDF
All bugfixes are incompatibilities
PDF
Openstack kilo installation using rdo
Building a network emulator with Docker and Open vSwitch
[MeetUp][2nd] 컭on턺
Service Discovery for Continuous Delivery with Docker
DockerCoreNet
GoLang & GoatCore
Connecting to the network
Quick Start Guide using Virtuozzo 7 (β) on AWS EC2
Lamp configuration u buntu 10.04
Puppet Camp Berlin 2015: Pedro Pessoa | Puppet at the center of everything - ...
DevOps(2) : Vagrant - (MOSG)
Docker 1.11 Meetup: Containerd and runc, by Arnaud Porterie and Michael Crosby
Instruction: dev environment
nginxをソースからインストールしてみたよ
OpenCSW - What is the project about?
Linux administration ii-parti
Advanced Replication
Montreal On Rails 5 : Rails deployment using : Nginx, Mongrel, Mongrel_cluste...
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)
All bugfixes are incompatibilities
Openstack kilo installation using rdo
Ad

Viewers also liked (20)

PDF
Антон Бикинеев, Reflection in C++Next
PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
PDF
Parallel STL
PDF
Догнать и перегнать boost::lexical_cast
PPTX
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
PDF
Fuzzing: The New Unit Testing
PDF
Василий Сорокин, Простой REST сервер на Qt с рефлексией
PPTX
Managing modular software for your nu get, c++ and java development
PDF
Unit-Testing Bad-Practices by Example
PPTX
Практика использования Dependency Injection
PDF
Василий Сорокин, “Google C++ Mocking and Test Frameworks”
PDF
DI в C++ тонкости и нюансы
PPT
Юнит-тестирование и Google Mock. Влад Лосев, Google
PPTX
Practical unit testing in c & c++
PDF
Clean Unit Test Patterns
PPTX
Как писать красивый код или основы SOLID
ODP
Антон Полухин. C++17
PDF
Automated Testing for Embedded Software in C or C++
PPTX
Григорий Демченко, Универсальный адаптер
PDF
Использование юнит-тестов для повышения качества разработки
Антон Бикинеев, Reflection in C++Next
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Parallel STL
Догнать и перегнать boost::lexical_cast
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Fuzzing: The New Unit Testing
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Managing modular software for your nu get, c++ and java development
Unit-Testing Bad-Practices by Example
Практика использования Dependency Injection
Василий Сорокин, “Google C++ Mocking and Test Frameworks”
DI в C++ тонкости и нюансы
Юнит-тестирование и Google Mock. Влад Лосев, Google
Practical unit testing in c & c++
Clean Unit Test Patterns
Как писать красивый код или основы SOLID
Антон Полухин. C++17
Automated Testing for Embedded Software in C or C++
Григорий Демченко, Универсальный адаптер
Использование юнит-тестов для повышения качества разработки
Ad

Similar to Павел Филонов, Разделяй и управляй вместе с Conan.io (20)

PDF
Conan a C/C++ Package Manager
PDF
DevOps(4) : Ansible(2) - (MOSG)
PPTX
Vagrant, Ansible, and OpenStack on your laptop
PDF
Release with confidence
DOCX
PDF
青云CoreOS虚拟机部署kubernetes
PDF
Docker Compose and Panamax - ContainerDays Boston - June 2015
ZIP
Zenoss: Buildout
PDF
MeaNstack on Docker
KEY
Node.js basics
PDF
RDO-Packstack Workshop
PPTX
Infrastructure as code - Python Saati #36
PDF
Kubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdf
PDF
Domino9on centos6
PDF
Antons Kranga Building Agile Infrastructures
PDF
Dependency Management in C++ (NDC TechTown 2021)
PPTX
Continuous delivery with docker
PDF
Linux Containers From Scratch: Makfile MicroVPS
DOCX
Install Cuckoo on Mac OS X
Conan a C/C++ Package Manager
DevOps(4) : Ansible(2) - (MOSG)
Vagrant, Ansible, and OpenStack on your laptop
Release with confidence
青云CoreOS虚拟机部署kubernetes
Docker Compose and Panamax - ContainerDays Boston - June 2015
Zenoss: Buildout
MeaNstack on Docker
Node.js basics
RDO-Packstack Workshop
Infrastructure as code - Python Saati #36
Kubernetes+-CKA-+0400+-+Application+Lifecycle+Management.pdf
Domino9on centos6
Antons Kranga Building Agile Infrastructures
Dependency Management in C++ (NDC TechTown 2021)
Continuous delivery with docker
Linux Containers From Scratch: Makfile MicroVPS
Install Cuckoo on Mac OS X

More from Sergey Platonov (20)

PPTX
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
PPTX
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
PDF
Антон Бикинеев, Writing good std::future&lt; C++ >
PPTX
Григорий Демченко, Асинхронность и неблокирующая синхронизация
PPTX
Павел Беликов, Как избежать ошибок, используя современный C++
PDF
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
PDF
Алексей Кутумов, Coroutines everywhere
PPTX
Дмитрий Нестерук, Паттерны проектирования в XXI веке
PPTX
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
PDF
Павел Довгалюк, Обратная отладка
PPTX
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
PPTX
Dori Exterman, Considerations for choosing the parallel computing strategy th...
PDF
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
PPTX
Александр Фокин, Рефлексия в C++
PDF
Антон Нонко, Классические строки в C++
PPTX
Михаил Матросов, Повседневный С++: boost и STL
PDF
Борис Сазонов, RAII потоки и CancellationToken в C++
PPTX
Алексей Кутумов, Вектор с нуля
PDF
Kirk Shoop, Reactive programming in C++
PPTX
Дмитрий Демчук. Кроссплатформенный краш-репорт
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Антон Бикинеев, Writing good std::future&lt; C++ >
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Павел Беликов, Как избежать ошибок, используя современный C++
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Алексей Кутумов, Coroutines everywhere
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Павел Довгалюк, Обратная отладка
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Фокин, Рефлексия в C++
Антон Нонко, Классические строки в C++
Михаил Матросов, Повседневный С++: boost и STL
Борис Сазонов, RAII потоки и CancellationToken в C++
Алексей Кутумов, Вектор с нуля
Kirk Shoop, Reactive programming in C++
Дмитрий Демчук. Кроссплатформенный краш-репорт

Recently uploaded (20)

PPTX
assetexplorer- product-overview - presentation
PDF
Wondershare Recoverit Full Crack New Version (Latest 2025)
PDF
Microsoft Office 365 Crack Download Free
PDF
Autodesk AutoCAD Crack Free Download 2025
PPTX
Oracle Fusion HCM Cloud Demo for Beginners
PPTX
Weekly report ppt - harsh dattuprasad patel.pptx
PPTX
Tech Workshop Escape Room Tech Workshop
PDF
AI/ML Infra Meetup | LLM Agents and Implementation Challenges
PPTX
Computer Software - Technology and Livelihood Education
PPTX
Patient Appointment Booking in Odoo with online payment
PDF
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
PDF
Time Tracking Features That Teams and Organizations Actually Need
PDF
EaseUS PDF Editor Pro 6.2.0.2 Crack with License Key 2025
PDF
Designing Intelligence for the Shop Floor.pdf
PDF
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
PDF
The Dynamic Duo Transforming Financial Accounting Systems Through Modern Expe...
PDF
AI-Powered Threat Modeling: The Future of Cybersecurity by Arun Kumar Elengov...
PPTX
Computer Software and OS of computer science of grade 11.pptx
PPTX
Monitoring Stack: Grafana, Loki & Promtail
PDF
Visual explanation of Dijkstra's Algorithm using Python
assetexplorer- product-overview - presentation
Wondershare Recoverit Full Crack New Version (Latest 2025)
Microsoft Office 365 Crack Download Free
Autodesk AutoCAD Crack Free Download 2025
Oracle Fusion HCM Cloud Demo for Beginners
Weekly report ppt - harsh dattuprasad patel.pptx
Tech Workshop Escape Room Tech Workshop
AI/ML Infra Meetup | LLM Agents and Implementation Challenges
Computer Software - Technology and Livelihood Education
Patient Appointment Booking in Odoo with online payment
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
Time Tracking Features That Teams and Organizations Actually Need
EaseUS PDF Editor Pro 6.2.0.2 Crack with License Key 2025
Designing Intelligence for the Shop Floor.pdf
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
The Dynamic Duo Transforming Financial Accounting Systems Through Modern Expe...
AI-Powered Threat Modeling: The Future of Cybersecurity by Arun Kumar Elengov...
Computer Software and OS of computer science of grade 11.pptx
Monitoring Stack: Grafana, Loki & Promtail
Visual explanation of Dijkstra's Algorithm using Python

Павел Филонов, Разделяй и управляй вместе с Conan.io

  • 1. 1 DIVIDE AND MANAGE WITHDIVIDE AND MANAGE WITH CONAN.IOCONAN.IO Pavel.Filonov@kaspersky.com
  • 2. 2 C++ PROVIDES CONTROLC++ PROVIDES CONTROL Example: parameter passing f(X)1. f(X&)2. f(const X&)3. f(X*)4. f(const X*)5. f(X&&)6. template<class T> f(T&&)7. f(owner<X*>)8. f(not_null<X*>)9. f(unique_ptr<X>)10. f(shared_ptr<X>)11.
  • 3. 3 C++ PROVIDES PORTABILITYC++ PROVIDES PORTABILITY But how we could build all of this!
  • 4. 4 C++ BUILD TOOLSC++ BUILD TOOLS CMake qmake bazel ninja meson maiken Scons ... Ok. But who will manage our dependencies?
  • 5. 5 C++ PACKAGE MANAGERSC++ PACKAGE MANAGERS Linux apt, yum, portage, pacman, ... Macos MacPorts, Fink, Homebrew, ... Windows Nuget, Chocolatey Cross-plarform cpm, hunter, ExternalProject_Add <self-written scripts on python, perl, bash, cmake> biicode conan
  • 6. 6 "HELLO, WORLD" IN TDD STYLE"HELLO, WORLD" IN TDD STYLE hello.h #ifndef HELLO_H #define HELLO_H #include <ostream> std::ostream& hello(std::ostream&); #endif test_hello.cpp void test_hello() { std::stringstream ss; hello(ss); assert("Hello, world" == ss.str()); }
  • 7. 7 BUILD CONFIGURATIONBUILD CONFIGURATION CMakeLists.txt cmake_minimum_required(VERSION 2.8.12) project(hello CXX) set(${PROJECT_NAME}_SOURCES ${CMAKE_SOURCE_DIR}/src/hello.cpp ) set(${PROJECT_NAME}_HEADERS ${CMAKE_SOURCE_DIR}/include/hello.h ) include_directories(include) add_executable(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/src/main.cpp ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_HEADERS} ) enable_testing() add_subdirectory(test)
  • 8. TRAVIS CI CONFIGURATIONTRAVIS CI CONFIGURATION .travis.yml sudo: required dist: trusty script: - mkdir build && cd build - cmake .. - cmake --build . - ctest matrix: include: - os: linux addons: apt: sources: - ubuntu-toolchain-r-test packages: - g++-4.9 env: CXX=g++-4.9 - os: linux addons: 8
  • 9. packages: - g++-5 env: CXX=g++-5 - os: linux addons: apt: sources: - ubuntu-toolchain-r-test packages: - g++-6 env: CXX=g++-6 - os: linux addons: apt: sources: - ubuntu-toolchain-r-test
  • 11. 10 APPVEYOR CONFIGURATIONAPPVEYOR CONFIGURATION appveyor.yml build: build_script: - mkdir build && cd build - cmake -G "%TOOLCHAIN_VERSION%" .. - cmake --build . --config release test_script: - cmd: ctest -C release -VV environment: matrix: - TOOLCHAIN_VERSION: Visual Studio 14 2015 - TOOLCHAIN_VERSION: Visual Studio 12 2013 - TOOLCHAIN_VERSION: Visual Studio 11 2012
  • 12. 11 WE NEED MORE BUILDSWE NEED MORE BUILDS
  • 13. 12 NOW WE WANT TO USE GOOGLETESTNOW WE WANT TO USE GOOGLETEST #include <sstream> #include <iostream> #include <gtest/gtest.h> #include <hello.h> TEST(hello, simple) { std::stringstream ss; hello(ss); ASSERT_EQ("Hello, world", ss.str()); } But how build it on CI?
  • 14. 13 HERE COMES CONANHERE COMES CONAN pip install conan conanfile.txt [requires] gtest/1.7.0@lasote/stable [generators] cmake CMakeLists.txt include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS})
  • 15. 14 INSTALL DEPENDENCIESINSTALL DEPENDENCIES $conan install Requirements gtest/1.7.0@lasote/stable from conan.io Packages gtest/1.7.0@lasote/stable:ee666ea2ce gtest/1.7.0@lasote/stable: Installing package ee666ea2ce gtest/1.7.0@lasote/stable: Looking for package ee666ea2ce in remote 'conan.io' Downloading conan_package.tgz [==================================================] Downloading conanmanifest.txt [==================================================] Downloading conaninfo.txt [==================================================] gtest/1.7.0@lasote/stable: Package installed ee666ea2ce PROJECT: Generated cmake created conanbuildinfo.cmake PROJECT: Generated conaninfo.txt
  • 16. 15 IF NO BINARY PACKAGE FOUNDIF NO BINARY PACKAGE FOUND $conan install --build=missing gtest/1.7.0: WARN: Binary for ad55876aa not in remote: Package not found! gtest/1.7.0: Building your package in ~/.conan/data/gtest/1.7.0/lasote gtest/1.7.0: Configuring sources in ~/.conan/data/gtest/1.7.0/lasote/stable/ [==================================================] Unzipping 4.8 MB, this can take a while gtest/1.7.0: Copying sources to build folder gtest/1.7.0: Generated cmake created conanbuildinfo.cmake -- The C compiler identification is GNU 6.1.1 -- The CXX compiler identification is GNU 6.1.1 ... gtest/1.7.0 package(): Copied 20 '.h' files gtest/1.7.0 package(): Copied 2 '.so' files: libgtest_main.so, libgtest.so gtest/1.7.0: Package 'ad55876aa' created PROJECT: Generated cmake created conanbuildinfo.cmake PROJECT: Generated conaninfo.txt
  • 17. 16 USING CONAN ON CIUSING CONAN ON CI .travis.yml before_install: - sudo pip install conan install: - conan install --build=missing appveyor.yml install: - set PATH=%PATH%;%PYTHON%/Scripts/ - pip.exe install conan # It install conan too - conan install --build=missing
  • 18. 17 CONAN REPOSITORY PACKAGE LISTCONAN REPOSITORY PACKAGE LIST
  • 19. 18 HOW TO BUILD OWN PACKAGEHOW TO BUILD OWN PACKAGE conanfile.py class LibrabbitmqConan(ConanFile): name = "librabbitmq" version = "0.8.1" def source(self): self.run("git clone https://github.com/alanxz/rabbitmq-c.git") def build(self): cmake = CMake(self.settings) self.run("cmake -DENABLE_SSL_SUPPORT=OFF " "%s/rabbitmq-c %s" % (self.conanfile_directory, cmake.command_line)) self.run("cmake --build . %s" % cmake.build_config) def package(self): self.copy("*.h", dst="include", src="rabbitmq-c/librabbitmq") conan export demo/testing
  • 20. 19 CONAN PRIVATE REPOSITORYCONAN PRIVATE REPOSITORY Get sources $ git clone https://github.com/conan-io/conan.git $ cd conan $ git checkout master $ pip install -r conans/requirements.txt $ pip install -r conans/requirements_server.txt $ pip install gunicorn Run server gunicorn -b 0.0.0.0:9300 -w 4 -t 120 conans.server.server_launcher:app Upload packages $ conan upload librabbitmq/0.8.1@demo/testing
  • 21. 20 CONAN BUILD PACKAGE TOOLSCONAN BUILD PACKAGE TOOLS build.py from conan.packager import ConanMultiPackager if __name__ == "__main__": builder = ConanMultiPackager() builder.add_common_builds(pure_c=True) builder.run()
  • 22. CONAN BUILD PACKAGE TOOLSCONAN BUILD PACKAGE TOOLS .travis.yml os: linux services: - docker sudo: required language: python env: matrix: - CONAN_GCC_VERSIONS=4.6 CONAN_USE_DOCKER=1 - CONAN_GCC_VERSIONS=4.8 CONAN_USE_DOCKER=1 - CONAN_GCC_VERSIONS=4.9 CONAN_USE_DOCKER=1 - CONAN_GCC_VERSIONS=5.2 CONAN_USE_DOCKER=1 - CONAN_GCC_VERSIONS=5.3 CONAN_USE_DOCKER=1 global: - CONAN_UPLOAD=1 - CONAN_REFERENCE="librabbitmq/0.8.1" - CONAN_USERNAME="filonovpv" - CONAN_CHANNEL="testing" - CONAN_TOTAL_PAGES=1 - CONAN_CURRENT_PAGE=1 21
  • 23. osx_image: xcode7.3 # apple-clang 7.3 language: generic env: - os: osx osx_image: xcode7.1 # apple-clang 7.0 language: generic env: - os: osx osx_image: xcode6.4 # apple-clang 6.1 language: generic env: - os: osx osx_image: xcode6.2 # apple-clang 6.0 language: generic env:
  • 24. CONAN BUILD PACKAGE TOOLSCONAN BUILD PACKAGE TOOLS appveyor.yml build: false environment: PYTHON: "C:Python27" PYTHON_VERSION: "2.7.8" PYTHON_ARCH: "32" CONAN_UPLOAD: 1 CONAN_REFERENCE: "librabbitmq/0.8.1" CONAN_USERNAME: "filonovpv" CONAN_CHANNEL: "testing" CONAN_TOTAL_PAGES: 4 matrix: - CONAN_CURRENT_PAGE: 1 - CONAN_CURRENT_PAGE: 2 - CONAN_CURRENT_PAGE: 3 - CONAN_CURRENT_PAGE: 4 install: # Workaround for CMake not wanting sh.exe on PATH for MinGW - set PATH=%PATH:C:Program FilesGitusrbin;=% 22
  • 29. 26 CONCLUSIONSCONCLUSIONS Positive points build scripts on python public repository private repository build matrix Negative points build scripts on python small number of packages in the official repository small amount of documentation
  • 30. 27 REFERENCESREFERENCES Conan - C/C++ package manager - ,1. conan.io c++ package manager demo with sfml -2. CppCon 2014: Lightning Talks - Boris Kolpackov "C++ Package Manager" - 3. Diego Rodriguez-Losada: Biicode, a C/C++ dependency manager with a hosting service - 4. Diego Rodriguez-Losada: Why in heaven is there no dependency management for C++? - 5. Arne Mertz, Using Conan for Third Party Libraries -6. Programming C++ With The 4 Cs: Clang, Cmake, Clion And Conan - 7. Site Source Video Video Video Video Blogpost Blogpost
  • 31. 28 THANK YOU FOR YOUR ATTENTION!THANK YOU FOR YOUR ATTENTION! Contacts: email Pavel.Filonov@kaspersky.com github twitter @filonovpv sdukshis