Перейти к содержанию
    

Система сборки

Использую make для задач сборки проекта для МК. По мере роста проекта требуются разные возможности, которые сам make напрямую не обеспечивает.

1) Конфигурирование сборки под разные платы. В большинстве случаев, все функции устройства сохраняются, а меняется только код HAL. Объем изменений может быть сильно разный, от самого простого, когда меняется назначение пинов МК, до переключения на другой МК с изменением списка компилируемых файлов и выбора другого компилятора.

2) Конфигурирование софтовых возможностей. Например, добавить/исключить поддержку поддержку какой-то периферии подключаемой к внешним интерфейсам устройства, разные типы датчиков, подключение которых не требует аппаратных изменений. Поддержка разных (и взаимоимключающих) протоколов взаимодействия.

3) Иногда выбор конкретной платы подразумевает наличие/отсутствие каких-то возможностей, в соответствии с этим включаются/отключаются софтовые блоки из п2.

 

Сейчас у меня сделан какой-то свой велосипед. Записываю конфигурацию платы в BOARD.h файл такого вида.

#define HW_MCU_STM32F405

#define HW_HAVE_ANALOG_KNOB
#define HW_HAVE_NTC_ON_PCB
#define HW_HAVE_NTC_MOTOR
#define HW_HAVE_NETWORK_EPCAN
#define HW_HAVE_STEP_DIR

#define HW_CLOCK_CRYSTAL_HZ		12000000UL
...

Где-то в проекте делаю "include _HW_INCLUDE", где этот параметр передаётся из ключей компилятора заданных через make, чтобы можно бы собрать проект под плату BOARD вызовом "make HWREV=BOARD".

Дальше требуется делать условные блоки в Makefile.

ifeq ($(HWMCU), STM32F405)
CFLAGS	+= -mcpu=cortex-m4 -mthumb
CFLAGS	+= -mfloat-abi=hard -mfpu=fpv4-sp-d16
endif
...

ifeq ($(INCLUDE_HAL_USB), 1)
OBJS	+= hal/usb.o
endif
...

Для этого я генерирую на каждый BOARD.h соответствующий ему BOARD.d, который включается в Makefile. Генерирую с помощью скрипта на питоне.

def mkdefs(hw):

    f = open('hal/hw/' + hw + '.h', 'r')
    g = open('hal/mk/' + hw + '.d', 'w')

    for s in f:
        if   'HW_MCU_STM32F405' in s:
            g.write('HWMCU = STM32F405\n')
        elif 'HW_MCU_STM32F722' in s:
            g.write('HWMCU = STM32F722\n')

        elif 'HW_HAVE_USB_CDC_ACM' in s:
            g.write('INCLUDE_HAL_USB = 1\n');
            g.write('INCLUDE_CHERRY = 1\n');

        elif 'HW_HAVE_NETWORK_EPCAN' in s:
            g.write('INCLUDE_HAL_CAN = 1\n')
            g.write('INCLUDE_EPCAN = 1\n')
...

Приходится постоянно дорабатывать этот велосипед под новые требования.

 

Ваши варианты решения таких проблем? Что есть готового хорошего и не слишком тяжеловесного?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

из того что попроще - перейти на cmake и собирать код под конкретную платформу из соответствующей папки HAL/build с использованием относительной адресации вида ../../src/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если  умеете Python, то SCons порулит все задачи. Правда, идеология там совсем не make, т.ч. тут некоторая ломка стереотипов. Но она (идеология) куда более прямая, чем в make. И вся мощь ЯП Python к вашим услугам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

premake, только там lua вместо питона, и не полная замена make как scons, а легкая надстройка которая генерит мэйкфайлы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...