Не так давно я решил попробовать связку conan + CMake для сборки проектов на C/C++ и столкнулся с неприятной проблемой. Раньше, имея примерно вот такую структуру проекта:

$ tree project
project/
├── CMakeLists.txt
├── bar
│   ├── CMakeLists.txt
│   └── src
│       ├── bar.cpp
│       └── CMakeLists.txt
└── foo
    ├── CMakeLists.txt
    └── src
        ├── CMakeLists.txt
        └── foo.cpp

после построения проекта традиционным способом:

$ cd project/
$ mkdir -p build/ && cd build/
$ cmake .. && cmake --build .

мы получаем копию структуры проекта в build/:

$ tree --ignore-case -I cmake* project/build/
project/build/
├── bar
│   ├── Makefile
│   └── src
│       ├── bar
│       └── Makefile
├── foo
│   ├── Makefile
│   └── src
│       ├── foo
│       └── Makefile
└── Makefile

И к такой структуре я очень привык и кажется она мне достаточно удобной.

Теперь добавим в корень проекта conanfile.txt с описанием всех зависимостей и минимально необходимые команды в корневой CMakeLists.txt:

 cmake_minimum_required(VERSION 3.1)
 project(project)
+
+include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
+conan_basic_setup()
+
 add_subdirectory(foo)
 add_subdirectory(bar)

И построим проект:

$ cd project/
$ mkdir -p build/ && cd build/
$ conan install --build=missing ..
$ cmake .. && cmake --build .

И видим, что все наши бинарники оказались в project/build/bin:

$ tree --ignore-case -I cmake* project/build/
project/build/
├── bar
│   ├── Makefile
│   └── src
│       └── Makefile
├── bin
│   ├── bar
│   └── foo
├── conanbuildinfo.cmake
├── conanbuildinfo.txt
├── conaninfo.txt
├── foo
│   ├── Makefile
│   └── src
│       └── Makefile
├── graph_info.json
└── Makefile

Но мы ведь совсем не просили conan делать этого. Немного погуглив, я нашёл причину. И чтобы вернуть всё как прежде нужно добавить параметр NO_OUTPUT_DIRS к комманде conan_basic_setup в корневом CMakeLists.txt:

 project(project)

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

 add_subdirectory(foo)
 add_subdirectory(bar)

И бинарники останутся там же где и были до добавления conan:

$ tree --ignore-case -I cmake* project/build/
project/build/
├── bar
│   ├── Makefile
│   └── src
│       ├── bar
│       └── Makefile
├── conanbuildinfo.cmake
├── conanbuildinfo.txt
├── conaninfo.txt
├── foo
│   ├── Makefile
│   └── src
│       ├── foo
│       └── Makefile
├── graph_info.json
└── Makefile

Скачать архив проекта-примера можно здесь.