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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GNU Make, Автоматическая генерация зависимостей 
V
    Опции темы
SaDFromSpb
Дата 15.10.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



    Одна из основных фичей make в том, что она позволяет перекомпилировать (перетранслировать etc...) только те файлы, которые в этом нуждаются. Для этого необходимо составлять в мэйкфайле правила с зависимостями. Ну понятное дело, что составлять эти зависимости вручную не круто. Можно что-нибудь забыть или перепутать.
    Исходя из этих соображений, мне захотелось написать такой мэйкфайл, который автоматически генерирует зависимости и собирает проект по одной команде make. (Можно конечно сделать отдельную команду depends для этого дела, и вызывать ее перед сборкой, если добавился новый файл или произошли изменения в инклудах. Но так делать лень =) и периодически обязательно будешь про это забывать.)

   В нете я нашел одно решение, которое удовлетворяло моим требованиям за одним исключением: генерируемые зависимости всегда были на шаг позади сборки. То есть сначала по старым зависимостям собирался проект, затем эти зависимости обновлялись.

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

   Прежде всего пришлось свыкнуться с мыслью, что одним мэйкфайлом не обойдешся, потому что зависимости должны присутствовать в мэйкфайле в явном виде уже при его первичном проходе. Следовательно, они должны быть либо прописанны вручную (чего мы хотим избежать), либо подцеплены include'ом из другого(их) файла(ов). Пришлось создавать один файл под именем "Makefile", генерирующий зависимости и вызывающий другой файл с загадочным именем ".compile".

Содержимое файла Makefile:
Код

MAKEFLAGS =--no-print-directory  # Это, чтобы не выводилась надпись entering/living directory ...
export EXECUTABLE = run            # Имя исполняемого файла. export нужна для того, 
                         # чтобы второй мэйкфайл тоже видел эту переменную

DELETE_DEPENDS       = FALSE       # Нужно ли удалять файлы с зависимостями после сборки 
export DEPEND_EXTEN  = depends  # Расширение для файлов с зависимостями, которое добавляется к именам файлов .cpp 

WARNFLAGS =  -Wall ... bla bla bla
export CXXFLAGS := $(WARNFLAGS) -ggdb еще bla bla bla bla   # Это встроенная переменная, которая используется неявным
                                             # правилом по сборке объектников (подставляется как ключ к gcc)

SRCS = main.cpp source1.cpp source2.cpp
HDRS = header1.hpp header2.hpp
export OBJS := $(SRCS:.cpp=.o)
export DEPENDS := $(SRCS:.cpp=.cpp.$(DEPEND_EXTEN))   # Вот это и будут файлы с зависимостями


DELETE_DEPENDS_COMMAND :=                             # команда для удаления файлов с зависимостями
ifeq ($(DELETE_DEPENDS), TRUE)
    DELETE_DEPENDS_COMMAND := $(RM) *.$(DEPEND_EXTEN)
endif


# Здесь создаем команду по генерации файлов с зависмостями средствами gcc.
# Для каждого файла команда имеет вид " g++ -M -MF  файл_зависмостей   cpp-шник "
ds := $(foreach depend,$(DEPENDS), && $(CCC) -M -MF $(depend) $(basename $(depend)))
CREATE_DEPENDS_COMMAND := $(wordlist 2,$(words $(ds)), $(ds))

# Main target
$(DEPENDS): $(SRCS) $(HDRS)
    @echo Generating dependencies...
    $(CREATE_DEPENDS_COMMAND)   # Создаем зависимости
    $(MAKE) -f .compile              # Вызываем второй мэйкфайл
    $(DELETE_DEPENDS_COMMAND)   # Удаляем файлы с зависимостями 

# Ну и так, по мелочи:

.PHONY: clean clear
clean: ; $(RM) *.o *.$(DEPEND_EXTEN)
clear: ; $(RM) *.o *.$(DEPEND_EXTEN) $(EXECUTABLE)


Содержимое файла ".compile"
Код

# Main target
$(EXECUTABLE) : $(OBJS)
    @echo Linking $(PROGRAM) binary
    $(CCC) -o $@ $(OBJS)
    @echo done

# Including files with dependencies
include *.$(DEPEND_EXTEN)     # Вот здесь и подключаем заветные зависимости


Собствено вот.
В данном примере в файлы зависимостей включаются и все библиотечные хедеры (это полезно, если параллельно редактируешь свою библиотеку). Если библиотечные хедеры не меняются, то флаг -M можно заменить на -MM. Тогда в зависимостях пропишутся только хедеры, включенные с помощью кавычек.

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

Это сообщение отредактировал(а) SaDFromSpb - 15.10.2006, 22:29


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
GrayCardinal
Дата 16.10.2006, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Интересное чтиво  smile 

www.a-a-p.org
И cons (но домашней не помню)


--------------------
PM MAIL WWW   Вверх
SaDFromSpb
Дата 16.10.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GrayCardinal
Цитата(GrayCardinal @  16.10.2006,  05:12 Найти цитируемый пост)
www.a-a-p.org
И cons (но домашней не помню) 
Я про них не знал, но догадывался  smile
Я все-таки именно про Make. Потому что многие все-равно его используют. (Вот ты, к примеру, чем пользуешся?).  И у нас в конторе его юзают в частности.
Хотя за ссылочки спасибо. Попробую дома поковырять.



Это сообщение отредактировал(а) SaDFromSpb - 16.10.2006, 15:21


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
bsa
Дата 16.10.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



PM   Вверх
bilbobagginz
Дата 16.10.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



aap, scons - намного более продвинуты чем make.
то, что ты пытаешься сваять - придумывать autoconf + automake сызнова для make.
дело гиблое.

все стрелки идут от make вперёд а не на make.




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
GrayCardinal
Дата 17.10.2006, 05:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



SaDFromSpb
Я - то ? У меня скрипт свой Perl'овский  smile 


--------------------
PM MAIL WWW   Вверх
SaDFromSpb
Дата 17.10.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Короче, понятно. Опять я позади планеты всей.  smile
Ладно. Будем более продвинутые темы осваивать.

Цитата(GrayCardinal @  17.10.2006,  05:26 Найти цитируемый пост)
У меня скрипт свой Perl'овский

Отец!  smile 

Но у меня есть оправдание - я на линухе сравнительно недавно программлю. Всем спасибо за инфу.


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

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

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


 




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


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

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