【问题标题】:Why find command failing from make file为什么从make文件中查找命令失败
【发布时间】:2019-09-06 11:28:22
【问题描述】:

我正在修改一个 windows make 文件。该文件是遗留构建代码的一部分,具有以下几行 --

    WROOT := "MyBuild/win/Program Files/Windows Kits/10" 


   ROOT_SDK_Version := $(shell find $(WROOT_WIN10_SDK)/Include -maxdepth 1 -type d -path $(WROOT_WIN10_SDK)/Include/[0-9.]* )

SHELL 变量映射到 bin/sh 但是当我打印变量 ROOT_SDK_Version 时,它是空的。但是,当我使用相同的参数手动调用 find 命令时,它会给出预期的结果。

为了调试这个问题,我在make文件中修改了上面的行,如下所示

ROOT_SDK_Version := $(shell find $(WROOT_WIN10_SDK)/Include -maxdepth 1 -type d -path $(WROOT_WIN10_SDK)/Include/[0-9.]* 2> output.txt )

运行 make 后我看到了文件 output.txt 的内容 -

find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

那么为什么 find 命令在从 make 文件运行时失败,但当我使用相同的参数手动运行时却成功了?任何指针表示赞赏。

提供更多上下文-

WROOT_WIN10_SDK := "$(GOBUILD_CAYMAN_MSVC_DESKTOP_ROOT)/win/Program Files/Windows Kits/10"

变量 GOBUID...is== E:/Myscpetre20/depot/sim/sim-20fq1/build/gobuild/compcache/cayman_msvc_desktop/ob-11144741/windows2016-clean

所以 WROOT_WIN10_SDK 是 == "E:/Myscpetre20/depot/sim/sim-20fq1/build/gobuild/compcache/cayman_msvc_desktop/ob-11144741/windows2016-clean/win/Program Files/Windows Kits/10"

【问题讨论】:

  • 可以在ROOT_SDK_Version := $(shell find ... 行之前插入$(info WROOT_WIN10_SDK=[$(WROOT_WIN10_SDK)]) 行以查看打印的内容。
  • 它正在打印这个 WROOT_WIN10_SDK=["E:/Myscpetre20/depot/sim/sim-20fq1/build/gobuild/compcache/cayman_msvc_desktop/ob-11144741/windows2016-clean/win/Program Files/ Windows 套件/10" ]
  • 我目前没有 Windows 系统可以玩,但我敢打赌这与 /Program Files/ 中的引号和空格有关。
  • 在@Beta 的评论之外,$(info ... 命令的输出似乎在最后的双引号 "] 字符之间有一个空格——不确定这是否是真的或者只是一个神器。如果是真的,那肯定是个问题,因为$(WROOT_WIN10_SDK)/Include 将被视为find 的单独路径参数。
  • 我认为这是导致问题的原因,但不确定为什么会这样,因为我将其定义为 WROOT_WIN10_SDK := "$(GOBUILD_CAYMAN_MSVC_DESKTOP_ROOT)/win/Program Files/Windows Kits/10", ,在 10 之后没有任何空格。任何想法如何删除它

标签: windows makefile build gnu-make


【解决方案1】:

我认为-path 选项的参数需要被引用——否则glob * 将被shell 扩展而不是传递给find。所以...

   ROOT_SDK_Version := $(shell find $(WROOT_WIN10_SDK)/Include -maxdepth 1 -type d -path '$(WROOT_WIN10_SDK)/Include/[0-9.]*' )

【讨论】:

  • 我试过了,现在它说“查找:/包含:没有这样的文件或目录”。但是我检查并打印了变量 $(WROOT_WIN10_SDK) 已正确填充
  • 这表明变量WROOT_WIN10_SDK 没有按照您在makefile 中的想法进行设置。您需要提供更多上下文。
  • 已更新我的问题以反映变量的设置方式
  • 请注意,$(WROOT_WIN10_SDK) 指的是 makefile 变量。如果您要使用环境变量,请使用$$WROOT_WIN10_SDK。调试的一个想法是用$(info ... ) 替换你的$(shell ...),这样你就可以准确地看到它在运行什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多