一个比较通用的makefile
.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的更多相关文章
- 一步一步写一个简单通用的makefile(三)
上一篇一步一步写一个简单通用的makefile(二) 里面的makefile 实现对通用的代码进行编译,这一章我将会对上一次的makefile 进行进一步的优化. 优化后的makefile: #Hel ...
- [置顶]
自己写一个简单通用的Makefile
转自:http://blog.csdn.net/u011913612/article/details/52102241 一.makefile的作用 Makefile是用于自动编译和链接的,一个工程有很 ...
- 一步一步写一个简单通用的makefile(一)
经常会用写一些小的程序有的是作为测试,但是每次都需要写一些简单的GCC 命令,有的时候移植一些项目中的部分代码到小程序里面进行测试,这个时候GCC 命令并不好些,如果写啦一个比较常用的makefile ...
- 一步一步写一个简单通用的makefile(四)--写一个通用的makefile编译android可执行文件
通常要把我们自己的的代码编译成在android里面编译的可执行文件,我们通常是建一个文件夹 . ├── Android.mk ├── Application.mk ├── convolve.cl ├─ ...
- 一步一步写一个简单通用的makefile(二)
这一篇源代码沿用上一篇的源代码hellomake.c hellofunc.c hellofunc.h makefile 但是代码内容和结构有变化,如下: . ├── include │ └── h ...
- 编写一个通用的Makefile文件
1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...
- Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile
GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...
- 一个通用的Makefile (转)
据http://bbs.chinaunix.net/thread-2300778-1-1.html的讨论,发现还是有很多人在问通用Makefile的问题,这里做一个总结.也作为以后的参考. ...
- 分享一个很通用c语言的Makefile
编写Makefile是一个苦乐交织的事情,快乐是因为从一堆需要手工逐个处理的编译过程,进步到一条命令完成,看着代码顺畅的在屏幕上滚动,编译为最终的产品,那个过程无比愉悦:而痛苦则是,写代码已经很累了, ...
随机推荐
- sql-计算每个月星期几有几天
--建立函数计算星期 create function w_count( ) --月份 ,))--星期几 returns int as begin ' as datetime) ,,')) as dat ...
- JAVA-小青蛙跳石头游戏
游戏摘自微信传的手机网页版小游戏,我拿来做成了JAVA的界面版,但是没有去做素材,,直接拿方块代替小青蛙.游戏原址就不分享了,只能在手机上打开. 下面是源码: /* * Main.java * */ ...
- Arduino 极速入门系列–1 点亮 LED
本篇内容为,使用 Arduino 点亮 LED 的做法示范.很简单的一个入门示范.我们让 LED 闪. 本篇使用到的工具和材料 Arduino Mini Pro 1 PCS Mini USB 数据线 ...
- Adobe Photoshop CC (32/64位) 绿色精简版
32位版下载地址:http://pan.baidu.com/share/link?uk=33907222&shareid=3828486959 64位版下载地址:http://pan.baid ...
- Highcharts动态添加点数据
Highcharts用来作为图表数据的展示十分方便,效果也比较好.highcharts不仅可以实现死数据的展示,也能实现动态数据的实时添加显示,类似财经股票的实时刷新效果,实现过程并不难,大致如下. ...
- 《简明python教程》笔记一
读<简明Python教程>笔记: 本书的官方网站是www.byteofpython.info 安装就不说了,网上很多,这里就记录下我在安装时的问题,首先到python官网下载,选好安装路 ...
- Stl源码剖析 第三章 iterator摘要
1. Stl的设计思想是: 将数据容器和算法分开,彼此独立设计,最后再以一贴胶合剂将它们撮合在一起,这个胶合剂就是迭代器. 2. 从3.2节迭代器的实现可知,如果要设计一个与容器分离实现的迭代器,会暴 ...
- JSP学习
http://blog.csdn.net/javaeeteacher/article/details/1932447
- linux系统下静态IP的设置
首先说明:下面用的系统为:kali 4.6.0版本的哦:不同的系统是不一样的:反正吧,在ubuntu上的好多方法在kali上就不管用,并且吧,不同的ubuntu的版本也不一样的: 第一步:设置网络的I ...
- Js dom操作总结
1.选取文档元素 1.1. getElemenById 基于唯一id获取,任何HTML元素可以有id属性,在文档中该值必须唯一. 1.2. getElementsByName 基于name属性的值选取 ...