【发布时间】:2017-10-20 19:28:26
【问题描述】:
我正在为一个爱好 OS 项目编写脚本。在使用脚本时,我注意到(几乎)同一个变量的两个不同的变量扩展会产生不同的结果(即使它们“直接”放置在彼此之后)。我将提供 makefile 的重要部分以及运行时的结果。
生成文件:
####################
# KERNEL #
####################
.PHONY: kernel
KERNEL_OBJS = $(patsubst %.c,%.o,$(wildcard kernel/*.c))
KERNEL_OBJS += $(patsubst %.asm,%.o,$(wildcard kernel/*.asm))
KERNEL_OBJS += $(DRIVER_OBJS)
KERNEL_NAME = kernel32.elf
kernel: $(KERNEL_OBJS)
@echo $^
@echo $(KERNEL_OBJS)
####################
# DRIVERS #
####################
.PHONY: drivers
DRIVER_OBJS := $(patsubst %.c,%.o,$(wildcard drivers/*/*.c))
Makefile 以下列方式通过终端执行(GNU Make 4.2.1):
make kernel
这会产生以下结果:
kernel/kmain.o kernel/boot.o
kernel/kmain.o kernel/boot.o drivers/vga/vga.o
输出线当然来自内核配方中的两条“回声线”。值得一提的是,此代码-sn-p 中使用的所有变量都在here and only here在其他较大的make-script中使用。两个常规后缀规则用于构建KERNEL_OBJS,但无论如何它们都不应该改变这里的输出。除了后缀规则之外,这个 sn-p 及其变量与脚本的其余部分完全分开。
任何想法为什么两个变量扩展不同?你的,米凯尔。
【问题讨论】: