Частичная сборка Qt6 из исходников

Мне нужно установить Qt6 на Ubuntu 18. Поскольку qt6 отсутствует в репозиториях (или нет?), Я должен скомпилировать их из исходного кода. Однако я делаю это на своем сервере VDS, который не очень мощный (2 ядра, 4 ГБ ОЗУ), поэтому мне не хватает мощности для стандартной компиляции Qt6 (компиляция вылетает с ошибками типа «У меня недостаточно ОЗУ»). Мне было интересно, можно ли скомпилировать только те модули, которые мне нужны для QtHttpServer (расширение для Qt6). Я пытался найти эту информацию в документации, но ничего не нашел.

2 ответа

Старый способ Qt5 - перейти к командной строке configure. например configure .... -skip qtremoteobjects -skip qtwebengineСогласно документации сборки Qt6 , эта опция все еще существует. (Прокрутите внизу страницы «Исключение модулей Qt»). В вашем случае вы, вероятно, пройдете много -skipоператоры при запуске configure. Каждая доступная опция пропуска - это каталог верхнего уровня в дереве исходных текстов.

Я еще не исследовал сборку с помощью Qt 6, как и с Qt 5. Но другой простой способ на Qt5 не создавать вещи, которые вам не нужны, - это просто удалить любой каталог верхнего уровня из дерева исходных текстов. Например, если вы не хотели строить qtremoteobjects или же qtwebengine, вы просто удаляете эти каталоги верхнего уровня. (Мы всегда удаляем qtwebengine из дерева исходных текстов каждый раз, когда делаем новую каплю - это, по сути, весь Chromium, и он больше, чем остальная часть кода вместе взятой!) Понятия не имею, работает ли удаление каталогов на Qt6 с их новой средой Ninja / CMake .

Мне нужно установить Qt6 на Ubuntu 18. Поскольку qt6 отсутствует в репозиториях (или нет?), Я должен скомпилировать их из исходного кода.

Это не совсем отслеживает - Qt делает бинарные загрузки доступными через свой онлайн-установщик, вы сможете загрузить и установить Qt6 таким образом. У меня установлена ​​копия Qt 6.1.0 в $HOME/Qt/ на моем ящике Fedora 33, полностью отделенном от системной установки Qt 5.15.2 в /usr/lib64/qt5/. И я ничего из этого не компилировал.

Однако, возможно, вам нужно скомпилировать другой код с исходными кодами Qt - получение рабочей среды сборки все еще имеет смысл.

Настройка сборки

Бег ./configure --help в исходном дереве перечислены параметры, доступные для конфигурации, включая определение <part>:

      $ ./configure --help
# ...snip...
Component selection:

  -skip  ......... Exclude an entire repository from the build.
  -make  ......... Add  to the list of parts to be built.
                         Specifying this option clears the default list first.
                         (allowed values: libs, tools, examples, tests,
                         benchmarks, manual-tests, minimal-static-tests)
                         [default: libs and examples, also tools if not
                         cross-building, also tests if -developer-build]
  -nomake  ....... Exclude  from the list of parts to be built.

Так, -make слишком высокоуровневый, чтобы быть вам полезен.

Строительные цели

Это нормально, потому что теперь, когда Qt использует CMake для генерации своей системы сборки, у вас действительно есть довольно точный контроль над процессом. После создания дерева сборки вы можете точно указать, какие цели CMake вы хотите построить, а не по умолчанию. all, добавив --target <name> аргумент в cmake --buildкомандная строка. Бег cmake --build <builddir> --target help заставит инструмент сборки перечислить его известные цели (по крайней мере, с помощью или ninja, не уверен, что это универсально).

сам по себе не указан в качестве цели. Существует http перечисленная функция, которая является частью цели, но вы не можете создавать функции. Предположительно QtHttpServer также является частью Qt::Network, хотя - который вы можете построить изолированно (но со всеми необходимыми зависимостями) *, используя целевой Network.

* - (Как оказалось, CMake настроит сборку на автоматическую компиляцию любых зависимостей времени выполнения , но во время установки есть зависимости, которые Qt не полностью определила как предварительные условия для целей, которым они требуются.)

1 тур

Итак, после загрузки исходников Qt6 в $HOME/Qt/6.1.0/Src используя их онлайн-установщик, моя первая попытка была:

      cd $HOME/Qt/6.1.0/Src
./configure -prefix $HOME/Qt/my_6.1.0
cmake --build . --target Network
cmake --install .  # Installs to the location given in `configure -prefix`

... Это не удалось --install step, потому что в нем отсутствовали вспомогательные инструменты, используемые в процессе установки.

Раунд 2

Итак, я сделал еще одну сборку:

      cmake --build . --target qttools

На самом деле это занимает гораздо больше времени, потому что для создания полного набора инструментов (в том числе графического) мне теперь нужно иметь большую часть QtCore, QtGui, а также QtWidgets построены как зависимости вместе с большими кусками QtDeclarative (где QML а также QtQuick live) и другие модули, которые я пропустил при первом запуске, потому что я только хотел.

Исключая часть дерева с ./configureварианты изначально помогли бы здесь, так как я мог бы избежать создания множества инструментов, которые мне не нужны. Также могут быть доступны более детализированные цели, которые позволят мне создать только определенные инструменты, необходимые для сценариев установки (с меньшим количеством зависимостей), но meh. В любом случае Qt бесполезен без основных библиотек. Тем не менее, если вы так стеснены, как вы говорите, потратьте немного времени на начальную configure сократить набор сборки, как описано в другом ответе, по-прежнему стоит.

В сторону: установка с помощью CMake

Стоит отметить, что это не приведет к запуску дополнительных сборок (поэтому моя первая попытка не удалась); он устанавливает только то, что уже было создано. Так что запускать эксперимент на любом этапе процесса безопасно. В худшем случае компоненты отсутствуют.

(В отличие от таких инструментов, как make, где обычно можно запустить make installпостроить и установить дерево за один шаг, если вы запустите cmake --installна полностью не построенном дереве он не запускает никаких сборок. В обычном дереве CMake он просто начнет выдавать сообщения об ошибке о том, что каждый из выходных данных по умолчанию отсутствует, а затем завершит работу «успешно», ничего не сделав. Однако у Qt есть несколько пользовательских сценариев установки, которые ожидают доступа к определенным файлам в дереве сборки, поэтому выполнение того же самого в несобранном / частично построенном дереве сборки Qt приводит к тому, что сценарии установки выдают ошибку, когда он не может найти эти файлы.)

3 тур

Итак, надо мной была шутка: даже после того, как все построили, cmake --install . по-прежнему не удалось с ТОЧНЫМ сообщением об ошибке:

      CMake Error at qtbase/src/tools/tracegen/cmake_install.cmake:53 (file):
  file INSTALL cannot find "$HOME/Qt/6.1.0/Src/qtbase/libexec/tracegen":
  No such file or directory.
Call Stack (most recent call first):
  qtbase/src/cmake_install.cmake:67 (include)
  qtbase/cmake_install.cmake:231 (include)
  cmake_install.cmake:47 (include)

Кажется tracegen даже не является частью qttools... но IS цель своей собственной. Вместо этого я должен был сделать во 2 раунде:

      cmake --build . --target tracegen

После этого это работает для установки (только) QtNetwork:

      cmake --install ./qtbase/src/network

Я также могу делать такие вещи, как:

      cmake --build . --target qtbase
cmake --build . --target qmake  # The qtbase install crashes without it
cmake --install ./qtbase

Для установки отдельных высокоуровневых модулей. QtBase на сегодняшний день является наиболее критичным, без него у вас действительно не будет установки Qt по любому разумному определению.

После этого можно проверить, работают ли основы:

      cmake --build . --target qtdiag
cmake --install ./qttools/src/qtdiag
$HOME/Qt/my_6.1.0/bin/qtdiag

... Если все в порядке (а это так), обширная информация о состоянии компонентов, которые я установил до сих пор, должна быть выгружена на стандартный вывод.

Другие вопросы по тегам