LINUX.ORG.RU

gmake subdirs


0

1

есть мейк-файл примерно следующего содержания:

dir1= obj
obj1=$(dir1)/main.o $(dir1)/notmain.o
src1= main.c notmain.c

dir2= sub
obj2=$(dir2)/one.o $(dir2)/two.o
src2=$(dir2)/one.c $(dir2)/two.c

# Rule 1
$(dir1)/%.o: %.c
  gcc -c $< -o $@ $(FLAGS1)

# Rule 2
$(dir2)/%.o: %.c
  gcc -c $< -o $@ $(FLAGS2)
# было поробовано в виде  $(dir2)/%.o: $(dir2)/%.c
# тоже не работает :(

all: $(obj1) $(obj2)
   gcc -o result  $^

Так вот, проблема заключается в том что второе правило сборки не срабатывает, и объекты из $(obj2) собираются дефолтным правилом сборки... При этом если создать конкретное правило для одного объектника из $(obj2) то оно срабатывает.

P.S. переменные src1, src2 для наглядности.

★★★★★

Последнее исправление: Jetty (всего исправлений: 1)
Ответ на: комментарий от unsigned

Оно работает. Просто срабатывает не это правило, а

%.o: %.c
  $(CC) $(CFLAGS) ........

Оно по умолчанию есть :)

Jetty ★★★★★
() автор топика
Ответ на: комментарий от Jetty
dir1= obj
obj1=$(dir1)/main.o $(dir1)/notmain.o
src1= main.c notmain.c

dir2= sub
obj2=$(dir2)/one.o $(dir2)/two.o
src2=$(dir2)/one.c $(dir2)/two.c

# Rule 1
$(dir1)/%.o: %.c
	gcc -c $< -o $@ $(FLAGS1)

# Rule 2
$(dir2)/%.o: $(dir2)/%.c
	@echo -n My rule:
	gcc -c $< -o $@ $(FLAGS2)

result: $(obj1) $(obj2)
	gcc -o result  $^
$ ls -RF
.:
Makefile  main.c  notmain.c  obj/  sub/
 
./obj:
 
./sub:
one.c  two.c

$ make
ggcc -c main.c -o obj/main.o
gcc -c notmain.c -o obj/notmain.o
My rule:gcc -c sub/one.c -o sub/one.o
My rule:gcc -c sub/two.c -o sub/two.o
gcc -o result  obj/main.o obj/notmain.o sub/one.o sub/two.o

Не может быть чтоб не работало.

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

Ну вот я же и говорю что мистика :)

Сейчас попробую еще раз проверить :), может магия вечера работала вчера :)

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

Доехал... Правило дефолтной сборки стояло раньше. Как только я его переместил в конец всех правил сборки, оно перестало выполнятся. Получается что мейк компилит правилом, которое первое подошло. От такие дела...

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

А чем тебя вообще не устроило правило по умолчанию?

Переменные можно переопределить для отдельной цели.

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

Потому что я из одних и тех же сорцов собираю несколько объектников для разных целей и с разными ключами.
Поэтому у меня несколько obj-директорий и для каждого конечного результата свои объектники, которые собраны со своими ключами.

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