7

我想使用 GNUMake 运行基于规则的 makefile,它在目录结构中(在 Windows 文件系统上)构建一组 C 文件。

根目录、一些子目录和一些文件包含空格。

示例文件:"C:\Documents and Settings\<username>\My Documents\Test Dir\Build Me.c"

当文件路径包含空格时,GNUMake 并不能真正工作。我已经阅读了解决此问题的可能方法(从我的文件名中删除空格,使用 8.3 格式,用?or替换空格\\等),但它们都不是完美的(或者它们是完美的吗?)

有没有灵丹妙药可以解决这个问题?

顺便说一句,我坚持使用 GNUMake,我不能使用不同的 make 工具。

4

6 回答 6

3

最简单的事情确实是修复文件名。

但是,如果做不到这一点,请编写命令以在文件名周围加上双引号。最简单、最安全的做法是将所有文件名放入宏中;诀窍是你必须转义双引号,否则 Make 会想吃掉它自己。

所以: FN="\"C:\My Documents\myfiles.c\"" FN2="C:\My Documents\myfile2.c"

或使用 $(CC) $(CFLAGS) "$(FN2)"

这里的技巧是用 echo 回显你的命令行

echo $(CC) $(CFLAGS) "$(FN2)"

或用于make -d获取 make 尝试做的所有细节。

您可能需要稍微修改一下,特别是,您可能需要加倍转义

于 2009-03-21T00:49:06.577 回答
2

您也许可以转义 makefile 中的空格,即:

$(CC) $(CFLAGS) 'C:\Documents\ and\ Settings\<username>\My\ Documents\Test\ Dir\Build Me.c'

我添加了单引号以防万一,但我不知道如果您使用的是 Windows 终端(而不是 cygwin 等),这是否有效。

于 2009-03-20T23:21:07.490 回答
2

我在http://www.mail-archive.com/help-make@gnu.org/msg05201.html找到了一个很好的灵感,这让我开始前进。我自己的测试应用程序包含一个从 YouTube 下载的 WW2 时代 Jazz FLV 文件的目录和一个音频子目录,我想在其中存储每个文件的 OGA 音频版本。当然,文件名包含空格。然后我想运行 ffmpeg2theora 到

这是我一起破解的 GNUMake Makefile。感谢本网站以及上面引用的网站上的所有提示!

sq = $(subst $(sp),?,$1)
qs = $(subst ?,$(sp),$1)

e :=
sp := $(e) $(e)

FLVS := $(foreach file,var,$(call sq,$(wildcard *.flv)))
FLVS := $(subst .flv?,.flv ,$(FLVS))

AUDIOS := $(patsubst %.flv,audio/%.oga,$(FLVS))

.PHONY: audios show

audios: $(AUDIOS)

$(AUDIOS) : $(FLVS)
    ffmpeg2theora --novideo -o "$(call qs,$@)" "$(call qs,$(notdir $(patsubst %.oga,audio/%.flv,$@)))"

show:
    echo $(FLVS)
    echo $(AUDIOS)
于 2010-10-11T19:20:04.420 回答
1

我通常使用 Dana the Sane 的答案和 Brian Yoder 的答案的组合。

您只需使用该$(subst)函数将所有出现的空格替换为转义空格。例如:

empty := 
space := $(empty) $(empty)
program_files := $(subst $(space),\$(space),$(ProgramFiles))

(请注意,在 Windows 上使用一些旧版本的 make 您还需要使用另一个$(subst)将路径反斜杠更改为斜杠)

于 2012-06-27T19:51:26.703 回答
0

如果空格仅在路径名的“根”部分,则可以将该目录挂载在不带空格的路径上。有多种方法可以做到这一点:从命令行(“net use”或“subst”)或从资源管理器(工具 > 映射网络驱动器)。所以 C:\Documents and Settings\\My Documents\Test Dir" 可能会变成 X:\BuildMe.c

但是,如果文件名或“根”构建目录下的目录中有空格,则可能没有任何完美的解决方案。我已经使用了您提到的其他建议(8.3 名称,用不同的字符替换空格)并且这些工作但它们有自己的问题。

于 2009-03-21T01:33:09.730 回答
0

我只是在有问题的字符串周围添加“单引号”:- '$(TARGET_DIR)'

示例:(这帮助我让erlang.mk在 Windows 上正常工作!)

app:: $(C_SRC_ENV)
    @mkdir -p priv/
    $(c_src_verbose) $(CC) $(CFLAGS) $(C_SRC_DIR)/*.c -fPIC -shared -o $(C_SRC_OUTPUT) \
        -I '$(ERTS_INCLUDE_DIR)' $(C_SRC_OPTS)

'$(ERTS_INCLUDE_DIR)'现在正确扩展为 'c:/Program Files/erl7.0/erts-7.0/include/'

usingmake -d还有助于揭示无效路径

于 2015-07-23T04:07:45.300 回答