Вопрос знатокам make и makefiles

User avatar
Privet
Администратор
Posts: 17199
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Вопрос знатокам make и makefiles

Post by Privet »

Имеется makefile (См. код ниже)
В этой же директории есть файл a.c

После отработки make ожидаем c.exe
(Не ищите смысла в этих действиях)

Логика работы:
1. Первое правило определяет как из любого .c файла получить .o
Это правило создаёт файл а.о
Работает

2. Второе правило описывает как из $(OBJS) получить $(EXTRAOBJ)
Т.е. создали .o, теперь на их основе создаём дополнительные .o
В данном случае, как из a.o получaем b.o
Работает

3. Третье правило это попытка описать как получить $(PROG) из $(OBJS) и $(EXTRAOBJ)
В данном случае я ожидаю получить c.exe из а.о и b.o
Не работает :х

Code: Select all

OBJS = a.o
EXTRAOBJ = b.o
PROG = c.exe

## Creating a.o
%.o : %.c
   @echo "## Creating a.o"
   @echo $< > $@

## Creating b.o
$(EXTRAOBJ) : $(OBJS)
   @echo "## Creating b.o"
   @echo $(OBJS) > b.o

## Creating c.exe
$(PROG) : $(OBJS) $(EXTRAOBJ)
   @echo "## Creating c.exe"
   @echo $(OBJS) $(EXTRAOBJ) > $(PROG)

clean:
   $(RM) $(PROG)
   $(RM) $(OBJS)
   $(RM) $(EXTRAOBJ)


Как описать правило создания $(PROG) после того, как созданы $(OBJS) и $(EXTRAOBJ)

P.S. $(OBJS) и $(EXTRAOBJ) могут содержать несколько файлов.
Привет.
User avatar
Privet
Администратор
Posts: 17199
Joined: 03 Jan 1999 10:01
Location: Redmond, WA

Post by Privet »

Смена порядка описания правил (перенос последнего на первое место) позволяет получить ожидаемый результат.
Проблема только в том, что в реале правила описаны в разных файлах и привило создания .exe стоит после include, которое всасывает файл с описанием остальных правил.
Есть из этого выход?

Code: Select all

OBJS = a.o 
EXTRAOBJ = b.o
PROG = c.exe

## Creating c.exe
$(PROG) : $(OBJS) $(EXTRAOBJ)
   @echo "## Creating c.exe"
   @echo $(OBJS) $(EXTRAOBJ) > $(PROG)

## Creating a.o
%.o : %.c
   @echo "## Creating a.o"
   @echo $< > $@

## Creating b.o
$(EXTRAOBJ) : $(OBJS)
   @echo "## Creating b.o"
   @echo $(OBJS) > b.o

clean:
   $(RM) $(PROG)
   $(RM) $(OBJS)
   $(RM) $(EXTRAOBJ)
Привет.
IrSz
Posts: 14
Joined: 14 Feb 2003 04:51
Location: Canada, Toronto

Re: Вопрос знатокам make и makefiles

Post by IrSz »

Работает если поменять местами $(PROG) и $(EXTRAOBJ)
Код выглядит так

OBJS = a.o
EXTRAOBJ = b.o
PROG = c.exe

## Creating a.o
%.o : %.c
echo "## Creating a.o"
echo $< > $@

## Creating c.exe
$(PROG) : $(OBJS) $(EXTRAOBJ)
echo "## Creating c.exe"
echo $(OBJS) $(EXTRAOBJ) > $(PROG)

## Creating b.o
$(EXTRAOBJ) : $(OBJS)
echo "## Creating b.o"
echo $(OBJS) > b.o


clean:
$(RM) $(PROG)
$(RM) $(OBJS)
$(RM) $(EXTRAOBJ)
ig
Уже с Приветом
Posts: 491
Joined: 09 Apr 2000 09:01
Location: Tigard, OR

Post by ig »

1. Вызывать : make c.exe
2. Создать еще один makefile с первым правилом для $(PROG) и include-ом для первоначального файла после (с возможной заменой ':' на '::' если правило в обоих файлах)

В makefile первая таргет (default goal) вызывается по умолчанию (как в #2) и может быть изменена при вызове (как в #1).
ig
Уже с Приветом
Posts: 491
Joined: 09 Apr 2000 09:01
Location: Tigard, OR

Post by ig »

Если есть возможность редактировать исходный файл, то самой простой выход - вставить первым правило типа:

all : $(PROG)

Если изменить файл нельзя, тогда создать файл типа:
#
PROG=c.exe

all : $(PROG)

include исходный_makefile
#

и вызывать новый makefile:
make -f имя_нового_makefile

Return to “Вопросы и новости IT”