LINUX.ORG.RU

Makefile: объектники от исходников в разных папках в одно место


0

1

Собираю щас микропроект на Си из пятка файлов исходников. Пара файлов лежит в корне (там же где и Makefile). Еще 3 файла лежат во вложенном каталоге:

.:
Makefile main.c file1.c

./dir
file2.c file3.c file4.c
И вот хочется мне чтобы все объектники всех исходников лежали все вместе (неважно где, можно в "." или "./obj"). В случае когда у нас нет dir, все понятно и очевидно, но когда часть исходников в отдельном каталоге («dir») make норовит все положить в тот же «dir». Что мне страсть как не охота.

Можно конечно руками написать отдельные правила для всех файлов, но это как-то громоздко. Хочется какой-нидь make-магии. Согласен на отдельные правила для каталогов "." и «dir»

★★★★

как-то так, наверно:

SOURCES := $(shell find . -name '*.c')

OBJECTS := \
        objs/main.o \
        objs/file1.o \
        objs/file2.o \
        objs/file3.o 

objs/%.o: SRC = $(filter %$*.c, $(SOURCES))
objs/%.o:
    gcc -c -MD $(SRC) -o $@

anonymous ()

Примерно так можно:

VPATH := dir
SRC := f1.c f2.c f3.c f4.c
OBJ := $(patsubst %.c, obj/%.o, $(SRC))

main: $(OBJ)
	gcc -o $@ $^

obj/%.o: %.c
	cc -c -o $@ $^

unsigned ★★★ ()

Всем спасибо. По итогам конкурса победил lovesan. Самое забавное, что этот вариант я с самого начала и сделал (только он не работал). Никак до меня не доходило, что для make "./obj/main.c" и «obj/main.c» разные файлы (хотя точней сказать будет строки). Убрал лишнюю "./" и все завертелось.

Очень любопытный вариант у anonymous с его отдельным правилом:

objs/%.o: SRC = $(filter %$*.c, $(SOURCES))

Ну а unsigned выдал тоже что и lovesan. Только что более полный, за что ему так же спасибо.

yax123 ★★★★ ()
Ответ на: комментарий от yax123

Кстати, начал вычищать свой Makefile. И увидел

vpath %.c ./dir
Без которого ничего не работало. Так что вперед вырывается unsigned

yax123 ★★★★ ()

объектники от исходников в разных папках

В мамки складывай, вендузоид

anonymous ()
Ответ на: комментарий от anonymous

В мамки складывай, вендузоид

Мы вас тоже нежно любим

yax123 ★★★★ ()
Ответ на: комментарий от Pavval

http://lorquotes.ru/view-quote.php?id=3726

Убейся апстивенса (если он у тебя есть конечно в твердом виде), я не одмин. А «папка» - это была оговорка, но как говорится, «всем по*уй».

yax123 ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.