编辑:更新完整Debian/规则和Debian/控制文件
我正在开发一个 Web 项目,需要为不同的部署服务器构建两个 debian 包。主要区别在于依赖的限制Debian/控制文件。所以我写在下面:
Source: web-app
Section: non-free/web
Priority: optional
Maintainer: Me
Build-Depends: debhelper (>= 4.0.0), build-essential
Standards-Version: 3.8.0
Homepage: http://abc.com
Package: web-app
Architecture: all
Depends: apache2, libapache2-mod-rpaf, openssl, rsync, imagemagick, mysql-client, ${other-depends}, libjs-cropper, libjs-jquery (>= 1.3.3-1), libjs-prototype, libjs-scriptaculous, libphp-phpmailer (>= 1.73-4), libphp-snoopy, tinymce (>= 3.2.6-0.1)
Description: Short description
Long description here.
还有Debian/规则文件:
#!/usr/bin/make -f
DEB_DH_INSTALL_ARGS=-X .svn
include /usr/share/cdbs/1/rules/debhelper.mk
# Add here any variable or target overrides you need.
# platform related package dependencies
XENIAL_LIBS = php7.0, php7.0-opcache, php-apcu, php7.0-mysql, php7.0-gd
PRE_XENIAL_LIBS = apache2-mpm-prefork, apache2-prefork-dev, php5.5, php-apc, php-gettext, php5-mysql, php5-gd
ifeq ($(shell lsb_release -cd | awk '/^Codename:/ { print $2}'), xenial)
PLATFORM_LIBS := $(XENIAL_LIBS)
else
PLATFORM_LIBS := $(PRE_XENIAL_LIBS)
endif
override_dh_gencontrol:
dh_gencontrol -- -Vother-depends="$(PLATFORM_LIBS)"
configure: configure-stamp
configure-stamp:
touch configure-stamp
build: build-stamp
build-stamp: configure-stamp
dh_testdir
dpkg-parsechangelog | awk '$$0 ~ /^Version:/ {print $$2}' > version.txt
touch build-stamp
部署目标之一是 Ubuntu 14.04 (Trusty),它应该取代其他取决于和PRE_XENIAL_LIBS。但我得到了服务器的最终控制文件,如下所示:
Depends: apache2, openssl, rsync, imagemagick, php, php-opcache, php-apcu, mysql-client, php-gettext, php-mysql, php-gd ...
出了什么问题,如何解决?
================更新==================
我已经修改了我的Debian/规则文件基于 Wouter 的答案,但仍然没有得到正确的替换。然后我运行命令
dpkg-buildpackage
然后从输出中发现了一个警告:
dpkg-gencontrol: warning: Depends field of package web-app: unknown substitution variable ${other-depends}
有什么线索吗?
答案1
首先,你的语法是错误的,并且会导致像这样的命令行...
dh_gencontrol -- -Vdist:Depends=""php7.0, php7.0-opcache, ...""
而不是(你想要的):
dh_gencontrol -- -Vdist:depends="php7.0, php7.0-opcache, ..."
这是因为make
不进行引用,并且您将变量中的数据引用两次(一次在赋值中,一次在使用时)。放下其中一个。
其次,它不起作用的原因是您的 debian/rules 文件(如所写)不会使用dh_gencontrol
您想要的额外参数进行调用。一个debian/rules
文件是一个Makefile
;因此,它应该有制定规则等,否则它们会被忽略。像这样的事情在我的机器上完成了预期的事情:
#!/usr/bin/make -f
%:
dh $@
PKGS := abcd, efgh
override_dh_gencontrol:
dh_gencontrol -- -Vdist:Depends="$(LIBS)"
如果这仍然没有达到您的预期,那么dpkg-buildpackage
绝对需要一个完整的示例(即您可以运行的东西)。
编辑: 你仍然有双引号。和XENIAL_LIBS
行PRE_XENIAL_LIBS
周围有引号。删除它们。另外,您还没有提供一个dpkg-buildpackage
不会抱怨的示例(一方面,控制文件不完整)。您正在处理的内容不一定包含公司机密,但展示问题的最小示例至关重要。根据您目前提供的信息,我无法重现您的问题。
编辑2:您的完整规则文件显示您正在使用 CDBS,而不是 debhelper 的dh
.因此,override_dh_gencontrol
目标不会被调用(这是dh
特定的事情)。我不知道 CDBS 如何处理覆盖单个 debhelper 命令(这就是为什么我在假期之前没有回复这个问题,希望也许其他人可以告诉你该怎么做),但这可能是另一个类似的事情您必须设置的 CDBS_FOO_BAR 变量。幸运的是,您的debian/rules
文件足够简单,因此来自 cdbs 的端口相当简单。应用以下补丁:
--- rules.old 2016-07-12 16:57:05.350385288 +0200
+++ rules 2016-07-12 16:58:54.456536432 +0200
@@ -1,8 +1,7 @@
#!/usr/bin/make -f
-DEB_DH_INSTALL_ARGS=-X .svn
-
-include /usr/share/cdbs/1/rules/debhelper.mk
+%:
+ dh $@
# Add here any variable or target overrides you need.
@@ -16,15 +15,10 @@
PLATFORM_LIBS := $(PRE_XENIAL_LIBS)
endif
+override_dh_install:
+ dh_install -X .svn
override_dh_gencontrol:
dh_gencontrol -- -Vother-depends="$(PLATFORM_LIBS)"
-
-configure: configure-stamp
-configure-stamp:
- touch configure-stamp
-
-build: build-stamp
-build-stamp: configure-stamp
- dh_testdir
+override_dh_auto_build:
dpkg-parsechangelog | awk '$$0 ~ /^Version:/ {print $$2}' > version.txt
- touch build-stamp
+ dh_auto_build
首先,这会删除不支持的 CDBS 包含和特定于 CDBS 的DEB_DH_INSTALL_ARGS
变量dh
,并添加 dh 所需的通配符Makefile
目标来代替它。它还添加了override_dh_install
目标,该目标替换了DEB_DH_INSTALL_ARGS
变量。
其次,这会删除configure
和build
目标,以及configure-stamp
和build-stamp
。dh
不使用这些(保留它们确实是有害的)。
最后,我们添加另一个覆盖目标,它执行 dpkg-parsechangelog 操作来创建 version.txt 文件。您的实际构建过程可能是其他的,但这向您展示了如何替换它。