我需要执行
第一个月
但是会有错误make: *** No rule to make target 'build/iso', needed by 'build/menghanOS.ios'. Stop.
个
我糊涂了
当我检查makefile文件时,我发现
BUILD_DIR := build
BIN_DIR := $(BUILD_DIR)/bin
ISO_DIR := $(BUILD_DIR)/iso
ISO_BOOT_DIR := $(IOS_DIR)/boot
IOS_GRUB_DIR := $(ISO_BOOT_DIR)/grub
OS_NAME = menghanOS
OS_BIN = $(OS_NAME).bin
OS_ISO = $(OS_NAME).ios
$(BUILD_DIR)/$(OS_ISO): $(ISO_DIR) $(BIN_DIR)/$(OS_BIN) GRUB_TEMPLATE
@./config-grub.sh ${OS_NAME} > $(ISO_GRUB_DIR)/grub.cfg
@cp $(BIN_DIR)/$(OS_BIN) $(ISO_BOOT_DIR)
@grub-mkrescue -o $(BUILD_DIR)/$(OS_ISO) $(ISO_DIR)
all: clean $(BUILD_DIR)/$(OS_ISO)
clean:
@rm -rf $(BUILD_DIR)
字符串
也许这里有问题
GRUB_TEMPLATE:
timeout=0
menuentry "$_OS_NAME" {
multiboot /boot/$_OS_NAME.bin
}
型
config-grub.sh:
export _OS_NAME=$1
cat GRUB_TEMPLATE | envsubst > "$2"
型
此外,makefile文件的权限如下:
-rwxrwxrwx 1 root root 1934 Jul 16 16:20 makefile*
型
我需要知道为什么会发生这样的错误
1条答案
按热度按时间6ovsh4lw1#
错误消息涉及两个目标
build/iso
和build/menghanOS.ios
。后者对应于$(BUILD_DIR)/$(OS_ISO)
,即第一个规则的目标。前者对应于$(ISO_DIR)
,这是第一个规则的先决条件之一。make
显然被要求构建build/menghanOS.ios
,也许是因为它是默认目标。为此,它必须确保该目标的所有先决条件都是最新的。错误消息表明build/iso
不存在,在这种情况下,make
期望有一个针对该目标的规则(可能是为了创建它),但makefile中没有这样的规则。make
随后终止并返回错误,因为无法满足build/menghanOS.ios
的先决条件。makefile似乎假设构建
build/iso
有一个规则,大概是这样的:字符串
添加该或等效项应可解决此特定问题。
旁注:将
clean
作为先决条件包含在all
目标中是一种糟糕的形式,而且可能会适得其反。而且提供一个all
目标也不是默认目标也是非常规的。大多数熟悉make
的人都希望make all
具有与裸make
相同的效果,至少如果前者具有任何有用的效果,但这些将对您的makefile产生不同的效果。就目前情况而言,makefile不太可能可靠地与并行make
一起工作。如果你想为一个干净的构建提供一个目标,那么就给它起一个别的名字,并对它进行结构化,以确保所有的清理都在任何构建之前完成。或者另一方面,输入make clean; make all
到底有多难?