我正在尝试为使用 mono 的程序构建 debian 包。我的make install
目标当前放置了所有二进制文件/usr/local/lib/mypackage
,然后创建一个微小的可执行脚本,/usr/local/bin
用 mono 调用实际的二进制文件。我使用单行代码将占位符替换PREFIX
为实际安装路径:
install: DESTDIR=/usr/local
install: LIBDIR=$(DESTDIR)/lib
install: BINDIR=$(DESTDIR)/bin
install: $(PHONIX) $(ANTLR) doc
install -m 0755 -d $(LIBDIR)/phonix
install -m 0755 -t $(LIBDIR)/phonix $(PHONIX) $(ANTLER)
install -m 0755 -D phonix.sh $(BINDIR)/phonix
sed -i "s!PREFIX!$(LIBDIR)!" $(BINDIR)/phonix
当我在 下运行时dh_make
,$(LIBDIR)
并$(BINDIR)
根据需要指向打包目录。所有内容都被安装到打包程序的正确位置,但调用sed
将我的本地打包目录的路径放入脚本中,然后将其逐字放置在包中。一旦我在目标系统上实际安装了该软件包,这显然不起作用。
我认为我需要将sed
调用移至安装后脚本中,但我不确定如何在安装后步骤中获取本地安装目录(道德上相当于 my$(LIBDIR)
和)。$(BINDIR)
或者有更好的方法来做到这一点吗?
编辑:这是我
phonix.sh
在调用 sed 之前的实际文件:
#!/usr/bin/sh
exec mono PREFIX/phonix.exe
如您所见,仅有的该文件的目的是为基于 mono 的 .exe 提供可执行包装。 sed 调用只是替换PREFIX
为$(LIBDIR)
。所以我真正需要知道的是如何获取 .exe 在目标系统上的实际安装位置这样包装脚本就可以工作了吗?
答案1
您正在DESTDIR
以非标准方式使用。它不是软件包的安装前缀,而是软件包构建等内容的“fakeroot”前缀。
更典型的写法是这样的:
prefix = /usr/local
bindir = $(prefix)/bin
libdir = $(prefix)/lib
install: $(PHONIX) $(ANTLR) doc
install -m 0755 -d $(DESTDIR)$(libdir)/phonix
install -m 0755 -t $(DESTDIR)$(libdir)/phonix $(PHONIX) $(ANTLER)
install -m 0755 -D phonix.sh $(DESTDIR)$(bindir)/phonix
sed -i "s!PREFIX!$(libdir)!" $(DESTDIR)$(bindir)/phonix
DESTDIR
在包的 makefile 中将其留空。它应该debian/rules
由 dh 或 cdbs设置或自动设置。我从你的问题中猜想它确实以某种方式设置了。