0. В документацию не посылать, читал не помогает, читал ещё раз, тоже самое. :)1. Есть проект с деревом каталогов, в котором живут исходники.
2. Вот, на половину рабочий Makefile.SUFFIXES =
.SUFFIXES = .cpp .oCXX = g++
CFLAGS = -g -O2
WARN = -W -Wall
FLAGS := $(CFLAGS) $(DEBUG) $(WARN)
INCLUDE = -I. -I../ -I../../ -I../../../SUBDIRS = alpha/db2 alpha/db3 beta/data gamma/os gamma/os/lnx gamma/os/bsd gamma/os/win
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) CXXFLAGS="$(FLAGS) $(INCLUDE)" -C $(D@) $@# EOF Make
3. Исходники живут в директориях $(SUBDIRS), там же живут хедеры.
Например каталог gamma/os/lnx, содержит:
main_lnx.cpp
coops.cppи каталог include, то есть gamma/os/lnx/include
Все зависимости в хедерах разрешены через #inclide, в соответствующих исходниках,
с ними проблем нет4. Перед тем как запускать make, в каждом каталоге с исходниками,
создаем Makefile c зависимостями.Делаем это командой:
g++ -I. -I../ -I../../ -I../../../ -MM *.cpp > Makefile;
1-ая проблема - на примере того же каталога gamma/os/lnx
После создания Makefile c зависимостями, он выглядит следующим образом:
main_lnx.o: main_lnx.cpp ./include/main_lnx.h ../os/include/main.h
coops.o: coops.cpp ./include/main_lnx.h ../os/include/main.hКогда в этот каталог заходит make -C gamma/os/lnx/
Компилируется только main_lnx.o, такое ощущение что coops.cpp не видит вообще.2-ая проблема
Как, а это возможно, автоматизировать созданий файла зависимостей,
которые вкладываются в подкаталоги?
То есть, аналог
g++ -I. -I../ -I../../ -I../../../ -MM *.cpp > Makefile;
перед make -C ....мдя..... я не тормоз,......
вот и ответил на вопрос - надо поместить перед make -C :)3-ая проблема
Как сделать рекурсивное брождение (от слова бродить) make, по подкаталогам,
а не указание их на прямую $(SUBDIR) ?Например, в корне проекта есть куча папок, 20, 30,... 100
1. Возможно, не указывая их поимённо, рекурсивно компилировать исходники?
учитывая, то что внутри каждого ещё могут быть 2,3 уровня вложений?
2. Или вариант с указанием только каталогов 1-ого уровня
например, только каталогов alpha, beta и gamma ?
Может быть autotools поможет?
Ниже цитата
"Automake -- система автоматического создания Makefile'ов для крупных проектов. Automake очень тесно работает совместно с Autoconf, позволяя с помощью буквально двух десятков строк создавать огромные Makefile'ы, которые обрабатывают огромное количество возможностей, по сборке и установке пакета, к которым привыкли все пользователи современных программ с открытыми исходниками."
Здесь начало http://squadette.ru/autotools-ru/article1.html
>Может быть autotools поможет?Это всё понятно, но надо минимизировать всё до минимума. (хорошо сказал :))
Есть ещё веселее, autoproject зовётся - http://packages.debian.org/unstable/devel/autoproject
Думается, придётся в обратном направлении делать.
>Может быть autotools поможет?Советовать autotools при наличии cmake по меньшей мере глупо, по большей - вредно.
>1-ая проблема - на примере того же каталога gamma/os/lnx
>
>После создания Makefile c зависимостями, он выглядит следующим образом:
>
>main_lnx.o: main_lnx.cpp ./include/main_lnx.h ../os/include/main.h
>coops.o: coops.cpp ./include/main_lnx.h ../os/include/main.h
>
>Когда в этот каталог заходит make -C gamma/os/lnx/
>Компилируется только main_lnx.o, такое ощущение что coops.cpp не видит вообще.А что ему ещё компилировать? По-умолчанию (без указания цели) выполняется первая цель. В вашем случае нужно добавить в начало Makefile что-то вроде (для GNU make):
.PHONY: allall: $(subst .cpp,.o,$(wildcard *.cpp))
и будет вам счастье. Точнее, будет вам то, что вы пытаетесь получить.
>3-ая проблема
>
>Как сделать рекурсивное брождение (от слова бродить) make, по подкаталогам,
>а не указание их на прямую $(SUBDIR) ?Всё решает (опять же, для GNU make) $(shell ...) и find.
Вообще, если вы используете GNU make, настоятельно рекомендую почитать по нему info - очень увлекательное чтиво, не говоря уже о пользе. Если вы используете другой make и у него нет аналогичного функционала... даже и не знаю, что сказать. Разве что посочувствовать...
Если становится неудобно использовать обычный make, лучше песмотреть на что-то более высокоуровневое. Без вариантов CMake.
>Если становится неудобно использовать обычный make, лучше песмотреть на что-то более высокоуровневое.
>Без вариантов CMake.Светка ты что ль? :)
>Светка ты что ль? :)Хренетка, иди проспись.