将GNUMake与包含空格的文件名一起使用的最可靠方法是什么?

时间:2009-03-20 23:12:11

标签: windows filenames space gnu-make

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

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

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

当文件路径包含空格时,GNUMake不起作用。我已经阅读了解决这个问题的可能方法(从我的文件名中删除空格,使用8.3格式,用?\\替换空格等)但是没有一个是完美的(或者是他们?)

是否有解决此问题的灵丹妙药?

顺便说一下,我坚持使用GNUMake,我不能使用不同的制作工具。

6 个答案:

答案 0 :(得分:3)

最简单的方法是修复文件名。

如果不这样做,请编写命令以在文件名周围加上双引号。最简单,最安全的方法是将所有文件名放入宏中;诀窍是你必须逃避双引号,否则Make会想要吃掉它。

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

或使用     $(CC)$(CFLAGS)“$(FN2)”

这里的技巧是使用echo

回显命令行
echo $(CC) $(CFLAGS) "$(FN2)"

或使用make -d获取制作尝试的所有详细信息。

你可能需要对此进行一些修改,特别是你可能需要加倍逃脱

答案 1 :(得分:2)

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

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

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

答案 2 :(得分: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)

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)

如果空格仅位于路径名的“根”部分,则可以将该目录安装在没有空格的路径上。有多种方法可以执行此操作:从命令行(“net use”或“subst”)或从Explorer(Tools&gt; Map Network Drive)。所以C:\ Documents and Settings \\ My Documents \ Test Dir“可能会变成X:\ BuildMe.c

但是,如果文件名或“root”构建目录下面的目录中有空格,那么可能没有任何完美的解决方案。我已经使用了你提到的其他建议(8.3名称,用不同的角色替换空白)和这些工作,但他们有自己的问题。

答案 5 :(得分:0)

我只需添加&#39;单引号&#39;围绕违规字符串: - &#39; $(TARGET_DIR)&#39;

示例:(这有助于我 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/'

使用make -d也有助于揭示无效路径