允许GCC makefile目标中的空间

时间:2013-02-21 14:07:50

标签: gcc makefile mingw target space

使用make.exe时,有没有办法让目标名称中的空格有效?如果这个非常古老的错误报告是正确的,似乎是不可能的: http://savannah.gnu.org/bugs/?712

作为参考,最大的问题是makefile命令如:

"foo bar baz": $(OBJ)
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

...似乎被视为三个单独的命令:一个用于构建“foo(注意包含”),一个用于构建条,最后一个用于构建baz“(再次,包括”)。这是因为make.exe似乎使用空格作为分隔符。

但是,假设有人可能想要构建“Hello World.exe”是合理的。这似乎不可能。双引号不起作用,也没有逃避单独的单词(我在某处读过,不记得链接):

"foo\\ bar\\ baz": $(OBJ)
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)

还有其他方法可以解决这个问题吗?官方手册仅确认按空格标记的内容,但不提供将空间用于任何其他目的的方法: http://www.gnu.org/software/make/manual/make.html#Rule-Syntax

编辑:按照建议,我也尝试过单斜线,但这些效果与双斜线完全相同。抱怨它无法找到第一个单词的规则:

mingw32-make.exe: *** No rule to make target `foo', needed by `all'.  Stop.

虽然可以正确生成可执行文件“foo bar baz.exe”,但每次单词都会进行链接。

3 个答案:

答案 0 :(得分:1)

而不是双反斜杠使用单反斜杠。以下Makefile有效(至少对于gnu make):

goal:   foo\ bar

foo\ bar:
    gcc -o "foo bar" "foo bar.c"

答案 1 :(得分:1)

正如马蒂亚斯所说,这是“\”的问题,但也是双引号。以下是我成功的方法:

EXECUTABLE=foo\ bar\ baz
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
                $(CC) $(OBJECTS) -o "$@" $(LDFLAGS)

注意$ @周围的双引号 在我看来,当make到达目标“$(EXECUTABLE)”时,它会扩展“\”,所以命令行变为

gcc file.o -o foo bar baz -LFlags

这不是你想要的,你想要在文件名周围加上双引号。

现在你在Windows上,我不记得它是如何处理名称中的空格的,所以马蒂亚斯说,首先检查“cmd.exe”如何处理空格(除了用双引号括起来的名字......)

答案 2 :(得分:1)

可能更容易考虑更简单的Makefile,它会忽略标准targetRule: dependencies调用中的依赖项。 OP适用于Windows,以下是在bash shell中的Linux上完成的;但我认为它应该适用于使用bash shell cygwin的Windows。我在Makefile中有以下内容(注意,在echo命令之前应该有 TAB ,SO转换为空格):

testA:
    echo "testA"

unrelated:
    echo "unrelated"

testA\ clean:
    echo "testA clean"

clean:
    echo "clean"

如果我使用make shell终端中的目标cleantestA致电bash,我会得到预期结果:

$ make testA 
echo "testA"
testA
$ make clean
echo "clean"
clean

现在,如果我按原样调用make testA cleanbash shell将在空格处拆分参数,因此make将接收两个参数,并将分别运行它们: / p>

$ make testA clean
echo "testA"
testA
echo "clean"
clean

...但是如果我用引号将make提供的目标包装起来 - 或者如果我逃避空间 - 那么shell将会理解它应该是一个内部有空格的单个参数,并且会传播它本身就是make,它将继续执行写为testA\ clean目标规则的内容:

$ make "testA clean"
echo "testA clean"
testA clean
$ make testA\ clean
echo "testA clean"
testA clean

这样做的一个后果是,遗憾的是,您无法在命令行“TAB”自动完成testA\ clean;如果您在命令行中键入make te TAB ,则只有testA会自动自动填充(并且testA\ clean不会显示为自动填充选项)。< / p>