如何使用带空格和点的路径进行安装

时间:2017-07-20 08:45:33

标签: macos makefile configure

我想使用带空格和点的路径进行安装(sudo make install)。 (例如/Applications/Sample App.app/Contents/Resources

但是,调用了以下错误。

ginstall: target 'App.app/Contents/Resources/lib/libserialport.a' is not a directory

如果我使用仅包含空格的路径,sudo make install\转义字符的效果非常好。

1 个答案:

答案 0 :(得分:1)

包含空格的Makefile和路径名不能很好地混合。使用空格将字符串拆分为列表。例如,你写这个:

SOURCES = foo.c bar.c baz.c
OBJECTS = $(patsubst %.c,%.o, $(SOURCES))

program: $(OBJECTS)

然后make会将变量SOURCESOBJECTS视为字符串的列表,拆分为空白字符,program将取决于这三个项目{ {1}},foo.obar.o

Make完全不知道某些字符串不应该以这种方式拆分(因为它们指的是路径名)。像许多早期脚本语言一样,它完全基于字符串插值。对于用于编写构建步骤的shell脚本片段也是如此。

有一些可行的解决方法,但它们都取决于makefile中变量的使用方式。如果使用shell将这些变量的内容显式传递给调用的make命令,则递归makefile可能会带来其他问题。

在某些情况下,修复相当简单,因此如果存在这样的安装规则:

baz.o

添加引号可能就足够了,如下所示:

install: program
    $(INSTALL) -m 755 program $(DESTDIR)$(bindir)/program

但这实际上取决于有问题的makefile。

如果项目使用automake(如install: program $(INSTALL) -m 755 program "$(DESTDIR)$(bindir)/program" ),最简单的解决方案是使用生成的makefile中的libserialport支持将整个东西安装到不包含空格的路径,然后之后将其移至最终目的地。这假设项目没有内部嵌入最终安装路径。