栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

自建通用Makefile 分享

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自建通用Makefile 分享

1年前写的,现在一些小型项目上,还是很好用的,兼容性还ok 分享一下 现在用不到了感觉

.PHONY:all clean

SHELL:=/bin/bash
MKDIR = mkdir -p
RM = rm
RMFLAGS = -rf

ARFLAGS = crs
DLFLAGS = -fPIC -shared

DIR_OBJS = $(ROOT)/objs
DIR_ELF = $(ROOT)/target
DIR_LIBS = $(ROOT)/libs
DIR_DLIBS = $(ROOT)/dlibs

DIRS = $(DIR_ELF) $(DIR_LIBS) $(DIR_DLIBS)

ifeq ($(CXX),g++)
CXX=g++
AR=ar
STRIP=strip
endif

ifeq ($(VERSION),"")
VERSION="plaform-name-version"
endif

ifdef TARGET
TARGET :=$(addprefix $(DIR_ELF)/,$(TARGET))
endif

ifdef LIB
LIB := $(addprefix $(DIR_LIBS)/,$(LIB))
endif

ifdef DLIB
DLIB := $(addprefix $(DIR_DLIBS)/,$(DLIB))
endif

#单独指定可以编译的源文件
ifndef SRC
SRCS=$(wildcard *.cc)
OBJS=$(SRCS:.cc=.o)
OBJS :=$(addprefix $(DIR_OBJS)/,$(OBJS))
else
SRCS:=$(SRC)
OBJS=$(SRCS:.cc=.o)
OBJS :=$(addprefix $(DIR_OBJS)/,$(OBJS))
endif

ifndef STATIC_OBJS
STATIC_OBJS = $(OBJS)
else
STATIC_OBJS := $(STATIC_OBJS:.cc=.o)
STATIC_OBJS := $(addprefix $(DIR_OBJS)/,$(STATIC_OBJS))
endif

ifneq ($(INC_DIRS),"")
INC_DIRS := $(strip $(INC_DIRS))
INC_DIRS :=$(addprefix -I,$(INC_DIRS))
endif

ifneq ($(link_LIBS),"")
link_LIBS := $(strip $(link_LIBS))
link_LIBS := $(addprefix -l,$(link_LIBS))
endif

ifneq ($(link_DLIBS),"")
link_DLIBS := $(strip $(link_DLIBS))
link_DLIBS := $(addprefix -l,$(link_DLIBS))
endif

define MAKE_EXTERN
@set -e ;
	for tmp in $(1) ;
	do 
	make -C $$tmp ;
	done
endef

define MAKE_EXTERN_CLEAN
@set -e ;
	for tmp in $(1) ;
	do 
	make clean -C $$tmp ;
	done
endef

#################### MAIN #####################
all:
	make $(DIRS)
	make $(DIR_OBJS)
ifdef LIB
	make $(LIB)
endif
ifdef DLIB
	make $(DLIB)
endif
ifdef MAKE_PRE
	$(call MAKE_EXTERN,$(MAKE_PRE))
endif
ifdef TARGET
	make $(TARGET)
endif
ifdef MAKE_OTHER
	$(call MAKE_EXTERN,$(MAKE_OTHER))
endif
#################### MAIN #####################

$(DIRS):
	$(MKDIR) $@

$(DIR_OBJS):
	$(MKDIR) $(addprefix $(DIR_OBJS)/,$(dir $(SRC))) $(dir $(STATIC_OBJS))

define COLOR_PATH
echo -e "e[31;1m$(1) $(2) $(3)33[0m"
endef

define ECHO_APP_PATH
	@set -e ;
	[[ -f $(1) ]] && $(call COLOR_PATH,[ NEW APP PATH ],>>>>>>,$(abspath $(1))) ;
	[[ -f $(1) ]] && echo "$$(date) $$(md5sum $(abspath $(1)))" >> version.log
endef

$(TARGET):$(OBJS)
	$(CXX) -L$(DIR_LIBS) -L$(DIR_DLIBS) $(filter %.o,$^) $(link_LIBS) $(link_DLIBS) -o $@ $(CFLAGS) $(INC_DIRS)
	$(STRIP) $(TARGET)
	$(call ECHO_APP_PATH,$@)

$(LIB): $(STATIC_OBJS)
	$(AR) $(ARFLAGS) $@ $(filter %.o,$^)

$(DLIB): $(SRCS)
	$(CXX) $(DLFLAGS) $(filter %.cc,$^)  -o $@ $(CFLAGS) $(INC_DIRS)

$(DIR_OBJS)/%.o : %.cc
	$(CXX) $(INC_DIRS) -E -MM $(filter %.cc,$^) > $@.dep
	$(CXX) $(INC_DIRS) -o $@ -c $(filter %.cc,$^) $(CFLAGS) $(INC_DIRS)

tags:
	@ctags -R ;
		cscope -Rbq
dist:
	@tar cvzf $$(date +%y%m%d%H%M).tar.gz $(TARGET)

version:
	echo "#ifndef __$(VERSION)_VERSION" > config.hpp
	echo "" >> config.hpp
	echo "#endif " >> config.hpp
	sed  -i 2c"static const char platform_version[] ="$(VERSION)";" config.hpp

clean:
ifdef MAKE_OTHER
	$(call MAKE_EXTERN_CLEAN,$(MAKE_OTHER))
endif
ifdef MAKE_PRE
	$(call MAKE_EXTERN_CLEAN,$(MAKE_PRE))
endif
	$(RM) $(RMFLAGS) $(notdir $(DIRS)) objs $(OBJS) tags cscope* config.hpp

此文件命名为 config.mk
大写的变量为环境变量,自己看着办

 CXX=g++
ROOT=.

TARGET=cplus_debug

SRC=$(wildcard *.cc)
include config.mk

上面的为工程管理的Makefile 文本,最简示例

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/599764.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号