执行Makefile的dir目标时报execvp: device/coo: Permission denied的原因是什么
报错原因
- 根本原因是对Makefile规则的语法理解有误:Makefile中目标对应的执行脚本(recipe)的每一行内容,都会被当作完整的shell命令提交给系统执行,系统会将行内第一个空格分隔的片段识别为要执行的可执行程序路径,剩余片段作为执行参数。
- 你定义的
_get_directories函数展开后得到的是一串目录路径:device/coo device/google device/sky vendor/sky build/product,直接放在dir目标的执行脚本中后,系统会尝试将第一个路径device/coo当作可执行文件运行。但device/coo是目录,操作系统不允许直接执行目录对象,因此抛出execvp: device/coo: Permission denied错误,返回码127对应「找不到符合要求的可执行命令」的错误场景。 - 你提到
find目标运行正常只是巧合:find目标展开后第一个片段是device/coo/AndroidProducts.mk,如果这个文件刚好有可执行权限、且文件头定义了正确的解释器(shebang),执行时就不会报错,只是实际行为和你想要「打印搜索到的文件路径」的预期不符。
修复方案
如果需求是打印函数返回的路径列表,只需要在执行脚本前加上echo命令即可,修改后的目标如下:
search: @echo $(call _search-android-products-files-in-dir,device) find: @echo $(_find-android-products-files) dir: @echo $(_get_directories)
加@前缀是为了避免make先打印执行的命令本身,只输出echo的结果。
内容的提问来源于stack exchange,提问作者Bobby Yang
相关产品推荐
相关产品推荐

