我想使用带空格和点的路径进行安装(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
与\
转义字符的效果非常好。
答案 0 :(得分:1)
包含空格的Makefile和路径名不能很好地混合。使用空格将字符串拆分为列表。例如,你写这个:
SOURCES = foo.c bar.c baz.c
OBJECTS = $(patsubst %.c,%.o, $(SOURCES))
program: $(OBJECTS)
然后make会将变量SOURCES
和OBJECTS
视为字符串的列表,拆分为空白字符,program
将取决于这三个项目{ {1}},foo.o
,bar.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
支持将整个东西安装到不包含空格的路径,然后之后将其移至最终目的地。这假设项目没有内部嵌入最终安装路径。