CMAKE - отладка / сборка? - PullRequest
       11

CMAKE - отладка / сборка?

3 голосов
/ 16 августа 2011

Хорошо, я использую CMake для сборки C ++ под Linux, для цели ARM.У меня есть #DEFINE в одном из моих файлов .h с именем DEBUG.Если установлено, я бы хотел, чтобы в сборку были добавлены различные методы для отслеживания через последовательный интерфейс.Я хотел бы иметь возможность сделать это, выполнив, например, «make debug» для сборки с этим набором #DEFINE, и иметь нормальную сборку «make» без ее установки.Это возможно?

Кроме того, можно ли указать CMake цель?Поскольку сейчас у меня есть 2 CMakeLists.txt, один для x86 и один для Armel (с другими вариантами, такими как сборка с отладочной информацией на x86, по сравнению с ARM, который хочет вырезать двоичный файл с оптимизированным размером).

Ответы [ 3 ]

2 голосов
/ 17 августа 2011

Кажется, у вас есть два вопроса.Один из них об отладке, вы можете использовать CMAKE_BUILD_TYPE для разделения настроек отладки / выпуска и использовать $ cmake --build . --config Release или $ cmake --build . --config Debug для компиляции.

Во втором случае о кросс-сборке возможно,Вы можете сделать так:

  1. Согласно этому руководству написать файлы конфигурации для arm и x86 соответственно, чтобы установить компилятор, архиватор и т. Д. Предположим, что имя x86 указано как *config_x86.cmake * и * config_arm.cmake * для arm.
  2. Определить макрос cmake, например * MY_TARGET *.И добавьте следующий код перед командой project ,

    if (${MY_TARGET} STREQUAL "x86")
        include(config_x86.cmake REQUIRED)
    elseif (${MY_TARGET} STREQUAL "arm")
        include(config_arm.cmake REQUIRED)
    endif ()
    
  3. Затем сгенерируйте файлы вашего проекта следующим образом:

    $ cmake -DMY_TARGET = x86"твой код dir"

1 голос
/ 17 августа 2011

Сборки отладки и выпуска поддерживаются из коробки CMake.

Допустим, CMakeLists.txt верхнего уровня для вашего проекта находится в ~ / project / foobar, вы можете создать отдельную отладку и сборку релиза с помощьюделая это:

mkdir ~/project/build

mkdir ~/project/build/foobar-debug 
cd ~/project/build/foobar-debug 
cmake -DCMAKE_BUILD_TYPE:STRING=Debug ~/project/foobar 

mkdir ~/project/build/foobar-rel
cd ~/project/build/foobar-rel
cmake -DCMAKE_BUILD_TYPE:STRING=Release ~/project/foobar 

Что еще лучше, так это то, что CMake поддерживает не только стандартные цели отладки / выпуска, к которым вы, вероятно, привыкли, но также поддерживает выпуск минимального размера, а также выпуск с информацией отладки.Смотрите другие параметры для CMAKE_BUILD_TYPE по адресу: http://cmake.org/Wiki/CMake_Useful_Variables

1 голос
/ 16 августа 2011

Что касается определений, вы можете делать то, что вы хотите, как это в ваших файлах CMakeLists.txt:

if( CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]" )
    message( "INFO: DEBUG BUILD" )
    # for debug type builds, turn on verbose makefiles
    SET(CMAKE_VERBOSE_MAKEFILE ON)

    # Tell other CMake files that we're doing a debug build
    SET( DEBUG_BUILD 1 )

    # Tell C/C++ that we're doing a debug build
    ADD_DEFINITIONS( -DDEBUG )
endif()

if( CMAKE_BUILD_TYPE MATCHES "[Rr][Ee][Ll][Ee][Aa][Ss][Ee]" )
    message( "INFO: RELEASE BUILD" )
endif()

CMake не любит поддерживать две цели, другими словами две цепочки инструментов, в одном дереве сборки. Там действительно нет необходимости в этом в любом случае. Определенно используйте сборки вне дерева с одним деревом сборки для каждой из ваших возможных целей. Примерно так:

cd /path/to/x86_build
cmake /path/to/src/x86/CMakeLists.txt
cd /path/to/Armel_build
cmake /path/to/src/Armel/CMakeLists.txt
...