如何将Linux Makefile转换为Windows兼容版本?
Windows 10 下兼容的 Makefile 转换方案
问题说明
我对Makefile了解不多,现有一个可在Linux下运行的Makefile(不清楚具体发行版),使用Windows 10,需要一个功能完全一致的Windows版Makefile(文件夹路径及名称均相同)。曾尝试让ChatGPT转换但未成功,自己也无法完成转换。原Linux Makefile内容如下:
ASM=nasm CC=gcc SRC_DIR=src TOOLS_DIR=tools BUILD_DIR=build .PHONY: all floppy_image kernel bootloader clean always tools_fat all: floppy_image tools_fat # # Floppy image # floppy_image: $(BUILD_DIR)/main_floppy.img $(BUILD_DIR)/main_floppy.img: bootloader kernel dd if=/dev/zero of=$(BUILD_DIR)/main_floppy.img bs=512 count=2880 mkfs.fat -F 12 -n "NBOS" $(BUILD_DIR)/main_floppy.img dd if=$(BUILD_DIR)/bootloader.bin of=$(BUILD_DIR)/main_floppy.img conv=notrunc mcopy -i $(BUILD_DIR)/main_floppy.img $(BUILD_DIR)/kernel.bin "::kernel.bin" mcopy -i $(BUILD_DIR)/main_floppy.img test.txt "::test.txt" # # Bootloader # bootloader: $(BUILD_DIR)/bootloader.bin $(BUILD_DIR)/bootloader.bin: always $(ASM) $(SRC_DIR)/bootloader/boot.asm -f bin -o $(BUILD_DIR)/bootloader.bin # # Kernel # kernel: $(BUILD_DIR)/kernel.bin $(BUILD_DIR)/kernel.bin: always $(ASM) $(SRC_DIR)/kernel/main.asm -f bin -o $(BUILD_DIR)/kernel.bin # # Tools # tools_fat: $(BUILD_DIR)/tools/fat $(BUILD_DIR)/tools/fat: always $(TOOLS_DIR)/fat/fat.c mkdir -p $(BUILD_DIR)/tools $(CC) -g -o $(BUILD_DIR)/tools/fat $(TOOLS_DIR)/fat/fat.c # # Always # always: mkdir -p $(BUILD_DIR) # # Clean # clean: rm -rf $(BUILD_DIR)/*
前置准备
在Windows 10上需要先搭建兼容环境:
- 安装MSYS2或MinGW-w64,确保以下工具可在终端调用:
nasm:汇编器gcc:C编译器dd:文件复制工具mkfs.fat:FAT文件系统格式化工具(需安装dosfstools包)mcopy:FAT镜像文件操作工具(需安装mtools包)
转换后的Windows版Makefile
ASM=nasm CC=gcc SRC_DIR=src TOOLS_DIR=tools BUILD_DIR=build .PHONY: all floppy_image kernel bootloader clean always tools_fat all: floppy_image tools_fat # # Floppy image # floppy_image: $(BUILD_DIR)/main_floppy.img $(BUILD_DIR)/main_floppy.img: bootloader kernel dd if=/dev/zero of=$(BUILD_DIR)/main_floppy.img bs=512 count=2880 mkfs.fat -F 12 -n "NBOS" $(BUILD_DIR)/main_floppy.img dd if=$(BUILD_DIR)/bootloader.bin of=$(BUILD_DIR)/main_floppy.img conv=notrunc mcopy -i $(BUILD_DIR)/main_floppy.img $(BUILD_DIR)/kernel.bin "::kernel.bin" mcopy -i $(BUILD_DIR)/main_floppy.img test.txt "::test.txt" # # Bootloader # bootloader: $(BUILD_DIR)/bootloader.bin $(BUILD_DIR)/bootloader.bin: always $(ASM) $(SRC_DIR)/bootloader/boot.asm -f bin -o $(BUILD_DIR)/bootloader.bin # # Kernel # kernel: $(BUILD_DIR)/kernel.bin $(BUILD_DIR)/kernel.bin: always $(ASM) $(SRC_DIR)/kernel/main.asm -f bin -o $(BUILD_DIR)/kernel.bin # # Tools # tools_fat: $(BUILD_DIR)/tools/fat.exe $(BUILD_DIR)/tools/fat.exe: always $(TOOLS_DIR)/fat/fat.c if not exist $(BUILD_DIR)/tools mkdir $(BUILD_DIR)/tools $(CC) -g -o $(BUILD_DIR)/tools/fat.exe $(TOOLS_DIR)/fat/fat.c # # Always # always: if not exist $(BUILD_DIR) mkdir $(BUILD_DIR) # # Clean # clean: if exist $(BUILD_DIR) rd /s /q $(BUILD_DIR) mkdir $(BUILD_DIR)
关键修改说明
- 目录创建:将Linux的
mkdir -p替换为Windows原生的if not exist <dir> mkdir <dir>,避免路径不存在时报错 - 工具编译输出:Windows下可执行文件需带
.exe后缀,因此将$(BUILD_DIR)/tools/fat改为$(BUILD_DIR)/tools/fat.exe - 清理命令:将Linux的
rm -rf替换为Windows的rd /s /q,强制删除目录及所有内容,之后重建空的BUILD_DIR - 核心命令兼容:
dd、mkfs.fat、mcopy在MSYS2/MinGW环境下语法与Linux一致,无需修改
内容的提问来源于stack exchange,提问作者rumixist
相关产品推荐
相关产品推荐

