make hello 的话只编写翻译 hello.cpp,这么些是用来提供该子目录makefile(sub

在条分缕析基础运营进度的./arch/arm/Makefile文件里超过了那样字段

 

162  export TEXT_OFFSET GZFLAGS MMUEXT  

说一下LINUX下的Makefile,直接依照实际蒙受的Makefile进行解读:

然后在子目录arch/arm/kernel/vmlinux.lds文件中又用到了TEXT_OFFSET 

当make的对象为all时,-C $(KDILX570)
指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)
申明然后重回到当前目录继续读入、施行业前的Makefile。

24    . = PAGE_OFFSET + TEXT_OFFSET;                 

例子:

    

all : hello another

上网一查export才知道:

hello : hello.cpp

这几个是用来提供该子目录makefile(sub
make)中寻访的,同一流的别的二个makefile中,是不能够访问/获得的。

g++ -o $@ $<

(可以通过makefile中存放变量MAKELEVEL查看得知当前makefile的levlel)

another : another.cpp
g++ -o $@ $<

好端端用法如下:

make后边不加参数的话,会把第一个指标作为默许的


直白 make 或 make all 的话会推行 hello.cpp 和 another.cpp 的编写翻译命令
make hello 的话只编写翻译 hello.cpp
make another 的话只编写翻译 another.cpp

carifan_TopMake=E516537_in_top_make
export carifan_TopMake                  
                                      //在目的外界export              
  
focus_bfin:
echo current make
MAKELEVEL=$(MAKELEVEL)
echo
*****************test Value in Top
Makefile=$(carifan_TopMake)         
make -f main.mak PLATFORM=Bfin
PRODUCT=Focus MAKE_TARGET=focus_bfin

####################################################################################################################
在Makefile中我们平常看到 = := ?=
+=那一个赋值运算符,那么她们有哪些界别吧?我们来做个简单的实验


新建二个Makefile,内容为:
ifdef DEFINE_VRE
VRE = “Hello World!”
else
endif

 

ifeq ($(OPT),define)
VRE ?= “Hello World! First!”
endif

若export在对象内部使用,那样经过echo将会打出空符号”test
Value in Top Makefile=  “

ifeq ($(OPT),add)
VRE += “Kelly!”
endif

 

ifeq ($(OPT),recover)
VRE := “Hello World! Again!”
endif

(详细链接:http://blog.csdn.net/a1232345/article/details/42112881)

all:
@echo $(VRE)

 

敲入以下make命令:
make DEFINE_VRE=true OPT=define 输出:Hello World!
make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover 输出:Hello World! Again!
make DEFINE_VRE= OPT=define 输出:Hello World! First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!

从上边的结果中大家得以领略的观看她们的区分了
= 是最基本的赋值
:= 是覆盖在此之前的值
?= 是一旦未有被赋值过就予以等号前边的值
+= 是增添等号前边的值

事先平素纠结makefile中“=”和“:=”的区分到底有何不相同,因为给变量赋值时,八个暗记都在利用。网络搜了一下,有人给出驾驭答,然则自个儿蠢笨,看不懂什么看头。几寻无果之下,也就放下了
。后日看一篇博客,无意中窥见作者对于那一个主题素材做了很好的解答。消除难点之余不免惊讶,不常候给个例子不就知道了啊?为何非要说得那么学术呢。^_^

1、“=”

make会将全部makefile张开后,再决定变量的值。也正是说,变量的值将会是一切makefile中最后被钦点的值。看例子:

x = foo
y = $(x) bar
x = xyz

在上例中,y的值将会是 xyz bar ,并不是 foo bar 。

2、“:=”

“:=”表示变量的值决定于它在makefile中的地点,并非整个makefile展开后的末段值。

x := foo
y := $(x) bar
x := xyz

在上例中,y的值将会是 foo bar ,并非 xyz bar 了。
PHONY := __build
#导致__build是二个假目的,不要有依赖(无需make后带标号),前面包车型大巴法规也会奉行

include Makefile
#因为Makefile中有obj-y,obj-y知道要编写翻译哪些文件,也正是领略obj-y等于什么,所以包涵进来
# obj-y := a.o b.o c/ d/
# $(filter %/, $(obj-y)) : 保留符合格式的事物,也正是保留c/ d/
# patsubst %/,%,$(filter %/, $(obj-y)) 在变量$(filter %/,
$(obj-y))中找到%/用%替换%/,即找到c/ d/用c d替换,那么__subdir-y
就等于 c d
# subdir-y : c d subdir-y 纯粹的目录名

subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)
#把变量$(subdir-y)里的每二个成员改成c/built-in.o那样的款式,subdir_objs变量等于x/built-in.o(的款式)但不是生成该格局的文书(来变成该文件之中有内容)
#即定义了变量而未有初步化,有这么些名字能够开展引用
# a.o b.o
cur_objs := $(filter-out %/, $(obj-y))
#在$(obj-y)中找到%/,然后扔掉,保留下去的恰恰是a.o b.o

__build : $(subdir-y) built-in.o
//依赖于子目录(步向子目录实践子目录的makefile),依赖于当前目录下的built-in.o

$(subdir-y):
make -C $@ -f $(TOPDIR)/Makefile.build
#$@ 代表输出目的文件 -f走入子目录 使用顶层的Makefile.build来编写翻译
built-in.o : $(cur_objs) $(subdir_objs)
$(LD) -r -o $@ $^
#把全部.o文件链接起来

dep_file = .$@.d
#用到dep_file时才会赋值,当时就赋值.$@.d根本就不通晓是怎么事物
%.o : %.c
$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<
#-c 链接
.PHONY : $(PHONY)
#.PHONY 的借助是假象目的,make无条件的实行它命令,即__build:
$(subdir-y): 下的吩咐(准绳)无条件试行

export TOP_DIR=$(shell pwd)
#通过export导出该变量,供后续编写翻译别的一些代码所采取,如通过在uboot中配备好,然后export出来给后续的kernel,drivers等部分编写翻译的时候利用

export HI_SDK?=Hi3518_SDK_V1.0.9.0
#在(parent,上层的)makefile中export出来变量,子makefile(sub
make)中,是足以访谈的。

export OSDRV_DIR=$(TOP_DIR)/$(SDK_VERSION)/osdrv
export OSDRV_CROSS?=arm-hisiv100nptl-linux
#设若未有被赋值过就予以等号前边的值

export
CHIP?=hi3518c#而一样等级的makefile(可透过makefile中放到变量MAKELEVEL查看得知当前makefile的levlel),

#是无力回天通过export来传递变量的,即三个makefile中export出来叁个变量,同拔尖的其他四个makefile中,是不大概访谈/得到的

export ARCH=arm #export是shell命令,设置条件变量ARCH=arm
export CROSS_COMPILE=$(OSDRV_CROSS)-
export
OSDRV_CROSS_CFLAGS#makefile中的export是导出变量到子makfile,而目的对应推行
的动作中的export,是属于shell中的export,其成效是导出变量到当前shell。此五个export的成效是例外的。

export REALTEK_DRV?=rtl8192EU_linux_v4.3.17_13587.20150309

CROSS_SPECIFIED:=y
#它左边赋得值即便是变量,只可以动用在那条语句此前定义好的,而不可能使用这么些语句之后定义的变量

endif

ifeq ($(OSDRV_CROSS),arm-hisiv200-linux)

LIB_TYPE:=glibc #概念四个变量LIB_TYPE的值是glibc,调用则使用$()符号
:= 覆盖在此以前的值,赋予的值立即见效

all:
@echo
“———————————————————————“#echo命令的功能是在显示器上显得一段文字,一般起到三个升迁的功能

all: prepare hiboot hikernel hibusybox hipctools hiboardtools wifidrv
hirootfs_build
#要生成all需求prepare hiboot等,就去prepare hiboot上边继续找推行

notools: prepare hiboot hikernel hibusybox wifidrv hirootfs_build

clean: hiboot_clean hikernel_clean \
hibusybox_clean hipctools_clean wifidrv_clean hiboardtools_clean
hirootfs_clean

distclean: pub_clean #要生成distclean需要pub_clean
,生成的平整在底下的一声令下中

##########################################################################################

prepare: #到那边,未有借助就不试行下边包车型客车平整
#冒号后如何也不曾,那么,make
就不会自行去找文件的重视,也就不会活动
#实行其后所定义的
命令。要实施其后的命令,将要在 make 命令后显明得建议这一个 lable的名字

@if [ “$(CHIP)” = “hi3518a” -o “$(CHIP)” = “hi3516c” ];then \

#末端跟的是shell的判别语句

#@在Makefile一般用来分析shell命令 ,用@把shell命令放在Makefile中实行

#@表示在make时不出口make的音讯(类似Windows下的echo off)。

pushd $(PC_TOOL_DIR);./mkyaffs2image $(ROOTFS_DIR)
$(IMAGE_DIR)/rootfs_2k_1bit.yaffs2 1 1;popd; \

chmod 644 $(IMAGE_DIR)/rootfs_2k_1bit.yaffs2; \

fi #fi是 if的结束标记 也就是#end

all:
#关键字.PHONY能够缓慢解决那难题,告诉make该对象是“假的”(磁盘上实际远非clean),那时make为扭转这些指标就能够将其准则实行二次
#make会将率先个冒出的靶子作为私下认可目的,正是只实行make不加目的名的时候,第一个目的名普普通通是all

相关文章