C语言 使用makefile生成iso文件有一些问题

yuvru6vn  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(158)

我需要执行
第一个月
但是会有错误
make: *** No rule to make target 'build/iso', needed by 'build/menghanOS.ios'. Stop.
我糊涂了
当我检查makefile文件时,我发现

  1. BUILD_DIR := build
  2. BIN_DIR := $(BUILD_DIR)/bin
  3. ISO_DIR := $(BUILD_DIR)/iso
  4. ISO_BOOT_DIR := $(IOS_DIR)/boot
  5. IOS_GRUB_DIR := $(ISO_BOOT_DIR)/grub
  6. OS_NAME = menghanOS
  7. OS_BIN = $(OS_NAME).bin
  8. OS_ISO = $(OS_NAME).ios
  9. $(BUILD_DIR)/$(OS_ISO): $(ISO_DIR) $(BIN_DIR)/$(OS_BIN) GRUB_TEMPLATE
  10. @./config-grub.sh ${OS_NAME} > $(ISO_GRUB_DIR)/grub.cfg
  11. @cp $(BIN_DIR)/$(OS_BIN) $(ISO_BOOT_DIR)
  12. @grub-mkrescue -o $(BUILD_DIR)/$(OS_ISO) $(ISO_DIR)
  13. all: clean $(BUILD_DIR)/$(OS_ISO)
  14. clean:
  15. @rm -rf $(BUILD_DIR)

字符串
也许这里有问题
GRUB_TEMPLATE:

  1. timeout=0
  2. menuentry "$_OS_NAME" {
  3. multiboot /boot/$_OS_NAME.bin
  4. }


config-grub.sh:

  1. export _OS_NAME=$1
  2. cat GRUB_TEMPLATE | envsubst > "$2"


此外,makefile文件的权限如下:

  1. -rwxrwxrwx 1 root root 1934 Jul 16 16:20 makefile*


我需要知道为什么会发生这样的错误

6ovsh4lw

6ovsh4lw1#

错误消息涉及两个目标build/isobuild/menghanOS.ios。后者对应于$(BUILD_DIR)/$(OS_ISO),即第一个规则的目标。前者对应于$(ISO_DIR),这是第一个规则的先决条件之一。
make显然被要求构建build/menghanOS.ios,也许是因为它是默认目标。为此,它必须确保该目标的所有先决条件都是最新的。错误消息表明build/iso不存在,在这种情况下,make期望有一个针对该目标的规则(可能是为了创建它),但makefile中没有这样的规则。make随后终止并返回错误,因为无法满足build/menghanOS.ios的先决条件。
makefile似乎假设构建build/iso有一个规则,大概是这样的:

  1. $(ISO_DIR):
  2. mkdir -p $@

字符串
添加该或等效项应可解决此特定问题。
旁注:将clean作为先决条件包含在all目标中是一种糟糕的形式,而且可能会适得其反。而且提供一个all目标也不是默认目标也是非常规的。大多数熟悉make的人都希望make all具有与裸make相同的效果,至少如果前者具有任何有用的效果,但这些将对您的makefile产生不同的效果。就目前情况而言,makefile不太可能可靠地与并行make一起工作。如果你想为一个干净的构建提供一个目标,那么就给它起一个别的名字,并对它进行结构化,以确保所有的清理都在任何构建之前完成。或者另一方面,输入make clean; make all到底有多难?

相关问题