说明:
0) Makefile文件放置于项目的根目录。
1) 项目源代码文件放置于src目录下面,可以在src下面建立子目录分别放置每个模块的源代码文件。Makefile会自动搜索并生成依赖以及编译这些源文件。
项目的主启动文件(含有main()函数)放置于src/main目录下面。
如果有其它的含main()的启动文件,请放置于src/xxx目录下面,例如测试目录:
src/test_xxx。使用时,拷贝一份Makfile重命名,修改src_module的值,然后用make -f xxx.mk 来编译需要的文件。
2) 编译的自动依赖文件放置于 bin/depend目录下面。
3) 调试版本(debug)编译的中间结果放置于 bin/debug, 发布版本(release)放置于bin/release
4) 清除分为 clean 和 cleanall
5) 使用时只需要修改 cc ,link 和 src_file_type的值就可以了。
PROGRAM = hello
CC = gcc
CFLAGS = -Wall
LINK = gcc
#LDFLAGS =
SRC_FILE_TYPE = c
#==================================================
# module define
SRC_MODULES = main conf util
#=================================================
#directory define
SRC_DIR := src
BUILD_DIR := ./bin
DEPS_DIR := $(BUILD_DIR)/depend
#==================================================
#program build mode is: debug/release
BUILD_MODE := debug
#BUILD_MODE := release
#Auto dependent generated? (YES/NO)
#AUTO_DEPENDENT = YES
AUTO_DEPENDENT = NO
#==================================================
#add the lib you used here
#LIBS := -lLib1 -lLib2 -lLib3
#LIBS := -lpthread
LIBS := -lpthread -lxml2
#LIB_PATH := -Lpath1 -Lpath2 -Lpath3
LIB_PATH :=
INCLUDE_PATH := -I $(SRC_DIR) -I ./src/include -I /usr/local/include/libxml2
#INCLUDE_PATH := -I/usr/lib/XXX/include
#=================================================
#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)
target_test = $(PROGRAM)_test
#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_DEPS) $(OUTPUT_OBJS)
@echo "|------------------------------------------------|"
@echo $(SRC_FILES)
$(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 $@
#
$(DEPS_DIR)/%.d: %.$(SRC_FILE_TYPE)
@echo -n "$(OUTPUT_DIR)/" > $@
$(CC) -MM $(INCLUDE_PATH) $< >> $@
.PHONY:test
$(BUILD_DIR)/$(target_test): $(OUTPUT_DEPS) $(OUTPUT_OBJS)
@echo "--------->make test!"
$(LINK) $(LIB_PATH) $(OUTPUT_OBJS) $(CFLAGS) -o $@ $(LIBS)
.PHONY:test
test: $(BUILD_DIR)/$(target_test)
.PHONY:testrun
testrun: test
$(BUILD_DIR)/$(target_test)
.PHONY:run
run:
$(BUILD_DIR)/$(target)
.PHONY:clean
clean:
-rm -rf $(OUTPUT_DIR)
-rm -f $(BUILD_DIR)/$(target)
-rm -f $(BUILD_DIR)/$(target_test)
.PHONY:cleanall
cleanall:clean
-rm -rf $(DEPS_DIR)
#dep files
-include $(OUTPUT_DEPS)
分享到:
相关推荐
5. **使用Makefile模板的优势** - **可复用性**:模板简化了创建新 `Makefile` 的过程,避免重复工作。 - **标准化**:模板确保项目的构建方式一致,有利于团队协作。 - **可扩展性**:根据项目需求对模板进行...
使用Makefile模板,用户只需要根据需要配置头文件路径,库文件路径,编译器、目标文件名即可一键make,生成对应编译器平台的可执行程序
LINUX驱动Makefile模板详解 在软件开发中,编写驱动程序的Makefile是一个非常重要的步骤。Makefile是用于自动地编译、链接和安装驱动程序的脚本文件。今天,我们将详细解释LINUX驱动Makefile模板的各个部分,并对...
### 动态库Makefile模板 1. **目标设定**:`PRG = libsvrtool.so`定义了目标动态库的名称。 2. **编译器与选项**:`CC = g++`指定使用`g++`作为编译器,`CC_FLAG`设置了编译选项,例如`-D_NOMNG -D_FILELINE`。 3. ...
### 通用Makefile模板解析与应用 #### 一、Makefile概述 Makefile是一种用于自动化构建过程的脚本文件,在软件开发过程中极为常见。通过定义一系列规则,Makefile能够自动处理项目的编译、链接等任务,极大地提高...
在本案例中,我们有三个Makefile模板,分别是两个简单的模板和一个复杂的模板,用于演示不同层次的Makefile使用。 简单Makefile通常包括以下几个部分: 1. **目标(Targets)**:这是Makefile的基本构建块,如`all`...
本文将详细讲解如何利用“Makefile模板”来快速编写Makefile,并探讨其与`gcc`编译器的配合使用。 一、Makefile模板介绍 Makefile模板通常包含一系列预设的规则和变量,帮助开发者快速搭建构建环境。这些模板可能...
在给定的"Makefile.zip"压缩包中,包含了一个通用的Makefile模板,旨在简化项目构建流程。 首先,我们来看Makefile的基本结构。Makefile由目标(target)、依赖项(dependency)和命令(command)组成。目标通常是...
通用的 `Makefile` 模板旨在提供一个灵活、模块化和跨平台的解决方案,使得开发者能够在不同环境中轻松地编译和管理项目。本文将深入探讨这个模板的核心特性及其在实际开发中的应用。 首先,`Makefile` 的模块化...
Makefile模板是预定义的一系列规则和指令,用于自动化编译、链接等构建任务,极大地提高了开发效率。 Makefile是Unix/Linux环境中的一种自动化构建脚本,它定义了如何从源代码生成可执行文件或库的规则。在lwbuild...
下面我们将详细讨论如何创建和使用这些库,并提供一个基本的`Makefile`模板。 首先,让我们理解一下动态库和静态库的区别: 1. **动态库**(.so文件):在运行时被加载到内存中,多个程序可以共享同一份库文件,...
基本通用makefile模板, 目录结构 ./src ./include ./lib。 makefile和*.c文件放在 ./src 目录, 头文件放在 ./include目录, 库文件放在 ./lib目录。不需要静态编译,取消 -static。 my_main_c 替换为你需要编译的...
`template-6-10.rar_Makefile模板_linux项目`是一个专门针对Linux项目设计的`Makefile`模板,旨在帮助开发者快速搭建并维护他们的小型或中型项目。 首先,我们需要理解`Makefile`的基本结构。`Makefile`由一系列...
Makefile模板,linux下生手,半生不熟的人的好伙伴.照葫芦画瓢的好东西.