uboot提供了两种编译策略,即可以将生成的目标文件与源码混在一起,也可以将生成的目标文件与源码分开。通过对uboot Makefile的分析,笔者编写了一个简单的实现这种功能的Makfile。

顶层makefile

ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)
# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}) //创建目录BUILD_DIR
# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) //目标文件生成的根目录,可以认为是一个常量,区别于obj
SRCTREE := $(CURDIR) //CURDIR是当前目录的路径,目录改变,它随之改变
TOPDIR := $(SRCTREE)
export SRCTREE OBJTREE TOPDIR include $(TOPDIR)/config.mk //config.mk中定义了obj变量,下边的内容使用了这个变量 OBJS = add/add.o sub/sub.o test/test.o //需要生成的目标文件
OBJS := $(addprefix $(obj),$(OBJS)) //需要生成目标文件的完整路径
.PHONY : $(OBJS) //确保源文件修改了,目标文件能够自动重建 $(obj)program: $(OBJS) //在总目标前边也加上了前缀obj,以实现目标文件与目标文件在不同的目录
gcc $^ -o $@ $(OBJS):
make -C $(dir $(subst $(obj),,$@)) //依次执行各个子目录中的makefile .PHONY: clean
clean:
make -C add clean
make -C sub clean
make -C test clean
rm -f $(obj)program //删除时也要注意目录问题

顶层config.mk (确定当前的源文件的目录,以及要生成目标文件的完整路径,并创建这个路径)

ifneq ($(OBJTREE),$(SRCTREE))
ifeq ($(CURDIR),$(SRCTREE))
dir :=
else
dir := $(subst $(SRCTREE)/,,$(CURDIR))
endif obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/) //确定要生成目标文件的完整路径,
//注意这是个变量,在不同的子目录中,执行makefile,obj的值相应的发生变化
src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/) //确定当前源文件的目录 $(shell mkdir -p $(obj)) //创建目标文件的完整路径,注意gcc命令并不能自动生成缺少的路径,所以需要事先创建
else //上边的是目标文件与源文件不同的情况,下边的是相同的情况
obj := //目标文件与源文件目录相同时,obj没有必要赋值
src :=
endif

子目录makefile,以add/makefile为例

include $(TOPDIR)/config.mk //子目录中的makefile也调用了obj变量,所以也要包含config.mk文件

$(obj)add.o: add.c ../include/heads.h
gcc -c -o $@ $< .PHONY: clean
clean:
rm -f $(obj)*.o

编译方法:

1、目标文件与源码混在一起

直接在顶层目录中执行:#make

2、目标文件与源码分开

方法一:

先声明个环境变量:#exprort BUILD_DIR=/tmp/build    //这里以/tmp/build为例

然后在顶层目录中执行:#make

方法二:

直接在顶层目录中执行:#make BUILD_DIR=/tmp/build

下载源码链接:sometest.zip

实现目标文件与源码分开的makefile测试实验的更多相关文章

  1. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...

  2. eclipse查看class文件的源码

    eclipse查看class文件的源码: 1.网上下载jadClipse的jar包和执行文件jad.exe和 net.sf.jadclipse_3.3.0.jar. 2.把上面下载的jar包放在ecp ...

  3. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码_转

    一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件到本地实例>本文以这篇文章的基础,提供了Byt ...

  4. 访问php文件显示源码

    前天新装了个LAMP的环境,兴冲冲的clone下来代码,结果一访问乐子就大了,直接显现源码 面对这个问题,冥思苦想,四处找资料啊 让我改这改那的,最后终于找到症结 Ubuntu 16.04 系统 LA ...

  5. Eclipse安装反编译插件,查看.class文件的源码

    2017-08-24 这样我们就可以通过Eclipse查看.class文件的源码了. 1.参考别人的博客,亲测有效 https://www.cnblogs.com/JealousGirl/p/setu ...

  6. Django的settings文件部分源码分析

    Django的settings文件部分源码分析 在编写Django项目的过程中, 其中一个非常强大的功能就是我们可以在settings文件配置许多选项来完成我们预期的功能, 并且这些配置还必须大写, ...

  7. spark读取文件机制 源码剖析

    Spark数据分区调研 Spark以textFile方式读取文件源码 textFile方法位于 spark-core_2.11/org.apache.spark.api.java/JavaSparkC ...

  8. eclipse中导入jar文件的源码

    有时候想看看一个jar包的源码是怎么写的,想按Ctrl+鼠标左键点击来自动导航这时候就需要先把源码给导入到eclipse中,步骤如下:首先准备jar包和源文件包比如:

  9. FFmpeg中HLS文件解析源码

    不少人都在找FFmpeg中是否有hls(m3u8)解析的源码,其实是有的.就是ffmpeg/libavformat/hlsproto.c,它依赖的文件也在那个目录中. 如果要是单纯想解析HLS的话,建 ...

随机推荐

  1. Dom4j写XML

    package com; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.I ...

  2. HDU--1533--Going Home--KM算法

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  3. EventBus3.0使用总结

    在Android中,接口回调已经能够处理掉大部分业务需求了,实在太变态的需求就用广播也能够完成,自己写的性能好出问题也好解决.....工作需要,不得不看看EventBus的用法,今天就来介绍一下学习经 ...

  4. AWS RDS 使用笔记

    创建VPC安全组 添加VPC子网 创建RDS子网组 创建RDS参数组 创建MySQL实例 查看RDS终端节点 使用 MySQL 监视器与数据库实例上的数据库连接 安装mysql client $ su ...

  5. 请列出你在从事IT生涯中,最难以忘怀的一次误操作

    IT系统最怕什么,我觉得就两点: 1.不可靠的软硬件. 2.误操作. 第一点就不用解释了,第二点是该文的内容,主要摘选自ITPUB的精华贴——[精华] 请列出你在从事DBA生涯中,最难以忘怀的一次误操 ...

  6. eclipse修改SVN下载的项目“>”变成“*”

    遇到过这样的问题,可能是因为下载的eclipse 的版本国过于高的原因. 一张图说明就行了. 将红色的地方打上勾就行了.

  7. 关于ligerui 中 grid 表格的扩展搜索功能在远程数据加载时无法使用的解决办法

    要想使用grid里的扩展搜索功能,除了要引用ligerui主要的js文件外,还必须引入下面的JS文件: 1.Source\demos\filter\ligerGrid.showFilter.js 2. ...

  8. Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGB

    Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGB ...

  9. HDU 4712 Hamming Distance(随机算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712 题目大意:任意两个数按位异或后二进制中含1的个数被称为海明距离,给定n个数,求出任意其中两个最小 ...

  10. 增加Swap内存

    增加512M Swap内存 #首先先建立一个分区,采用dd命令如下:dd if=/dev/zero of=/home/swap bs=1024 count=524288#(1个block为1K,512 ...