+ All Categories
Home > Software > Dependencies Managers in C/C++. Using stdcpp 2014

Dependencies Managers in C/C++. Using stdcpp 2014

Date post: 21-Jun-2015
Category:
Upload: biicode
View: 1,229 times
Download: 1 times
Share this document with a friend
Description:
Talk about dependencies in C and C++, both in SW design and architecture, and also about package managers and dependency managers.
Popular Tags:
44
Dependencies in C++ using std::cpp oct-2014 @diegorlosada Why there is no SerialPort in C/C++?
Transcript
Page 1: Dependencies Managers in C/C++. Using stdcpp 2014

Dependencies in C++

using std::cpp oct-2014

@diegorlosada

Why there is no SerialPort in C/C++?

Page 2: Dependencies Managers in C/C++. Using stdcpp 2014

I just wanted a SerialPort!

$ pip install pyserial

>>> import serial >>> ser = serial.Serial(0)

>>> print ser.name

>>> ser.write("hello")

>>> ser.close()

Page 3: Dependencies Managers in C/C++. Using stdcpp 2014

Serial Port in MRPT

>5K files, 70 Mb First class robotics SW.

CSerializable, CObject…

Page 4: Dependencies Managers in C/C++. Using stdcpp 2014

Serial Port in Boost/Asio

Page 5: Dependencies Managers in C/C++. Using stdcpp 2014

DONT MAKE ME USE YOUR DESIGN

• Let me use your functionality without using your design

– Functionality, core value should be independent, easily isolated:

• Easily testable, mockable

• Easily understandable

• Easily reusable

SerialPort

CStream<SerialPort> Cserializable

<T>

Matrix Algorithm

MyApp

CStream<T>

Page 6: Dependencies Managers in C/C++. Using stdcpp 2014

RELATED PATTERNS

• Functional programming

• Low coupling, separation of concerns, single responsibility

Page 7: Dependencies Managers in C/C++. Using stdcpp 2014

LOW COUPLING (GRASP) & KISS

Page 8: Dependencies Managers in C/C++. Using stdcpp 2014

DECOUPLE FUNCTIONALITY

Page 9: Dependencies Managers in C/C++. Using stdcpp 2014
Page 10: Dependencies Managers in C/C++. Using stdcpp 2014

GENERIC FUNCTIONALITY

Page 11: Dependencies Managers in C/C++. Using stdcpp 2014

POLYMORPHIC

Page 12: Dependencies Managers in C/C++. Using stdcpp 2014

THE PROBLEM: NO DEP MANAGER

• That wouldnt happen with a dep manager:

– Install and manage deps per project

– Portable: the same in all plaforms

– Simple and fast to upload/share

Page 13: Dependencies Managers in C/C++. Using stdcpp 2014

EXISTING DEP MANAGERS

Page 14: Dependencies Managers in C/C++. Using stdcpp 2014

THE PROBLEM: NO DEP MANAGER

Page 15: Dependencies Managers in C/C++. Using stdcpp 2014

• OS based (package managers)

– Apt-get, brew, MSI, vagrant

• Dev system based

– make, nuget, cmake

DEP TOOLS FOR C/C++

Page 16: Dependencies Managers in C/C++. Using stdcpp 2014

Advanced Packaging Tool, or APT, is a free user interface that works with core libraries to handle the installation and removal of software

• Install:

– Applications

– Libraries –dev

– Debug –dbg

• apt-get install opencv-dev

APT

Page 17: Dependencies Managers in C/C++. Using stdcpp 2014

Package: biicode

Priority: optional

Section: devel

Maintainer: Julia S.Simon <[email protected]>

Architecture: %ARCHITECTURE%

Version: %VERSION%

Depends: zlib1g, libc-bin

Recommends: build-essential, cmake | python2.7

Suggests: nodejs | default-jdk

Homepage: http://www.biicode.com

Description: Biicode is cool

#!/bin/bash

chmod -R a+rx /usr/lib/biicode/

ln -s -f /usr/lib/biicode/bii /usr/bin/bi

#!/bin/bash

rm /usr/bin/bii

control

postinst prerm

APT FILES

Page 18: Dependencies Managers in C/C++. Using stdcpp 2014

dpkg-deb chmod 755 ${POSTINST_FILE}

chmod 755 ${PRERM_FILE}

chmod 755 ${TMPDIR}/DEBIAN

chmod 755 ${TMPDIR}/DEBIAN/control

find ${TMPDIR}/usr -type d -exec chmod 755 {} +

echo "cd ${TMPDIR}"

cd ${TMPDIR}

echo "Calculating md5sums"

find . -type f ! -regex '.*?biicode*' ! -regex

'.*?DEBIAN.*' -printf '%P ' | xargs md5sum >

DEBIAN/md5sums

chmod 644 DEBIAN/md5sums

echo "cd ${HOLDER}"

cd ${HOLDER}

fakeroot dpkg-deb -z8 -Zgzip --build biicode

echo "cp biicode.deb ~/biicode.deb"

cp biicode.deb ~/biicode.deb

#(cd; alien -r -c -v biicode.deb)

#(cd; alien -t -c -v biicode.deb)

APT FILES (2)

Page 19: Dependencies Managers in C/C++. Using stdcpp 2014

• pkgconfig (*nix)

prefix=/usr/local

exec_prefix=${prefix}

libdir=${exec_prefix}/lib

includedir=${prefix}/include

Name: libzmq

Description: 0MQ c++ library

Version: 4.0.4

Libs: -L${libdir} -lzmq

Cflags: -I${includedir}

$ > pkg-config --cflags --libs libzmq -I/usr/local/include -L/usr/local/lib -lzmq

libzmq.pc

MANIFEST APT-GET

Page 20: Dependencies Managers in C/C++. Using stdcpp 2014

Apt-get pros & cons

• Pros – Mature – Transitive dependencies, conflict detection – GUIs

• Cons – Linux only – Difficult to publish to debian/ubuntu repos, certain

policies to be followed. Being part of such organizations non trivial.

– Possible to run an apt repo (add to /etc/apt/sources.list) with reprepro, but manage infraestructure

– May be slow (e.g. Ubuntu 12.04LTS cmake 2.8.7)

APT Pros & Cons

Page 21: Dependencies Managers in C/C++. Using stdcpp 2014

MAC

• Handles all above problems with one command. For OS X: – MacPorts – Fink – Homebrew – pkgsrc: binary packages for Mac OS X (more info) – etc.

• In general, they: – take a single command as input, defining which package is to be

installed – download source code (Fink downloads a pre-built application) – figures out dependencies – download missing dependencies – builds and install dependencies – builds and install the requested package – Usage example: brew install imagemagick

MAC OS

Page 22: Dependencies Managers in C/C++. Using stdcpp 2014

category Rudix MacPorts Fink Homebrew pkgsrc / pkgin

Homepage rudix.org MacPorts.org

fink.thetis.ig42.org

brew.sh pkgsrc.org andpkgin.net

Year project started

2005 2002 2001 2009 Support for Darwin in 2001

Number of packages

488 (but `rudix available | wc -l` says 351)

17,680 (but `port list | wc -l` says 17,686)

7,951. `apt-cache search . | wc -l` says 209 stable binary .deps)

2,498. `brew search | wc -l` says 2,591. This is not counting various extra "taps"

8,884 binaries for OS X (according to `pkgin available | wc -l`)

Source/binary/both?

Binary only Traditionally only source

Option for both

Source, but also binaries through "bottles"

Both.

Language written in

Python Tcl Perl (front-end)

Ruby C

License BSD BSD GPL :( BSD BSD

Default prefix Directly to /usr/local

/opt/local /sw /usr/local/Cellar. Programs symlink to /usr/local/bin

/usr/pkg

Lastest GCC available

Not available 4.8.1 4.8 4.9 No binary available but pkgsrc has 4.8

Installation of packages

Extremely easy Slow, since it builds from source

The source builds are understandably slow, but the binaries are quick

Source compilation is obviously slow. I've had some linking issues sometimes.

Trivially easy

Uninstallation of packages

Easy and painless

Easy Easy and fast Very easy Trivially easy

MAC PKG MANAGERS

Page 23: Dependencies Managers in C/C++. Using stdcpp 2014

• macports

o Portfile (tcl script)

o El código puede estar en un CVS

o Te tienen que aprobar el nuevo port (proceso manual)

o brew

o en el cual es necesario que tus paquetes sean open source para ser aceptados, pero es un proceso relativamente rápido tener una biblioteca en brew.

SHARING PACKAGES

Page 24: Dependencies Managers in C/C++. Using stdcpp 2014

msi: Windows Installer, software component used for the installation, maintenance, and removal of software on modern Microsoft Windows systems

Build a msi package with Visual Studio Video: https://www.youtube.com/watch?v=HpiZ_o5EgCo

WINDOWS: MSI

Page 25: Dependencies Managers in C/C++. Using stdcpp 2014

• Support for every Windows release since

2000

• Extensive support for installation of 64-bit

applications

• Supports creation of a single EXE to install

your program for easy online distribution.

• Standard Windows 2000/XP-style

wizard interface.

• Customizable setup types.

• Complete uninstall capabilities.

• Installation of files • Includes integrated support for "deflate",

bzip2, and 7-Zip LZMA/LZMA2 file compression.

• Creation of shortcuts anywhere, including in the Start Menu and on the desktop.

• Creation of registry and .INI entries. • Support for passworded and encrypted

installs. • Support for digitally signed installs and

uninstalls. • Unicode installs. • Full source code is available (Borland

Delphi 2.0-5.0 and 2009).

; -- Example.iss --

; Creates its icon in the Programs folder of the start Menu instead of in a subfolder, and also creates a desktop icon.

[Setup]

AppName=My Program

AppVersion=1.5

DefaultDirName={pf}\My Program

; Since no icons will be created in "{group}", we don't need the wizard to ask for a Start Menu folder name:

DisableProgramGroupPage=yes

UninstallDisplayIcon={app}\MyProg.exe

OutputDir=userdocs:Inno Setup Examples Output

[Files]

Source: "MyProg.exe"; DestDir: "{app}"

Source: "MyProg.chm"; DestDir: "{app}"

Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]

Name: "{commonprograms}\My Program"; Filename: "{app}\MyProg.exe"

Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"

INNO SETUP

Page 26: Dependencies Managers in C/C++. Using stdcpp 2014

If we run the *.iss with Inno, a SetUp Wizard is opened and

INNO SETUP

Page 27: Dependencies Managers in C/C++. Using stdcpp 2014

chocolatey

• Motor global de ejecución de

PowerShell utilizando la

infraestructura de

empaquetado NuGet.

• Como apt-get, pero construido

para Windows . PowerShell. Se

puede desarrollar herramientas

y aplicaciones con NuGet y

liberarlos con Chocolatey.

$> cist vim $> cup all

A la hora de subir tus paquetes:

• Fácil de usar con aplicación sin dependencias.

• Ficheros de configuración muy extensos y complejos cuando se tienen dependencias de otros paquetes.

CHOCOLATEY

Page 28: Dependencies Managers in C/C++. Using stdcpp 2014

Empaquetar .msi / .exe .msi

$packageName = 'Package Name' $installerType = 'msi' $url = 'http://path/to/download/installer_x86.msi' $url64 = 'http://path/to/download/installer_x64.msi' $silentArgs = '/quiet' $validExitCodes = @(0,3010) Install-ChocolateyPackage "$packageName" "$installerType" "$silentArgs" "$url" "$url64" -validExitCodes $validExitCodes

.exe

$name = 'Package Name' $url = 'http://path/to/download/installer.exe' Install-ChocolateyPackage $name 'EXE' '/VERYSILENT' $url

CHOCOLATEY: Wraps around MSI EXE

Page 29: Dependencies Managers in C/C++. Using stdcpp 2014

PROVISIONERS: bash, puppet, chef, docker...

Empty VM

$ mkdir vm_dev $ VAGRANT INIT

DEV VM

$ VAGRANT UP

$ VAGRANT DESTROY

Make based CONTAINERS AND VIRTUALIZATION

Page 30: Dependencies Managers in C/C++. Using stdcpp 2014

• OS based (package managers)

– Apt-get, brew, MSI, vagrant

• Dev system based

– make, nuget, cmake

DEP TOOLS FOR C/C++

Page 31: Dependencies Managers in C/C++. Using stdcpp 2014

Make based

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib ... ${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib

cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib

MAKE BASED

Page 32: Dependencies Managers in C/C++. Using stdcpp 2014

• git submodule – git submodule add

git://github.com/chneukirchen/rack.git rack

• git subtree – git subtree add --prefix .vim/bundle/tpope-vim-

surround https://bitbucket.org/vim-plugins-mirror/vim-surround.git master --squash

• As usual, with all things git, there is a learning curve to make the most of the feature.

• The user responsible for commits to subprojects • Contributing back might be complex

GIT Based

Page 33: Dependencies Managers in C/C++. Using stdcpp 2014

CYGWIN

Page 34: Dependencies Managers in C/C++. Using stdcpp 2014

MINGW

Page 35: Dependencies Managers in C/C++. Using stdcpp 2014

• http://www.nuget.org/

NuGET for C++

Page 36: Dependencies Managers in C/C++. Using stdcpp 2014

find_package(FOO): no download packages, only find “my_lib”

library in your system if exists.

It would need a file named foo-config.cmake to set all the

variables where the files are saved (include and lib folder)

CMAKE and FindPackage

Page 37: Dependencies Managers in C/C++. Using stdcpp 2014

# (compute PREFIX relative to file location)

set(foo_INCLUDE_DIRS ${PREFIX}/include/foo-1.2)

set(foo_LIBRARY ${PREFIX}/lib/foo-1.2/libfoo.a)

find_package(Foo REQUIRED)

include_directories(${foo_INCLUDE_DIRS})

add_executable(myexe myexe.c)

target_link_libraries(myexe ${foo_LIBRARY})

Foo-config.cmake

CMakeLists.txt

CMAKE and FindPackage

Page 38: Dependencies Managers in C/C++. Using stdcpp 2014

# - Try to find LibXml2 # Once done this will define # LIBXML2_FOUND - System has LibXml2 # LIBXML2_INCLUDE_DIRS - The LibXml2 include directories # LIBXML2_LIBRARIES - The libraries needed to use LibXml2 # LIBXML2_DEFINITIONS - Compiler switches required for using LibXml2 find_package(PkgConfig) pkg_check_modules(PC_LIBXML QUIET libxml-2.0) set(LIBXML2_DEFINITIONS ${PC_LIBXML_CFLAGS_OTHER}) find_path(LIBXML2_INCLUDE_DIR libxml/xpath.h HINTS ${PC_LIBXML_INCLUDEDIR} ${PC_LIBXML_INCLUDE_DIRS} PATH_SUFFIXES libxml2 ) find_library(LIBXML2_LIBRARY NAMES xml2 libxml2 HINTS ${PC_LIBXML_LIBDIR} ${PC_LIBXML_LIBRARY_DIRS} ) set(LIBXML2_LIBRARIES ${LIBXML2_LIBRARY} ) set(LIBXML2_INCLUDE_DIRS ${LIBXML2_INCLUDE_DIR} )

CMAKE and FindPackage

Page 39: Dependencies Managers in C/C++. Using stdcpp 2014

CPM CPP

• CMake + Git

# ++ MODULE: OpenGL platform

CPM_AddModule("gl_platform"

GIT_REPOSITORY "https://github.com/iauns/cpm-gl-platform" GIT_TAG "1.3.5")

Page 40: Dependencies Managers in C/C++. Using stdcpp 2014

WHAT IS BIICODE?

Page 41: Dependencies Managers in C/C++. Using stdcpp 2014

BIICODE

HWClient.h

HWClient.cpp

HWServer.h

HWServer.cpp

Person.h

Person.cpp

ZMQ PROTOBUF SQLITE

ClientApp.cpp ServerApp.cpp TCP

Page 42: Dependencies Managers in C/C++. Using stdcpp 2014

OPEN SOURCE QUEST

Page 43: Dependencies Managers in C/C++. Using stdcpp 2014

FRIENDS

Page 44: Dependencies Managers in C/C++. Using stdcpp 2014

GRACIAS!

@biicode

www.biicode.com

using std::cpp oct-2014

@diegorlosada


Recommended