Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Makefile, как грамотно писать? 
:(
    Опции темы
quasi
Дата 1.9.2007, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007

Репутация: нет
Всего: 0



А подскажите как правильно пишутся makefile-s для SMP ражима. Собственно тут сложно в том что-бы дать знать сборщику когда можно запустить паралельный поток, а вот как это сделать? Кто-нибуть писал такие makefile?
PM MAIL   Вверх
bsa
Дата 1.9.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Если ты про параллельную компиляцию файлов, то все просто. Во-первых, ты должен указать make, сколько потоков хочешь получить. Оптимально - количество процессоров +1 (т.е. для двухпроцессорной системы это будет 3). Делается это ключем -j:
Код
make -j3 all
Makefile же должен быть таким, чтобы цель, зависящая от других целей, не начала выполняться раньше, чем выполнятся зависимости. Например:
Код
all: file
file: file1.o file2.o
    gcc -o $@ $^
file1.o: file1.c
    gcc -o $@ $<
file2.o: file2.c
    gcc -o $@ $<
Если file2.c, например намного дольше собирается, чем file1.c, а make был запущен в более чем 1-м потоке, может возникнуть ситуация, когда цель file начнет выполняться до окончания целей file1.o и file2.o. А это черевато. Поэтому, надо делать так:
Код
all: file
file: file1.o file2.o
    rm -f $@
    gcc -o $@.tmp $^
    mv $@.tmp $@
file1.o: file1.c
    rm -f $@
    gcc -o $@.tmp $<
    mv $@.tmp $@
file2.o: file2.c
    rm -f $@
    gcc -o $@.tmp $<
    mv $@.tmp $@
Таким образом, зависимая цель не начнет свое исполнение, пока зависимости полностью не выпонятся.

Кстати, autotools (automake, autoconf и компания) делает правильные с этой точки зрения мейкфайлы. Может стоит воспользоваться им?

PM   Вверх
JackYF
Дата 1.9.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(bsa @  1.9.2007,  11:18 Найти цитируемый пост)
когда цель file начнет выполняться до окончания целей file1.o и file2.o.

как это? ведь она зависит от file2.o, как она может начать выполняться, если не закончилась сборка file2.o?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 1.9.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Это не у меня надо спрашивать. Думаю, там проблемы чуть глубже. Короче, я сталкивался с подобными проблемами, когда писал Makefile самостоятельно: если собирать без ключа -j, то все в порядке, если с ключем, то какие-то странные ошибки выдаются.
А потом, эти цели - просто имена файлов. Соответственно, зависимая цель начинает выполняться, когда изменились зависимости.
Хотя, хрен знает.
PM   Вверх
quasi
Дата 1.9.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007

Репутация: нет
Всего: 0



А почему j3, а не j4? В документации по ФриБСД сказано что лудше j4(но это при сборке мира)?! М да уж, переписывть куча мейк-файлов в портах дело совсем не веселое.
PM MAIL   Вверх
bsa
Дата 1.9.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



quasi, вообще-то, скорее всего, ничего в портах переписывать не нужно. Просто запускай make с ключем -j<X>. А почему именно -j3, я уже писал выше. Ты, видимо, плохо читал.
PM   Вверх
quasi
Дата 4.9.2007, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007

Репутация: нет
Всего: 0



Да пробовал я, когда -j<X> , то сборка ломается. И в FreeBSD, и в NetBSD.
PM MAIL   Вверх
bsa
Дата 4.9.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Цитата(quasi @ 4.9.2007,  09:02)
Да пробовал я, когда -j<X> , то сборка ломается. И в FreeBSD, и в NetBSD.

значит не судьба
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0490 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.