.PHONY : all clean

DEBUG := YES

CC := gcc
CXX := g++
LD := g++
AR := ar rc HOME_PATH := $(realpath .)
SOURCE_PATH := ${HOME_PATH}/src
INC_PATH := -I${HOME_PATH}/src
DEP_PATH := ${HOME_PATH}/dep
SRCS := $(wildcard ${SOURCE_PATH}/*.c) $(wildcard ${SOURCE_PATH}/*.cpp)
LIB_PATH := -L${HOME_PATH}/lib DEBUG_CFLAGS := -g -O0 -Wall -Wconversion -Wuninitialized -D_DEBUG -m64 -pg
RELEASE_CFLAGS := -O3 -m64
DEBUG_CXXFLAGS := ${DEBUG_CFLAGS}
RELEASE_CXXFLAGS := ${RELEASE_CFLAGS}
DEBUG_LDFLAGS := --static
RELEASE_LDFLAGS := --static ifeq (YES, ${DEBUG})
CFLAGS := ${DEBUG_CFLAGS}
CXXFLAGS := ${DEBUG_CXXFLAGS}
LDFLAGS := ${DEBUG_LDFLAGS}
BIN_PATH := ${HOME_PATH}/bin/debug
OBJ_PATH := ${HOME_PATH}/obj/debug
else
CFLAGS := ${RELEASE_CFLAGS}
CXXFLAGS := ${RELEASE_CXXFLAGS}
LDFLAGS := ${RELEASE_LDFLAGS}
BIN_PATH := ${HOME_PATH}/bin/release
OBJ_PATH := ${HOME_PATH}/obj/release
endif BIN := ${BIN_PATH}/miku
LIBS := -Wl,-dn -lev -Wl,-dn -lglog -Wl,-dn -lpthread OBJS := $(patsubst %,${OBJ_PATH}/%.o,$(basename ${notdir ${SRCS}}))
DEPS := $(patsubst %,${DEP_PATH}/%.d,$(basename ${notdir ${SRCS}})) all : ${BIN_PATH} ${OBJ_PATH} ${DEP_PATH} ${BIN} ${BIN}: ${OBJS}
${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIB_PATH} ${LIBS} ${BIN_PATH}:
mkdir -p ${BIN_PATH}
${OBJ_PATH}:
mkdir -p ${OBJ_PATH}
${DEP_PATH}:
mkdir ${DEP_PATH} ${DEP_PATH}/%.d : ${SOURCE_PATH}/%.c
@set -e;\
rm -f $@;\
${CC} -MM ${CFLAGS} ${INC_PATH} $< > $@.tmp;\
sed 's,\($*\)\.o[ :]*,${OBJ_PATH}/\1.o $@ : ,g' < $@.tmp > $@;\
rm -f $@.tmp ${DEP_PATH}/%.d : ${SOURCE_PATH}/%.cpp
@set -e;\
rm -f $@;\
${CC} -MM ${CFLAGS} ${INC_PATH} $< > $@.tmp;\
sed 's,\($*\)\.o[ :]*,${OBJ_PATH}/\1.o $@ : ,g' < $@.tmp > $@;\
rm -f $@.tmp -include ${DEPS} ${OBJ_PATH}/%.o : ${SOURCE_PATH}/%.c
${CC} -c ${CFLAGS} ${INC_PATH} $< -o ${OBJ_PATH}/${basename ${notdir $@}}.o ${OBJ_PATH}/%.o : ${SOURCE_PATH}/%.cpp
${CXX} -c ${CXXFLAGS} ${INC_PATH} $< -o ${OBJ_PATH}/${basename ${notdir $@}}.o clean:
-rm -f ${HOME_PATH}/dep/*.d
-rm -f ${HOME_PATH}/obj/debug/*.o
-rm -f ${HOME_PATH}/obj/release/*.o
-rm -f ${HOME_PATH}/bin/debug/*
-rm -f ${HOME_PATH}/bin/release/*

  基于 gcc -MM 实现的头文件依赖推导。

一个比较通用的makefile的更多相关文章

  1. 一步一步写一个简单通用的makefile(三)

    上一篇一步一步写一个简单通用的makefile(二) 里面的makefile 实现对通用的代码进行编译,这一章我将会对上一次的makefile 进行进一步的优化. 优化后的makefile: #Hel ...

  2. [置顶] 自己写一个简单通用的Makefile

    转自:http://blog.csdn.net/u011913612/article/details/52102241 一.makefile的作用 Makefile是用于自动编译和链接的,一个工程有很 ...

  3. 一步一步写一个简单通用的makefile(一)

    经常会用写一些小的程序有的是作为测试,但是每次都需要写一些简单的GCC 命令,有的时候移植一些项目中的部分代码到小程序里面进行测试,这个时候GCC 命令并不好些,如果写啦一个比较常用的makefile ...

  4. 一步一步写一个简单通用的makefile(四)--写一个通用的makefile编译android可执行文件

    通常要把我们自己的的代码编译成在android里面编译的可执行文件,我们通常是建一个文件夹 . ├── Android.mk ├── Application.mk ├── convolve.cl ├─ ...

  5. 一步一步写一个简单通用的makefile(二)

    这一篇源代码沿用上一篇的源代码hellomake.c hellofunc.c hellofunc.h makefile 但是代码内容和结构有变化,如下: . ├── include │   └── h ...

  6. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  7. Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile

    GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...

  8. 一个通用的Makefile (转)

    据http://bbs.chinaunix.net/thread-2300778-1-1.html的讨论,发现还是有很多人在问通用Makefile的问题,这里做一个总结.也作为以后的参考.       ...

  9. 分享一个很通用c语言的Makefile

    编写Makefile是一个苦乐交织的事情,快乐是因为从一堆需要手工逐个处理的编译过程,进步到一条命令完成,看着代码顺畅的在屏幕上滚动,编译为最终的产品,那个过程无比愉悦:而痛苦则是,写代码已经很累了, ...

随机推荐

  1. highchart导出功能的介绍更改exporting源码

    本案利用highchar作为前端,展示数据的图形效果,结合spring+springmvc来完成数据图片的导出. jsp引入文件: <script src="${pageContext ...

  2. strom的使用01

    1.strom的安装和测试 1.1 搭建zookeeper集群 参考hadoop2.0初识1.3中的1.4配置zookeeper集群和自动故障转移 1.2 安装storm依赖的软件 sudo yum ...

  3. 1.Dotnet Core安装

    DtnetCore1.0.1的安装包我以上传至百度网盘,里面有安装教程. http://pan.baidu.com/s/1c2iLNNE 如果安装不上,请留言,我会在第一时间回复你. 不需要挂VPN.

  4. dsp 28377在线升级 实例总结

    使用dsp品台28377d来实现在线升级的功能. 方案 : 升级程序  +  应用程序 升级程序 : 主要的目的是将上位机发送过来的应用程序数据(ccs编译生成的.bin文件)烧写到指定位置,之后在跳 ...

  5. 安装php-amqplib(RabbitMQ的phpAPI)

    历史经验告诉我们,装逼没有好下场. 总结一下之前composer安装php-amqplib包失败的原因: composer安装的时候需要指定PHP执行文件的位置: PHP安装路径:/usr/local ...

  6. Eclipse打JAR包,插件Fat Jar的安装与使用

    Eclipse可以安装一个叫Fat Jar的插件,用这个插件打包非常方便,Fat Jar的功能非常强大首先要下载Fat Jar,下载地址:https://sourceforge.net/project ...

  7. es6 import export 与 node 中的module.exports exports

    1.export a.export 变量 export var name = 'jack';export var age = 18;//等同于 var name = 'jack';var age = ...

  8. Android之Toolbar的三个问题:修改左边箭头颜色、怎样修改右边以及子activity中的toolbar添加返回箭头

    1)怎样修改左边这个小箭头的颜色? 2)怎样修改右边这三个点的颜色.怎样把这三个点替换成我自己的图标? 3)怎样让"交易清单"这4个字居中显示? 首先设置Theme为AppComp ...

  9. GNS3 IOU 配置

    GNS3使用视频: http://edu.51cto.com/lesson/id-25295.html GNS3 IOU 与VM http://www.mamicode.com/info-detail ...

  10. openssl evp RSA 加密解密

    openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...