问题背景
今天在makefile中,遇到一个场景,依赖一个目标,需要cd到其他文件夹里面执行一个操作。简单来说,可以描述成这样:
lbm_mtl_server_mock.so这个目标的生成,我需要去到相关的目录去执行一个make操作。
注:这里的LBM_MTL_SERVER_DIR=/workspace/branches/linux/pb_lbm/lbm_mtl_server
然后,就遇到了一个问题,就在本目录一直循环。遇到的情况如下:
问题分析
这里一直找不到头绪,为什么这里会陷入一个无限循环呢?从makefile的角度来分析这个问题。
依赖结构这样写,应该没有问题。注意到这里出错的情况下,每次都cd过去了,然后make的时候,又cd回原目录了。
初始怀疑:是不是cd没有成功?导致在当前目录下直接执行了 make,进而一直导致循环的产生。
问题验证
我们换种写法,我们直接把cd $(LBM_MTL_SERVER_DIR) && make试一下如何?
实验结果证实,直接写成cd $(LBM_MTL_SERVER_DIR) && make,就成功进入到了LBM_MTL_SERVER_DIR目标目录,并执行了make。这是神马原因?难道这里的shell执行还不一样,分两行写还不同了?
makefile中的命令
到了gun的makefile官网,找到makefile官方手册。终于找到了问题的真相。
在makefile中的命令,它采用的是每行使用独立的shell进程来执行,每一行之间没有关系。读到这里就明白了,如果想要执行一系列动作,那你必须把命令写到同一行中,否则就是由不同的shell子进程来执行。
这里把原文贴出来:
这里把gun_make的文档上传到附件,大家感兴趣可以进行阅读。gun_make.pdf