make 以某种方式改变了配方而不是遵循 Makefile
make somehow changed the recipe and not following the Makefile
不知何故,make 没有遵循 makefile 而是自己生成了配方。将c源代码编译成.o的方法是:
@$(CC) $(CFLAGS) -ffreestanding -std=gnu99 -c -o $@ $< -I /usr/include/multiboot/ -nostdlib -I include
但不知何故,它变成了这样:
i686-elf-gcc -Wextra -Wall -O2 -s -Wno-int-to-pointer-cast -c -o cexpand.o cexpand.c
这导致编译器抱怨缺少一些头文件。此外,--trace 报告了这一点:
<builtin>: update target 'cexpand.o' due to: cexpand.c
现在,有什么办法可以阻止它这样做吗?
整个 Makefile:
//just incase someone asked, it's from my wip os NetDOS-32. Also, I'm not really an expert in Makefiles.
OBJ=$(patsubst %.c,%.o,$(wildcard *.c))
CC=i686-elf-gcc
CFLAGS=-Wextra -Wall -O2 -s -Wno-int-to-pointer-cast
NASM=nasm
NFLAGS=-felf32
LD=i686-elf-gcc
all: os.iso
os.iso:kernel.elf
-@mkdir -p isodir/boot/grub
@cp kernel.elf isodir/boot/kernel.elf
@cp grub.cfg isodir/boot/grub/grub.cfg
@sudo grub-mkrescue -o os.iso isodir
boot.o:boot.asm
@echo "[NASM($(NASM))] $<"
@$(NASM) -o $@ $< $(NFLAGS)
%.o:%.c mm/%.c font.h Makefile
@echo "[CC($(CC))] $<"
@$(CC) $(CFLAGS) -ffreestanding -std=gnu99 -c -o $@ $< -I /usr/include/multiboot/ -nostdlib -I include
kernel.elf:$(OBJ) boot.o
@echo "[LD($(LD))] $(OBJ) boot.o"
@$(LD) -Tlinker.ld -o $@ -ffreestanding -O2 -nostdlib boot.o $(OBJ) -lgcc $(CFLAGS)
clean:
-rm *.o *.elf
test: all
qemu-system-x86_64 -cdrom os.iso
您的规则如下所示:
%.o:%.c mm/%.c font.h Makefile
只有当所有先决条件都已经存在或可以创建时,模式规则才会适用。如果不是,则该规则不适用,make 将继续寻找另一个规则。在这种情况下,有 built-in 条匹配规则,它将使用这些规则。
因此,我的预期是对于 cexpand.o
目标,此模式规则不适用。很可能是因为文件 mm/cexpand.c
不存在。
不知何故,make 没有遵循 makefile 而是自己生成了配方。将c源代码编译成.o的方法是:
@$(CC) $(CFLAGS) -ffreestanding -std=gnu99 -c -o $@ $< -I /usr/include/multiboot/ -nostdlib -I include
但不知何故,它变成了这样:
i686-elf-gcc -Wextra -Wall -O2 -s -Wno-int-to-pointer-cast -c -o cexpand.o cexpand.c
这导致编译器抱怨缺少一些头文件。此外,--trace 报告了这一点:
<builtin>: update target 'cexpand.o' due to: cexpand.c
现在,有什么办法可以阻止它这样做吗?
整个 Makefile:
//just incase someone asked, it's from my wip os NetDOS-32. Also, I'm not really an expert in Makefiles.
OBJ=$(patsubst %.c,%.o,$(wildcard *.c))
CC=i686-elf-gcc
CFLAGS=-Wextra -Wall -O2 -s -Wno-int-to-pointer-cast
NASM=nasm
NFLAGS=-felf32
LD=i686-elf-gcc
all: os.iso
os.iso:kernel.elf
-@mkdir -p isodir/boot/grub
@cp kernel.elf isodir/boot/kernel.elf
@cp grub.cfg isodir/boot/grub/grub.cfg
@sudo grub-mkrescue -o os.iso isodir
boot.o:boot.asm
@echo "[NASM($(NASM))] $<"
@$(NASM) -o $@ $< $(NFLAGS)
%.o:%.c mm/%.c font.h Makefile
@echo "[CC($(CC))] $<"
@$(CC) $(CFLAGS) -ffreestanding -std=gnu99 -c -o $@ $< -I /usr/include/multiboot/ -nostdlib -I include
kernel.elf:$(OBJ) boot.o
@echo "[LD($(LD))] $(OBJ) boot.o"
@$(LD) -Tlinker.ld -o $@ -ffreestanding -O2 -nostdlib boot.o $(OBJ) -lgcc $(CFLAGS)
clean:
-rm *.o *.elf
test: all
qemu-system-x86_64 -cdrom os.iso
您的规则如下所示:
%.o:%.c mm/%.c font.h Makefile
只有当所有先决条件都已经存在或可以创建时,模式规则才会适用。如果不是,则该规则不适用,make 将继续寻找另一个规则。在这种情况下,有 built-in 条匹配规则,它将使用这些规则。
因此,我的预期是对于 cexpand.o
目标,此模式规则不适用。很可能是因为文件 mm/cexpand.c
不存在。