LINUX.ORG.RU

Вопрос по Makefile

 


0

2

У меня возник небольшой вопрос по Makefile. Условный пример (в реальности всё не так, но это минимальный пример, когда проявляется проблема):

SOURCES=$(wildcard *.c)
HEADERS=$(wildcard *.h)

EXECUTABLE=build/test.elf

OBJECTS=$(foreach SOURCE,$(SOURCES),build/$(SOURCE:.c=.o))

all: build $(EXECUTABLE)

build:
	mkdir -p build

%.o: %.c $(HEADERS)
	$(CC) -c -o $@ $<

%.elf: $(OBJECTS)
	$(CC) -o $@ $(OBJECTS)

clean:
	rm -rfv build

В каталоге сборки у нас лежит один-единственный main.c для теста.

Допустим, я хочу складывать все объектные и бинарные файлы в подкаталог build, чтобы не засорять дерево исходников. В итоге получаю:

$ make
mkdir -p build
make: *** Нет правила для сборки цели «build/test.elf», требуемой для «all».  Останов.

Если убрать добавление build/ ко всем именам объектных файлов, то всё работает. А я таки хочу добавлять. Что мне делать?

★★★★★
Ответ на: комментарий от Eddy_Em

Проблему решает:

...
OBJECTS = $(addprefix build/,$(SOURCES:.c=.o))
...
build/%.o: %.c $(HEADERS)
...
build/%.elf: $(OBJECTS)
...

Окей. А что если я при этом ещё и не хочу повторять структуру каталогов в build.

То есть мне нужно что-то типа:

OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(SOURCES:.c=.o)))

А так опять Makefile ломается. Как это исправить?

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

Кое-как пришёл к такому:

SOURCES=main.c dir/main2.c

EXECUTABLE=build/test.elf

OBJECTS=$(addprefix build/,$(notdir $(SOURCES:.c=.o)))

all: build $(EXECUTABLE)

build:
	mkdir -p build

$(OBJECTS) : build/%.o : %.c
	$(CC) -c -o $@ $<

%.elf: $(OBJECTS)
	$(CC) -o $@ $(OBJECTS)

clean:
	rm -rfv build

(существует два каких-то исходника - main.c и dir/main2.c).

В итоге имею ошибку:

$ make
cc -c -o build/main.o main.c
make: *** Нет правила для сборки цели «main2.c», требуемой для «build/main2.o».  Останов.
KivApple ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.