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

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

  • 1.
    1 DIVIDE AND MANAGEWITHDIVIDE 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" INTDD 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(VERSION2.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 CONFIGURATIONTRAVISCI 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
  • 10.
  • 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 MOREBUILDSWE NEED MORE BUILDS
  • 13.
    12 NOW WE WANTTO 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 CONANHERECOMES 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 $conaninstall 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 BINARYPACKAGE 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 ONCIUSING 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 PACKAGELISTCONAN REPOSITORY PACKAGE LIST
  • 19.
    18 HOW TO BUILDOWN 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 REPOSITORYCONANPRIVATE 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 PACKAGETOOLSCONAN 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 PACKAGETOOLSCONAN 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 PACKAGETOOLSCONAN 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
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
    26 CONCLUSIONSCONCLUSIONS Positive points build scriptson 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 FORYOUR ATTENTION!THANK YOU FOR YOUR ATTENTION! Contacts: email Pavel.Filonov@kaspersky.com github twitter @filonovpv sdukshis