четверг, 14 апреля 2016 г.

[prog] Поясните про использование CMake, пожалуйста

Поскольку все больше и больше C++ных проектов использует CMake, то приходится учится работать с такими проектами. Но есть вещи, которые пока не понятны. Поэтому буду признателен читателям, если меня просветят и/или подскажут, где именно что-нибудь полезное можно прочитать.

Первый непонятный момент. Допустим, есть простая ситуация: Linux и всего два компилятора -- gcc и clang. Мне нужно пользоваться то тем, то другим. При этом компилироваться как в release-режиме, так и в debug. Правильно ли я понимаю, что каноническим решением является вот такое:

cd ~/develop/my-project
mkdir build_gcc_release
cd build_gcc_release
cmake -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=Release ..
cd ..
mkdir build_gcc_debug
cd build_gcc_debug
cmake -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=Debug ..
mkdir build_clang_release
cd build_clang_release
cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Release ..
cd ..
mkdir build_clang_debug
cd build_clang_debug
cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Debug ..

Второй непонятный момент. Допустим, мне нужно использовать три внешних проекта (p1, p2, p3), у которых сборка делается через CMake. При этом я хочу, чтобы результаты компиляции всех трех подпроектов (т.е. исполнимые файлы и so-ки) сбрасывались в одни и те же каталоги. Т.е. вместо того, чтобы иметь что-то вроде p1/build/lib b p1/build/bin, p2/build/lib и p2/build/bin, p3/build/lib и p3/build/bin, я хочу иметь my-project/build/lib и my-project/build/bin.

Правильно ли я понимаю, что в этом случае у меня получается что-то вроде:

cd ~/develop/my-project
wget https://p1.home/download/p1-some-ver.tar.gz
tar -xf p1-some-ver.tar.gz
cd p1-some-ver
mkdir build_gcc_release
cd build_gcc_relese
cmake -DCMAKE_INSTALL_PREFIX=~/develop/my-project/build -DCMAKE_BUILD_TYPE=Release ..
make install
cd ../..

wget https://p3.home/download/p2-some-ver.tar.gz
tar -xf p2-some-ver.tar.gz
cd p2-some-ver
mkdir build_gcc_release
cd build_gcc_relese
cmake -DCMAKE_INSTALL_PREFIX=~/develop/my-project/build -DCMAKE_BUILD_TYPE=Release ..
make install
cd ../..

...

Т.е. я создаю compiler-specific makefiles для каждого из подпроектов, но при этом для всех подпроектов указываю общее значение CMAKE_INSTALL_PREFIX?

Отправить комментарий