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中,我们做了以下几点改进: 1. `$(wildcard *.c)`:这个通配符表达式用于获取当前目录下所有`.c`文件的列表,将其赋值给变量`SRCS`,无需手动列出每个源文件。 2. `$(SRCS:.c = .o)`:这一行...
V3.5版本可能包含了一些新功能、改进和错误修复。 3. **MyTemplateV3.5**:这可能是压缩包中的主要文件或文件夹,包含了STM32例程模板的所有内容。可能包括了初始化代码、示例程序、Makefile、配置文件等,用于快速...
- 创建一个名为`Makefile`的文本文件,将提供的模板内容粘贴进去,确保命令前的Tab字符正确无误。 - 修改Makefile中的变量值,比如`PROGRAM`、`SRCDIRS`和`SRCEXTS`,以匹配项目的具体需求。 - 切换到Makefile...
"Generic Makefile for C/C++ Programs-开源"项目提供了一个通用且可定制的Makefile模板,旨在简化C和C++项目的构建流程。 Makefile是一种脚本,它定义了如何从源代码生成可执行文件或库。这个开源项目的核心价值...
【描述】"2018研究生数模论文LaTeX模板V2.0"表明这是一个更新过的模板,可能包含了2018年以前版本中的改进和优化,旨在帮助研究生更高效、规范地撰写数学建模论文。模板通常会包含预设的页面布局、标题样式、参考...
【清华大学论文模板】是专为清华大学学生和研究人员设计的一套 LaTeX 模板,旨在帮助他们按照学校规定的格式规范撰写学术论文、毕业论文等...同时,模板的开源性质也鼓励社区参与和持续改进,确保了模板的与时俱进。
描述中提到,“包含配置的Makefile框架”是指pConfigure系统的核心功能,即提供了一套用于项目配置的Makefile模板和规则。开发者可以通过这个框架,无需复杂的autoconf或其他类似的配置工具,就能处理项目的编译和...
7. **CHANGELOG.md**:这是项目变更日志,记录了模板每次更新的主要变化和改进,方便用户了解新版本的特性。 8. **README.md**:这是项目的基本说明文件,通常包含模板的安装、使用方法以及注意事项等信息,是初次...
随着脚本的不断改进,跟踪整个项目的最新版本变得很繁琐。 因此,我将它们全部放在一个地方并根据需要进行更新。 该存储库包含用于基于Linux的项目的模板,这些模板主要针对具有ARM CPU和Xilinx FPGA的嵌入式设备。...
7. `discussion.tex`: 讨论,对模型的局限性和改进方向进行探讨。 8. `conclusion.tex`: 结论,总结研究工作并指出未来可能的研究方向。 9. `bibliography.bib`: 参考文献数据库,使用`bibtex`管理参考文献。 10. `...
这篇描述提到的“最新版本”意味着这个模板集已经更新至2014年5月15日的WHUPhd(20140515),可能包含了最新的校规要求、格式调整和改进。 在使用这个模板时,首先你需要下载并解压压缩包,其中可能包含以下文件和...
6. `ChangeLog.md`:变更日志,记录了模板的更新历史,方便用户了解每次更新的内容和改进。 7. `README.md`:说明文件,提供了模板的使用指南和注意事项,包括如何安装、如何开始编写以及常见问题解答。 8. `...
2. **创建 Makefile**:`BuildMake` 提供模板和指导,帮助你快速生成符合规范的 `Makefile`。 3. **定义目标和依赖**:在 `Makefile` 中,指定你的可执行文件或其他输出作为目标,并列出它们依赖的源文件。 4. **...
在Google Code上,"solution to makefile" 可能是指一个开源项目或资源,旨在解决使用makefile时遇到的常见问题,或者是提供了一种更高效、更易用的makefile模板或库。这个项目可能包含了特定的策略和最佳实践,帮助...
虽然具体到这个名为"emtoo"的压缩包文件没有详细信息,但我们可以推测它可能包含一个实现了上述功能的Makefile模板、相关脚本和可能的解释文档。使用这个工具,开发者可以在C和C++项目中更有效地管理头文件的包含,...
固件库V3.5.0在前一版本的基础上进行了优化和增强,增加了更多功能,改进了兼容性和性能。 在使用这个模板时,首先你需要一个支持C/C++的集成开发环境(IDE),如Keil MDK、IAR Embedded Workbench或STM32CubeIDE。...
使用MakeGENerator的开发者可以通过阅读其文档、示例和配置模板来了解如何充分利用这个工具。由于它是开源的,社区的支持和贡献也是其持续发展和改进的重要动力。因此,如果你遇到问题或有新的需求,可以参与到开源...
7. 在快速部署项目中,需要对平台所有的服务器进行 debian 化,添加 templates 文件和修改 Debian 目录的postinst,prerm,rules 脚本,并修改 Makefile 和各个服务器的启动脚本文件。 8. 在云会议平台传输管理服务器...
3. **Makefile模板**:tmake 提供了预定义的模板,简化了Makefile的编写,通过简单的配置即可生成适合特定项目的Makefile。 4. **变量和规则的抽象**:tmake 将常见的编译和链接操作抽象为可重用的变量和规则,方便...
该版本R0.12a相较于之前的版本,进行了优化和改进,提供了更好的易用性和兼容性。在这个压缩包中,你将找到一个工程模板,帮助开发者快速集成和使用FATFS。 FATFS是Tatsuhiko Hagiwara开发的一个开源项目,它的主要...