Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Архитектура makefile для сборки нескольких проектов
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
koluna
Всем привет!

Разбираюсь с make.
Стоит задача написать makefile (Windows, MinGW-make, компилятор Keil) для сборки 5 проектов, каждый из которых имеет по 3 конфигурации (всего 15 конфигураций).
В каждый из проектов включается множество сырцов библиотек (одни и те же в каждый проект).
Проекты необходимо собирать или все сразу, или 1 любой на выбор, или несколько на выбор и т. п.
Проекты совершенно независимые. Главное - удобство и скорость сборки.

Структура папки, содержащей все проекты следующая:

obj

Конфигурация1
o1
o2
...

...
Конфигурация15
o1
o2
...



exe
Конфигурация1
hex
map
...

...
Конфигурация15
hex
map
...



prj1
prj2,3,4 (в одной папке)
prj5


Написал первый вариант.
В общих чертах работает следующим образом (обвязку инструментария не описываю).
Определяем список общих для всех проектов путей и объектников.
Определяем для каждого проекта в отдельности:
- список дополнительных объектников, дополняем их путями
- свои дефайны
- пути (корректируем общие пути с учетом проекта)

Далее - фиктивные цели (15 штук).
В их правилах следующее.
Создание папок.
Рекурсивный вызов make (без смены дирректории, makefile тот же самый) с множеством параметров: сформированное имя hex-файла (конечная цель), список объектников, список дефайнов и т. д.

Получается один громоздкий makefile с множеством однотиных переменных для каждой конфигурации.
Работает, но хочется оптимизировать sm.gif
Какую структуру можете порекомендовать?
mdmitry
Я делал для 4 связанных проектов просто командный файл, типа такого:

Код
@echo off
echo MAKE PRJ1
cd prj1
make clean
make all
cd ..  
cd prj2
echo MAKE PRJ2
make clean
make all
cd ..
........
@echo on


makefile для каждого проекта был свой, но с подключаемой общей частью. Мне необходимо было иметь возможность независимо собирать каждый проект.
Не пробовал, но вроде можно из make вызывать другой make, при этом для первого make сформировать необходимый makefile с вызовами make.
koluna
Цитата(mdmitry @ Sep 6 2013, 18:26) *
Мне необходимо было иметь возможность независимо собирать каждый проект.


Аналогично.

Цитата
Не пробовал, но вроде можно из make вызывать другой make, при этом для первого make сформировать необходимый makefile с вызовами make.


Это и есть рекурсивный вызов.
Так и сделал.
Только в моем случае вторично make вызывается с тем же самым makefile.
Вот я думаю все... может, для каждого проекта сделать свой makefile. А из главного makefile при необходимости вызывать makefile для каждого из проектов.
Ну или вообще не нужен будет этот главный makefile - можно будет обойтись батником...
Сергей Борщ
QUOTE (koluna @ Sep 6 2013, 17:26) *
Вот я думаю все... может, для каждого проекта сделать свой makefile. А из главного makefile при необходимости вызывать makefile для каждого из проектов.
Тоже неплохое решение. Свой makefile каждого проекта может включать в себя один общий на все проекты makefile с общей неизменной частью. А makefile верхнего уровня у меня выглядит так:
CODE
SUBDIRS =
SUBDIRS += utilites
SUBDIRS += modules/UAS-B/Software
SUBDIRS += modules/UAS-C/Software
SUBDIRS += modules/UAS-C2/Software
SUBDIRS += modules/UAS-stepper/software
SUBDIRS += modules/UAS-D/Software
#SUBDIRS += router


$(MAKECMDGOALS):
    @for subdir in $(SUBDIRS); do echo ===== $$subdir =====; $(MAKE) --no-print-directory -C $$subdir $(MAKECMDGOALS); done
mdmitry
Сергей, я правильно понимаю, что Вы явно в командной строке указываете цель (clean, all и т.д ) для всех проектов из списка директорий (utilites modules/UAS-B/Software ... router)?
Сергей Борщ
QUOTE (mdmitry @ Sep 6 2013, 19:43) *
Сергей, я правильно понимаю, что Вы явно в командной строке указываете цель (clean, all и т.д ) для всех проектов из списка директорий (utilites modules/UAS-B/Software ... router)?
Да. Как вставить сюда цель по-умолчанию all я не придумал пока.

Добавлено: вот вы спросили и я придумал:
CODE
SUBDIRS =
SUBDIRS += utilites
SUBDIRS += modules/UAS-B/Software
SUBDIRS += modules/UAS-C/Software
SUBDIRS += modules/UAS-C2/Software
SUBDIRS += modules/UAS-stepper/software
SUBDIRS += modules/UAS-D/Software
#SUBDIRS += router

GOALS = $(MAKECMDGOALS)
GOALS += $(if $(MAKECMDGOALS),,all)

$(GOALS):
    @for subdir in $(SUBDIRS); do echo ===== $$subdir =====; $(MAKE) --no-print-directory -C $$subdir $(GOALS); done
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.