【问题标题】:How to keep the dot in filename in GNU Make如何在 GNU Make 中保留文件名中的点
【发布时间】:2014-01-10 10:00:07
【问题描述】:

我有一个变量

SRC = file1.csv file2.csv file3.csv

如果我echo $(subst .csv,.,$(SRC))echo $(subst csv,,$(SRC)),我会得到

file1 file2 file3

我要找的是

file1. file2. file3.

但是 GNU make 一直在去掉这个点。如何解决?


添加

我的真实台词有这样的额外内容:

SRC = $(shell dir /b /s $(SRC_ROOT)\*.csv))
echo $(subst .csv,.,$(basename $(notdir $(SRC))))

【问题讨论】:

  • 这里不会发生这种情况。我得到了你预期的输出(我应该)你使用的是什么版本的 GNU make?
  • GNU Make for Windows v3.81 来自gnuwin32.sourceforge.net/packages/make.htm。有点旧的构建系统,所以我无法更新版本。

标签: windows makefile gnu


【解决方案1】:

编辑:谢谢大家,MadScientist 是对的,我在导致问题的行中有一些额外的$(basename $(notdir。以下是我的真实台词,加上 MadScientist 敏锐的眼光和评论,我的解决方案是这样的:

SRC = $(shell dir /b /s $(SRC_ROOT)\*.csv))
echo $(patsubst %csv,%,$(notdir $(SRC)))

【讨论】:

  • 这是不对的。首先,您的SRC 变量中没有目录,因此$(notdir $(SRC))$(SRC) 相同。其次,你的SRC 值只有一个后缀,所以$(basename ...) 会给你file1 file2 file3。这意味着$(patsubst ...) 不会做任何事情(这是一个无操作)。这就是为什么你需要使用addsuffix(我假设你的意思是addsuffix,即使你写了addprefix)来加回.。如果您需要删除目录(您应该在示例中使用它们!)使用$(patsubst %csv,%,$(notdir $(SRC)))
  • @MadScientist 很好addsuffix 它是。所以我根据您的评论删除了addsuffix + basename。而patsubst + notdir 就足够了。
【解决方案2】:

我同意 Etan,您的示例运行良好。我认为您在现实生活中所做的事情与您在这里描述的不同。

我会注意到虽然使用subst 是个坏主意。如果你有像cacsv20.csv 这样的文件,那么csv 上的subst 会做错事。

建议你使用patsubst,如:$(patsubst %csv,%,$(SRC))

ETA:根据更新后的问题,您可能想要:

SRC := $(shell dir /b /s $(SRC_ROOT)\*.csv))
BASE := $(patsubst %csv,%,$(notdir $(SRC)))

使用notdir 去掉目录名,使用patsubst(不是basename)去掉后缀,因为你想保留尾随句点。

注意我使用的是:= 而不是=;除非在非常特殊的情况下,出于性能原因,您总是希望在使用$(shell ...) 时使用:=

【讨论】:

  • 试过了,结果和patsubst一样。
  • 但你对我添加的额外内容是正确的。现实生活是这样的:echo $(subst .csv,.,$(basename $(notdir $(SRC))))$(basename $(notdir 是问题的原因。
  • 嗯,我觉得这样发布我的答案并继续用你的评论编辑它而不在我的问题中适当解释是不对的。应该归功于您帮助我找到答案。您能否更新您的答案并让我接受它作为答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多