我写的万能多用途简洁的Makefile

来源:互联网 发布:单片机 8位可变波特率 编辑:程序博客网 时间:2024/05/01 10:23

我写的万能多用途,简洁的Makefile。希望对你有用。

############################################################### 简洁通用的Makefile文件(Ver 1.1)## Smart Makefile for general purpose (Ver 1.1)## Author: 汤 永康 Yongkang TANG <tangyk%at%gmail>## License: FreeBSD ## Please use this makefile at YOUR OWN RISK !!!## Source: https://github.com/tangyk/Smart-Makefile## 功能: (1)自动搜索编译指定目录下的所有c/c++程序文件##  (2)自动搜索并包含(#include)指定目录下的头文件##   (3) 可一次性生成多个可执行文件##  (4) 设置简单####  用法:  make   编译所有的应用程序##          make [step4指定的某程序名]##          make clean  清除obj文件#############################################################CC=g++# Step1.设置第三方头文件的路径以及编辑参数.  比如 CFLAGS= -c -Wall -g -I/any/path/inludeCFLAGS= -c -Wall -g # Step2.设置库文件以及库文件路径 比如 LIBS = -lGL -lGLU `pkg-config --libs opencv`LIBS=  -lm# Step3.制定程序的所在路径# 路径不能以 [/] 符号结尾.  应设置为:  SRC_DIR = . , SRC_DIR = ./test1 SRC_DIR = .# Step4.需要生成的可执行程序列表 e.g. APP = app1 app2 app3APP = app#app_EXCL = ./test2/src/test3.cpp ./test2.cxx# Step5.一个可执行程序只能有一个(main)入口。# 当有多个应用程序时,需要设置生成各个可执行程序时,需要排除的程序文件列表# 如果step4中指定的应用程序是server, 在生成server时,需要排除 ./client.c 以及 ./test1.c的话,应做如下设置#server_EXCL = ./client.c ./test1.c # 以此类推。########################### 请不要更改以下内容 ##########EXTS := *.C *.c *.cxx *.CXX *.cpp *.CPP *.cc *.CCDIRS := ${shell find ${SRC_DIR} -type d -print}SRCS := $(foreach dir,$(DIRS),$(wildcard $(addprefix $(dir)/,$(EXTS))))CFLAGS += $(foreach dir,$(DIRS), $(addprefix -I,$(dir)))OBJS := $(addsuffix .o, $(SRCS))define CMPL_APP$(1): $(filter-out $(addsuffix .o,$(value $(1)_EXCL)), $(OBJS))$(CC) -o $(1) $(filter-out $(addsuffix .o, $(value $(addsuffix _EXCL, $(1)))), $(OBJS)) $(LIBS) $(value $(addsuffix _LIBS, $(1)))endefdefine CMPL_SRC${1}.o:${CC} $(CFLAGS) ${1} -o ${1}.oendef.PHONY: all clean.SUFFIXES:all: $(APP)$(foreach s,$(SRCS),$(eval $(call CMPL_SRC, $(s))))$(foreach ap,$(APP),$(eval $(call CMPL_APP, $(ap))))clean:rm -f ${OBJS} ${value APP}