nixp.ru v3.0

25 мая 2017,
четверг,
09:59:28 MSK

DevOps с компанией «Флант»
Fatal написал 14 февраля 2006 года в 18:23 (314 просмотра) Ведет себя как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.

Здравствуйте!

Как можно найти правило, по которому выполняется действие?

У меня есть makefile

KEYS := -g -Wall

LIBS := -L. -lmy

LIBNAME := libmy.a

all: ${LIBNAME} ${OUT}

%.out: %.o

${CXX} $^ ${KEYS} ${LIBS} ${F} -o $@

%.o: %.cxx

${CXX} -c $^

clean:

rm -rf *.o *.out *.core *.a

#

# CREATING MY LIBS

#

LIBFILES := mycstring.o

${LIBNAME}: ${LIBFILES}

ar cr $@ $^

ranlib $@

где переменные F и OUT задаются через параметры в gmake.

Я набираю в командной строке:

[18:47] ~/practise> gmake clean ; gmake OUT=t.out

rm -rf *.o *.out *.core *.a

g++ -c mycstring.cxx

ar cr libmy.a mycstring.o

ranlib libmy.a

g++ -c t.cxx

g++ t.o -g -Wall -L. -lmy -o t.out

rm t.o

и вы можете видеть действия, которые были выполнены.

Вопрос почему выполняется самое последнее действие rm t.o?

Я просматривал все шаблонные правила командой gmake -p но ничего похожего не было. Я могу его показать при вашем желании, сейчас его не копирую, так как он большой.

Fatal

И если можно, напишите где вы узнали ответ на этот вопрос.

rgo

t.o в данной ситуации выступает в роли промежуточного (intermediate) файла, и make его удаляет наплевав на рулесы.

ответ на вопрос написан в `info make’, а нашёл я его так:

$ make -d OUT=t.out | tail
Got a SIGCHLD; 1 unreaped children.
Live child 0x0807aef0 (t.out) PID 3660
Reaping winning child 0x0807aef0 PID 3660
Removing child 0x0807aef0 PID 3660 from chain.
  Successfully remade target file `t.out'.
 Finished prerequisites of target file `all'.
Must remake target `all'.
Successfully remade target file `all'.
Removing intermediate files...
rm t.o

собственно отсюда я узнал слово intermediate, и поискал его в index’е мануала make.

Fatal

большое спасибо!