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”)

Jenkins + armhf + deb

Эта заметка о том, как я разворачивал CI для около-железячных софтовых проектов и каких проблем я огреб с этим безобразием, пока добился рабочего (хоть и при помощи лома и мата) решения. Возможно даже первая из серии.

Начнем с проблемы. Совсем просто, на случай если это читают дети. У нас есть несколько software проектов. Нам надо периодически делать следующие рутинные действия:

  • Собрать проект и проверить, что он вообще собирается где-то, кроме ноутбука разработчика
  • Прогнать unit-test’ы (Ведь мы же не ленимся писать unit-test’ы, не так ли?)
  • Собрать deb-пакеты, и загрузить куда-нибудь, чтобы пользователи были счастливы

Казалось бы, все давно отлажено, есть OpenSuse Build Service / Open Build Service, Travis, Jenkins. Есть такие страшные штуки как sbuild, schroot и целый выводок утилит от debian-разрабов и просто классных людей, какие могут проблемы? Как всегда, дьявол в деталях. Сразу предупреждаю – текста будет много.

IMG_20151123_010048

(далее…)

Doxygen && gh-pages

У гитхаба есть классная возможность прикреплять к репозиториям html странички. И если конструктор сайтов в стиле yandex.narod’а времен начала нулевых интересует мало кого, то вот постить туда html сгенеренный doxygen’ом – милое дело.
Другое дело, что хранить историю в ветке gh-pages нельзя, иначе она будет распухать c каждым коммитом в основную репу. Да и не нужно ее фиксировать. Потому правильным тут будет:

  • Создавать чистый бранч, куда коммитить сгенеренные доки
  • Делать push с –force, чтобы при этом выкидывать прошлую историю для бранча gh-pages
  • Хочется делать это прямо из дерева исходников, не переключаясь на бранч с документацией
  • Потенциально интегрировать это с CI/Jenkins: Прошел билд, юнит-тесты и статический анализ – бампаем документацию

Делается проще, чем звучит. Ниже, чтобы не забыть, мой сниплет для этого безобразия:

doxygen: 
	-rm -Rfv doxygen/
	( cat Doxyfile ; echo "PROJECT_NUMBER=0.1" ) | doxygen 
	cd doxygen/html;\
	rm -Rfv .git;\
	git init .; git checkout --orphan gh-pages;\
	git add *;\
	git commit -m "documentation-for-gh-pages";\
	git remote add origin git@github.com:MY_GITHUB_USERNAME/MY_GITHUB_PROJECT.git;\
	git push -u -f origin gh-pages

ESP8266: Привет, Франкенштейн

Так как я наконец-то запилил самодельные отладочные платки , самое время начать веселье.
Заправившись под завязку кофеином я занырнул в SDK на esp8266 на этих выходных. Внутри как всегда треш и угар в тяжелой форме. Отвечая на вопросы страждущих – нет, я не буду править код референсной прошивки с AT командами. Это прошивка дерьмо. Точка. Насколько первосортное, что даже как пример ее использовать сложно. Так что нам нужна… замена.

Вот эту-то замену я за эти дни и запилил, и теперь она находится в ранней альфа-версии.

Приветствуйте Frankenstein Firmware для ESP8266.

(далее…)

Вышел rf24boot v0.2

DSC_0078

Месяц выдался угарным, но у меня все же нашлась минутка допилить rf24boot.. Да, та самая хрень, которая может обновлять прошивку в мк поверх nRF24L01 беспроводного интерфейса. Вместе со стандартным набором фиксов для библиотеки rf24 в antares, в сам загрузчик я тоже внес тонну изменений. Самое главное – наконец-то сделал USB-стик для программирования.. Так как дешевого stm32 с USB под рукой не было, а использовать stm32f103ret6 на такое жаба задушила донгл вышел на atmega8 с vusb внутри и 16M кварцем.  (Вожно и 20Mhz, и даже 24.5 воткнуть, в принципе). Под катом ченджлог.

(далее…)

USB-машинка для ЛУТа с Web-интерфейсом

Заюзать ламинатор для ЛУТа у меня было в списке запланированных дел очень и очень давно. К сожалению, ламинатора с ручной регулировкой температуры в продаже я так и не нашел, потому взял что было. И, разумеется, это “то что было” тонер даже расплавить не осилило, не то что перевести на медь.

Супер, время сделать этой машинке небольшой апгрейд

(далее…)

Увидел свет Antares 0.2-rc1

После двух лет тихой, незаметной и неторопливой (очень) разработки вышел первый релиз Antares. Antares — это открытая и свободная (GPLv2) реализация системы сборки и набор библиотечного кода, ориентированные на разработку под «голое железо». А еще это то, что я использую вместо вредной для здоровья arduino для всех своих околомикроконтроллерных проектов.
0.2-rc1 это первый релиз, начиная с которого я решил показать это детище широкой общественности, и который достаточно стабилен, чтобы им пользоваться. О том что это, зачем и как можно вычитать более подробнее в README: RUS | ENG

snapshot9

(далее…)

Избавляемся от кипятильника: x86 -> armv7l для домашнего сервера

Мой домашний сервачок имеет долгую историю. Начиналось все со старого Pentium 4, с 20GB HDD и FreeBSD 6.2 в далеком… Какой это год-то был?
Так или иначе, после нескольких лет работы, трижды паянная материнка была отправлена в шкаф к прочему хламу, и была заменена на свеженький тогда intel atom D410, фряху где-то в районе 7 с чем-то заменил linux, сначала debian, потом agilia, потом арч. В общем сервер был хороший, тихий, не пытающийся взлететь на вентиляторах. И в общем-то хватало, у меня же тут чай не вебсервис на овер 9000 хитов в минуту.
В общем, жило это себе тихо мирно, иногда падало под HAD-эффектом, но хватало.
Теперь, же пришла мне в голову мысля выпилить этот тормозной кипятильник по имени x86, и поставить что-то на armv7l. Плюсы на лицо:

  • Жрет 10 ватт в пике
  • Пассивное охлаждение
  • Реактивный eMMC для системы
  • 4 ядра
  • Есть всегда терминал на последовательный порт – в случае факапа не надо тащить в, пардон, туалет (да, там у меня серверная) монитор, или изымать оборудование оттуда. К бивису на дешевых материнках по уарту не достучишься.

Итак, железкой был выбран ODROID-X2 на самсунговском Exynos4412 Prime, как нечто самое оптимальное. ODROID-U2 мне не понравился тем, что NAND впаян, eMMC как-то проще заменить, да и eMMC если память не изменяет быстрее.

IMG_20130521_133759

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

IMG_20130516_104144

(далее…)

Немного черной магии: bash, cgi и загрузка файлов через POST

Прежде, чем меня объявят съехавшим с катушек фриком, оговорюсь, что это делалось для борды, где наличествует всего 64MiBs оперативной памяти (из которой больше половины сжирал запущенный софт). И (из-за специфичности задачи), я решил юзать bash подцепленный к lighttpd через cgi (гусары – молчать!) Тащить туда тяжелую артиллерию (php или python), усложняло код серверсайд части, да и вообще пахло садомазохизмом.
Ладно, в общем потихонечку я дошел до ручки необходимости загружать на борду файлы через POST. Разумеется, начал я с гуглежа решения, и даже нашел одно. Но к сожалению, у него был недостаток.
(далее…)

android & dnsmasq: делаем обертку

Несколькими постами ранее, я рассказвал, как заставить wifi точку доступа андройда работать вменяемо, с локальным разрешением имен. Так как мой телефон играет так же роль карманного сервера, то и dnsmasq играет тут на нем один из ключевых элементов.

Но после недели использования этого решения вскрылась проблема. Когда подключаю телефон к компьютеру через провод, dns до телефона ресолвится неверно. Почему?

Начнем с теории. Когда я врубаю wifi точку доступа, на телефоне поднимается интерфейс ap0 со статическим IP 192.168.43.1.
Когда я врубаю раздачу по USB, подымается usb0 с IP 192.168.42.129.
(на других телефонах все это может различаться)
Чего мы хотим получить? Чтобы на dns запрос пришедший с usb0 нам ответили, что у телефона IP 192.168.42.129, а по ap0, соответственно, 192.168.43.1
Начал я, разумеется с того, что в /etc/hosts внес две строки такого вида:

192.168.43.1 anomalia anomalia.portable git.anomalia p.anomalia
192.168.42.129 anomalia anomalia.portable git.anomalia p.anomalia

Заработало? Нет! Почему?
(далее…)