mirror of
https://github.com/ttroy50/cmake-examples.git
synced 2025-12-18 12:14:36 +03:00
213 lines
8.5 KiB
Plaintext
213 lines
8.5 KiB
Plaintext
= Conan Basic Example
|
|
:toc:
|
|
:toc-placement!:
|
|
|
|
toc::[]
|
|
|
|
# Introduction
|
|
|
|
link:http://conan.io[Conan] supports downloading libraries and making them available to an application developers. Packages are defined in the +link:https://docs.conan.io/en/latest/using_packages/conanfile_txt.htm[conanfile.txt]+ file, which defines packages, options, and the link:https://docs.conan.io/en/latest/reference/generators.html#generators-reference[generators] for your project.
|
|
|
|
The files in this tutorial are below:
|
|
|
|
```
|
|
.
|
|
├── CMakeLists.txt
|
|
├── conanfile.txt
|
|
├── main.cpp
|
|
└── README.adoc
|
|
```
|
|
|
|
* link:CMakeLists.txt[] - Contains the CMake commands to run
|
|
* link:conanfile.txt[] - Contains the conan dependencies and options
|
|
* link:main.cpp[] - Source file of the application.
|
|
|
|
# Concepts
|
|
|
|
## conanfile.txt
|
|
|
|
### requires
|
|
|
|
The conanfile.txt defines the required packages you wish to install
|
|
|
|
[source,ini]
|
|
----
|
|
[requires]
|
|
fmt/5.3.0@bincrafters/stable
|
|
----
|
|
|
|
|
|
Where:
|
|
|
|
* `fmt` is the name of the package / library.
|
|
* `5.3.0` is the version of the package.
|
|
* `bincrafters` is the owner / builder of the package.
|
|
* `stable` is channel of the package. Channels provide a to have different variants of packages.
|
|
|
|
### generators
|
|
|
|
Generators define the build systems that you are using and allows Conan to create files with all the information needed to find your libraries and link your program.
|
|
|
|
[source,ini]
|
|
----
|
|
[generators]
|
|
cmake
|
|
----
|
|
|
|
The CMake generator will create the file `conanbuildinfo.cmake` which should be included in your +CMakeLists.txt+ file. This will be a per-user file and should not be committed to your source control system.
|
|
|
|
## Installing Packages
|
|
|
|
To install packages you should run the following:
|
|
|
|
[source,bash]
|
|
----
|
|
$ mkdir build
|
|
$ cd build
|
|
$ conan install ..
|
|
----
|
|
|
|
This will tell conan to read the +conanfile.txt+ from your root folder and install any required package configurations. If the package is not availabe in your package cache it will be downloaded.
|
|
|
|
As per our requires section, `conan install` will download a static library version of fmtlib along with all required headers. On my system with default configuration, this cached library is as follows:
|
|
|
|
[source,bash]
|
|
----
|
|
$ ls ~/.conan/data/fmt/5.3.0/bincrafters/stable/package/4d887c1c2779c63d2cdd81580698d2e22cb35b29/
|
|
conaninfo.txt conanmanifest.txt include lib licenses share
|
|
$ ls ~/.conan/data/fmt/5.3.0/bincrafters/stable/package/4d887c1c2779c63d2cdd81580698d2e22cb35b29/lib
|
|
cmake libfmt.a
|
|
----
|
|
|
|
The install command will also create any temporary files such as the +conanbuildinfo.cmake+ file.
|
|
|
|
## conanbuildinfo.cmake
|
|
|
|
As mentioned the +conanbuildinfo.cmake+ file contains any CMake commands that are required to link against your installed libraries. You must include this file in your CMakeLists.txt as follows
|
|
|
|
[source,cmake]
|
|
----
|
|
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
|
|
conan_basic_setup()
|
|
----
|
|
|
|
The +CMAKE_BINARY_DIR+ here is the same build directory that your ran `conan install` in and will eventually run your `cmake` command in.
|
|
|
|
Once included the variable +CONAN_LIBS+ is made available which contains the information you need to link against the libraries.
|
|
|
|
[source,cmake]
|
|
----
|
|
# link against the fmt target supplied by conan
|
|
target_link_libraries(third_party_include
|
|
PRIVATE
|
|
${CONAN_LIBS}
|
|
)
|
|
----
|
|
|
|
# Building the Example
|
|
|
|
[source,bash]
|
|
----
|
|
$ mkdir build
|
|
|
|
$ cd build/
|
|
|
|
$ conan install ..
|
|
Configuration:
|
|
[settings]
|
|
arch=x86_64
|
|
arch_build=x86_64
|
|
build_type=Release
|
|
compiler=gcc
|
|
compiler.libcxx=libstdc++11
|
|
compiler.version=5
|
|
os=Linux
|
|
os_build=Linux
|
|
[options]
|
|
[build_requires]
|
|
[env]
|
|
|
|
fmt/5.3.0@bincrafters/stable: Not found in local cache, looking in remotes...
|
|
fmt/5.3.0@bincrafters/stable: Trying with 'conan-center'...
|
|
Downloading conanmanifest.txt
|
|
[==================================================] 166B/166B
|
|
Downloading conanfile.py
|
|
[==================================================] 2.9KB/2.9KB
|
|
Downloading conan_export.tgz
|
|
[==================================================] 758B/758B
|
|
Decompressing conan_export.tgz: 1.98kB [00:00, 504kB/s]
|
|
fmt/5.3.0@bincrafters/stable: Downloaded recipe revision 0
|
|
conanfile.txt: Installing package
|
|
Requirements
|
|
fmt/5.3.0@bincrafters/stable from 'conan-center' - Downloaded
|
|
Packages
|
|
fmt/5.3.0@bincrafters/stable:4d887c1c2779c63d2cdd81580698d2e22cb35b29 - Download
|
|
|
|
fmt/5.3.0@bincrafters/stable: Retrieving package 4d887c1c2779c63d2cdd81580698d2e22cb35b29 from remote 'conan-center'
|
|
Downloading conanmanifest.txt
|
|
[==================================================] 1.1KB/1.1KB
|
|
Downloading conaninfo.txt
|
|
[==================================================] 550B/550B
|
|
Downloading conan_package.tgz
|
|
[==================================================] 156.2KB/156.2KB
|
|
Decompressing conan_package.tgz: 161kB [00:00, 13.8MB/s]
|
|
fmt/5.3.0@bincrafters/stable: Package installed 4d887c1c2779c63d2cdd81580698d2e22cb35b29
|
|
fmt/5.3.0@bincrafters/stable: Downloaded package revision 0
|
|
conanfile.txt: Generator cmake created conanbuildinfo.cmake
|
|
conanfile.txt: Generator txt created conanbuildinfo.txt
|
|
conanfile.txt: Generated conaninfo.txt
|
|
conanfile.txt: Generated graphinfo
|
|
|
|
$ cmake ..
|
|
-- The C compiler identification is GNU 5.4.0
|
|
-- The CXX compiler identification is GNU 5.4.0
|
|
-- Check for working C compiler: /usr/bin/cc
|
|
-- Check for working C compiler: /usr/bin/cc -- works
|
|
-- Detecting C compiler ABI info
|
|
-- Detecting C compiler ABI info - done
|
|
-- Detecting C compile features
|
|
-- Detecting C compile features - done
|
|
-- Check for working CXX compiler: /usr/bin/c++
|
|
-- Check for working CXX compiler: /usr/bin/c++ -- works
|
|
-- Detecting CXX compiler ABI info
|
|
-- Detecting CXX compiler ABI info - done
|
|
-- Detecting CXX compile features
|
|
-- Detecting CXX compile features - done
|
|
-- Conan: Adjusting output directories
|
|
-- Conan: Using cmake global configuration
|
|
-- Conan: Adjusting default RPATHs Conan policies
|
|
-- Conan: Adjusting language standard
|
|
-- Current conanbuildinfo.cmake directory: /home/devuser/ws/build
|
|
-- Conan: Compiler GCC>=5, checking major version 5
|
|
-- Conan: Checking correct version: 5
|
|
-- Configuring done
|
|
-- Generating done
|
|
-- Build files have been written to: /home/devuser/ws/build
|
|
|
|
$ make VERBOSE=1
|
|
/usr/bin/cmake -H/home/devuser/ws -B/home/devuser/ws/build --check-build-system CMakeFiles/Makefile.cmake 0
|
|
/usr/bin/cmake -E cmake_progress_start /home/devuser/ws/build/CMakeFiles /home/devuser/ws/build/CMakeFiles/progress.marks
|
|
make -f CMakeFiles/Makefile2 all
|
|
make[1]: Entering directory '/home/devuser/ws/build'
|
|
make -f CMakeFiles/third_party_include.dir/build.make CMakeFiles/third_party_include.dir/depend
|
|
make[2]: Entering directory '/home/devuser/ws/build'
|
|
cd /home/devuser/ws/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/devuser/ws /home/devuser/ws /home/devuser/ws/build /home/devuser/ws/build /home/devuser/ws/build/CMakeFiles/third_party_include.dir/DependInfo.cmake --color=
|
|
Dependee "/home/devuser/ws/build/CMakeFiles/third_party_include.dir/DependInfo.cmake" is newer than depender "/home/devuser/ws/build/CMakeFiles/third_party_include.dir/depend.internal".
|
|
Dependee "/home/devuser/ws/build/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/home/devuser/ws/build/CMakeFiles/third_party_include.dir/depend.internal".
|
|
Scanning dependencies of target third_party_include
|
|
make[2]: Leaving directory '/home/devuser/ws/build'
|
|
make -f CMakeFiles/third_party_include.dir/build.make CMakeFiles/third_party_include.dir/build
|
|
make[2]: Entering directory '/home/devuser/ws/build'
|
|
[ 50%] Building CXX object CMakeFiles/third_party_include.dir/main.cpp.o
|
|
/usr/bin/c++ -I/home/devuser/.conan/data/fmt/5.3.0/bincrafters/stable/package/4d887c1c2779c63d2cdd81580698d2e22cb35b29/include -std=gnu++11 -o CMakeFiles/third_party_include.dir/main.cpp.o -c /home/devuser/ws/main.cpp
|
|
[100%] Linking CXX executable bin/third_party_include
|
|
/usr/bin/cmake -E cmake_link_script CMakeFiles/third_party_include.dir/link.txt --verbose=1
|
|
/usr/bin/c++ CMakeFiles/third_party_include.dir/main.cpp.o -o bin/third_party_include -L/home/devuser/.conan/data/fmt/5.3.0/bincrafters/stable/package/4d887c1c2779c63d2cdd81580698d2e22cb35b29/lib -lfmt -Wl,-rpath,/home/devuser/.conan/data/fmt/5.3.0/bincrafters/stable/package/4d887c1c2779c63d2cdd81580698d2e22cb35b29/lib
|
|
make[2]: Leaving directory '/home/devuser/ws/build'
|
|
[100%] Built target third_party_include
|
|
make[1]: Leaving directory '/home/devuser/ws/build'
|
|
/usr/bin/cmake -E cmake_progress_start /home/devuser/ws/build/CMakeFiles 0
|
|
|
|
$ ./bin/third_party_include
|
|
Hello, conan. This is fmtlib!
|
|
---- |