• make 参数 ARCH与CROSS_COMPILE***


    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

  • 相关阅读:
    Session的使用与管理
    CSS控制文字,超出部分显示省略号
    MP4 文件前端获取视频封面
    prefetch预加载功能使用
    react-学习之路-react-router-解决问题记录
    如何将一个div盒子水平垂直都居中?
    window下查看端口号,并删除对应进程
    判断js 验证字符串里面有没有包含汉字:
    vue 现有的$变量 以及如何添加全局变量
    与人言
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/12288515.html
Copyright © 2020-2023  润新知