【问题标题】:wildcard doesnot work for a new generated folder通配符不适用于新生成的文件夹
【发布时间】:2013-05-27 15:47:16
【问题描述】:

我正在尝试从新生成的文件夹中获取一个 .tar.gz 文件名(上面的一个步骤)。 我尝试使用通配符,但没有运气,

在我的 makefile 中,我尝试了:

...
...
...
other parts
...

deb:
    python setup.py sdist   --- this step will generate a new folder called dist
    cd dist; ls -l          --- from here, I see the file is shown.
    echo $(wildcard dist/*.tar.gz)   (also tried dist/pylink*.tar.gz, dist/*.gz)  --fails!

我使用 make -f makefile deb 运行它。

通配符总是一无所获

但是如果我离开python生成的文件夹,然后重新运行上面的文件,我可以看到文件名被写入控制台。有谁知道为什么?我应该如何获取文件名?我需要使用文件名并将文件名扩展到另一个文件名。

非常感谢!

【问题讨论】:

  • 函数应该拼写为wildcard,而不是wilcard
  • 感谢您指出我的错字。已经修好了。

标签: linux makefile wildcard


【解决方案1】:

您没有这么明确地说,但我认为,因为您使用的是$(wildcard ...),所以您提供的行是 GNU make makefile 规则的一部分。在寻求帮助时,最好提供一个可行的示例,而不仅仅是一小部分。

您遇到的问题是 make 在开始配方的第一行之前扩展了配方所有行中的所有变量和函数。所以即使$(wildcard ...) 直到配方的第三行才出现,它在第一行运行之前就被扩展了。当$(wildcard ...) 函数运行时,这些文件还不存在,因此它会展开为空。

既然你在一个 shell 中,为什么不直接使用 shell globbing?

python setup.py sdist
cd dist; ls -l
echo dist/*.tar.gz

【讨论】:

  • 您好,感谢您的回复。所以我在makefile中尝试了 $(shell find -name 'dist/pylink*.*') ,但仍然一无所获。这是否符合你所说的 shell globbing 的意思。对不起,如果这个问题太天真了。
  • 不,我的意思是我写的。扩展*?[a-z] 等特殊字符并将它们与文件名匹配的能力称为globbing,shell 可以自行完成。如果您输入echo dist/*.tar.gz,那么shell 将为您展开它。你不需要 make 函数来做。
  • 至于$(shell ...),这是一个make函数,就像$(wildcard ...)一样,它同时被扩展并且有同样的问题:使用不同的make函数没有帮助。您必须完全停止使用 make 函数并依赖 shell 来进行通配符扩展。
  • 再想一想,关于makefile中的变量,如果用=来给变量赋值,是不是在使用变量的时候就设置了值?如果使用 := ,则在声明变量时设置值。请指出我的误解。非常感谢。
  • 这是一个不同的问题...在您的原始问题中没有引用变量。使用:= 分配变量时,分配变量时会扩展变量值。给变量赋值=时,变量值在使用时展开。
猜你喜欢
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多