Makefile当中不能执行find命令

现象描述

运行Makefile的时候报警,说找不到bin文件,还卡住执行不下去了。

find: '../../../bin': No such file or directory

问题代码如下

#头文件总路径
INCLUDE_PATH = ../../../
#查找路径所有子路径
INCLUDE_SUBPATH = $(shell "find" $(INCLUDE_PATH) -type d)

里面用find命令来查找头文件路径下所有的子路径,由于这个Makefile文件只能放在某个模块下来编译某个模块的源文件,但是源文件引用到的头文件在这个模块外面,不得不通过路径寻找到对应的头文件,跟源文件一起编译才能通过。

分析思路

修改路径

因为这是个路径,我用的是相对路径,看看是不是哪里写错了,换成绝对路径试试,发现还是一样报错。

然后尝试改成别的路径,发现有这么个规律。调整了斜杠,校对了中英文大小写也不行,就是只有Makefile文件所在的文件夹和上一级文件夹能在Makefile文件里面使用find命令。很奇怪,但是不知道是什么导致的,暂时先换个方向,后面发现这个才是破局的关键。

INCLUDE_PATH = ../../../  #报错
INCLUDE_PATH = ../../     #报错
INCLUDE_PATH = ../        #不报错
INCLUDE_PATH = .          #不报错

报警信息

根据报警信息,需要找到一个叫bin文件或者文件夹,于是对比上面“修改路径”里面的四个路径,显示所有的隐藏文件,都找不到这个bin文件或者文件夹。这就很奇怪了,连不报错的路径都没有bin文件或者文件夹,它是怎么运行的呢?这时候我就认为问题应该不是出在bin文件或者文件夹这里,关键在其他地方。

CMD窗口对比

既然Makefile里面是借用CMD里面来执行DOS命令,那在CMD窗口执行的效果应该跟Makefile是一样的,于是对比测试下。

命令 makefile CMD窗口
find . 报错 不报错
find ../ 报错 不报错
find ../../ 不报错 不报错
find ../../../ 不报错 不报错

看到这结果人都麻了。

find命令的本质

同样是DOS命令,在CMD窗口不报错,在Makefile里面却报错,那就要更加深入地研究这个find是怎么运行的。

于是我找到根目录来执行,发现这个find命令还真的比较特别。

C:\>find .
FIND: 参数格式不正确

然后看看help,原来一般情况下是不能够find [路径]这样执行的,肯定是有一些别的文件,帮助我在Makefile文件路径里面执行了find [路径]这个命令。

C:\>help find
在文件中搜索字符串。

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V         显示所有未包含指定字符串的行。
  /C         仅显示包含字符串的行数。
  /N         显示行号。
  /I         搜索字符串时忽略大小写。
  /OFF[LINE] 不要跳过具有脱机属性集的文件。
  "string" 指定要搜索的文本字符串。
  [drive:][path]filename
             指定要搜索的文件。

如果没有指定路径,FIND 将搜索在提示符处键入
的文本或者由另一命令产生的文本。

对比路径

对比“修改路径”里面的四个路径,看到里面原来有个find.exe的执行文件!!!

问题结论

只要把这个文件放到哪里那里就能执行find [路径]命令,没放到的路径就不能这样执行,所以Makefile的find并不是执行DOS命令,而是执行这个find.exe文件,所以寻找路径被限制也是因为这个find.exe的执行文件。

你可能感兴趣的:(前端)