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

Makefile的模板

阅读更多
说明:

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)


分享到:
评论

相关推荐

    makefile模板

    5. **使用Makefile模板的优势** - **可复用性**:模板简化了创建新 `Makefile` 的过程,避免重复工作。 - **标准化**:模板确保项目的构建方式一致,有利于团队协作。 - **可扩展性**:根据项目需求对模板进行...

    linux开发Makefile模板

    使用Makefile模板,用户只需要根据需要配置头文件路径,库文件路径,编译器、目标文件名即可一键make,生成对应编译器平台的可执行程序

    LINUX驱动Makefile模板[文].pdf

    LINUX驱动Makefile模板详解 在软件开发中,编写驱动程序的Makefile是一个非常重要的步骤。Makefile是用于自动地编译、链接和安装驱动程序的脚本文件。今天,我们将详细解释LINUX驱动Makefile模板的各个部分,并对...

    linux_ 几个常用makefile模板.pdf

    ### 动态库Makefile模板 1. **目标设定**:`PRG = libsvrtool.so`定义了目标动态库的名称。 2. **编译器与选项**:`CC = g++`指定使用`g++`作为编译器,`CC_FLAG`设置了编译选项,例如`-D_NOMNG -D_FILELINE`。 3. ...

    通用Makefile模板

    ### 通用Makefile模板解析与应用 #### 一、Makefile概述 Makefile是一种用于自动化构建过程的脚本文件,在软件开发过程中极为常见。通过定义一系列规则,Makefile能够自动处理项目的编译、链接等任务,极大地提高...

    Makefile模板示例

    在本案例中,我们有三个Makefile模板,分别是两个简单的模板和一个复杂的模板,用于演示不同层次的Makefile使用。 简单Makefile通常包括以下几个部分: 1. **目标(Targets)**:这是Makefile的基本构建块,如`all`...

    Makefile模板

    本文将详细讲解如何利用“Makefile模板”来快速编写Makefile,并探讨其与`gcc`编译器的配合使用。 一、Makefile模板介绍 Makefile模板通常包含一系列预设的规则和变量,帮助开发者快速搭建构建环境。这些模板可能...

    Makefile.zip_Makefile模板_makefile

    在给定的"Makefile.zip"压缩包中,包含了一个通用的Makefile模板,旨在简化项目构建流程。 首先,我们来看Makefile的基本结构。Makefile由目标(target)、依赖项(dependency)和命令(command)组成。目标通常是...

    通用的makefile模板

    通用的 `Makefile` 模板旨在提供一个灵活、模块化和跨平台的解决方案,使得开发者能够在不同环境中轻松地编译和管理项目。本文将深入探讨这个模板的核心特性及其在实际开发中的应用。 首先,`Makefile` 的模块化...

    lwbuild轻量级构建框架(Makefile模板)

    Makefile模板是预定义的一系列规则和指令,用于自动化编译、链接等构建任务,极大地提高了开发效率。 Makefile是Unix/Linux环境中的一种自动化构建脚本,它定义了如何从源代码生成可执行文件或库的规则。在lwbuild...

    Linux动态库,静态库,exe的makefile模板

    下面我们将详细讨论如何创建和使用这些库,并提供一个基本的`Makefile`模板。 首先,让我们理解一下动态库和静态库的区别: 1. **动态库**(.so文件):在运行时被加载到内存中,多个程序可以共享同一份库文件,...

    基本通用makefile模板

    基本通用makefile模板, 目录结构 ./src ./include ./lib。 makefile和*.c文件放在 ./src 目录, 头文件放在 ./include目录, 库文件放在 ./lib目录。不需要静态编译,取消 -static。 my_main_c 替换为你需要编译的...

    template-6-10.rar_Makefile模板_linux项目

    `template-6-10.rar_Makefile模板_linux项目`是一个专门针对Linux项目设计的`Makefile`模板,旨在帮助开发者快速搭建并维护他们的小型或中型项目。 首先,我们需要理解`Makefile`的基本结构。`Makefile`由一系列...

    Makefile模板 和我一起学习Makefile

    Makefile模板,linux下生手,半生不熟的人的好伙伴.照葫芦画瓢的好东西.

Global site tag (gtag.js) - Google Analytics