angle-left

Автогенерация кода и CMake

Доброе утро!

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

В моём случае возникла необходимость генерировать парсеры и классы из описания некоторых тегов. На этом примере и рассмотрим решение данной задачи.

Был выставлен ряд требований:

  • возможность обновления каталога сборки при изменении описания;
  • возможность обновления каталога сборки при изменении генератора;
  • интегрируемость с QtCreator.

Последнее требование выставлено в связи с тем, что я пользуюсь данной средой разработки, а она, в свою очередь, разбирает каталог сборки, созданный CMake.

\\

Прикинем, как это всё реализовать. Очевидно, что нужен генератор кода. В моём случае он будет называться tag_data_gen.pl. Интерфейс у него следующий: первым аргументом командной строки передаётся путь к каталогу для сохранения, остальными — пути к файлам с описанием, по которому генерировать. Вывод его выглядит следующим образом:

set(generated_files
  tag1.td.hpp
  tag1.td.cpp
  tag2.td.hpp
  tag2.td.hpp
)

Конкретная реализация генератора и формата описания в рамках данной задачи не принципиальна.

\\

Пусть сами исходники проекта находятся в src/. Тогда создадим каталог src/tag_data/, в котором будут располагаться наши файлы с описанием для генератора.

Добавим в CMakeLists.txt следующие строки:

set(src src)                                                                            
                                                                                  
include_directories(${src})                                                            
                                                                                  
set(tag_data                                                                      
  ${src}/tag_data/tag1.td                                                      
  ${src}/tag_data/tag2.td                                                        
  )                                                                               
                                                                                  
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS                    
  ${tag_data}                                                                   
  tag_data_gen.pl                                                                 
  ) 

Таким образом мы научили CMake воспринимать эти файлы как часть структуры проекта. Обновление их должно вести к пересборке зависимостей.

Следующим этапом необходимо вызвать генератор. Для этого создадим каталог сгенерированных файлов и вызовем генератор, перенаправив его вывод (см. пример выше) в файл. Смысл сего действия будет пояснён далее. Достигается это парой нехитрых команд:

make_directory("${CMAKE_BINARY_DIR}/generated")                                   
execute_process(                                                                  
  COMMAND perl tag_data_gen.pl ${CMAKE_BINARY_DIR}/generated ${tag_data}          
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}                                        
  OUTPUT_FILE generated_files.cmake                                            
  )

Теперь вывод вида set(generated_files …) будет находиться в файле generated_files.cmake.  Это даёт нам возможность получить список сгенерированных файлов в виде листовой переменной в одну команду:

include(generated_files.cmake)

Ну и можем сделать что-нибудь, например, такое:

add_library("generated" SHARED ${generated_files})
get_filename_component(gendirpath ${CMAKE_BINARY_DIR}/generated ABSOLUTE)      
include_directories(${gendirpath})  

Теперь мы получили отдельную единицу трансляцию (в данном случае — динамическую библиотеку) из наших сгенерированных файлов, заодно добавив их в структуру проекта, что позволит их безболезненно #include "…" и видеть их в QtCreator.

\\

Как оказалось, не так уж и сложно.

Вперед

Работаю в компании Tune-IT, разрабатываю софт. Могу писать на perl. Могу не писать. Могу клаву так заныкать, что фиг найдёшь.

Что умеет ваш портал?

Наш портал уже "из коробки" умеет очень многое. Сразу же после установки вы сможете использовать следующие компоненты:

Справочник сотрудников

Удобный агрегатор контактной информации, адресов и телефонов всех сотрудников компании.

Интеграция с IP-телефонией

Вы можете позвонить любому сотруднику, просто кликнув по иконке на его карточке в справочнике.

Встроенный клиент Webmail

Все ваши сотрудники могут пользоваться корпоративной электронной почты без необходимости настройки почтового клиента.

Вики-справочник

Централизованное хранилище для всей информации, необходимой сотрудникам для решения их повседневных задач.

Интеграция с сервером печати

Печать и сканирование документов через прямо веб-интерфейс портала - без необходимости установки драйверов принтера на компьютеры сотрудников.

Файловое хранилище

В портал встроено файловое хранилище с поддержкой версионирования файлов. Каждый пользователь имеет свой домашний каталог, доступный как через веб-интерфейс, так и через проводник Windows.

Мультимедиа-возможности

Встроенные фото- и видеогалерея позволяют просматривать фотографии и видео прямо на портале.

Социальные коммуникации

В портал встроена полноценная корпоративная социальная сеть. Сотрудники могут обмениваться сообщениями, файлами и общаться в форуме.

Кроме того, вы можете воспользоваться любым из сотен плагинов, доступных на Liferay Marketplace.

Сколько это будет стоить?

Как уже было сказано выше, вы можете использовать наш интранет-портал абсолютно бесплатно и без каких-либо ограничений на количество пользователей или параллельно запущенных сессий. Единственное, чего вы не получите в бесплатной лицензии - это техническая поддержка.

Существует несколько уровней технической поддержки, отличающихся друг от друга SLA и стоимостью.

  Free Basic 24x7
Количество пользователей
Количество сессий
Email hotline нет есть есть
Phone hotline нет нет есть
Обращений в месяц - 10
Режим технической поддержки - 8x5 24x7
Стоимость Бесплатно 20 000 /месяц 100 000 /месяц

 

OK, мне всё это нравится. Где я могу скачать ваш портал?

В настоящий момент портал находится в стадии бета-тестирования. Когда мы закончим, ссылка на скачивание и инструкция по установке появятся вот здесь

Если вы заинтересовались решением, или хотите поучаствовать в бета-тестировании - пожалуйста, напишите нам!