Introduction

# 整个工程由多个源代码目录组成,每个目录有自己独立的一个makefile,这个makefile是一个大的、整体的Makefile来构建整个工程,
# 默认情况是全编,也提供单编某个模块的指令,比如工程proj由mod1、mod2、mod3这几个编译单元组成,它们之间还存在着依赖关系。我写了一个这样的Makefile:
# make # 全编
# make mod1 # 单编mod1目录
# make mod2 # 单编mod2目录
# ...
# make clean # 清除已经编译的

# 切换到指定目录,然后就进行编译
define cd_and_compile
    make -C $(1) || exit "$$?"
endef

# 切换到指定目录,然后就进行清空
define cd_and_clean
    make -C $(1) clean || exit "$$?"
endef

# 所有需要编译的模块,已经按照依赖关系排序
MOD:= mod1 mod2 mod3 

# 先全部清空,然后进行全编
all: clean $(MOD)


# 单编mod3,输出libmod3.so
mod3:
    $(call cd_and_compile, $@)

# 单编mod1,输出libmod1.a
mod1: 
    $(call cd_and_compile, $@)

# 单编mod2,输出libmod2.a
mod2: 
    $(call cd_and_compile, $@)


# 清空mod3
clean_mod3:
    $(call cd_and_clean, mod3)
# 清空mod1
clean_mod1:
    $(call cd_and_clean, mod1)
# 清空mod2
clean_mod2:
    $(call cd_and_clean, mod2)


# 清空
clean:
    @for dir in $(MOD); do  \
        $(call cd_and_clean, $$dir);    \
    done

.PHONY:all $(MOD) clean clean_mod3 clean_mod2 clean_mod1