pintos项目是在大二下的时候学习操作系统时的实验课项目,由于当时学业压力大,根本没时间去仔细地了解Linux。
因此在这个时候重新来学习,先从这个makefile来学习,因为Makefile是linux下大型项目的一个编译工具,希望自己具备这样的能力。
那么先回忆一下,在Pintos的测试中是进入路径
pintos/src/threads/build
下输入make 命令,然后再输入 make check 命令来测试,输入 make clean 来清空之前编译的结果的。
那么这个目录下的Makefile应该是一个总的Makefile了,看看这个Makefile里面的内容,一点一点来解析吧!
# -*- makefile -*-
SRCDIR = ../..
#所有存放源文件的目录,也就是 pintos/src/
all: kernel.bin loader.bin
#这个all是标签,Makefile中的第一个目标会被作为其默认目标,由于伪目标的特性是,总是被执行的,
#所以其依赖的 kernel.bin loader.bin 就总是不如“all”这个目标新。所以,这2个二进制文件总会更新
include ../../Make.config
include ../Make.vars
include ../../tests/Make.tests
这个是Makefile的前面几行,all是个标签,输入命令 make all 的话就会运行 kernel.bin loader.bin 这2个程序
然后看到 include 了一个文件,去看看 pintos/src/Make.config
那么对3个这Makefile的文件的解析我都写在这里了:
首先是../../Make.config:
# -*- makefile -*-
SHELL = /bin/sh
#指定使用的shell
VPATH = $(SRCDIR)
#特殊变量 VPATH 指定文件的查找路径
# Binary utilities.
# If the host appears to be x86, use the normal tools.
# If it's x86-64, use the compiler and linker in 32-bit mode.
# Otherwise assume cross-tools are installed as i386-elf-*.
X86 = i.86\|pentium.*\|[pk][56]\|nexgen\|viac3\|6x86\|athlon.*\|i86pc
# .*是模糊匹配,\|是管道的转义
X86_64 = x86_64
# Pintos doesn't compile/run properly using gcc 4.3+. Force 4.1 for now.
# 这句话的意思大概是 必须是4.1版本的gcc 才可以正常编译
CCPROG = /usr/class/cs140/x86_64/bin/i586-elf-gcc
ifeq ($(strip $(shell command -v $(CCPROG) 2> /dev/null)),)
#strip函数:功能:去掉<string>字串中开头和结尾的空字符。返回被去掉空格的字符串值。
#如果strip这个函数返回为空的话
#strip是函数名, 函数参数是 $(shell command -v $(CCPROG) 2> /dev/null) ,单独的一个变量
#参考博客: http://www.cnblogs.com/bethal/p/5430229.html
# 这个函数会新生成一个Shell程序来执行命令
CCPROG = gcc
endif
ifneq (0, $(shell expr `uname -m` : '$(X86)'))
CC = $(CCPROG)
LD = ld
OBJCOPY = objcopy
else
ifneq (0, $(shell expr `uname -m` : '$(X86_64)'))
CC = $(CCPROG) -m32
LD = ld -melf_i386
OBJCOPY = objcopy
else
CC = i386-elf-gcc
LD = i386-elf-ld
OBJCOPY = i386-elf-objcopy
endif
endif
ifeq ($(strip $(shell command -v $(CC) 2> /dev/null)),)
$(warning *** Compiler ($(CC)) not found. Did you set $$PATH properly? Please refer to the Getting Started section in the documentation for details. ***)
en