GNU make - помогите.
От: Fiend  
Дата: 01.11.02 13:56
Оценка:
Привет всем.
Подскажите, пожалуйста как сделать. У меня есть несколько каталогов, в них исходники и заголовки. Допустим, в каждом из каталогов независимый проект и рузельтат компиляции — испольняемый файл.
Мне нужен вневшний мэйк файл, который в каждом из каталогов:
1) скомпилит объектные файлы
2) сгенерит файлы зависимостей
3) все эти файлы разложит где надо.
4) скомпилит исп. файл
Я читал на ситфорум.ру про использование гну мэйк, но мне не подходит использованная там идея с внешним файлом — скриптом, который запустит мэйки.
Итак, подробности.
Внешний каталог:
work/
в нем
/project1
/s1.cpp
/s2.cpp
/s3.cpp
/project2
/s1.cpp
/s2.cpp

Makefile.

Пример Makefile (для начала, скомпилим только project1)


SOURCES = $(wildcard project1/*.cpp) #ага, получил имена исходников
OBJECTS = $(patsubst %.cpp,%.o,$(wildcard project1/*.cpp))#ага, имена обж.
PROJECT1 : $(OBJECTS)
    g++ -o project1/PROJECT1 $^ #скомпилим здесь исп. файл
$(OBJECTS) : $(SOURCES) #В примерах пишут %.o:%.cpp
    g++ -c -MD $< #вот тут проблема, объектники компилятся
#а вот файлы зависимостей - нет.
include $(wildcard project1/*.d)

Помогите.
Было бы здорово, если бы еще и сказали как объектн. и файлы зависимостей еще и в дополнительно вложенные в project1 директории помещать.
Re: GNU make - помогите.
От: Kubyshev Andrey  
Дата: 01.11.02 14:10
Оценка:
Здравствуйте Fiend, Вы писали:

F>Я читал на ситфорум.ру про использование гну мэйк, но мне не подходит использованная там идея с внешним файлом — скриптом, который запустит мэйки.


eto ne ideya eto workaround . Esli hochesh , nazyvai eto nedostatokom make. No krome nego est drugie pakety autobuilda :

cook http://www.canb.auug.org.au/~millerp/cook/cook.html
GNU project http://www.gnu.org/software/cons/
Jakarta http://jakarta.apache.org/ant/

a vot v pascale takih problem net. im ne nuzhen make
Re[2]: GNU make - помогите.
От: Fiend  
Дата: 01.11.02 14:15
Оценка:
Мне нужно именно мэйк использовать. Где ошибка в моем мэйкфайле (может он целиком ?
А паскаль — чур меня, не кночи он будь помянут.
Re[3]: GNU make - помогите.
От: Fiend  
Дата: 04.11.02 13:43
Оценка:
Здравствуйте Fiend, Вы писали:

Так и не помогли
Re[4]: GNU make - помогите.
От: Аноним  
Дата: 05.11.02 05:07
Оценка:
Здравствуйте Fiend, Вы писали:

F>Здравствуйте Fiend, Вы писали:


F>Так и не помогли

autoconf, automake
Почитать: http://sources.redhat.com/autobook/autobook/autobook_toc.html
Re[5]: GNU make - помогите.
От: White Eagle Россия  
Дата: 05.11.02 09:32
Оценка:
Здравствуйте Аноним, Вы писали:

А>autoconf, automake

А>Почитать: http://sources.redhat.com/autobook/autobook/autobook_toc.html

А чем оно тут ему поможет? autoconf + automake создают make-файлы в каждом подкаталоге,
да еще один внешний скрипт, а автору вроде как надо чтобы только один внешний Make-файл.
Ума правда не приложу зачем
В общем вопрос был как сделать через задницу автогеном, а ты советуешь как правильно
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[6]: GNU make - помогите.
От: Fiend  
Дата: 05.11.02 13:20
Оценка:
WE>А чем оно тут ему поможет? autoconf + automake создают make-файлы в каждом подкаталоге,
WE>да еще один внешний скрипт, а автору вроде как надо чтобы только один внешний Make-файл.
WE>Ума правда не приложу зачем

Ты все правильно понял.

WE>В общем вопрос был как сделать через задницу автогеном, а ты советуешь как правильно


Грубо, но справедливо. Мне это не надо. От меня требуют так сделать. В качестве мотивации дают статью, где много чего понаписано, и сказано, что рекурс. мэйк — плохо, а такой (какой надо) — хорошо.
Re: GNU make - помогите.
От: White Eagle Россия  
Дата: 05.11.02 15:32
Оценка: 2 (1)
Здравствуйте Fiend, Вы писали:

F>Пример Makefile (для начала, скомпилим только project1)


F>

F>
F>SOURCES = $(wildcard project1/*.cpp) #ага, получил имена исходников
F>OBJECTS = $(patsubst %.cpp,%.o,$(wildcard project1/*.cpp))#ага, имена обж.
F>PROJECT1 : $(OBJECTS)
F>    g++ -o project1/PROJECT1 $^ #скомпилим здесь исп. файл
F>$(OBJECTS) : $(SOURCES) #В примерах пишут %.o:%.cpp
F>    g++ -c -MD $< #вот тут проблема, объектники компилятся
F>#а вот файлы зависимостей - нет.
F>include $(wildcard project1/*.d)
F>

F>Помогите.
F>Было бы здорово, если бы еще и сказали как объектн. и файлы зависимостей еще и в дополнительно вложенные в project1 директории помещать.

Да, сочувствую.
Ну насчет помещения объектников и зависимостей во вложенные папки — это примерно так:
project1/obj/%.o: project1/%.cpp
        g++ -Wp,-MD,project1/.deps/$(*F).d -c $< -o $(@D)/obj/$(@F)


Что не так с твоими правилами $(OBJECTS) : $(SOURCES) сходу не соображу, но что-то явно не так.
Честно говоря ни разу не видел и нигде не читал чтобы кто-то так извращался. А статейка про то что
рекурсивный make плохо — она общедоступна? Можно линк?
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[2]: GNU make - помогите.
От: Fiend  
Дата: 06.11.02 08:18
Оценка:
Да, статейка доступна. Там даже решение предлагается — мне ее правда поздно дали, я уж успел сюда написать. А находится она здесь:http://aegis.sourceforge.net/auug97.pdf
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.