makefile子目录,call function, 多rules之间的独立shell

MAKE = make

SUBDIR = sub

TESTVAR = aaa

.PHONY: all

# subroutine:
#       @echo "call  11111"

# all:
#       $(call subroutine)
#       $(warning ---!!!---)cd ${SUBDIR} && ${MAKE}

# all:
#       @echo  TESTVAR == ${TESTVAR}
#       $(warning ---!!!---)cd ${SUBDIR} && ${MAKE}
#       @CURVAR=mmm; echo  "--1--" $${CURVAR};
#       @echo "--2--" $${CURVAR}

all:
        @echo  TESTVAR == ${TESTVAR}
        $(warning ---!!!---)cd ${SUBDIR} && ${MAKE}
        @CURVAR=mmm; echo  "--1--" $${CURVAR};  \
        echo "--2--" $${CURVAR}



sub directory



TESTVAR = sssub

all:
        @echo  "-----2-----" ${TESTVAR}




下面所称的 make 都假定是 GNU Make,也是所有 Linux 发行版所采用的 make 版本。本文内容主要来自从 GNU Make manual(在 Debian/Ubuntu 中,安装软件包 make-doc,然后执行命令 info make 就可以看到;对于自己编译的 make 版本,自身就带有 doc)。

这里所称递归使用指从 Makefile 里再调用 make 去执行另一个 Makefile,对于具有目录结构的工程很有用,通常可以为每个目录创建一个 Makefile,然后用一个总的 Makefile 进行管理。

(1) 基本用法
在一个 Makefile 里调用另一个 Makefile 的命令是:
cd subdir && $(MAKE)

因为每一条命令都使用一个单独的 shell 环境,具有独立的当前目录,故 MAKE 后面无需再加上 cd..。Make 的 manual 建议:永远使用 $(MAKE) 而不要直接在 Makefile 中写 make,这可以保证在系统中装有不同版本的 make 时父进程与子进程是相同版本,这可以保证进程之间的通信正确。

(2) 变量传递
make 可以将变量传递给子 make 进程,按照以下规则:
a. 用户在命令行上赋值的变量默认传递,并且仍以命令行方式传递(这可保证子进程再有子进程时一直传下去)
b. Makefile 中赋值的变量默认不传递
c. 用 export 命令可明令传递某一个变量(用法类似 bash,如 export MYVAR)
d. 用 unexport 命令可明令不传递某一个变量
e. 如果对一个变量有多次赋值,则它们的优先级顺序为:命令行赋值优先级最高;Makefile 自身的赋值次之;父进程传来的变量最低(父进程传来的命令行除外)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值