LINUX.ORG.RU

Makefile: rule дёргающий другой rule

 


0

1

Все добра и счастья ☺

Есть такой Makefile для сборки ассемблерного говна в сэндбоксе:

.PHONY: cleanall cleanobj

DYNLINK = /usr/i686-pc-linux-gnu/lib/ld-linux.so.2
LINKPATH = /usr/i686-pc-linux-gnu/lib
LIBARCH = elf_i386

ASFLAGS := -m32 -gstabs+
LDFLAGS := -dynamic-linker $(DYNLINK) -L$(LINKPATH) -m $(LIBARCH) -lc

%: %.o
	$(LD) $(LDFLAGS) $< -o $@

# all: %.o

%.o: %.s
	$(AS) $(ASFLAGS) $< -o $@

claenall: cleanobj
	-rm program

cleanobj:
	-rm *.o

При вызове make test получаю такой выхлоп:

make test
cc -m32 -gstabs+ -dynamic-linker /usr/i686-pc-linux-gnu/lib/ld-linux.so.2 -L/usr/i686-pc-linux-gnu/lib -m elf_i386 -lc  test.s   -o test
cc: error: elf_i386: No such file or directory
cc: error: unrecognized command line option '-m'
make: *** [<builtin>: test] Error 1

ЧЯДНТ?


Ответ на: комментарий от post-factum

ок, префразирую вопрос: я ожидаю увидеть в выхлопе as, а не cc я же явно указываю $(AS). Потом почему в том же выхлопе одна строка «cc -m32 -gstabs+ -dynamic-linker /usr/i686-pc-linux-gnu/lib/ld-linux.so.2 -L/usr/i686-pc-linux-gnu/lib -m elf_i386 -lc test.s -o test»? Мне казалось, что должно быть сначала:

as --32 --gstabs+ test.s -o test.o
а потом
 ld -dynamic-linker /usr/i686-pc-linux-gnu/lib/ld-linux.so.2 -L/usr/i686-pc-linux-gnu/lib -m elf_i386 test.o -lc -o test2

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

Цель test подхватывается встроенным правилом. Можно подавить так:

# empty list of predefined suffixes to disable builtin rules
.SUFFIXES:

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

Цель test подхватывается встроенным правилом.

что за встроенное правило? Я не вижу его в make -p

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

+ c .SUFFIXES: у меня ещё отрабатывает clean, но мне хочется, чтобы make foo запускал два рула для foo.o и foo

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

Видимо, это:

%.s:

%: %.s
#  recipe to execute (built-in):
        $(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@

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

+ c .SUFFIXES: у меня ещё отрабатывает clean

Это не clean (кстати, там опечатка в claenall):

   The second difference is that if 'make' _does_ create B in order to
update something else, it deletes B later on after it is no longer
needed.  Therefore, an intermediate file which did not exist before
'make' also does not exist after 'make'.  'make' reports the deletion to
you by printing a 'rm -f' command showing which file it is deleting.

Подавляется так:

# prevent deletion of intermediate (*.o here) files
.SECONDARY:
xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Ох, как всё сложно. Autotools мне кажется легче ☺ Спасибо за помощь!

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