C++初心者がMacでパッケージ管理ツールConanを試してみた

C++ を利用し始めたのですが、ライブラリを利用するのに`pip` とか`yarn` とか`gem` みたいなライブラリ管理ツールを利用したくて、良いツールがないか探していたら、Conanというものがあったので、お試ししてみました。  

C/C++ Open Source Package Manager
https://conan.io/

多くのプラットフォーム、ビルドシステムに対応していて使い勝手がよさそうです。  

>### All platforms
>Windows, Linux, Apple, FreeBSD, Android, iOS, embedded, cross-building, etc.
>### All build systems 
>Visual Studio MSBuild, CMake, Makefiles, SCons, etc. Extensible to any build system.
>### All packages 
>Python based package recipes for great extensibility, customization and integration with other systems. Package and reuse your build tools too.

下記でも紹介されており、興味をもちました。  

Conan C/C++ Package Managerを使ってみた - Qiita
https://qiita.com/gasuketsu/items/6bea2465f0425c4cf5ab


利用するライブラリはConanのドキュメントでも利用されていたPOCOってのにしました。  

POCO C++ Libraries - Simplify C++ Development
https://pocoproject.org/


## 環境・前提条件

```sh
> sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G4015

> g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

> gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

# CMakeを利用します
> cmake --version
cmake version 3.13.3

CMake suite maintained and supported by Kitware (kitware.com/cmake).

# Pythonとpipを利用します
> python --version
Python 3.6.6

> pip --version
pip 19.0.1 from (略)
```

CMakeってなにそれという方はこちらをご参考ください。

C++初心者がMacでCMakeを利用してみる - Qiita
https://qiita.com/kai_kou/items/df335eb7ee78229ee46f

## インストール

`pip` を利用してインストールします。仮想環境を作成していますが、お好みです。  
conanのドキュメントをみると仮想環境下での利用が推奨されています。  
また、Python 3.4の場合、落とし穴があるみたいなので、ご注意ください^^  

Install — conan 1.12.0 documentation
https://docs.conan.io/en/latest/installation.html


```sh
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ

> python -m venv venv
> . venv/bin/activate
# fishな方用
> . venv/bin/activate.fish

> pip install conan
(略)
Successfully installed PyJWT-1.7.1 PyYAML-3.13 asn1crypto-0.24.0 astroid-2.1.0 bottle-0.12.16 certifi-2018.11.29 cffi-1.11.5 chardet-3.0.4 colorama-0.4.1 conan-1.12.0 cryptography-2.3.1 deprecation-2.0.6 distro-1.1.0 fasteners-0.14.1 future-0.16.0 idna-2.6 isort-4.3.4 lazy-object-proxy-1.3.1 mccabe-0.6.1 monotonic-1.5 node-semver-0.6.1 packaging-19.0 patch-1.16 pluginbase-0.7 pyOpenSSL-18.0.0 pycparser-2.19 pygments-2.3.1 pylint-2.2.2 pyparsing-2.3.1 requests-2.21.0 six-1.12.0 tqdm-4.30.0 typed-ast-1.3.0 urllib3-1.24.1 wrapt-1.11.1

> conan --version
WARN: Remotes registry file missing, creating default one in /Users/kai/.conan/registry.json
Conan version 1.12.0
```

## 設定

ドキュメントを参考にしつつPECOが利用できるようにします。  

Getting Started — conan 1.12.0 documentation
https://docs.conan.io/en/latest/getting_started.html


`conan search` コマンドでライブラリが存在するか確認します。  
ドキュメントだと検索文字列をそのまま指定していましたが、Mac？Fish？の場合、ダブルクォーテーション`"` で括る必要がありました。  

```sh
> conan search "Poco*" --remote=conan-center

Existing package recipes:

Poco/1.7.8p3@pocoproject/stable
Poco/1.7.9@pocoproject/stable
Poco/1.7.9p1@pocoproject/stable
Poco/1.7.9p2@pocoproject/stable
Poco/1.8.0.1@pocoproject/stable
Poco/1.8.0@pocoproject/stable
Poco/1.8.1@pocoproject/stable
Poco/1.9.0@pocoproject/stable
```

`conan inspect` コマンドでパッケージの情報が確認できます。  

```sh
> conan inspect Poco/1.9.0@pocoproject/stable

Poco/1.9.0@pocoproject/stable: Not found in local cache, looking in remotes...
Poco/1.9.0@pocoproject/stable: Trying with 'conan-center'...
Downloading conanmanifest.txt
[==================================================] 186B/186B
Downloading conanfile.py
[==================================================] 8.4KB/8.4KB
name: Poco
version: 1.9.0
url: http://github.com/pocoproject/conan-poco
homepage: None
license: The Boost Software License 1.0
author: None
description: Modern, powerful open source C++ class libraries for building network- and internet-based applications that run on desktop, server, mobile and embedded systems.
topics: None
generators: ('cmake', 'txt')
exports: None
exports_sources: ('CMakeLists.txt', 'PocoMacros.cmake')
short_paths: False
apply_env: True
build_policy: None
settings: ('os', 'arch', 'compiler', 'build_type')
options:
    cxx_14: [True, False]
(略)
```

ライブラリが利用できるようにconanの設定ファイル`conanfile.txt` を作成します。  

```sh
> touch conanfile.txt
```

`[requires]` で利用するライブラリ、`[generators]` に利用するビルドシステムを指定するみたいです。  
パッケージ管理ツールによくある`conan add xxx` みたいなコマンドはないみたいです。  

```txt:conanfile.txt
[requires]
Poco/1.9.0@pocoproject/stable

[generators]
cmake
```

`conanfile.txt` には`[options]` でリンクを動的・静的にするかなど指定ができるみたいです。  

Installing dependencies — conan 1.12.0 documentation
https://docs.conan.io/en/latest/using_packages/conanfile_txt.html

リンクについてはまだよく把握していませんが下記が詳しかったです。  

ライブラリのリンク方法をきっちり区別しよう - Qiita
https://qiita.com/argama147/items/2f636a2f4fd76f6ce130


### ライブラリをインストールする

まだ実装がありませんが、先にライブラリをインストールしてみます。  

```sh
> mkdir build
> cd build
> conan install ..

Configuration:
[settings]
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=apple-clang
compiler.libcxx=libc++
compiler.version=10.0
os=Macos
os_build=Macos
[options]
[build_requires]
[env]
(略)
ERROR: Missing prebuilt package for 'Poco/1.9.0@pocoproject/stable'
Try to build it from sources with "--build Poco"
Or read "http://docs.conan.io/en/latest/faq/troubleshooting.html#error-missing-prebuilt-package"
```

エラーになりました。読めと出てきたドキュメントをみると、conanはデフォルトではソースからパッケージをビルドしないみたいので、ビルド済みのファイルがない場合は、パラメータでビルドするように指定する必要があるそうです。なので、`--build Poco` を追加して再実行してみます。  

Troubleshooting — conan 1.12.0 documentation
https://docs.conan.io/en/latest/faq/troubleshooting.html#error-missing-prebuilt-package

```sh
> conan install .. --build Poco

conanfile.txt: Installing package
Requirements
    OpenSSL/1.0.2o@conan/stable from 'conan-center' - Cache
    Poco/1.9.0@pocoproject/stable from 'conan-center' - Cache
    zlib/1.2.11@conan/stable from 'conan-center' - Cache
Packages
    OpenSSL/1.0.2o@conan/stable:75c89fa3e1091e5c3911f9847d6d4abd7c60e60f - Cache
    Poco/1.9.0@pocoproject/stable:abee8e51298879d92da94c759061385c809e5325 - Build
    zlib/1.2.11@conan/stable:534dcc368c999e07e81f146b3466b8f656ef1f55 - Cache

zlib/1.2.11@conan/stable: Already installed!
OpenSSL/1.0.2o@conan/stable: Already installed!
(略)
[100%] Built target Zip
Poco/1.9.0@pocoproject/stable: Package 'abee8e51298879d92da94c759061385c809e5325' built
Poco/1.9.0@pocoproject/stable: Build folder /Users/kai/.conan/data/Poco/1.9.0/pocoproject/stable/build/abee8e51298879d92da94c759061385c809e5325
Poco/1.9.0@pocoproject/stable: Generated conaninfo.txt
Poco/1.9.0@pocoproject/stable: Generated conanbuildinfo.txt
Poco/1.9.0@pocoproject/stable: Generating the package
Poco/1.9.0@pocoproject/stable: Package folder /Users/kai/.conan/data/Poco/1.9.0/pocoproject/stable/package/abee8e51298879d92da94c759061385c809e5325
Poco/1.9.0@pocoproject/stable: Calling package()
Poco/1.9.0@pocoproject/stable package(): Copied 1 file: LICENSE
Poco/1.9.0@pocoproject/stable package(): Copied 761 '.h' files:
Poco/1.9.0@pocoproject/stable package(): Copied 13 '.a' files:
Poco/1.9.0@pocoproject/stable: Package 'abee8e51298879d92da94c759061385c809e5325' created
conanfile.txt: Generator cmake created conanbuildinfo.cmake
conanfile.txt: Generator txt created conanbuildinfo.txt
conanfile.txt: Generated conaninfo.txt
conanfile.txt: Generated graphinfo
```

今度はエラーなく完了しました。いくつかのファイルが`build` ディレクトリに生成されたのと、ライブラリは`/Users/xxx/.conan/data/` 配下に配置されました。POCOライブラリが依存しているライブラリも同時にインストールされています。これは便利だ！  

```sh
> tree .
.
├── conanbuildinfo.cmake
├── conanbuildinfo.txt
├── conaninfo.txt
└── graph_info.json

> ls /Users/xxx/.conan/data/
OpenSSL Poco    zlib
```

## 実装してビルド

POCOライブラリを利用した実装をしてみます。以下のサンプルを利用させてもらいました。  

POCO C++ Libraries の簡単な使用方法 - Qoosky
https://www.qoosky.io/techs/8e92d3d34a


```sh
> touch ../poco_sample.cpp
```

```cpp:poco_sample.cpp
#include <iostream>
#include <Poco/RegularExpression.h>

int main() {
    Poco::RegularExpression regexp("^[a-zA-Z]+");

    std::string buf;
    regexp.extract("ABC123", buf);
    std::cout << buf << std::endl;

    return 0;
}
```

ビルド出来るように`CMakeLists.txt` を作成します。  
`conan install` で生成された`build/conanbuildinfo.cmake` を含めるのがポイントでしょうか。  

```sh
> touch ../CMakeLists.txt
```

```txt:CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
project(ConanSample)

add_definitions("-std=c++11")

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

add_executable(poco_sample poco_sample.cpp)
target_link_libraries(poco_sample ${CONAN_LIBS})
```

`cmake` コマンドを実行してみます。  

```sh
> cmake ..
-- The C compiler identification is AppleClang 10.0.0.10001044
-- The CXX compiler identification is AppleClang 10.0.0.10001044
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc -- works
(略)
-- Configuring done
-- Generating done
-- Build files have been written to: 任意のディレクトリ/build

> cmake --build .
Scanning dependencies of target poco_sample
[ 50%] Building CXX object CMakeFiles/poco_sample.dir/poco_sample.cpp.o
[100%] Linking CXX executable bin/poco_sample
[100%] Built target poco_sample

> tree -L 2 .
.
├── CMakeCache.txt
├── CMakeFiles
│   ├── 3.13.3
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeOutput.log
│   ├── CMakeTmp
│   ├── Makefile.cmake
│   ├── Makefile2
│   ├── TargetDirectories.txt
│   ├── cmake.check_cache
│   ├── feature_tests.bin
│   ├── feature_tests.c
│   ├── feature_tests.cxx
│   ├── poco_sample.dir
│   └── progress.marks
├── Makefile
├── bin
│   └── poco_sample
├── cmake_install.cmake
├── conanbuildinfo.cmake
├── conanbuildinfo.txt
├── conaninfo.txt
└── graph_info.json
```

`bin/poco_sample` が生成されましたので、実行してみます。  

```sh
> ./bin/poco_sample
ABC
```

動きました！！！  


## まとめ

ライブラリの依存関係を解決してくれるので、利用するまでの手間をだいぶと省くことができそうです。  
ほかにもライブラリ管理ツールはあるので、そのうちに試してみたいと思います。  


## 参考

C/C++ Open Source Package Manager
https://conan.io/

Conan C/C++ Package Managerを使ってみた - Qiita
https://qiita.com/gasuketsu/items/6bea2465f0425c4cf5ab

POCO C++ Libraries - Simplify C++ Development
https://pocoproject.org/

Install — conan 1.12.0 documentation
https://docs.conan.io/en/latest/installation.html

Getting Started — conan 1.12.0 documentation
https://docs.conan.io/en/latest/getting_started.html

Installing dependencies — conan 1.12.0 documentation
https://docs.conan.io/en/latest/using_packages/conanfile_txt.html

ライブラリのリンク方法をきっちり区別しよう - Qiita
https://qiita.com/argama147/items/2f636a2f4fd76f6ce130

Troubleshooting — conan 1.12.0 documentation
https://docs.conan.io/en/latest/faq/troubleshooting.html#error-missing-prebuilt-package

POCO C++ Libraries の簡単な使用方法 - Qoosky
https://www.qoosky.io/techs/8e92d3d34a