编写自己的Makefile

来源:互联网 发布:ios必备app知乎 编辑:程序博客网 时间:2024/05/21 17:10

之前学习了一些Makefile规则,自己编写了一个简单的Makefile,分为三个部分:HYCMakefile,Makefilebase.mk,Makefile

Makefilebase.mk是一些通用规则,就像c++代码中的头文件,我们把一些通用的规则,放在一起;

HYCMakefile,是一些需要使用Makefile时,才能确定的一些内容,比如用到哪些include目录,库文件目录,用到哪些宏定义、哪些源文件 等等;

 

Makefile的内容如下:

#############################################################################
# author:huangxw
#     hyc
#############################################################################

#
PROJ_TYPE = HYC
#
include $(HYC_BASE)/etc/Makefilebase.mk            #####这个就是把基本规则引入

#
DEST=test

#BIN,APP
DEST_TYPE = BIN
#
USER_DEFS= TEST_LOG

DEST_SOURCES:= $(shell find ./ -maxdepth 1  -name \*.cpp)

#
USER_INC_PATH =$(HYC_BASE)/include/unix     #####头文件路径

#
USER_LIBRARIES =        #####包含哪些库
#
# 包含基本的 Makefile 规则文件
include $(HYC_BASE)/etc/HYCMakefile   #####这个根据引入第二部分,这里面调用了g++等

 

【说明】这里的include可以理解为c++代码中的宏定义,直接把文件内容替换

 

Makefilebase.mk源码:

#####################################################################
#
# author:huangxw
#     hyc
#####################################################################
#
#
OS_TYPE := $(shell uname)
#
#
ifeq "$(OS_TYPE)" "Linux"
endif

#################################################################################

#public
CC=g++
CFLAGS := -Wall -g -fPIC
#
ifeq ($(DEST_TYPE),APP)
 CFLAGS +=  -shared
endif
#
ifeq "$(PROJ_TYPE)" "PROJ_TEST"
    INCLUDE_PATH := $(HOME)/work/project/include
    INSTALL_HEADER_PATH := $(HOME)/work/project/include
    LIB_PATH := /home/huangxw/ob_rel/lib
    INSTALL_LIB_PATH := /home/huangxw/ob_rel/lib
endif

#
ifeq "$(PROJ_TYPE)" "HYC"
    INCLUDE_PATH := ./ $(HYC_BASE)/include
    INSTALL_HEADER_PATH := $(HYC_BASE)/include
    LIB_PATH := ./ $(HYC_BASE)/lib
    INSTALL_LIB_PATH := $(HYC_BASE)/lib
 OB_REL := $(HYC_BASE)/etc
endif
#################################################################################
Source2Object = $(foreach i,$(basename $(notdir $(1))),build/$(i).o)
##################################################################################

 

HYCMakefile源码:

#############################################################################
# author:huangxw
#     hyc
#############################################################################
#
TARGET=$(DEST)
#
ifeq ($(DEST_TYPE),APP)
 TARGET=lib$(DEST).so
endif
#
ifneq "$(USER_DEFS)" ""
 H_USER_DEFS := $(foreach n,$(USER_DEFS),-D$(n))
endif
#
H_LIB_PATH:=
ifneq "$(LIB_PATH)" ""
 H_LIB_PATH := $(foreach n,$(LIB_PATH),-L$(n))
endif
#
H_INCLUDE_PATH:=
ifneq "$(USER_INC_PATH)" ""
 INCLUDE_PATH += $(USER_INC_PATH)
endif
H_INCLUDE_PATH := $(patsubst %, -I%, $(INCLUDE_PATH))
#
H_USER_LIBRARIES:=
ifneq "$(USER_LIBRARIES)" ""
 H_USER_LIBRARIES := $(patsubst  %,-l% , $(USER_LIBRARIES))
endif

###########################################################################
OBJS := $(DEST_SOURCES:.cpp=.o)
PATHOBJS := $(call Source2Object,$(DEST_SOURCES))
all:echo dir $(OBJS) $(TARGET) exec
echo:
 @echo $(OBJS)
dir:
 mkdir -p build
$(OBJS):%.o:%.cpp
 $(CC)  $(CFLAGS) $(H_USER_DEFS) $(H_INCLUDE_PATH) $(H_LIB_PATH) $(H_USER_LIBRARIES) -c $<  -o ./build/$(notdir $@)
$(TARGET):$(PATHOBJS)
 $(CC)  $(CFLAGS) $(H_USER_DEFS) $(H_INCLUDE_PATH) $(H_LIB_PATH) $(H_USER_LIBRARIES) $?  -o build/$@
exec:
 @cp ./build/$(TARGET) .
###############################################
clean:
 rm -rf  build $(TARGET)

 


 

 

 各位兄弟姐妹,如果你看到了这里,并觉得有些帮助,请顶一个,谢谢!

原创粉丝点击