Dependencies in C++
using std::cpp oct-2014
@diegorlosada
Why there is no SerialPort in C/C++?
I just wanted a SerialPort!
$ pip install pyserial
>>> import serial >>> ser = serial.Serial(0)
>>> print ser.name
>>> ser.write("hello")
>>> ser.close()
Serial Port in MRPT
>5K files, 70 Mb First class robotics SW.
CSerializable, CObject…
Serial Port in Boost/Asio
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>
RELATED PATTERNS
• Functional programming
• Low coupling, separation of concerns, single responsibility
LOW COUPLING (GRASP) & KISS
DECOUPLE FUNCTIONALITY
GENERIC FUNCTIONALITY
POLYMORPHIC
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
EXISTING DEP MANAGERS
THE PROBLEM: NO DEP MANAGER
• OS based (package managers)
– Apt-get, brew, MSI, vagrant
• Dev system based
– make, nuget, cmake
DEP TOOLS FOR C/C++
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
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
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)
• 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
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
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
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
• 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
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
• 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
If we run the *.iss with Inno, a SetUp Wizard is opened and
INNO SETUP
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
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
PROVISIONERS: bash, puppet, chef, docker...
Empty VM
$ mkdir vm_dev $ VAGRANT INIT
DEV VM
$ VAGRANT UP
$ VAGRANT DESTROY
Make based CONTAINERS AND VIRTUALIZATION
• OS based (package managers)
– Apt-get, brew, MSI, vagrant
• Dev system based
– make, nuget, cmake
DEP TOOLS FOR C/C++
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
• 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
CYGWIN
MINGW
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
# (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
# - 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
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")
WHAT IS BIICODE?
BIICODE
HWClient.h
HWClient.cpp
HWServer.h
HWServer.cpp
Person.h
Person.cpp
ZMQ PROTOBUF SQLITE
ClientApp.cpp ServerApp.cpp TCP
OPEN SOURCE QUEST
FRIENDS
GRACIAS!
@biicode
www.biicode.com
using std::cpp oct-2014
@diegorlosada