Не так давно я решил попробовать связку 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
Скачать архив проекта-примера можно здесь.