在GCC生成文件的目标留出空间(Allow space in target of GCC makef

2019-07-20 07:58发布

有没有办法让目标名内部空间使用的make.exe当工作? 这似乎是不可能的,如果这真的是古代的bug报告是正确的: http://savannah.gnu.org/bugs/?712

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

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

......似乎得到视为三个独立的命令:一是打造“富(注意包括‘),一个建酒吧,最后,一个打造巴兹’(又包括”)。 这是因为的make.exe好像是用空格作为分隔符。

然而,这是合理的假设,人们可能会想建立“你好World.exe”为例。 这似乎并不可能。 双引号不工作,而且也不逃避单独的单词(我读过的地方,不记得的链接):

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

是否有任何其他的方式来解决这一问题? 官方手册只证实了记号化逐空间的东西,但不提供一种方法,利用空间用于其他任何目的: http://www.gnu.org/software/make/manual/make.html#Rule-句法

编辑:作为建议,我已经试过单斜杠太多,但这些都为双斜杠的确切同样的效果。 让会抱怨无法找到的第一个字的规则:

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

可执行“富酒吧baz.exe”是否正确,虽然生产,但联每字每一次完成。

Answer 1:

取而代之的双反斜线的使用单一的。 下面的Makefile工作(至少对于GNU MAKE):

goal:   foo\ bar

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


Answer 2:

因为马蒂亚斯说,它是“\”的问题,而是双引号了。 这里是我succeded到这一点:

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

注意周围的$双引号@看来,我认为时许到达目标“$(可执行的)”,它扩展了“\”,因此命令行成为

gcc file.o -o foo bar baz -LFlags

这是不是你想要的,你要围绕着文件的名称双引号。

现在你是在Windows,我不记得它是如何在名称空间的交易,从而马蒂亚斯说,首先请与空间如何“cmd.exe的”交易(除非用双引号周围的名字......)



Answer 3:

也许更容易考虑一个简单的Makefile,而忽略在标准的依赖性targetRule: dependencies调用。 该OP是Windows,而下方在Linux上做bash外壳; 但也许应该是适用的使用Windows的到bash通过shell cygwin ,我猜。 我在下面Makefile (注意,这里应该是前TAB echo命令,SO转换为空格):

testA:
    echo "testA"

unrelated:
    echo "unrelated"

testA\ clean:
    echo "testA clean"

clean:
    echo "clean"

如果我打电话make有目标的cleantestAbash shell终端,我得到预期的结果:

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

现在,如果我叫make testA clean刚刚写入,在bash shell将在分割空间的参数,所以make将获得两个参数,并且将分开运行:

$ 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将不被显示为自动完成选项)。



文章来源: Allow space in target of GCC makefile