реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Архитектура makefile для сборки нескольких проектов
koluna
сообщение Sep 6 2013, 14:13
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Всем привет!

Разбираюсь с 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
Какую структуру можете порекомендовать?

Сообщение отредактировал koluna - Sep 6 2013, 14:18


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Sep 6 2013, 14:26
Сообщение #2


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Я делал для 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.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
koluna
сообщение Sep 6 2013, 15:26
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(mdmitry @ Sep 6 2013, 18:26) *
Мне необходимо было иметь возможность независимо собирать каждый проект.


Аналогично.

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


Это и есть рекурсивный вызов.
Так и сделал.
Только в моем случае вторично make вызывается с тем же самым makefile.
Вот я думаю все... может, для каждого проекта сделать свой makefile. А из главного makefile при необходимости вызывать makefile для каждого из проектов.
Ну или вообще не нужен будет этот главный makefile - можно будет обойтись батником...


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 6 2013, 17:10
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Sep 6 2013, 17:43
Сообщение #5


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Сергей, я правильно понимаю, что Вы явно в командной строке указываете цель (clean, all и т.д ) для всех проектов из списка директорий (utilites modules/UAS-B/Software ... router)?


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 6 2013, 18:26
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 06:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016