uboot学习之二----主Makefile学习之四----两种编译方法:原地编译和单独输出文件夹编译

时间:2021-08-23 12:48:15

第57-123行:

57 # 
58 # U-boot build supports producing a object files to the separate external
59 # directory. Two use cases are supported:
60 #
61 # 1) Add O= to the make command line
62 # 'make O=/tmp/build all'
63 #
64 # 2) Set environement variable BUILD_DIR to point to the desired location
65 # 'export BUILD_DIR=/tmp/build'
66 # 'make'
67 #
68 # The second approach can also be used with a MAKEALL script
69 # 'export BUILD_DIR=/tmp/build'
70 # './MAKEALL'
71 #
72 # Command line 'O=' setting overrides BUILD_DIR environent variable.
73 #
74 # When none of the above methods is used the local build is performed and
75 # the object files are placed in the source directory.
76 #
77
78 ifdef O
79 ifeq ("$(origin O)", "command line")
80 BUILD_DIR := $(O)
81 endif
82 endif

83
84 ifneq ($(BUILD_DIR),)
85 saved-output := $(BUILD_DIR)
86
87 # Attempt to create a output directory.
88 $(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
89
90 # Verify if it was successful.
91 BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
92 $(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
93 endif # ifneq ($(BUILD_DIR),)
94
95 OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
96 SRCTREE := $(CURDIR)
97 TOPDIR := $(SRCTREE)
98 LNDIR := $(OBJTREE)
99 export TOPDIR SRCTREE OBJTREE
100
101 MKCONFIG := $(SRCTREE)/mkconfig
102 export MKCONFIG
103
104 ifneq ($(OBJTREE),$(SRCTREE))
105 REMOTE_BUILD := 1
106 export REMOTE_BUILD
107 endif
108
109 # $(obj) and (src) are defined in config.mk but here in main Makefile
110 # we also need them before config.mk is included which is the case for
111 # some targets like unconfig, clean, clobber, distclean, etc.
112 fneq ($(OBJTREE),$(SRCTREE))
113 obj := $(OBJTREE)/
114 src := $(SRCTREE)/
115 else
116 obj :=
117 src :=
118 endif
119 export obj src
120
121 # Make sure CDPATH settings don't interfere
122 unexport CDPATH
123

编译复杂项目:makefile提供两种编译管理方法,默认情况是原地编译。

原地编译的缺点:

第一:污染源文件目录。第二:一套源代码只能按照一种配置和编译方法进行处理,无法同时维护超过两个或两个以上的配置编译方法。

 

输出文件夹编译:

为了解决以上缺陷,采用单独输出文件夹的方式编译,Linux kernel支持这样的方法,具体实现思路是:将所有编译生成的.o文件或者

其他文件全部输出到指定好的目录。uboot也学习了这样的方法。

具体做法:

见57行---76行的注释:

  ①在命令行编译时制定make O=输出目录(注意配置时也要加O=输出目录)

 make O=/tmp/build all

 

比如我们在root@ubuntu:/usr/local/arm/qt_x210v3/uboot这里面创建一个output文件夹来作为输出目录:
三步: make O=output/ distclean
    make O=output/ x210_sd_config
   这一步出错:

uboot学习之二----主Makefile学习之四----两种编译方法:原地编译和单独输出文件夹编译


解决方法:进入output文件夹后手工创建这个文件:

root@ubuntu:/usr/local/arm/qt_x210v3/uboot/output# mkdir board/samsung/x210 -p

然后重新配置。

     make O=output/ all 

uboot学习之二----主Makefile学习之四----两种编译方法:原地编译和单独输出文件夹编译最后发现还是有问题。应该是整个uboot移植时还是不行的。我们以后使用三星版本的uboot进行移植再来研究。

  ②设置环境变量BUILD_DIR指出期望的输出目录。

  'export BUILD_DIR=/tmp/build' 
   'make'

      第二种方法也可以通过MAKEALL脚本实现。

       'export BUILD_DIR=/tmp/build' 
      './MAKEALL'
make o=输出目录会覆盖BUILD_DIR


很多bsp开发都使用这样的方式,所以有利于后面学习。

两种编译方法的makefile代码实现在78---123行