[时间戳] 我的第一个 Makefile!
# Makefile for my operating system - A0 - ! ALL : os.iso obj/boot.o : ../src/boot.s mkdir obj i686-elf-as ../src/boot.s -o obj/boot.o obj/kernel.o : ../src/kernel.cpp i686-elf-g++ -c ../src/kernel.cpp -o obj/kernel.o -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti obj/os.bin : ../src/linker.ld obj/boot.o obj/kernel.o i686-elf-gcc -T ../src/linker.ld -o obj/os.bin -ffreestanding -O2 -nostdlib obj/boot.o obj/kernel.o -lgcc os.iso : obj/os.bin mkdir -p iso/boot/grub cp obj/os.bin iso/boot/os.bin cp ../src/grub.cfg iso/boot/grub/grub.cfg grub-mkrescue -o os.iso iso clean : -rm -rf obj -rm -rf *.iso -rm -rf iso .PHONY : clean ALL
尽管有点 verbose。
输出:
zxp4@ZXPRISM:~/my_projects/cpp/os-a0/build$ make mkdir obj i686-elf-as ../src/boot.s -o obj/boot.o i686-elf-g++ -c ../src/kernel.cpp -o obj/kernel.o -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti i686-elf-gcc -T ../src/linker.ld -o obj/os.bin -ffreestanding -O2 -nostdlib obj/boot.o obj/kernel.o -lgcc mkdir -p iso/boot/grub cp obj/os.bin iso/boot/os.bin cp ../src/grub.cfg iso/boot/grub/grub.cfg grub-mkrescue -o os.iso iso xorriso 1.5.4 : RockRidge filesystem manipulator, libburnia project. Drive current: -outdev 'stdio:os.iso' Media current: stdio file, overwriteable Media status : is blank Media summary: 0 sessions, 0 data blocks, 0 data, 950g free Added to ISO image: directory '/'='/tmp/grub.RyB9Kj' xorriso : UPDATE : 294 files added in 1 seconds Added to ISO image: directory '/'='/home/zxp4/my_projects/cpp/os-a0/build/iso' xorriso : UPDATE : 298 files added in 1 seconds xorriso : NOTE : Copying to System Area: 512 bytes from file '/usr/lib/grub/i386-pc/boot_hybrid.img' ISO image produced: 2478 sectors Written to medium : 2478 sectors at LBA 0 Writing to 'stdio:os.iso' completed successfully.
以及,经过 ChatGPT 润色 + 个人修改后的新版本:
# Makefile for my operating system - A0 - ! ALL : os.iso ASM_FILES := $(shell find ../src -name "*.s") CPP_FILES := $(shell find ../src -name "*.cpp") OBJ_FILES := $(patsubst ../src/%.s, obj/%.o, $(ASM_FILES)) $(patsubst ../src/%.cpp, obj/%.o, $(CPP_FILES)) obj/%.o : ../src/%.s mkdir -p $(dir $@) i686-elf-as $< -o $@ obj/%.o : ../src/%.cpp mkdir -p $(dir $@) i686-elf-g++ -c $< -o $@ -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti obj/os.bin : ../src/linker.ld $(OBJ_FILES) i686-elf-gcc -T ../src/linker.ld -o $@ -ffreestanding -O2 -nostdlib $(OBJ_FILES) -lgcc os.iso : obj/os.bin ../src/grub.cfg mkdir -p iso/boot/grub cp obj/os.bin iso/boot/os.bin cp ../src/grub.cfg iso/boot/grub/grub.cfg grub-mkrescue -o $@ iso clean : -rm -rf obj -rm -rf *.iso -rm -rf iso .PHONY : clean ALL
学到了新知识:
- 使用通配符简化重复工作
- 使用 shell 和内置函数扩展 make 的功能
感觉写起来比 CMake 舒服。。大概是因为 make 给了更多自由发挥的空间吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理