LINUX.ORG.RU

Makefile не собирается по шаблонному правилу


0

0

Должно сработать шаблонное правило, когда не указаны команды для сборки:
%: %.cpp
#  commands to execute (built-in):
        $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@

<b>helloworld.cpp</b>
#include <iostream>

int main(int argc, char ** argv)
{
	std::cout << "Hello, World!" << std::endl;
	return 0;
}

<b>Makefile</b>
OUTPUTFILE=hello
INSTALLDIR=bin

.PHONY: all
all: $(OUTPUTFILE)

$(OUTPUTFILE): helloworld.cpp
	
.PHONY: install
install:
	mkdir -p bin
	cp -p hello bin/
	
.PHONY: clean
clean:
	rm -f hello

$ make
make: Nothing to be done for `all'.
$ touch helloworld.cpp
$ echo "shit" >> helloworld.cpp
$ make
make: Nothing to be done for `all'.

Что я делаю не так?

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

Ты же не написал команд для получения $(TARGET) из helloworld.cpp

make видит, что надо пересобрать файл, составляет список команд, который получается пустой, и честно тебе говорит, что для цели "all" не требуется выполнения команд.

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

>make видит, что надо пересобрать файл, составляет список команд, который получается пустой, и честно тебе говорит, что для цели "all" не требуется выполнения команд.

В книжке написано, что "make знает, как собирать исполняемый файл hello из исходного файла helloworld.cpp без явного указания. Все шаблоны можно посмотреть через $ make -p". Кому верить?

HappyCoder
() автор топика

замени OUTPUTFILE=hello на OUTPUTFILE=helloworld

anonymous
()

CFLAGS=-g -Wformat LDLIBS=-lm

all : hello

hello : hello.o

.PHONY: install clean

и так далее

вы видимо переусердствовали с целью .PHONY - в ней перечисляются действия не образующие файлов

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

В make -p написано:
%: %.cpp
#  команды, которые следует выполнить (встроенные):
        $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@

т.е. надо чтобы имена совпадали. У тебя они не совпадают, поэтому правило не применяется.

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

С PHONY и без - не работает :(

===============================================
$ make
make: Nothing to be done for `all'.
$ touch helloworld.cpp
$ make
make: Nothing to be done for `all'.
$ echo "changes" >> helloworld.cpp
$ make
make: Nothing to be done for `all'.
$ cat Makefile
OUTPUTFILE=helloworld
INSTALLDIR=bin

all: $(OUTPUTFILE)

$(OUTPUTFILE): helloworld.cpp

.PHONY: install
install:
mkdir -p bin
cp -p hello bin/

.PHONY: clean
clean:
rm -f hello
===============================================

make helloworld выдаёт "'helloworld' is up to date"

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

Его даже не существовало. То есть ни разу не был собран.

$ ls -a
.
..
bin
helloworld.cpp
Makefile

$ make -v
GNU Make 3.81
This program built for x86_64-pc-linux-gnu

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

Хм.. Вообще оказалось, что вся беда из-за ложных \t не там где надо :(

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