我想使用GNUMake运行基于规则的makefile,它在目录结构中(在Windows文件系统上)构建一组C文件。
根目录,一些子目录和一些文件包含空格。
示例文件:"C:\Documents and Settings\<username>\My Documents\Test Dir\Build Me.c"
当文件路径包含空格时,GNUMake不起作用。我已经阅读了解决这个问题的可能方法(从我的文件名中删除空格,使用8.3格式,用?
或\\
替换空格等)但是没有一个是完美的(或者是他们?)
是否有解决此问题的灵丹妙药?
顺便说一下,我坚持使用GNUMake,我不能使用不同的制作工具。
答案 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
也有助于揭示无效路径