[时间戳] 我的第一个 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 给了更多自由发挥的空间吧。

posted @   ZXPrism  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示