nsq makefile解析

makefile逐渐成为编写项目的痛点,go的打包发布等,业界可能还没有约定俗成的技术方案。但发现很多项目还是沿用了c/c++的make方案。包括traefik、nsq等项目。所以这里对nsq的makefile做简单解析。

# 目录声明,把linux下传统的/usr/local作为存放nsq bin的主目录
PREFIX=/usr/local
DESTDIR=
GOFLAGS=
BINDIR=${PREFIX}/bin

BLDDIR = build
# 对windows做兼容
EXT=
ifeq (${GOOS},windows)
    EXT=.exe
endif

# 目标集,makefile的目的就是生成下面这些名字的可执行文件
APPS = nsqd nsqlookupd nsqadmin nsq_pubsub nsq_to_nsq nsq_to_file nsq_to_http nsq_tail nsq_stat to_nsq
# all作为伪目标依赖于APPS这个目标集
all: $(APPS)

# 这段是利用build目录作为临时的中间结果目录,因为最终都是要放到/usr/local/bin中用于系统调用
# wildcard是显示的说明后面语句中的*是通配符
$(BLDDIR)/nsqd:        $(wildcard apps/nsqd/*.go       nsqd/*.go       nsq/*.go internal/*/*.go)
$(BLDDIR)/nsqlookupd:  $(wildcard apps/nsqlookupd/*.go nsqlookupd/*.go nsq/*.go internal/*/*.go)
$(BLDDIR)/nsqadmin:    $(wildcard apps/nsqadmin/*.go   nsqadmin/*.go nsqadmin/templates/*.go internal/*/*.go)
$(BLDDIR)/nsq_pubsub:  $(wildcard apps/nsq_pubsub/*.go  nsq/*.go internal/*/*.go)
$(BLDDIR)/nsq_to_nsq:  $(wildcard apps/nsq_to_nsq/*.go  nsq/*.go internal/*/*.go)
$(BLDDIR)/nsq_to_file: $(wildcard apps/nsq_to_file/*.go nsq/*.go internal/*/*.go)
$(BLDDIR)/nsq_to_http: $(wildcard apps/nsq_to_http/*.go nsq/*.go internal/*/*.go)
$(BLDDIR)/nsq_tail:    $(wildcard apps/nsq_tail/*.go    nsq/*.go internal/*/*.go)
$(BLDDIR)/nsq_stat:    $(wildcard apps/nsq_stat/*.go             internal/*/*.go)
$(BLDDIR)/to_nsq:      $(wildcard apps/to_nsq/*.go               internal/*/*.go)

# %从上面的中间目标集match出bin名称,在build目录中mkdir目录
# $(dir $@) dir是makefile函数,$@是接收% match出的值
$(BLDDIR)/%:
	@mkdir -p $(dir $@)
	go build ${GOFLAGS} -o $@ ./apps/$*

# APPS中的所有% 依赖于 build中的所有
$(APPS): %: $(BLDDIR)/%

clean:
	rm -fr $(BLDDIR)

# 防止有同名文件
.PHONY: install clean all
.PHONY: $(APPS)

# 文件放到/usr/local/bin中,这里的install是什么命令??
install: $(APPS)
	install -m 755 -d ${DESTDIR}${BINDIR}
	for APP in $^ ; do install -m 755 ${BLDDIR}/$$APP ${DESTDIR}${BINDIR}/$$APP${EXT} ; done

makefile技术文章:
http://blog.csdn.net/liang13664759/article/details/1771246

nsq makefile解析
Share this