SECCOM 2017
Conan.io C/C++ Package Manager
Uilian Ries @uilianries
Link desta apresentação
https://goo.gl/6XprTk
Uilian Ries
@uilianries
https://uilianries.github.io
● Análise de sistemas - UNISINOS;
● Desenvolvedor C++ na Khomp;
● Entusiasta Open Source.
QUEM SOU EU
KHOMP na SECCOM 2017
● Palestra empresarial no Hall
● 5 de Outubro (hoje)
● Às 14h10
KHOMP - Posições em aberto
● http://khomp.com/trabalhe-conosco
● Desenvolvedor C++
● Desenvolvedor Web
ERA APENAS UM CÓDIGO …
Exemplo utilizando Boost Regex
para validar e-mail
/* VALIDAR SE A ENTRADA É UM ENDEREÇO DE E-MAIL */
// main.cpp
#include <iostream>
#include <boost/regex.hpp>
int main(int argc, char** argv){
if (argc != 2) return 1;
boost::regex expr{"b[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}b"}
;
std::cout << std::boolalpha << boost::regex_match(argv[1], expr) << 'n';
return 0;
}
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(regex-example CXX)
find_package(Boost 1.64.0 COMPONENTS regex)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(regex main.cpp)
target_link_libraries(regex ${Boost_LIBRARIES})
uilian@local $ mkdir build && cd build && cmake ..
-- Could NOT find Boost
main.cpp:5:27: fatal error: boost/regex.hpp: No such file or
directory
#include <boost/regex.hpp>
^
compilation terminated.
Problema
Resolver
dependência
externa!
1) Baixar fontes
2) Construir
3) Instalar
~2 HORAS!
CppCon 2017 - Learning and Teaching Modern C++,
Bjarne Stroustrup
https://youtu.be/fX2W3nNjJIo?t=41m44s
Conan.io
O bárbaro chegou
para o resgate!
Conan.io
Features
● FOSS;
● Licença MIT;
● Estilo GIT, distribuído;
● Empacotamento de fontes e artefatos;
● Geradores MSVC, CMake, qmake, ...
Conan.io no Github
https://github.com/conan-io/conan
$ sudo pip install conan
$ conan new profile default --detect
It seems to be the first time you run conan
Auto detecting your dev setup to initialize conan.conf
Found gcc 6.3
Default conan.conf settings
os=Linux
arch=x86_64
compiler=gcc
compiler.version=6.3
build_type=Release
*** You can change them in ~/.conan/conan.conf ***
*** Or override with -s compiler='other' -s ...s***
Instalação
Utilizando pip
Exemplo
Boost Regex
# conanfile.txt
[requires]
Boost/1.64.0@bincrafters/stable
[generators]
cmake
Exemplo
Boost Regex
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(regex-example CXX)
include(${CMAKE_BINARY_DIR}/conanbuild
info.cmake)
conan_basic_setup()
add_executable(regex main.cpp)
target_link_libraries(regex ${CONAN_LIBS})
$ tree
.
├── CMakeLists.txt
├── conanfile.txt
└── main.cpp
0 directories, 3 files
Exemplo
Boost Regex
$ conan remote add bincrafters 
https://api.bintray.com/conan/bincrafters/p
ublic-conan
$ mkdir build && cd build
$ conan install ..
$ cmake .. && cmake --build .
$ bin/regex foo@mail.com
true
$ bin/regex foo#mail#com
false
Exemplo
Boost Regex
Dúvidas?
Conan
Numa casca
de noz
● Nomeação de pacotes
● Setup do sistema
● Distribuição de artefatos
● Cache local
Pacote
Estrutura do
nome
Estrutura do pacote:
name/version@user/channel
Exemplo:
Poco/1.7.5@lasote/stable
Poco/1.7.5@lasote/testing
Poco/1.7.5@lasote/ci
Poco/1.7.9@pocoproject/stable
Setup
Criação do
profile
Valores pré-definidos
+
Configuração do host
=
Profile Padrão
$uname
Linux
$ uname -m
X86_64
$ g++ --version
g++ 6.3.0 20170519
Setup
host
os: [Windows, Linux, Macos, Android, iOS]
arch: [x86, x86_64, armv6, armv7, armv7hf, armv8]
compiler:
gcc:
version: ["4.4", "4.5", "4.6", "4.7", "4.8", "4.9", "5.1", "5.2", "5.3"]
libcxx: [libstdc++, libstdc++11]
Visual Studio:
runtime: [MD, MT, MTd, MDd]
version: ["8", "9", "10", "11", "12", "14"]
clang:
version: ["3.3", "3.4", "3.5", "3.6", "3.7", "3.8"]
libcxx: [libstdc++, libstdc++11, libc++]
apple-clang:
version: ["5.0", "5.1", "6.0", "6.1", "7.0", "7.3"]
libcxx: [libstdc++, libc++]
build_type: [None, Debug, Release]
● Valores
pré-definidos
$ conan profile show default
Configuration for profile default:
[settings]
arch: x86_64
build_type: Release
compiler: gcc
compiler.libcxx: libstdc++
compiler.version: 6.3
os: Linux
[options]
[build_requires]
[env]
[scopes]
dev=True
Setup
Profile padrão
conanfile.txt
Conan cache
conan.khomp.corp
Distribuição descentralizada
localhost
bintray.com/conan
$ conan install
1) Consulta cache local
2) Consulta servidor local
3) Consulta Bintray
Conan.io no Bintray
https://bintray.com/conan/
$ conan search  Boost/1.64.0@bincrafters/stable
Existing packages for recipe
Boost/1.64.0@bincrafters/stable:
Package_ID:
2bf7892a6dc21cad89e2c743f5ea0b1372817683
[options]
shared: True
use_icu: False
[settings]
arch: x86_64
build_type: Release
compiler: gcc
compiler.libcxx: libstdc++
compiler.version: 6.3
os: Linux
[requires]
...
Cache
Local
Boost Regex
Cache Local - 1 receita, N pacotes
localhost
conanfile.txt
amd64
Boost/1.64.0@bincrafters/stable
configN
i386
$ conan search
Lista todos pacotes na cache
Indentificação do pacote
Boost/1.64.0@bincrafters/stable
Package_ID: b2a2dd150fed04abc97d11c09f340db88855c686
[options]
shared: True
[settings]
arch: x86_64
build_type: Release
compiler: gcc
compiler.libcxx: libstdc++
compiler.version: 6.3
os: Linux
[requires]
Boost.Core/1.64.0@bincrafters/stable:5ab84d6acfe1f23
Dúvidas?
Hands-on
Como criar uma
receita do zero
Pacote Hello World!
● Todos devem participar
● Criar receita Conan para construir o projeto
● Deverá ser criado um biblioteca com apenas uma função:
○ void helloWord();
$ conan new --bare hello/0.1.0
$ tree
.
└── conanfile.py
0 directories, 1 files
Hands-on
Como criar uma
receita do zero
# conanfile.py
from conans import ConanFile, tools
class HelloConan(ConanFile):
name = "hello"
version = "0.1.0"
settings = "os", "arch", "compiler", "build_type"
def package_info(self):
self.cpp_info.libs = tools.collect_libs(self)
Hands-on
Criando uma
receita do zero
# hello.h
#pragma once
void helloWorld();
# hello.cpp
#include "hello.h"
#include <iostream>
void helloWorld() {
std::cout << "Hello World!n";
}
Hands-on
Como criar uma
receita do zero
# CMakeLists.txt
project(Hello CXX)
cmake_minimum_required(VERSION 2.8)
include(${CMAKE_BINARY_DIR}/conanbuil
dinfo.cmake)
conan_basic_setup()
add_library(hello hello.cpp)
Hands-on
Como criar uma
receita do zero
from conans import ConanFile, CMake, tools
class HelloConan(ConanFile):
name = "hello"
version = "0.1.0"
settings = "os", "arch", "compiler", "build_type"
exports_sources = “*”
generators = “cmake”
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def package(self):
self.copy(pattern="*.h", dst=”include”, src=”.”)
self.copy(pattern="*", dst=”lib”, src=”lib”)
def package_info(self):
self.cpp_info.libs = tools.collect_libs(self)
Hands-on
Como criar uma
receita do zero
$ conan new --sources hello/0.1.0
$ tree
.
├── conanfile.py
└── src
├── CMakeLists.txt
├── hello.cpp
└── hello.h
1 directory, 4 files
Hands-on
Como criar uma
receita do zero
$ conan create uilian/testing
● Exportar os fontes
● Gerar cmakebuildinfo
● Executar CMake (configure,build)
● Empacotar artefatos (headers,libs)
Hands-on
Criando uma
receita do zero
Hands-on
Como testar o
pacote
Pacote Hello World!
● Todos devem participar
● Criar diretório com nome test_package
● Criar aplicação que consome a biblioteca hello
● Criar receita Conan para construir o teste
$ mkdir test_package
$ cd test_package
Hands-on
Como testar o
pacote
# main.cpp
#include "hello.h"
int main() {
helloWorld();
return 0;
}
Hands-on
Como testar o
pacote
# CMakeLists.txt
project(PackageTest CXX)
cmake_minimum_required(VERSION 2.8)
include(${CMAKE_BINARY_DIR}/conanbuil
dinfo.cmake)
conan_basic_setup()
add_executable(hello main.cpp)
target_link_libraries(hello ${CONAN_LIBS})
Hands-on
Como testar o
pacote
from conans import Conanfile, CMake, tools
Import os
class HelloTestConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = “cmake”
def build(self):
cmake = CMake(self)
cmake.configure(build_dirs=”./”)
cmake.build()
def imports(self):
self.copy(pattern="*.so", dst=”bin”, src=”lib”)
def test(self):
with tools.chdir(“bin”):
self.run(“.%shello” % os.sep)
Hands-on
Como testar o
pacote
$ conan new --sources --test hello/0.1.0
$ tree .
.
├── conanfile.py
├── src
│ ├── CMakeLists.txt
│ ├── hello.cpp
│ └── hello.h
└── test_package
├── CMakeLists.txt
├── conanfile.py
└── example.cpp
2 directories, 7 files
Hands-on
Como testar o
pacote
$ conan create uilian/testing
● Exportar os fontes
● Gerar cmakebuildinfo
● Executar CMake (configure,build)
● Empacotar artefatos (headers,libs)
● Executar testes
Hands-on
Como testar o
pacote
$ conan info hello/0.1.0@uilian/testing
$ conan search hello/0.1.0@uilian/testing
Hands-on
Como testar o
pacote
REFERÊNCIAS
Conan.io
Github Conan.io
Programming C++ With The 4 Cs
CppCon 2016 Conan.io
CppCast Conan.io
SECCOM 2017
Conan.io C/C++ Package Manager
Uilian Ries
@uilianries
https://uilianries.github.io/
SECCOM 2017 - Conan.io o gerente de pacote para C e C++

SECCOM 2017 - Conan.io o gerente de pacote para C e C++

  • 1.
    SECCOM 2017 Conan.io C/C++Package Manager Uilian Ries @uilianries
  • 2.
  • 3.
    Uilian Ries @uilianries https://uilianries.github.io ● Análisede sistemas - UNISINOS; ● Desenvolvedor C++ na Khomp; ● Entusiasta Open Source. QUEM SOU EU
  • 4.
    KHOMP na SECCOM2017 ● Palestra empresarial no Hall ● 5 de Outubro (hoje) ● Às 14h10
  • 5.
    KHOMP - Posiçõesem aberto ● http://khomp.com/trabalhe-conosco ● Desenvolvedor C++ ● Desenvolvedor Web
  • 6.
    ERA APENAS UMCÓDIGO … Exemplo utilizando Boost Regex para validar e-mail
  • 7.
    /* VALIDAR SEA ENTRADA É UM ENDEREÇO DE E-MAIL */ // main.cpp #include <iostream> #include <boost/regex.hpp> int main(int argc, char** argv){ if (argc != 2) return 1; boost::regex expr{"b[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}b"} ; std::cout << std::boolalpha << boost::regex_match(argv[1], expr) << 'n'; return 0; }
  • 8.
    # CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(regex-exampleCXX) find_package(Boost 1.64.0 COMPONENTS regex) include_directories(${Boost_INCLUDE_DIRS}) add_executable(regex main.cpp) target_link_libraries(regex ${Boost_LIBRARIES})
  • 9.
    uilian@local $ mkdirbuild && cd build && cmake .. -- Could NOT find Boost main.cpp:5:27: fatal error: boost/regex.hpp: No such file or directory #include <boost/regex.hpp> ^ compilation terminated.
  • 10.
  • 11.
    CppCon 2017 -Learning and Teaching Modern C++, Bjarne Stroustrup https://youtu.be/fX2W3nNjJIo?t=41m44s
  • 12.
  • 13.
    Conan.io Features ● FOSS; ● LicençaMIT; ● Estilo GIT, distribuído; ● Empacotamento de fontes e artefatos; ● Geradores MSVC, CMake, qmake, ...
  • 14.
  • 15.
    $ sudo pipinstall conan $ conan new profile default --detect It seems to be the first time you run conan Auto detecting your dev setup to initialize conan.conf Found gcc 6.3 Default conan.conf settings os=Linux arch=x86_64 compiler=gcc compiler.version=6.3 build_type=Release *** You can change them in ~/.conan/conan.conf *** *** Or override with -s compiler='other' -s ...s*** Instalação Utilizando pip
  • 16.
  • 17.
    Exemplo Boost Regex # CMakeLists.txt cmake_minimum_required(VERSION2.8) project(regex-example CXX) include(${CMAKE_BINARY_DIR}/conanbuild info.cmake) conan_basic_setup() add_executable(regex main.cpp) target_link_libraries(regex ${CONAN_LIBS})
  • 18.
    $ tree . ├── CMakeLists.txt ├──conanfile.txt └── main.cpp 0 directories, 3 files Exemplo Boost Regex
  • 19.
    $ conan remoteadd bincrafters https://api.bintray.com/conan/bincrafters/p ublic-conan $ mkdir build && cd build $ conan install .. $ cmake .. && cmake --build . $ bin/regex foo@mail.com true $ bin/regex foo#mail#com false Exemplo Boost Regex
  • 20.
  • 21.
    Conan Numa casca de noz ●Nomeação de pacotes ● Setup do sistema ● Distribuição de artefatos ● Cache local
  • 22.
    Pacote Estrutura do nome Estrutura dopacote: name/version@user/channel Exemplo: Poco/1.7.5@lasote/stable Poco/1.7.5@lasote/testing Poco/1.7.5@lasote/ci Poco/1.7.9@pocoproject/stable
  • 23.
  • 24.
    $uname Linux $ uname -m X86_64 $g++ --version g++ 6.3.0 20170519 Setup host
  • 25.
    os: [Windows, Linux,Macos, Android, iOS] arch: [x86, x86_64, armv6, armv7, armv7hf, armv8] compiler: gcc: version: ["4.4", "4.5", "4.6", "4.7", "4.8", "4.9", "5.1", "5.2", "5.3"] libcxx: [libstdc++, libstdc++11] Visual Studio: runtime: [MD, MT, MTd, MDd] version: ["8", "9", "10", "11", "12", "14"] clang: version: ["3.3", "3.4", "3.5", "3.6", "3.7", "3.8"] libcxx: [libstdc++, libstdc++11, libc++] apple-clang: version: ["5.0", "5.1", "6.0", "6.1", "7.0", "7.3"] libcxx: [libstdc++, libc++] build_type: [None, Debug, Release] ● Valores pré-definidos
  • 26.
    $ conan profileshow default Configuration for profile default: [settings] arch: x86_64 build_type: Release compiler: gcc compiler.libcxx: libstdc++ compiler.version: 6.3 os: Linux [options] [build_requires] [env] [scopes] dev=True Setup Profile padrão
  • 27.
    conanfile.txt Conan cache conan.khomp.corp Distribuição descentralizada localhost bintray.com/conan $conan install 1) Consulta cache local 2) Consulta servidor local 3) Consulta Bintray
  • 28.
  • 29.
    $ conan search Boost/1.64.0@bincrafters/stable Existing packages for recipe Boost/1.64.0@bincrafters/stable: Package_ID: 2bf7892a6dc21cad89e2c743f5ea0b1372817683 [options] shared: True use_icu: False [settings] arch: x86_64 build_type: Release compiler: gcc compiler.libcxx: libstdc++ compiler.version: 6.3 os: Linux [requires] ... Cache Local Boost Regex
  • 30.
    Cache Local -1 receita, N pacotes localhost conanfile.txt amd64 Boost/1.64.0@bincrafters/stable configN i386 $ conan search Lista todos pacotes na cache
  • 31.
    Indentificação do pacote Boost/1.64.0@bincrafters/stable Package_ID:b2a2dd150fed04abc97d11c09f340db88855c686 [options] shared: True [settings] arch: x86_64 build_type: Release compiler: gcc compiler.libcxx: libstdc++ compiler.version: 6.3 os: Linux [requires] Boost.Core/1.64.0@bincrafters/stable:5ab84d6acfe1f23
  • 32.
  • 33.
  • 34.
    Pacote Hello World! ●Todos devem participar ● Criar receita Conan para construir o projeto ● Deverá ser criado um biblioteca com apenas uma função: ○ void helloWord();
  • 35.
    $ conan new--bare hello/0.1.0 $ tree . └── conanfile.py 0 directories, 1 files Hands-on Como criar uma receita do zero
  • 36.
    # conanfile.py from conansimport ConanFile, tools class HelloConan(ConanFile): name = "hello" version = "0.1.0" settings = "os", "arch", "compiler", "build_type" def package_info(self): self.cpp_info.libs = tools.collect_libs(self) Hands-on Criando uma receita do zero
  • 37.
    # hello.h #pragma once voidhelloWorld(); # hello.cpp #include "hello.h" #include <iostream> void helloWorld() { std::cout << "Hello World!n"; } Hands-on Como criar uma receita do zero
  • 38.
    # CMakeLists.txt project(Hello CXX) cmake_minimum_required(VERSION2.8) include(${CMAKE_BINARY_DIR}/conanbuil dinfo.cmake) conan_basic_setup() add_library(hello hello.cpp) Hands-on Como criar uma receita do zero
  • 39.
    from conans importConanFile, CMake, tools class HelloConan(ConanFile): name = "hello" version = "0.1.0" settings = "os", "arch", "compiler", "build_type" exports_sources = “*” generators = “cmake” def build(self): cmake = CMake(self) cmake.configure() cmake.build() def package(self): self.copy(pattern="*.h", dst=”include”, src=”.”) self.copy(pattern="*", dst=”lib”, src=”lib”) def package_info(self): self.cpp_info.libs = tools.collect_libs(self) Hands-on Como criar uma receita do zero
  • 40.
    $ conan new--sources hello/0.1.0 $ tree . ├── conanfile.py └── src ├── CMakeLists.txt ├── hello.cpp └── hello.h 1 directory, 4 files Hands-on Como criar uma receita do zero
  • 41.
    $ conan createuilian/testing ● Exportar os fontes ● Gerar cmakebuildinfo ● Executar CMake (configure,build) ● Empacotar artefatos (headers,libs) Hands-on Criando uma receita do zero
  • 42.
  • 43.
    Pacote Hello World! ●Todos devem participar ● Criar diretório com nome test_package ● Criar aplicação que consome a biblioteca hello ● Criar receita Conan para construir o teste
  • 44.
    $ mkdir test_package $cd test_package Hands-on Como testar o pacote
  • 45.
    # main.cpp #include "hello.h" intmain() { helloWorld(); return 0; } Hands-on Como testar o pacote
  • 46.
    # CMakeLists.txt project(PackageTest CXX) cmake_minimum_required(VERSION2.8) include(${CMAKE_BINARY_DIR}/conanbuil dinfo.cmake) conan_basic_setup() add_executable(hello main.cpp) target_link_libraries(hello ${CONAN_LIBS}) Hands-on Como testar o pacote
  • 47.
    from conans importConanfile, CMake, tools Import os class HelloTestConan(ConanFile): settings = "os", "arch", "compiler", "build_type" generators = “cmake” def build(self): cmake = CMake(self) cmake.configure(build_dirs=”./”) cmake.build() def imports(self): self.copy(pattern="*.so", dst=”bin”, src=”lib”) def test(self): with tools.chdir(“bin”): self.run(“.%shello” % os.sep) Hands-on Como testar o pacote
  • 48.
    $ conan new--sources --test hello/0.1.0 $ tree . . ├── conanfile.py ├── src │ ├── CMakeLists.txt │ ├── hello.cpp │ └── hello.h └── test_package ├── CMakeLists.txt ├── conanfile.py └── example.cpp 2 directories, 7 files Hands-on Como testar o pacote
  • 49.
    $ conan createuilian/testing ● Exportar os fontes ● Gerar cmakebuildinfo ● Executar CMake (configure,build) ● Empacotar artefatos (headers,libs) ● Executar testes Hands-on Como testar o pacote
  • 50.
    $ conan infohello/0.1.0@uilian/testing $ conan search hello/0.1.0@uilian/testing Hands-on Como testar o pacote
  • 51.
    REFERÊNCIAS Conan.io Github Conan.io Programming C++With The 4 Cs CppCon 2016 Conan.io CppCast Conan.io
  • 52.
    SECCOM 2017 Conan.io C/C++Package Manager Uilian Ries @uilianries https://uilianries.github.io/