% в моем make-файле не работает.
Я тестировал make-файл на Ubuntu 16.04 x64.
Мой код makefile таков:
Версия 1
CC=gcc
OBJ=main.o
TARGET:=main
.PHONY: clean
all : main
# ${OBJ}:%.o:%.c
%.i : %.c
$(info Preprocess: build main.i)
${CC} -E -o $@ $<
%.s : %.i
$(info Compile: build main.s)
${CC} -S -o $@ $<
%.o : %.s
$(info Assemble: build main.o)
${CC} -c -o $@ $<
main : main.o
$(info Link: build main.o)
${CC} -o $@ $^
clean:
rm -f *.o *.out *.s *.i *.asm *.map ${OBJ} main
запустите make, в терминале печатается сообщение:
gcc -c -o main.o main.c
Link: build main.o
gcc -o main main.o
Итак, запускается только последнее правило (main: main.o).
Первый шаг - это автоматически полученный код (gcc -c -o main.o main.c).
почему другие правила не работают 101
А потом я изменяю третьи правила, добавляю статический режим:
Версия 2
...
%.i : %.c
$(info Preprocess: build main.i)
${CC} -E -o $@ $<
%.s : %.i
$(info Compile: build main.s)
${CC} -S -o $@ $<
main.o : %.o : %.s
$(info Assemble: build main.o)
${CC} -c -o $@ $<
%: %.o
$(info Link: build main.o)
${CC} -o $@ $^
Тогда все правила вступят в силу, отобразить сообщение:
Preprocess: build main.i
gcc -E -o main.i main.c
Compile: build main.s
gcc -S -o main.s main.i
Assemble: build main.o
gcc -c -o main.o main.s
Link: build main.o
gcc -o main main.o
rm main.i
(зачем запускать "rm main.i"?)
Я снова изменяю makefile:
Версия 3
%.o:%.c
$(info build main.o)
${CC} -c -o $@ $<
main : main.o
$(info Link: build main.o)
${CC} -o $@ $^
Может работать правильно. Распечатать сообщение:
build main.o
gcc -c -o main.o main.c
Link: build main.o
gcc -o main main.o
Итак, почему версия 1 не может работать правильно?