Как использовать корень установки, который находится в сгенерированных файлах Makefile?

qmake генерирует следующее (среди прочих) правило для установки цели:

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

я не могу INSTALL_ROOT что-то вроде этого в

isEmpty(INSTALL_ROOT) {
    INSTALL_ROOT=/usr
}

, потому что INSTALL_ROOT как-то локально для сгенерированных файлов Makefile. Согласно тому, что я выяснил до сих пор INSTALL_ROOT по умолчанию пусто. Его можно использовать как

INSTALL_ROOT=$HOME make install

при вызове make, что нормально. Однако я хочу иметь возможность указать по умолчанию установка root, скажем /usr. Я могу сделать это, введя новую переменную PREFIX как было предложено здесь. Тогда сгенерированное правило будет выглядеть так (if 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 ответов


Я отвечаю за Windows здесь. Похоже, вы используете UNIX, Linux или Mac OS X, поэтому вам может потребоваться внести несколько изменений.

INSTALL_ROOT-это плохо документированная функция, которая, похоже, была добавлена, чтобы те, у кого нет доступа root или admin, могли установить Qt в свою локальную файловую систему. Это на самом деле немного взломать, так как, как вы уже видели, невозможно указать произвольную цель, но вы всегда можете переместить файлы в нужное место впоследствии.


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 запрос:

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

и использование переменной INSTALLS в qmake:http://doc.qt.digia.com/qt/qmake-environment-reference.html#installs - и Как указать ввод переменной установки QMake?

по умолчанию, если вы просто сделать

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

тогда ваш двоичный файл будет установлен в любом месте, которое qt считает правильным, QT_INSTALL_BINS. Вы можете изменить эти значения по умолчанию, конечно, задав цель.путь к чему-то другому. Кварта поставляет эти пути, но его до вас, чтобы использовать их или нет.

вы могли бы сделать

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-файл, определяющий значение по умолчанию для установок.