LINUX.ORG.RU

Доисторический Makefile

 


0

2

Если кратко, то кусок правил

.c.o:
        cc -c -I/usr/include -I$(TOP) $<

$(TARGETS): $$@.o
        cc $@.o $(LLDLIBS) -o $@

после привидения к виду

%.o: %.c
        cc -c -I/usr/include -I$(TOP) $<

$(TARGETS): $($@.o)
        cc $@.o $(LLDLIBS) -o $@

при компоновке ругается на отсутствие объектного файла.

cc: ошибка: aaindex.o: Нет такого файла или каталога
Makefile:79: ошибка выполнения рецепта для цели «aaindex»

Т.е. правило %.o: %.c почему-то игнорируется.

P.S: собственно, сабж ftp://ftp.sgi.com/opengl/opengl12.tgz

★★★★

Последнее исправление: mutronix (всего исправлений: 1)

Я до конца не понимаю, почему происходит такая фигня, но по какой-то причине make предпочитает свои встроенные правила (в частности для %.o: %c).

Лечится добавлением в начало Makefile

.SUFFIXES:

P. S. нафига промежуточные объектные файлы?

%: %.c
	$(CC) -o $@ -I$(TOP) $^ $(LLDLIBS)

kawaii_neko ★★★★
()

Попробуй make aaindex.o

И/или поразбирай make -pn

anonymous
()

Погуглив хорошенько, нашёл как минимум два варианта:

  • В том русском переводе поищи: $$@
    Похоже, в SGI пользовлись не GNU make, а make из System V. Значит достаточно в оригинальном Makefile заменить всего одну строчку для использования статического шаблонного правила:
    --- Makefile		1999-10-04 21:45:16.000000000 +0200
    +++ Makefile.new	2016-04-20 01:36:19.597295864 +0200
    @@ -75,7 +75,7 @@ all: default
     .c.o:
     	cc -c -I/usr/include -I$(TOP) $<
     
    -$(TARGETS): $$@.o
    +$(TARGETS): %: %.o
     	cc $@.o $(LLDLIBS) -o $@
     
     $(IMAGING_SUBSET) : $$@.o readImage.o
    
  • Применить Secondary-Expansion:
    --- Makefile		1999-10-04 21:45:16.000000000 +0200
    +++ Makefile.new	2016-04-20 01:39:10.785288665 +0200
    @@ -75,6 +75,7 @@ all: default
     .c.o:
     	cc -c -I/usr/include -I$(TOP) $<
     
    +.SECONDEXPANSION:
     $(TARGETS): $$@.o
     	cc $@.o $(LLDLIBS) -o $@
    
    

И больше ничего не нужно менять (pattern rule в норме).

gag ★★★★★
()

Вариант третий: просто взять make 3.80 - тогда собирается без единого изменения: оказалось, что совместимость кое-как реализовали, из документации заметку убрали, а потом решили, что реализация не годится, но в доку на то же место заметку не вернули.

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

Спасибо. Почитаю ещё на эту тему на досуге.

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