2016-05-24 3 views
3

Мы пишем приложение для встроенного устройства ARM/Linux. Разработка выполняется на ПК с ОС Windows, с использованием кросс-компилятора, Eclipse и Ninja. Cmake в настоящее время может создавать сценарии сборки, которые хорошо работают по назначению.cmake - компилировать изначально и скрещивать один и тот же код

У нас есть модульные тесты, которые выполняются на встроенном устройстве, подключенном к сети, после того, как проект будет перенаправлен (на git) на сервер.

Мы пытаемся реализовать модульные тесты, которые будут работать на ПК, прежде чем мы попробуем их на устройстве. Это означает построение изначально, используя MinGW gcc - конечно, мы не можем запускать исполняемые файлы ARM Linux на ПК.

Даже если мы переключим инструментальную цепочку, запустив cmake, чтобы перестроить набор правил для Ninja или создадим два каталога сборки, один для ПК, один для ARM, проблема остается в том, что CMake попытается запустить тестовый исполняемый файл, а позже постройте, модульные тесты будут предприняты в сборке ARM.

Как мы можем сконфигурировать сборки (через cmake) для создания обоих - и не пытаться запускать скремблированные на ПК?

+0

Вы можете проверить [ 'CMAKE_CROSSCOMPILING'] (HTTPS : //cmake.org/cmake/help/latest/variable/CMAKE_CROSSCOMPILING.html). См. [Как указать CMake использовать компилятор архитектуры сборки?] (Http://stackoverflow.com/questions/36173840/how-to-instruct-cmake-to-use-the-build-architecture-compiler). – Florian

+0

Не могли бы вы добавить пример кода CMake, как вы выполняете «запуск тестового исполняемого файла»? Вы добавили его как 'add_custom_command (TARGET ... POST_BUILD ...)' и/или с помощью 'add_test()'? Я думаю, что в обоих случаях просто положить 'if (NOT CMAKE_CROSSCOMPILING)' | 'endif()' вокруг этой конкретной команды должен сделать трюк. – Florian

+0

@Florian: В CMakeLists.txt верхнего уровня есть только 'ADD_SUBDIRECTORY (UnitTests)'. Затем в каталоге есть 'ExternalProject_Add (GMockDownload \t GIT_REPOSITORY" https://github.com/google/googletest.git "...', который выполняет всю оставшуюся работу. Да, 'if (NOT CMAKE_CROSSCOMPILING)' помогает здесь. Кажется, два отдельных сборщика и запуск cmake дважды - это не оптимально, потому что я получаю два проекта Eclipse вместо двух конфигураций сборки. –

ответ

2

Обращаясь моими комментарии в ответ

У меня есть аналогичные установки в своих проектах (здание из тех же источников симулятора, модульные тестов и целевого двоичном), и вы можете проверить CMAKE_CROSSCOMPILING дифференцировать свои два случаи использования. Просто положить

if (NOT CMAKE_CROSSCOMPILING) 
    .... 
endif() 

И вам нужно иметь два двоичных выходных каталога. CMake не позволяет смешивать инструментальные цепочки в одном каталоге.

Но вам не нужно иметь два проекта IDE. В моих проектах:

  • Я добавил (а) все источники - вкл. «крест-компилировать только» файлы - в библиотеках/исполняемых цели
    • Я пометив их как «исключено из сборки» для PC только варианты
    • Таким образом, все источники будут показывать вверх в одном IDE проекта (напримердля поиска по коду)
  • Я добавил кросскомпилируете, вызов в качестве пользовательской цели
    • Я удалил его из сборки по умолчанию, но вы можете явно запустить его из вашего IDE
    • в моем случае это внешний сценарий, но вы также можете передать необходимые звонки непосредственно в COMMAND параметров
    • можно даже использовать другой ExternalProject_Add(), чтобы включить свой собственный проект для кросс-компиляции

Вот некоторые фрагменты кода для такого подхода:

if (NOT CMAKE_CROSSCOMPILING) 
    set(PC "ON" CACHE INTERNAL "hw-platform PC") 
    unset(MCU CACHE) 
else() 
    set(MCU "ON" CACHE INTERNAL "hw-platform MCU") 
    unset(PC CACHE) 
endif() 

... 

if (PC) 
    # Exclude files that only compile/work on MCU 
    set_source_files_properties(... PROPERTIES HEADER_FILE_ONLY 1) 
endif() 

... 

if (PC) 
    add_test(...) 
endif() 

... 

if (PC AND EXISTS "${CMAKE_SOURCE_DIR}/buildMcu.cmd") 
    add_custom_target(
     BUILD_MCU 
     COMMAND buildMcu.cmd 
     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} 
    ) 
    set_target_properties(BUILD_MCU PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1) 
endif() 

Ссылки

Смежные вопросы