嵌入式linux:make 参数 ARCH与CROSS_COMPILE

经常看到make 命令带一些参数,例如海思编译内核时使用命令

make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- menuconfig

这时什么意思呢?

ARCH
即architecture,就是选择编译哪一种cpu architecture,也就是编译arch/目录下的哪一个子目录。如指定make ARCH=arm就是编译arch/arm下的代码。如果不指定,make将使用本机(用什么机器编译就是什么)的cpu作为缺省ARCH.注意:arch/arm下不但有arm体系架构特有的代码,还有arm特有的kconfig,也就是配置选项,所以在make menuconfig,make xxxx_defconfig的时候也必须指定ARCH=arm。

CROSS_COMPILE

即交叉编译器的前缀(prefix),也就是选择将代码编译成目标cpu的指令的工具,如指定make CROSS_COMPILE=arm-none-linux-gnueabi-就是使用arm-none-linux-gnueabi-gcc, arm-none-linux-gnueabi-ld等工具将代码编译成arm的可执行指令。如果不指定CROSS_COMPILE参数,make时将认为prefix为空,即使用gcc来编译。这里cross_compile的设置,是假定所用的交叉工具链的gcc程序名称为arm-linux-gcc。如果实际使用的gcc名称是some-thing-else-gcc,则这里照葫芦画瓢填some-thing-else-即可。总之,要省去名称中最后的gcc那3个字母。


在配置或编译内核之前,首先要确定目标CPU架构,以及编译时采用什么工具链。这是最最基础的信息,首先要确定的。

如果你是为当前使用的PC机编译内核,则无须设置。

否则的话,就要明确设置。

这里以arm为例,来说明。

有两种设置方法():

a) 修改Makefile

打开内核源码根目录下的Makefile,修改如下两个Makefile变量并保存。

ARCH           := arm
CROSS_COMPILE  := arm-linux-

注意,这里cross_compile的设置,是假定所用的交叉工具链的gcc程序名称为arm-linux-gcc。如果实际使用的gcc名称是some-thing-else-gcc,则这里照葫芦画瓢填some-thing-else-即可。总之,要省去名称中最后的gcc那3个字母。

b) 每次执行make命令时,都通过命令行参数传入这些信息。

这其实是通过make工具的命令行参数指定变量的值。

例如

配置内核时时,使用

make  ARCH=arm  CROSS_COMPILE=arm-linux-  menuconfig

编译内核时使用

make  ARCH=arm  CROSS_COMPILE=arm-linux- 


注意,实际上,对于编译PC机内核的情况,虽然用户没有明确设置,但并不是这两项没有配置。因为如果用户没有设置这两项,内核源码顶层Makefile(位于源码根目录下)会通过如下方式生成这两个变量的值。

SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
 -e s/arm.*/arm/ -e s/sa110/arm/ \
 -e s/s390x/s390/ -e s/parisc64/parisc/ \
 -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
 -e s/sh[234].*/sh/ )

ARCH?= $(SUBARCH)
CROSS_COMPILE ?=

经过上面的代码,ARCH变成了PC编译机的arch,即SUBARCH。因此,如果PC机上uname -m输出的是ix86,则ARCH的值就成了i386。

而CROSS_COMPILE的值,如果没配置,则为空字符串。这样一来所使用的工具链程序的名称,就不再有类似arm-linux-这样的前缀,就相当于使用了PC机上的gcc。

最后再多说两句,ARCH的值还需要再进一步做泛化。因为内核源码的arch目录下,不存在i386这个目录,也没有sparc64这样的目录。

因此顶层makefile中又构造了一个SRCARCH变量,通过如下代码,生成他的值。这样一来,SRCARCH变量,才最终匹配到内核源码arch目录中的某一个架构名。


SRCARCH := $(ARCH)  


ifeq ($(ARCH),i386)
        SRCARCH := x86
endif


ifeq ($(ARCH),x86_64)
        SRCARCH := x86
endif

ifeq ($(ARCH),sparc64)
       SRCARCH := sparc
endif

ifeq ($(ARCH),sh64)
       SRCARCH := sh
endif
  • 14
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ux-gnueabihf- alientek_emmc_defconfig 4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig 5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 6 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage 7 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules 8 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs 9 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx6ull-alientek-emmc.dtb 10 mkdir -p output 11 cp -f arch/arm/boot/uImage output/ 12 cp -f arch/arm/boot/dts/imx6ull-alientek-emmc.dtb output/ 13 cp -f System.map output/ 14 mkdir -p output/lib/modules 15 cp -fRv modules/* output/lib/modules/ 16 rm output/lib/modules/`uname -r`/build 17 rm output/lib/modules/`uname -r`/source 18 tar -cf output.tar output 19 rm -rf output 上述代码中,第 2 行的 make 命令用于清除之前的编译结果,第 3 行的 make 命令用于配置编译环境,第 4 行的 make 命令用于打开内核配置界面,第 5 行的 make 命令用于编译内核,第 6 行的 make 命令用于编译内核镜像,第 7 行的 make 命令用于编译内核模块,第 8 行的 make 命令用于编译设备树二进制文件,第 9 行的 make 命令用于编译特定设备树文件,第 10-18 行的命令用于创建输出目录,并将编译结果复制到输出目录中,最后一行的命令用于清除临时文件。 这个脚本是针对 MX6ULL alientek EMMC 核心板进行编译的,如果需要编译其他型号的核心板,则需要相应调整配置文件和设备树文件的名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值