【问题标题】:How to make install using path with space and dot如何使用带空格和点的路径进行安装
【发布时间】:2017-07-20 17:18:53
【问题描述】:

我想使用带空格和点的路径进行安装(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\ 转义字符配合得很好。

【问题讨论】:

  • makefile 是你自己写的吗?你能把它贴在某个地方吗?
  • 不,我正在尝试构建libserialport 库(sigrok.org/wiki/Libserialport)。我按照他们网站上显示的构建指南进行操作,./configuremakesudo make install
  • 以下是Makefile的前缀部分
  • prefix = /Applications/Sample\\ App.app/Contents/Resource

标签: macos makefile configure


【解决方案1】:

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

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

program: $(OBJECTS)

然后make会将变量SOURCESOBJECTS视为字符串的列表,以空格字符分割,而program将取决于foo.obar.o这三个项目, baz.o.

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

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

在某些情况下,修复相当简单,所以如果有这样的安装规则:

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

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

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

但这实际上取决于相关的 makefile。

如果项目使用automake(如libserialport),最简单的解决方案是使用生成的makefile中的DESTDIR支持将整个东西安装到不包含空格的路径,然后将其移动到之后的最终目的地。不过,这假设项目没有在内部嵌入最终安装路径。

【讨论】:

  • 我用DESTDIR你说的sudo make install DESTDIR=/usr/local,但是安装目录设置为DESTDIR/prefix
  • 对不起,我不明白。你能改写吗? DESTDIR/prefix 是实际目录还是占位符?
  • 我的意思是DESTDIR + prefix 目录,但我想安装到DESTDIR 目录而不是prefix
  • 简单地说,我只想安装带有/Applications/Sample App.app/Contents/Resource 前缀的libserialport 库,因为我的C++ 应用程序正是指那个目录。
  • 啊。您需要在 makefile 中恢复您的 prefix 编辑,使其再次成为 /usr/local。而且您可能不应该使用DESTDIR=/usr/local,而应该使用DESTDIR=/tmp/libserialport-build 之类的东西。然后就可以从/tmp/libserialport-build目录下复制构建好的库了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2011-03-20
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2012-08-30
相关资源
最近更新 更多