最近写了一个递归Makefile,目的是既可以实现子模块的单独编译,也可以不做任何修改就和整个程序的整体进行无缝衔接的编译。具体的思路是借助第三方文件,将子模块编译好的.o文件的路径自动写到config.mk文件中,在总控Makfile中只需要include这个config.mk就可以。单个模块的编译只需要cd到相应目录就可以进行本模块的单独编译,整个程序的编译也只需要cd到顶层目录,分别执行make config,make,make install就可以进行编译和安装。下面这个就是顶层Makefile

CROSS_COMPILE=
#CC=/opt/arm-cross-compile/arm-2010.09/bin/arm-none-linux-gnueabi-gcc
#CC=gcc
CC=arm-linux-gnueabi-gcc
D=-DDEBUG
CFLAGS= -g -O3 $(D) export CC CFLAGS INCLUDE_DIR = $(shell cd ./common/include/; pwd)
SUB_DIR= ./entry/ \
./sqlite/ \ NFS_DIR:=~/nfs
CORE_NAME = core
$(shell touch config.mk)
include ./config.mk all:$(OBJS)
$(CC) $(CFLAGS) $^ -lpthread -L/home/jiang/nfs/usr/lib/ -lsqlite3 -o $(CORE_NAME) config:
@echo "OBJS+=\\" > config.mk
@for dir in $(SUB_DIR); \
do \
echo "\n"; \
$(MAKE) -C $$dir ; \
echo "\n"; \
done clean:
$(RM) ./config.mk
@for dir in $(SUB_DIR); \
do \
echo "\n"; \
$(MAKE) -C $$dir clean; \
echo "\n"; \
done
install:
cp $(CORE_NAME) $(NFS_DIR)

下面这个就是每一个子模块的Makfile,会把编译成功的.o文件路径添加到config.mk中

CUR_DIR=$(shell pwd)
OBJ_DIR:=$(CUR_DIR)/obj
INCLUDE_DIR= -I ./include -I ../common/include
SRC=$(wildcard ./src/*.c) all:$(SRC)
$(CC) $(CFLAGS) $(INCLUDE_DIR) -c $^
mv ./*.o $(OBJ_DIR)
echo "${OBJ_DIR}/*.o \\" >> ../config.mk
echo "\033[44;37m $(notdir $(CUR_DIR)) done \033[0m"
clean:
$(RM) $(OBJ_DIR)/*

下面就是config.mk的内容,会在顶层目录中执行make config之后自动生成

OBJS+=\
/home/jiang/Documents/Documents/IntellStorage/A9_main/A9_core/entry/obj/*.o \
/home/jiang/Documents/Documents/IntellStorage/A9_main/A9_core/sqlite/obj/*.o \

为了使一个头文件的实例在整个工程中只有一份,对于接口文件,约定一律以inter_开头进行命名并且放置在自己的include目录中,下面这个脚本的作用就是扫描指定的子模块的include目录,将其中的inter_*头文件在entry模块的include中自动生成同名符号链接文件。

#|/bin/bash
#扫描指定include的文件,符合inter_*.h的文件会自动在entry/include中创建其符号链接 SHELL_DIR=$(cd $(dirname ${0});pwd)
cd ${SHELL_DIR}
SUB_INCLUDES="../camera/include ../buzzer/include ../gsm/include ../led/include ../sqlite/include ../zigbee/include"
for A_SUB_INCLUDE in ${SUB_INCLUDES}
do
echo ${A_SUB_INCLUDE}
(
cd ${A_SUB_INCLUDE}
HEADERS=$(ls ./inter*)
for A_HEADER in ${HEADERS}
do
ln -s ../${A_SUB_INCLUDE}/${A_HEADER} ../../entry/include/${A_HEADER}
done
)
done

递归编译的Makefile的实现的更多相关文章

  1. [Makefile] 递归编译的Makefile的实现

    转自:http://www.linuxidc.com/Linux/2017-01/139702.htm 最近写了一个递归Makefile,目的是既可以实现子模块的单独编译,也可以不做任何修改就和整个程 ...

  2. Linux内核配置、编译及Makefile简述

    Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...

  3. 层级目录结构的Makefile递归编译方法

    层级目录结构的Makefile编写方法. 层级目录结构的Makefile编写方法. 0.前言 1.如何编译整个工程 2.过滤每层不需要编译的目录 3将所有输出文件定向输出. 0.前言 假如现在有这样一 ...

  4. 自动构建Makefile(1)--C/C++编译流程&Makefile规则简介

      前言: 大家在Windows上使用VS构建C/C++程序时,不需要自己编辑略显晦涩的Makefile文件,而对于初学者而言, 他们甚至没意识到它的存在.VS是自动生成Makefile文件, 并构建 ...

  5. g++编译的makefile模板库和脚本

    编译C++文件,特别是多文件的时候,经常要找模板,这里为了后面方便,就自己做了一个模板. makefile模板:Makefile # Object files to either reference ...

  6. Linux下C语言多文件的编译以及makefile的应用

    1.关于编译和链接 一般来说,无论是C.C++,首先要把源文件编译成中间代码文件,在Windows下也就是.obj文件,UNIX下是.o文件,即Object File,这个动作叫做编译(compile ...

  7. Linux下多个.c文件的编译和Makefile文件

    在编程的时候,我们可以把一个完整程序的每个函数分离出来,写成.c文件,最后再一起编译和链接.这样有利于程序功能模块化,也方便检查代码错误. .h文件:里面编辑该程序需要引用的头文件. #ifndef  ...

  8. Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)

    一.确认已经装好了GCC和Make的软件包 可以使用whereis命令查看: 如果whereis  gcc和whereis  make命令有结果,说明安装了这两个软件,可以继续往下做. 二.使用GCC ...

  9. 解决 Ubuntu16.04 + opencv4.1 源码编译错误 Makefile:160: recipe for target 'all' failed

    最近源码编译 opencv,出现下面的错误 [ %] Built target opencv_dnn Makefile:: recipe for target 'all' failed google ...

随机推荐

  1. Task Cancellation: Parallel Programming

    http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ...

  2. JSTL select和checkbox的用法

    select的 用法 <select id="roleIds" name="roleIds" multiple="true" back ...

  3. js原型对象,每个new出来的新对象都有独立的原型对象__proto__

    刚才看一篇博文的时候, 动手测试了一下 JavaScript的原型链, 原型对象,发现每个构造器(赋给了某个 prototype ) new 出来的对象都有各自独立的原型对象 __proto__. p ...

  4. fuel 6.1自动推送3控高可用centos 6.5 juno环境排错(二)

    https://docs.mirantis.com/openstack/fuel/fuel-6.1/ 由于在测试高可用时,我是用esxi虚拟机测试,测试过程中遇到了网络问题:虚拟机间网络不通,故从网络 ...

  5. [iOS]C语言技术视频-01-变量的定义

    下载地址: 链接: http://pan.baidu.com/s/1eQJaVwY 密码: c7j8

  6. DNS架设准备+申请领域查询授权

    1. 架设DNS服务器首先我们得安装一下的软件[root@bogon ~]# rpm -qa | grep ^bindbind-libs-9.8.2-0.37.rc1.el6.i686 <==给 ...

  7. Bestcoder #80

    首先吐槽一下,ca爷出的这套题到处都是坑,bestcoder变成besthack,Ranting已经掉得不能看了 A题: 链接:http://acm.hdu.edu.cn/showproblem.ph ...

  8. python web开发基本概念

    参考了廖雪峰的Python博客. web请求顺序: 浏览器发送一个http请求 服务器收到请求后,生成一个html文档. 服务器将html文档作为http相应的body发送给浏览器 浏览器收到http ...

  9. Android L(5.0)源码之图形与图像处理之简单图片——Bitmap

    最近在研究android 5.0的gallery模块,学习了相关的知识点,准备写点博客总结一下,有时间了会补充完整

  10. iOS开发——浅谈构架与用户体验

    工作不是千篇一律的重复,从中寻找乐趣才是我们应该做的. 作为一名码农,做过几个项目,每次做项目的时候都会自己构思,如果完全是我自己设计,会怎么去设计?心里一直没有满意的答案,不管怎么布局,好像都感觉差 ...