тяжелая наркомания: Сборка VPI расширения и запуск Verilog тестов при помощи cmake/ctest

Недавно потребовалось для нужд кровавой отладки сделать свое VPI расширение для verilog HDL и встал вопрос как интегрировать это добро с какой-нибудь нормальной системой сборки. К сожалению, в плане инструментов для сборки, отладки и тестирование люди проектирующие СБИС живут если не в каменном веке, то в своем особом мирке, со своей особой атмосферой. Опенсурсный iverilog в этом плане ничуть не лучше коммерческих тулов, которые кладут огромный болт на многие общепринятые в мире linux практики.
Ну да хрен с ними. Надо решать как с этим жить. В этой заметке я постараюсь пройтись по основным нюансам написания CMakeLists.txt для сборки vpi расширения и его unit-тестирования.

(далее…)

CMake + atom + .clang_complete

С некоторый пор я переехал с emacs’а на atom, который выглядел как более современная замена. Что для меня было важным – у него очень хорошая работа с CMake и автодополнение для оного. Вскоре ко всему этому делу я прикрутил lint и autocomplete через clang. И то и другое мне понравилось, но хотело актуального .clang_autocomplete в корне проекта. Однако, если проект получает от системы сборки кучу дефайнов, то управлять этим файликом руками становится больно и неприятно. Выход – генерить его на лету. Вот мой костыль для CMake:

message(STATUS "Generarating ${CMAKE_SOURCE_DIR}/.clang_complete")
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
file(WRITE ${CMAKE_SOURCE_DIR}/.clang_complete "")
foreach(dir ${dirs})
  file(APPEND ${CMAKE_SOURCE_DIR}/.clang_complete "-I${dir}\n")
endforeach()
string(REPLACE "'" "" CMAKE_C_FLAGS_SPLIT ${CMAKE_C_FLAGS})
string(REPLACE " " ";" CMAKE_C_FLAGS_SPLIT ${CMAKE_C_FLAGS_SPLIT})
foreach(flag ${CMAKE_C_FLAGS_SPLIT})
  file(APPEND ${CMAKE_SOURCE_DIR}/.clang_complete "${flag}\n")
endforeach()

Очевидно, если мы используем C++ в проекте, то и обрабатывать схожим образом надо переменную CMAKE_CXX_FLAGS. У этого кода есть очевидное ограничение: Если мы передаем через -D дефайны с несколькими словами – нас ждет облом (напр. -DRELEASE_CODENAME=”Black Burned Cookies”)