`
siwind
  • 浏览: 144567 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Makefile模板(改进)

阅读更多
Makefile模板:
1) 模块文件(不含main函数) 分类存放于src/xxx目录下面。例如: src/conf/conf.c;src/util/pool.c
2) 公共头文件存放于 src/include目录,模块私有头文件放置于模块目录src/xxx目录下面
3) 所有的含有main入口点的源代码文件放置于src/目录下面,例如 src/main.c, src/test.c等。
4) 支持增加自定义目标,定义好自己的目标后就能够 编译出可执行文件(见模板最后示例). bin/main, bin/test等。
5) 支持依赖自动推导。
6) 使用时,请自行修改变量: CC、LINK、 SRC_FILE_TYPE、 MAIN_FILE、 SRC_MODULES、 LIBS、 INCLUDE_PATH 即可。

============================================
#================================================
# User define parameter
#
PROGRAM = hello
CC = g++
LINK = g++
CFLAGS = -Wall 
#LDFLAGS = 

SRC_FILE_TYPE = cxx
SRC_DIR := src

LIBS := -lpthread
INCLUDE_PATH := -I$(SRC_DIR)/include 

#define main source file in which "main()" function exist!
#MAIN_FILE = main
MAIN_FILE = $(PROGRAM)

# module define which act as subdirectory reside in "src" directory
#SRC_MODULES = main conf ca comm pm utils ic reg timer 
SRC_MODULES = main 

#==================================================
# Optional User define parameter
#

#program build mode is: debug/release
BUILD_MODE := debug
#BUILD_MODE := release

#Auto dependent generated? (YES/NO)
#AUTO_DEPENDENT = YES
#AUTO_DEPENDENT = NO

#=================================================
#directory define
BUILD_DIR := ./bin
DEPS_DIR := $(BUILD_DIR)/depend

#================================================= 
#get out put directory
ifeq ($(BUILD_MODE),debug)
OUTPUT_DIR := $(BUILD_DIR)/debug
CFLAGS += -g -O0

else
ifeq ($(BUILD_MODE),release)
OUTPUT_DIR := $(BUILD_DIR)/release
CFLAGS += -O3

else
$(error "BUILD_MODE error!(release/debug)")
endif
endif

##set target
target = $(PROGRAM)

#add path
#VPATH = $(shell find $(SRC_DIR) -type d)
#VPATH = $(SRC_DIR)
VPATH += $(addprefix $(SRC_DIR)/, $(SRC_MODULES))

#FIND_SRC_FILES = $(shell find $(SRC_DIR) -maxdepth 1 -name "*.$(SRC_FILE_TYPE)")
#SRC_FILES = $(notdir $(FIND_SRC_FILES) )

FIND_SRC_FILES = $(foreach dir, $(VPATH), $(wildcard $(dir)/*.$(SRC_FILE_TYPE)))
SRC_FILES = $(notdir $(FIND_SRC_FILES) )

OBJ_FILES = $(SRC_FILES:.$(SRC_FILE_TYPE)=.o)

#auto depend file?
ifeq ($(AUTO_DEPENDENT) ,YES)
DEP_FILES = $(SRC_FILES:.$(SRC_FILE_TYPE)=.d)
endif

OUTPUT_OBJS = $(addprefix $(OUTPUT_DIR)/,$(OBJ_FILES))
OUTPUT_DEPS = $(addprefix $(DEPS_DIR)/,$(DEP_FILES))

#INCLUDE_PATH += $(addprefix -I , $(VPATH))

##======  start of init shell ======##
## exec init shell command

$(shell mkdir -p "$(OUTPUT_DIR)")
$(shell mkdir -p "$(DEPS_DIR)")
#$(foreach dir, $(SRC_MODULES),$(shell mkdir -p "$(DEPS_DIR)/$(dir)"))

##======= end of init ==============##

#add target
.PHONY:all
all: $(BUILD_DIR)/$(target)

.PHONY: help
help:
	@echo "make's target is:  "
	@echo "		make all      --  make all and generate target!"
	@echo "		make run      --  make all and run the target! "
	@echo "		make clean    --  make clean the object files!"
	@echo "		make cleanall --  make clean all ,clean everything!"
	@echo "Test:"
	@echo "		make test     --  make  test target!"
	@echo "		make testrun  --  make test target and run it!"
	@echo "		make help     --  this help!"
	@echo " "
	@echo " "



## 
#link all objs and libs
$(BUILD_DIR)/$(target): $(OUTPUT_DIR)/$(MAIN_FILE).o $(OUTPUT_DEPS) $(OUTPUT_OBJS) 
	$(LINK) $(LIB_PATH)  $< $(OUTPUT_OBJS) $(CFLAGS) -o $@ $(LIBS)
	@echo "Make '$(BUILD_DIR)/$(target)' finished!"
  
    
#compile source files into object files
$(OUTPUT_DIR)/%.o: %.$(SRC_FILE_TYPE) 
	$(CC) $(CFLAGS) $(INCLUDE_PATH) -I $(basename $<) -c $< -o $@

#src dir compiler
$(OUTPUT_DIR)/%.o: $(SRC_DIR)/%.$(SRC_FILE_TYPE)
	$(CC) $(CFLAGS) $(INCLUDE_PATH) -c $< -o $@

#
$(DEPS_DIR)/%.d: %.$(SRC_FILE_TYPE)
	@echo -n "$(OUTPUT_DIR)/" > $@
	$(CC) -MM $(INCLUDE_PATH) $< >> $@


.PHONY:test
test: $(OUTPUT_DIR)/test.o $(OUTPUT_DEPS) $(OUTPUT_OBJS)
	$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) $< -o $(BUILD_DIR)/$@ $(LIBS)
	

.PHONY:testrun
testrun: test
	$(BUILD_DIR)/test

.PHONY:run
run: $(BUILD_DIR)/$(target)
	$(BUILD_DIR)/$(target)

.PHONY:clean
clean:
	-rm -rf $(OUTPUT_DIR)
	-rm -f $(BUILD_DIR)/$(target)

.PHONY:cleanall
cleanall:clean
	-rm -rf $(BUILD_DIR)/*

#dep files
-include $(OUTPUT_DEPS)

#=========== user custom target define here ===================================
#.PHONY:test
#test1: $(OUTPUT_DIR)/test1.o $(OUTPUT_DEPS) $(OUTPUT_OBJS)
#	$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) $< -o $(BUILD_DIR)/$@ $(LIBS)

#.PHONY:test
#test2: $(OUTPUT_DIR)/test2.o $(OUTPUT_DEPS) $(OUTPUT_OBJS)
#	$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) $< -o $(BUILD_DIR)/$@ $(LIBS)

#.PHONY:test
#test3: $(OUTPUT_DIR)/test3.o $(OUTPUT_DEPS) $(OUTPUT_OBJS)
#	$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) $< -o $(BUILD_DIR)/$@ $(LIBS)






分享到:
评论

相关推荐

    一个通用Makefile的编写

    在这个通用的Makefile中,我们做了以下几点改进: 1. `$(wildcard *.c)`:这个通配符表达式用于获取当前目录下所有`.c`文件的列表,将其赋值给变量`SRCS`,无需手动列出每个源文件。 2. `$(SRCS:.c = .o)`:这一行...

    STM32例程模板

    V3.5版本可能包含了一些新功能、改进和错误修复。 3. **MyTemplateV3.5**:这可能是压缩包中的主要文件或文件夹,包含了STM32例程模板的所有内容。可能包括了初始化代码、示例程序、Makefile、配置文件等,用于快速...

    C&C++通用Makefile[归类].pdf

    - 创建一个名为`Makefile`的文本文件,将提供的模板内容粘贴进去,确保命令前的Tab字符正确无误。 - 修改Makefile中的变量值,比如`PROGRAM`、`SRCDIRS`和`SRCEXTS`,以匹配项目的具体需求。 - 切换到Makefile...

    Generic Makefile for C/C++ Programs-开源

    "Generic Makefile for C/C++ Programs-开源"项目提供了一个通用且可定制的Makefile模板,旨在简化C和C++项目的构建流程。 Makefile是一种脚本,它定义了如何从源代码生成可执行文件或库。这个开源项目的核心价值...

    2018研究生数模论文LaTeX模板V2.0

    【描述】"2018研究生数模论文LaTeX模板V2.0"表明这是一个更新过的模板,可能包含了2018年以前版本中的改进和优化,旨在帮助研究生更高效、规范地撰写数学建模论文。模板通常会包含预设的页面布局、标题样式、参考...

    清华大学论文模板

    【清华大学论文模板】是专为清华大学学生和研究人员设计的一套 LaTeX 模板,旨在帮助他们按照学校规定的格式规范撰写学术论文、毕业论文等...同时,模板的开源性质也鼓励社区参与和持续改进,确保了模板的与时俱进。

    包含配置的Makefile框架pConfigure-开源

    描述中提到,“包含配置的Makefile框架”是指pConfigure系统的核心功能,即提供了一套用于项目配置的Makefile模板和规则。开发者可以通过这个框架,无需复杂的autoconf或其他类似的配置工具,就能处理项目的编译和...

    北京理工大学非官方 LaTeX 模板集合,包含本科、研究生毕业设计模板.zip

    7. **CHANGELOG.md**:这是项目变更日志,记录了模板每次更新的主要变化和改进,方便用户了解新版本的特性。 8. **README.md**:这是项目的基本说明文件,通常包含模板的安装、使用方法以及注意事项等信息,是初次...

    模板:广泛项目中常用文件的模板。 包括Makefile,脚本等

    随着脚本的不断改进,跟踪整个项目的最新版本变得很繁琐。 因此,我将它们全部放在一个地方并根据需要进行更新。 该存储库包含用于基于Linux的项目的模板,这些模板主要针对具有ARM CPU和Xilinx FPGA的嵌入式设备。...

    latex数学建模美赛模板

    7. `discussion.tex`: 讨论,对模型的局限性和改进方向进行探讨。 8. `conclusion.tex`: 结论,总结研究工作并指出未来可能的研究方向。 9. `bibliography.bib`: 参考文献数据库,使用`bibtex`管理参考文献。 10. `...

    武汉大学博士论文latex模板最新版本

    这篇描述提到的“最新版本”意味着这个模板集已经更新至2014年5月15日的WHUPhd(20140515),可能包含了最新的校规要求、格式调整和改进。 在使用这个模板时,首先你需要下载并解压压缩包,其中可能包含以下文件和...

    西电本科毕业设计论文LaTeX模板宏包.zip

    6. `ChangeLog.md`:变更日志,记录了模板的更新历史,方便用户了解每次更新的内容和改进。 7. `README.md`:说明文件,提供了模板的使用指南和注意事项,包括如何安装、如何开始编写以及常见问题解答。 8. `...

    buildmake:基于 Makefile 的构建系统。-开源

    2. **创建 Makefile**:`BuildMake` 提供模板和指导,帮助你快速生成符合规范的 `Makefile`。 3. **定义目标和依赖**:在 `Makefile` 中,指定你的可执行文件或其他输出作为目标,并列出它们依赖的源文件。 4. **...

    Make it so

    在Google Code上,"solution to makefile" 可能是指一个开源项目或资源,旨在解决使用makefile时遇到的常见问题,或者是提供了一种更高效、更易用的makefile模板或库。这个项目可能包含了特定的策略和最佳实践,帮助...

    makefile &amp; compilation harness gener-开源

    虽然具体到这个名为"emtoo"的压缩包文件没有详细信息,但我们可以推测它可能包含一个实现了上述功能的Makefile模板、相关脚本和可能的解释文档。使用这个工具,开发者可以在C和C++项目中更有效地管理头文件的包含,...

    Template工程模板——新建工程使用(基于固件库V3.5.0).zip

    固件库V3.5.0在前一版本的基础上进行了优化和增强,增加了更多功能,改进了兼容性和性能。 在使用这个模板时,首先你需要一个支持C/C++的集成开发环境(IDE),如Keil MDK、IAR Embedded Workbench或STM32CubeIDE。...

    MakeGENerator - The Makefile GENerator-开源

    使用MakeGENerator的开发者可以通过阅读其文档、示例和配置模板来了解如何充分利用这个工具。由于它是开源的,社区的支持和贡献也是其持续发展和改进的重要动力。因此,如果你遇到问题或有新的需求,可以参与到开源...

    嵌入式软件开发工程师个人简历模板(常用版).docx

    7. 在快速部署项目中,需要对平台所有的服务器进行 debian 化,添加 templates 文件和修改 Debian 目录的postinst,prerm,rules 脚本,并修改 Makefile 和各个服务器的启动脚本文件。 8. 在云会议平台传输管理服务器...

    tmake个版本集合

    3. **Makefile模板**:tmake 提供了预定义的模板,简化了Makefile的编写,通过简单的配置即可生成适合特定项目的Makefile。 4. **变量和规则的抽象**:tmake 将常见的编译和链接操作抽象为可重用的变量和规则,方便...

    FATFS(R0.12a)模板工程.zip

    该版本R0.12a相较于之前的版本,进行了优化和改进,提供了更好的易用性和兼容性。在这个压缩包中,你将找到一个工程模板,帮助开发者快速集成和使用FATFS。 FATFS是Tatsuhiko Hagiwara开发的一个开源项目,它的主要...

Global site tag (gtag.js) - Google Analytics