.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. inline-boock的默认间距

    1 2 3 4 div{width:900px;} div li{ display:inline-block; width:300px;} <ul>     <li></ ...

  2. Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0

    maven构建项目的时候遇到这个错误: 一.直接原因 制定路径下确实没有sqljdbc4.jar文件. 二.根本原因 微软不允许以maven的方式直接下载该文件. 三.解决办法 3.1 手动下载相关库 ...

  3. 关于tomcat访问managerapp出现403报错的解决方法

    最近工作需要在tomct下部署war包并访问. 学了几种方法后想从Tomcat Web Application Manager去部署. 但是启动tomcat后浏览器http://localhost:8 ...

  4. TestNG Study Note 1 - Eclipse 插件安装

    TestNG 插件在线安装 Help -> Install New Software -> Add -> Paste TestNG url to Add:  http://testn ...

  5. Linux SHELL,环境变量

    SHELL: 在计算机科学中,Shell俗称壳(用来区别于核),是指"提供使用者使用界面"的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命 ...

  6. PBS 安装

    How to install PBS Pro using the configure script. . Install the prerequisite packages for building ...

  7. mybatis原理

    http://blog.csdn.net/column/details/mybatis-principle.html?page=1

  8. .net(C#)在vs2010版本下的MVC如何配置才能切换静态页面(html)

    由于vs2010用的人比较多,虽然建mvc项目vs2010可能还不成熟,但鉴于每个人的成长有限,每个地方的资源有限,最主要的是为了解决问题,所以先不管那么多了. 用vs2010为公司网站建站,要求js ...

  9. [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥)

    [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥) nohacks 发表于 2016-5-29 17:12:51 https:// ...

  10. 【转】PCI学习笔记

    1.PCI设备编号    每一个PCI device都有其unique PFA(PCI Fcntion Address)    PFA由 bus number.device number.functi ...