如何使用驻留在生成的Makefile中的INSTALL_ROOT?

时间:2011-12-02 18:04:03

标签: qt qmake

qmake生成以下(以及其他)安装目标的规则:

-$(INSTALL_PROGRAM) "$(TARGET)" "$(INSTALL_ROOT)/$(TARGET)"

我无法在INSTALL_ROOT文件中设置*.pro这样的内容

isEmpty(INSTALL_ROOT) {
    INSTALL_ROOT=/usr
}

因为INSTALL_ROOT在某种程度上是生成Makefile的本地。根据我到目前为止发现的内容INSTALL_ROOT默认为空。它可以像

一样使用
INSTALL_ROOT=$HOME make install

调用make时,这很好。但是,我希望能够指定默认安装根,例如/usr。我可以按照建议here引入新变量PREFIX。 然后生成的规则将显示为(如果PREFIX设置为/usr

-$(INSTALL_PROGRAM) "$(TARGET)" "$(INSTALL_ROOT)/usr/$(TARGET)"

然而

INSTALL_ROOT=$HOME make install

将目标安装到/home/<user_name>/usr/$(TARGET),这不是人们所期望的。

因此,将INSTALL_ROOT设置为某个默认值会产生一致的行为,这比添加PREFIX要好,但如何在INSTALL_ROOT文件中设置*.pro

INSTALL_ROOT的目的是什么?它应该被使用?

2 个答案:

答案 0 :(得分:5)

INSTALL_ROOT用于包构建系统,如NSIS,debian或任何其他方式,用于分割构建的软件并交付它。

为此您需要

的结果
INSTALL_ROOT=$PWD/package_root make install

在$ PWD / package_root下创建一个完全模仿您计划传递到的目标系统上的树。请注意,您需要INSTALL_ROOT为完整路径(因此为$ PWD),而不是相对路径。

创建包时,您可以将该树压缩为存档,然后您的安装过程只需将同一树解压缩到目标文件系统。

$PWD/package_root/usr/bin/my_binary

将安装到

/usr/bin/my_binary

在目标上。

这就是INSTALL_ROOT的问题的答案。要回答如何指定“默认安装根”,需要有关要实现的内容的更多信息。

看一下qmake -query的输出:

sez@ubuntu-11.10:~$ qmake -query
QT_INSTALL_PREFIX:/usr
QT_INSTALL_DATA:/usr/share/qt4
QT_INSTALL_DOCS:/usr/share/qt4/doc
QT_INSTALL_HEADERS:/usr/include/qt4
QT_INSTALL_LIBS:/usr/lib/i386-linux-gnu
QT_INSTALL_BINS:/usr/bin
<snipped>
QT_VERSION:4.7.4

以及在qmake中使用INSTALLS变量:http://doc.qt.digia.com/qt/qmake-environment-reference.html#installs - 和How do I specify input the QMake INSTALLS variable?

默认情况下,只需执行

target.path = $$[QT_INSTALL_BINS]
INSTALLS += target

然后你的二进制文件将安装在任何qt认为正确的地方,QT_INSTALL_BINS。您可以通过将target.path设置为其他内容来更改这些默认值。 Qt提供这些路径,但由您决定是否使用它们。

你可以做到

MY_DEFAULT_INSTALL=/opt/myproj

somedocs.files = docs/index.html
somedocs.path = $$MY_DEFAULT_INSTALL/docs

target.path = $$MY_DEFAULT_INSTALL/bin

INSTALLS += somedocs target

例如,其中MY_DEFAULT_INSTALL是.pro文件中定义安装默认值的位置。

答案 1 :(得分:3)

我在这里回答Windows。您似乎使用的是UNIX,Linux或Mac OS X,因此您可能需要进行一些更改。

INSTALL_ROOT是一个记录不完整的功能,似乎已添加,以便那些没有root或admin访问权限的人可以在其本地文件系统中安装Qt。它实际上有点像黑客,因为你已经看到,不可能指定任意目标,但你可以随后将文件移动到所需的位置。