Get Involved/development/More: Difference between revisions

From KDE Community Wiki
(164 intermediate revisions by 17 users not shown)
Line 1: Line 1:
This page is the continuation with more advanced topics of the page [[Get_Involved/development]].
This page is the continuation with more advanced topics of the page [[Get_Involved/development]].


This paged is not meant for people that are starting to program for KDE.
== kde-builder is an alternative to kdesrc-build ==
 
kdesrc-build and kde-builder are two KDE build frameworks. They are used at the command line and have identical command line syntax, just replace the string "kdesrc-build" with "kde-builder". They use the same configuration file, named <code>kdesrc-buildrc</code>.
 
kde-builder is newer and regularly gets new features and is written in Python.
 
kdesrc-build is in maintenance mode and feature frozen and written in Perl.
 
The "how to install kde-builder" procedure is here https://invent.kde.org/sdk/kde-builder/-/blob/master/README.md .


== Develop in a Linux container ==
== Develop in a Linux container ==


When you start programming for KDE, it is recommended that you [[Get_Involved/development|use kdesrc-build in your main operating system or in a virtual machine]] running on a rolling-release Linux distribution (Arch, openSUSE Tumbleweed, KDE neon) or running on e.g. the latest version of Fedora KDE Spin or Kubuntu.
When you start programming for KDE, it is recommended that you [[Get_Involved/development|use kdesrc-build in your main operating system or in a virtual machine]] running on a [[Get_Involved/development#Operating_system|Linux operating system that is better supported by kdesrc-build]].


As an alternative, you can run kdesrc-build in a Linux container (docker, podman, toolbx, distrobox).
As an alternative, you can run kdesrc-build in a Linux container (docker, podman, toolbx, distrobox).
Line 15: Line 23:
=== Option 2. distrobox ===
=== Option 2. distrobox ===


Or, you can just create a long lived (pet not cattle) container using distrobox and podman (or docker). See https://www.youtube.com/watch?v=9JEALbcmcCg https://github.com/89luca89/distrobox
It is possible to start developing KDE software using container images that are able to see inside your home folder. This can be done using distrobox and podman.
 
First, install distrobox and podman from your distribution repositories:
 
* Debian/Ubuntu: sudo apt install distrobox podman
* openSUSE: sudo zypper install distrobox podman
* Fedora: sudo dnf install distrobox podman
* Arch: sudo pacman --sync distrobox podman
 
On systems which are designed for you to not tamper with their root files (immutable distributions like openSUSE Kalpa, Fedora Kinoite, and SteamOS on the Steam Deck) you can use an [https://distrobox.it/#alternative-methods official alternative method] to install distrobox:
 
{{Input|<nowiki>
curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sh -s -- --prefix ~/.local
</nowiki>}}
 
On the Steam Deck, you will additionally need to add <tt>~/.local/bin</tt> to the <code>$PATH</code>.
 
==== Building without kdesrc-build ====
 
You can build a single repository using the [https://community.kde.org/Neon/Containers KDE Neon Unstable docker image]. We will be using the <code>plasma:unstable</code> image, which comes with the latest KDE software and libraries, and we will be using the minimal version, which requires you to install development libraries before compiling your projects.
 
After installing distrobox and podman, run the following to create a new distrobox container:
 
{{Input|
podman pull invent-registry.kde.org/neon/docker-images/plasma:unstable
distrobox create --image invent-registry.kde.org/neon/docker-images/plasma:unstable
}}
 
This will create a distrobox container named '''plasma-unstable'''.
 
{{Note|The plasma:unstable image size is 5.6 GB.}}
 
Lastly, enter the generated container:
 
{{Input|
distrobox enter plasma-unstable
}}


Start with the official Docker hub container image of one of the Linux distributions that is better suited for kdesrc-build. Then setup kdesrc-build in the container. distrobox makes it such that you can run GUI apps in the container. Also, your user's home directory (~) is the same in the host operating system and in the container. Warning: the container will write to your home directory and may conflict with your host operating system.
You can then just clone the desired repository in your home folder and build it while being inside the container. If any development libraries are missing, you can just install them the same way you would install on Debian/Ubuntu/KDE Neon:


== Other operating systems ==
{{Input|
sudo apt install packagename-dev
}}


=== FreeBSD ===
You can also use <code>build-dep</code> to let apt install the required libraries for the program you will be compiling. For example, to install the development libraries for Kate, you can run:


Install the latest release of FreeBSD with KDE Plasma Desktop on your hardware computer or in a virtual machine. Then set up kdesrc-build using the same procedure as when installing kdesrc-build on a Linux operating system. FreeBSD is currently supported by kdesrc-build. See https://www.youtube.com/watch?v=v2wq0eTnUuc https://www.youtube.com/watch?v=MT-AN4J-hn8
{{Input|
sudo apt-get build-dep kate
}}


=== Microsoft Windows ===
==== Building with kdesrc-build ====


You can build and develop KDE projects using the [[Get_Involved/development/Windows|Microsoft Windows]] operating system.
First, install distrobox and podman from your distribution repositories. Then run:


=== Apple macOS ===
{{Input|
distrobox enter
}}


You can build and develop KDE projects using the [[Get_Involved/development/Mac|Apple macOS]] operating system.
This should create a container based on your current Linux OS and enter it. It is preferable to use one of the Linux distributions that is better suited for kdesrc-build, as mentioned [[Get_Involved/development#Operating_system|in this wiki page]], so if your distribution does not provide very up-to-date packages, you can download and use a different container image for your distrobox from [https://hub.docker.com/search?type=image Dockerhub]. For example, with openSUSE Tumbleweed:


== What to do if CMake configure fails because a build dependency is missing ==
{{Input|
podman pull opensuse/tumbleweed
distrobox create --image opensuse/tumbleweed --name tumbleweed
distrobox enter tumbleweed
}}


If you run kdesrc-build in order to build a KDE git repository. And if building fails with a CMake error. Then, that is most often caused by the fact that you do not have installed some binary packages from your Linux OS.
Then it's a matter of downloading and running kdesrc-build as detailed in [[Get_Involved/development/Set_up_a_development_environment]]:


See below for some ideas about how to find out what Linux packages you need to install.
<syntaxhighlight lang="bash">
mkdir -p ~/.local/share/
cd ~/.local/share
git clone https://invent.kde.org/sdk/kdesrc-build.git
cd kdesrc-build
./kdesrc-build --initial-setup
mkdir -p ~/.local/bin
ln -sf ~/.local/share/kdesrc-build/kdesrc-build ~/.local/bin
</syntaxhighlight>


=== Debian/Kubuntu/KDE neon ===
From this point on, one important thing to bear in mind is that a distrobox container is transparent in its user space and containerized in its root space: when you are inside a distrobox container, you can see the content of system's home folder, but not your system's root folders, only the container's root folders. This means that you can install packages inside the container using root privileges and access those packages to compile your programs stored in your home, without ever installing those packages in your actual system!


E.g. I am on Kubuntu 22.10, <code>kdesrc-build frameworks</code> fails, module <code>kcoreaddons</code> has CMake (configure) error <code>Could NOT find Qt6LinguistTools (missing: Qt6LinguistTools_DIR)</code>.
You can take advantage of this by installing, for instance, Qt development packages used for kdesrc-build from inside the container. This way, it is not necessary to compile Qt with kdesrc-build. This is particularly convenient if you want to compile KDE software with Qt6 quickly.


Option 1:
Likewise, you should [https://community.kde.org/Get_Involved/development/Install_the_dependencies install the required dependencies] from inside the distrobox rather than from your system's repositories. Then you can start compiling as usual.


Search on the internet for <code>ubuntu packages Qt6LinguistTools</code> it returns https://packages.ubuntu.com/kinetic/amd64/qt6-tools-dev Expand "amd64 [list of files]": <code>/usr/lib/x86_64-linux-gnu/cmake/Qt6LinguistTools/Qt6LinguistToolsConfig.cmake</code>
After compiling your program with kdesrc-build from inside the distrobox, you can run it with <code>kdesrc-build run</code>, and despite it originating from inside a container and using the libraries from the container, it will run just fine as a GUI application on your system!


{{Input|1=<nowiki>
{{Note|If you are on an X11 session, you will need to create the file <tt>~/.config/distrobox/distrobox.conf</tt> and add <code>xhost +si:localuser:$USER</code> to it in order for distrobox to be able to run graphical applications.}}
sudo apt install qt6-tools-dev
</nowiki>}}


Option 2:
The only few gotchas to using this method are:
{{Input|1=<nowiki>
sudo apt install apt-file
sudo apt-file update
apt-file find Qt6LinguistToolsConfig.cmake
# qt6-tools-dev: /usr/lib/x86_64-linux-gnu/cmake/Qt6LinguistTools/Qt6LinguistToolsConfig.cmake
sudo apt install qt6-tools-dev
</nowiki>}}


If the error is:
* You cannot use a [[Get_Involved/development/Build_software_with_kdesrc-build#Plasma|full Plasma Desktop session]] made from git.
{{Input|1=<nowiki>
* You will need qqc2-desktop-style and Breeze to show the correct theme for your applications.
The imported target "Qt6::qtwaylandscanner" references the file
* You will need the QtWayland library and its respective development package to run your applications natively on a Wayland session.
    "/usr/lib/qt6/libexec/qtwaylandscanner"
but this file does not exist.
</nowiki>}}


Then:
== Other operating systems ==
{{Input|1=<nowiki>
apt-file find /usr/lib/qt6/libexec/qtwaylandscanner
# qt6-wayland-dev-tools: /usr/lib/qt6/libexec/qtwaylandscanner
sudo apt install qt6-wayland-dev-tools
</nowiki>}}


Option 3:
=== Kubuntu >= 23.10 ===
{{Input|1=<nowiki>
apt search linguist | grep qt6
# linguist-qt6/kinetic 6.3.1-2 amd64
sudo apt install linguist-qt6
</nowiki>}}


=== Fedora ===
The default configuration of kdesrc-build requires Qt version 6.6. Kubuntu 23.10 has Qt version 6.4.2. It is recommended that you use a [[Get_Involved/development#Operating_system|Linux OS that is better supported by kdesrc-build]].


<code>sudo dnf provides "NameOrPathOfFileThatIsMissing"</code>
If you are a more seasoned developer you might be able to use Kubuntu for kdesrc-build by [[Get_Involved/development/More#Qt_6_installed_using_the_Qt_online_installer|installing Qt6 using the Qt online installer]] or by [[Get_Involved/development/More#Build_Qt_using_kdesrc-build|building Qt6 using kdesrc-build]].


See https://invent.kde.org/redstrate/cmake-package-installer/-/blob/master/src/main.rs
=== FreeBSD ===


== Advanced kdesrc-build ==
Install the latest release of FreeBSD with KDE Plasma Desktop on your hardware computer or in a virtual machine.


After you have edited a git repository and you want to build it, <code>--no-src</code> will make sure that <code>kdesrc-build</code> does not overwrite your changes with the latest source code from the official git repository (remote "origin" / https://invent/kde.org).
Your user should be member of the "wheel" user group (e.g. this can be configured in the FreeBSD installer, when creating your user you can select additional user groups for your user). Your user should be able to use sudo:


<code>--no-include-dependencies</code> only builds the git repository that you give as parameter to <code>kdesrc-build</code>.
<pre>
pkg install sudo
visudo
# Uncomment the line: %wheel ALL=(ALL:ALL) ALL
</pre>


<code>--debug</code> shows verbose output.
Then set up kdesrc-build using the same procedure as when installing kdesrc-build on a Linux operating system. FreeBSD is currently supported by kdesrc-build. See https://www.youtube.com/watch?v=8MqBnb3Y9JU


<code>--refresh-build</code> forces a rebuild (not an incremental build) and a full reinstall.
=== OpenBSD >= 7.5 ===


E.g. you have edited kcalc. You run:
Install OpenBSD version greater than or equal to 7.5. In the installer keep the defaults, the user created by the installer is named "administrator" in this example.
<pre>
<pre>
kdesrc-build kcalc --no-src --no-include-dependencies --refresh-build --debug |& tee ~/a.txt
# Enable doas
su -
cp /etc/examples/doas.conf /etc/doas.conf
exit
# kdesrc-build needs sudo.
mkdir -p ~/.local/bin ; ln -s /usr/bin/doas ~/.local/bin/sudo
echo "export PATH=~/.local/bin:\$PATH" >> ~/.bashrc
 
# Test doas.
doas su
# kde-builder needs bash.
pkg_add bash
chsh -s /usr/local/bin/bash
exit
 
# As user administrator
chsh -s /usr/local/bin/bash
 
# As per https://rsadowski.de/posts/2024-01-09-openbsd-kde/ , https://openports.pl/path/meta/kde,-plasma
doas su
pkg_add kde-plasma kate
 
# I recommend that you use tigervnc. https://nmariusp.github.io/install-os.html#openbsd--75
</pre>
</pre>


For details, see:
After you install kdesrc-build:
<pre>
<pre>
kdesrc-build --help
# Edit the kdesrc-buildrc file e.g.:
cmake-options -DCMAKE_BUILD_TYPE=RelWithDebInfo -DKF_IGNORE_PLATFORM_CHECK=ON
 
# Also set environment variable:
export CMAKE_PREFIX_PATH=/usr/local/lib/qt6/cmake
# Or
export CMAKE_PREFIX_PATH=/usr/local/lib/qt5/cmake
</pre>
</pre>


Note: the resources below might not be up to date.
=== Microsoft Windows ===


See the [https://docs.kde.org/trunk5/en/kdesrc-build/kdesrc-build/ kdesrc-build manual], [https://invent.kde.org/sdk/kdesrc-build/-/blob/master/README.md Readme #1], [https://invent.kde.org/sdk/kdesrc-build/-/blob/master/doc/README.md Readme #2], [https://invent.kde.org/sdk/kdesrc-build/-/blob/master/doc/source-reference/index.adoc Document #3] for more kdesrc-build information and options.
You can build and develop KDE projects using the [[Get_Involved/development/Windows|Microsoft Windows]] operating system.


== Build Qt using kdesrc-build ==
=== Apple macOS ===
 
You can build and develop KDE projects using the [[Get_Involved/development/Mac|Apple macOS]] operating system.
 
== What to do if CMake configure fails because a build dependency is missing ==
 
See https://community.kde.org/Get_Involved/development/Install_the_dependencies .
 
== Project Documentation ==
 
* [https://docs.kde.org/trunk5/en/kdesrc-build/kdesrc-build/ Handbook]
* [https://invent.kde.org/sdk/kdesrc-build/-/blob/master/README.md Readme #1]
* [https://invent.kde.org/sdk/kdesrc-build/-/blob/master/doc/README.md Readme #2]
 
Developer's documentation can be found in the {{ic|doc/source-reference}} in the project repo.
 
== kf6-qt6 vs. kf5-qt5 ==
 
Many KDE git repositories can build correctly and run correctly using "kdesrc-build kf6-qt6".
 
The KDE git repositories that can build correctly and run correctly using "kdesrc-build kf6-qt6" have two long lived git branches:
 
* A long lived git branch that does not contain the deprecated symbols from kf5-qt5, named e.g. "master".
* And another long lived git branch for qt5-kf5, where the deprecated symbols still exist.


Set up kdesrc-build from scratch as usual.
What is "kf6-qt6"? You just set up kdesrc-build following the procedure. The resulting kdesrc-build installation will be of type kf6-qt6. In kdesrc-buildrc in the "global" section you will have "branch-group kf6-qt6". The git repositories that have only one long lived git branch e.g. named "master" will use that. The git repositories that have a second long lived git branch, will use the git branch where the deprecated symbols do not exist e.g. named "master".


Open the configuration file <code>~/.config/kdesrc-buildrc</code> and confirm that <code>qtdir</code> and the lines <code>include...qt5-build-include</code> and <code>include...custom-qt5-libs-build-include</code> are not commented out (i.e. there should not be a <code>#</code> in front of the lines). E.g. (replace "username" with your Linux user's name):
What is "kf5-qt5"? Follow the chapter "kdesrc-build Qt5". The resulting kdesrc-build installation will be of type kf5-qt5. In kdesrc-buildrc in the "global" section you will have "branch-group kf5-qt5". The git repositories that have only one long lived git branch e.g. named "master" will use that. The git repositories that have a second long lived git branch where the deprecated symbols still exist e.g. named "kf5" will use that.


{{Input|1=<nowiki>
== Build Qt using kdesrc-build ==
qtdir ~/kde/usr # Where to make install Qt5
include /home/username/kde/src/kdesrc-build/qt5-build-include
include /home/username/kde/src/kdesrc-build/custom-qt5-libs-build-include
</nowiki>}}


Run in a terminal:
=== Qt6 ===
If you cannot build the KDE frameworks using {{ic|kdesrc-build}} and the Qt provided by your Linux distribution is outdated, you might want to build the Qt framework using {{ic|kdesrc-build}}.


{{Input|1=<nowiki>
In your configuration file use the {{ic|qt-install-dir}} option (in the ''global'' section) with non-empty value, for example:
kdesrc-build Qt5
kdesrc-build frameworks
</nowiki>}}


== kdesrc-build, Qt6 and KDE Frameworks 6 ==
{{bc|
global
  qt-install-dir ~/kde/usr
  branch-group kf6-qt6
end global
}}


Set up kdesrc-build clean from scratch following the same procedure as when using "Qt5 and KDE Frameworks 5". Before building anything using kdesrc-build, do:
It is recommended that if you build Qt6 using kdesrc-build, you also build qtwebengine. Edit the file {{ic|~/.local/state/sysadmin-repo-metadata/module-definitions/qt6.ksb}}. Follow the instructions found in the file: if you want qtwebengine, add it to use-modules after "qtwebchannel" and comment out the line "ignore-modules qtwebengine".


{{Input|1=<nowiki>
Then build Qt6: {{bc|kdesrc-build qt6-set}}
sed -i 's/kf5-common/kf6-common/' ~/.config/kdesrc-buildrc
sed -i 's/kf5-qt5/kf6-qt6/' ~/.config/kdesrc-buildrc
</nowiki>}}


The file <code>~/.config/kdesrc-buildrc</code> should contain the not commented out lines:
To compile Qt6 with Qt X11 Extras (which is a necessary library to compile [https://api.kde.org/frameworks/kwindowsystem/html/ KWindowSystem]), you should enable XCB feature during compilation


{{Input|1=<nowiki>
{{bc|1=kdesrc-build qt6-set --cmake-options="-DQT_FEATURE_xcb=ON"}}
include /home/username/kde/src/kdesrc-build/kf6-common-options-build-include
...
include /home/username/kde/src/kdesrc-build/kf6-qt6-build-include
</nowiki>}}


In the file <code>~/.config/kdesrc-buildrc</code>, in the "global" section, the line "cmake-options" should contain "-DBUILD_WITH_QT6=ON".
=== Qt5 ===
If you want the same for Qt5, change {{ic|branch-group}} option and use {{ic|qt5-set}} instead of {{ic|qt6-set}}.


Then build KDE Frameworks 6:
== Qt 6 installed using the Qt online installer ==


{{Input|1=<nowiki>
A screen recording version is available https://www.youtube.com/watch?v=3BIbYN2vIZw
kdesrc-build frameworks
</nowiki>}}


Note: <code>kdesrc-build --initial-setup</code> does not install the packages needed for building with kdesrc-build "Qt6 and KDE Frameworks 6". The instructions on [[Guidelines and HOWTOs/Build from source/Install the dependencies|how to install the dependencies]] are for "Qt5 and KDE Frameworks 5" only, they do not work for "Qt6 and KDE Frameworks 6". Therefore many kdesrc-build modules will fail to build because of missing dependencies (CMake errors).
The homepage of the Qt Framework is https://www.qt.io . Go to this web page, create an online account. https://www.qt.io/download-open-source > "Download the Qt Online Installer" > Linux > "Qt Online Installer for Linux (64-bit)" > download a file named e.g. qt-unified-linux-x64-4.6.1-online.run into the directory e.g. "~/Downloads".


=== Ubuntu ===
<pre>
ls -la ~/Downloads # The downloaded file needs to have the "executable" chmod bit set.
chmod u+x ~/Downloads/qt-unified-linux-x64-4.6.1-online.run
~/Downloads/qt-unified-linux-x64-4.6.1-online.run
</pre>


{{Input|1=<nowiki>
A graphical user interface (GUI) installer wizard starts. Login using your Qt online account. Next > check the checkbox "I have read and agree to the terms and conditions of using OpenSource Qt", check the checkbox "I'm an individual and do not use Qt for any company" > Next > Next > enable "Help us improve" > Next > Custom installation, notice that the install directory is "~/Qt" > Next. Install the latest version of Qt6 and the latest version of the Qt Creator integrated development environment (IDE). There are some Qt6 components that are not used by KDE and can be left out when installing Qt6 e.g. Qt Design Studio, WebAssembly, Android, Sources, Qt Quick 3D, Qt 3D, Qt Quick 3D Physics, "Qt Debug Information Files". Next > enable "I have read and agree" > Next > Install.
sudo apt install qt6-tools-dev qt6-declarative-dev libqt6core5compat6-dev qt6-wayland-dev qt6-wayland-dev-tools qt6-base-private-dev libqt6svg6-dev libqt6opengl6-dev libqt6shadertools6-dev
</nowiki>}}


== Build Qt6 using kdesrc-build ==
In the KDE Plasma app launcher (start menu) you now have the application "Qt Maintenance Tool".


A screen recording version is available https://www.youtube.com/watch?v=TDzX0376QyA
Set up kdesrc-build from scratch as usual.


Note: If you cannot build the KDE frameworks using kdesrc-build and using the Qt6 provided by your OS (Linux distribution). Because the Qt6 is not complete. You might want to build Qt6 using kdesrc-build.
Edit the file kdesrc-buildrc to look like:


Note: Building Qt6 using kdesrc-build is an advanced topic.
<pre>
global
...
    qt-install-dir  ~/Qt/6.7.0/gcc_64 # Where to install Qt6 if kdesrc-build supplies it
    libname lib
...
end global
</pre>


Set up kdesrc-build clean from scratch following the same procedure as when using "Qt5 and KDE Frameworks 5".
== Two independent kdesrc-build configurations: kf6-qt6 and kf5-qt5 ==


{{Input|1=<nowiki>
You can switch between configurations with {{ic|--rc-file}} command line option. Generate another config, make the changes for the {{ic|source-dir}}, {{ic|build-dir}}, {{ic|install-dir}},
Edit two files:
and other changes you want. Make sure you use different value for {{ic|persistent-data-file}} option, to not mix things up.


cat ~/.config/kdesrc-buildrc
As an alternative, you can utilize custom variable to make switch from a single config:
# This file controls options to apply when configuring/building modules, and
# controls which modules are built in the first place.
# List of all options: https://docs.kde.org/trunk5/en/kdesrc-build/kdesrc-build/conf-options-table.html


{{bc-hl|shell|
global
global
     branch-group kf6-qt6
     _ver 5  # <-- Change this to switch
    source-dir ~/kde${_ver}/src
    build-dir ~/kde${_ver}/build
    install-dir ~/kde${_ver}/usr
    persistent-data-file ~/kde${_ver}/persistent-options.json
end global


    # Finds and includes *KDE*-based dependencies into the build.  This makes
include ~/.local/share/kdesrc-build/data/build-include/kf${_ver}-qt${_ver}.ksb
    # it easier to ensure that you have all the modules needed, but the
}}
    # dependencies are not very fine-grained so this can result in quite a few
    # modules being installed that you didn't need.
    include-dependencies true


    # Install directory for KDE software
== Other CPU architectures than x86_64/amd64 and x86 ==
    kdedir ~/kde/usr


    # Directory for downloaded source code
You can build and develop KDE projects using a Linux OS installed on an  [[Get_Involved/development/ARM|ARM]] architecture CPU.
    source-dir ~/kde/src


    # Directory to build KDE into before installing
== kdesrc-build issues ==
    # relative to source-dir by default
    build-dir ~/kde/build


    qtdir  ~/kde/usr # Where to install Qt5 if kdesrc-build supplies it
See https://community.kde.org/Get_Involved/development/Install_the_dependencies


    cmake-options -DCMAKE_BUILD_TYPE=Debug -DBUILD_WITH_QT6=ON
=== wayland-protocols is too old, e.g. "kdesrc-build kidletime" fails ===


    # kdesrc-build sets 2 options which is used in options like make-options or set-env
<pre>
    # to help manage the number of compile jobs that happen during a build:
mkdir -p ~/kde/misc && cd ~/kde/misc
    #
wget https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/1.31/downloads/wayland-protocols-1.31.tar.xz
    # 1. num-cores, which is just the number of detected CPU cores, and can be passed
tar -xJvf wayland-protocols-*.tar.xz && mv wayland-protocols-*/ wayland-protocols
    #    to tools like make (needed for parallel build) or ninja (completely optional).
cd wayland-protocols
    #
meson setup builddir --prefix $HOME/kde/usr
    # 2. num-cores-low-mem, which is set to largest value that appears safe for
meson compile -C builddir
    #    particularly heavyweight modules based on total memory, intended for
meson install -C builddir
    #    modules like qtwebengine
</pre>
    num-cores 16
    num-cores-low-mem 12


    # kdesrc-build can install a sample .xsession file for "Custom"
=== "kdesrc-build kpat" fails because of black-hole-solitaire ===
    # (or "XSession") logins,
    install-session-driver false


    # or add a environment variable-setting script to
This happens on Debian/Ubuntu/Kubuntu. Because there is no Linux distribution binary package for https://github.com/shlomif/black-hole-solitaire.
    # ~/.config/kde-env-master.sh
    install-environment-driver true


    # Stop the build process on the first failure
Solution: append at the end of kdesrc-buildrc file:
     stop-on-failure true
<pre>
options kpat
     cmake-options -DWITH_BH_SOLVER=OFF
end options
</pre>


    # Use a flat folder layout under ~/kde/src and ~/kde/build
=== libdisplay-info is not available ===
    # rather than nested directories
    directory-layout flat


    # Build with LSP support for everything that supports it
If your Linux OS does not have a package for libdisplay-info.
    compile-commands-linking true
Append at the end of the file <code>kdesrc-buildrc</code>:
    compile-commands-export true
<pre>
module libdisplay-info
  repository https://gitlab.freedesktop.org/emersion/libdisplay-info.git
end module
</pre>


    git-repository-base qt6-copy https://invent.kde.org/qt/qt/
=== Building applications against Qt5 after discontinued support ===
end global


# With base options set, the remainder of the file is used to define modules to build, in the
With [https://invent.kde.org/sysadmin/repo-metadata/-/commit/b37ae38cefd9e1c9021afd74cc43e8e64847f550 this] commit, for some applications the support of building against Qt5 was intentionally disabled.
# desired order, and set any module-specific options.
#
# Modules may be grouped into sets, and this is the normal practice.
#
# You can include other files inline using the "include" command. We do this here
# to include files which are updated with kdesrc-build.


# Common options that should be set for some KDE modules no matter how
If for some reason you still want to build a Qt5 version of application, you can do it with some hacks. For example, lets say we want Ark. We need to manually see its dependencies listed in metadata:
# kdesrc-build finds them. Do not comment these out unless you know
{{bc-hl|bash|
# what you are doing.
$ ~/.local/state/sysadmin-repo-metadata/dependencies/dependency-data-kf5-qt5 {{!}} grep kde/kdeutils/ark
include /home/username/kde/src/kdesrc-build/kf6-common-options-build-include
}}


# Qt and some Qt-using middleware libraries. Uncomment if your distribution's Qt
Then for each dependency, find out the branch that is used for qt5.
# tools are too old but be warned that Qt take a long time to build!
include /home/username/kde/src/kdesrc-build/qt6-build-include
include /home/username/kde/src/kdesrc-build/custom-qt6-libs-build-include


# KF5 and Plasma :)
Then create a custom ksb file with custom module-set:
#include /home/username/kde/src/kdesrc-build/kf6-qt6-build-include


# To change options for modules that have already been defined, use an
{{hbc-hl|shell|~/ark-qt5.ksb|
# 'options' block. See kf6-common-options-build-include for an example
module-set ark-qt5
    repository kde-projects
    use-modules \
        extra-cmake-modules \
        karchive \
        kconfig \
        kcoreaddons \
        kcrash \
        kdbusaddons \
        kdoctools \
        ki18n \
        kiconthemes \
        kio \
        kparts \
        kpty \
        kservice \
        kwidgetsaddons \
        kwindowsystem \
        ark
end module-set


cat ~/kde/src/kdesrc-build/qt6-build-include
# Downloads and installs Qt6 from the KDE mirror, using Qt6's CMake support
# exclusively.  Consider this an unofficial build that won't be supported by Qt
# upstream since we don't go through the init-repository script.
# It is probably better to install from your local distribution devel packages
# if possible!
module-set qt6-set
    override-build-system qt6 # technically optional for now


    repository qt6-copy # as defined in kdesrc-buildrc-kf6-sample
options extra-cmake-modules
     branch     6.4
     branch kf5
end options


     # Controls where Qt6 is installed
options karchive
    prefix ${qtdir}
     branch kf5
end options


    # These have been manually placed in dependency order based on the
options kconfig
     # .gitmodules file in https://code.qt.io/cgit/qt/qt5.git/tree/.gitmodules
     branch kf5
    # in "essential" or "addons" categories with some additions
end options
    # qtdoc should be last to give it best opportunity to make needed docs
    use-modules qtbase qttools qtshadertools qtdeclarative qtsvg  \
        qtimageformats qtmultimedia qtwayland                    \
        qtwebsockets qtwebchannel qtwebengine qtwebview qtsensors            \
        qtnetworkauth qt5compat qtdoc qtpositioning


    # if you want qtwebengine, add it to use-modules after "qtwebchannel" and
options kcoreaddons
    # comment this out. Note qtwebengine has significant and different build
     branch kf5
     # requirements of its own.
end options
    #ignore-modules qtwebengine


     # Archiving API requires zstd support which may not be present in your CMake
options kcrash
    cmake-options -DQT_BUILD_TESTS=FALSE -DCMAKE_BUILD_TYPE=RelWithDebInfo \
     branch kf5
                  -DQT_AVOID_CMAKE_ARCHIVING_API=TRUE
end options


     cmake-generator Ninja # comment out if you want the default CMake generator
options kdbusaddons
end module-set
     branch kf5
end options


options qtwebengine
options kdoctools
     # qtwebengine build system is weird, involving make as the top-level driver
     branch kf5
    # and then calling ninja for the bulk of the build.  qtwebengine is a bulky
    # module and having ninja use all cores at once may run out of memory if
    # not careful, so we use make to pass less aggressive Ninja flags.
    # num-cores-low-mem needs to be defined in your kdesrc-buildrc.
    make-options NINJAFLAGS=-j${num-cores-low-mem}
end options
end options


# vim: set ft=kdesrc-buildrc:
options ki18n
    branch kf5
end options


</nowiki>}}
options kiconthemes
    branch kf5
end options


== Portable installation of kdesrc-build ==
options kio
    branch kf5
end options


If you are interested in or need separate builds of KDE software, like when building with Qt5 or Qt6, you can create a self-contained, portable installation of kdesrc-build in its own folder. This way, you can manage your kdesrc-build configuration files each in their own environment without mixing configurations or having to rebuild the universe every time you want to test a different one.
options kparts
    branch kf5
end options


{{Input|1=<nowiki>
options kpty
# To not lose your previous build, make a backup:
    branch kf5
mv ~/.config/kdesrc-buildrc ~/.config/kdesrc-buildrc~bak && mv ~/kde ~/kde~bak
end options
# Set up kdesrc-build as usual: https://community.kde.org/Get_Involved/development#Set_up_kdesrc-build
# Then move the generated kdesrc-buildrc to inside the new ~/kde folder:
mv ~/.config/kdesrc-buildrc ~/kde
# This will make kdesrc-build use this file even if ~/.config/kdesrc-buildrc exists.
# Then link kdesrc-build and kdesrc-run to the root of the ~/kde folder:
cd ~/kde
ln -s src/kdesrc-build/kdesrc-build .
ln -s src/kdesrc-build/kdesrc-run .
# Edit the file paths in ~/kde/kdesrc-buildrc
cd ~/kde
# Calling ~/kde/kdesrc-build will then only use the current folder's kdesrc-buildrc:
./kdesrc-build frameworks
mv ~/kde ~/kde.5 # Or to any other directory.
# Edit the file paths in the file ~/kde.5/kdesrc-buildrc
cd ~/kde.5
./kdesrc-build frameworks --refresh-build # Because binary files contain file full paths starting with "~/kde".
</nowiki>}}


== What is the command line of the processes started by kdesrc-build ==
options kservice
    branch kf5
end options


E.g. what are the command lines that are run by kdesrc-build in order to run the CMake configure step for the kconfig KDE git repository?
options kwidgetsaddons
    branch kf5
end options


{{Input|1=<nowiki>
options kwindowsystem
kdesrc-build kconfig --no-src --no-include-dependencies --debug --refresh-build |& tee ~/a.txt
    branch kf5
kate ~/a.txt &
end options
</nowiki>}}


Returns:
options ark
    branch release/23.08
end options


{{Input|1=<nowiki>
# --
Building kconfig (build system KDE CMake) from frameworks (1/1)
Queueing PKG_CONFIG_PATH to be set to /home/username/kde/usr/lib/pkgconfig
Queueing LD_LIBRARY_PATH to be set to /home/username/kde/usr/lib
Queueing PATH to be set to /home/username/kde/usr/bin:/home/username/kde/src/kdesrc-build:/home/username/.local/bin:/home/username/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Not prepending /home/username/kde/usr/lib/pkgconfig to PKG_CONFIG_PATH as it appears to already be defined in PKG_CONFIG_PATH.
Queueing PKG_CONFIG_PATH to be set to /home/username/kde/usr/lib/pkgconfig
Not prepending /home/username/kde/usr/lib to LD_LIBRARY_PATH as it appears to already be defined in LD_LIBRARY_PATH.
Queueing LD_LIBRARY_PATH to be set to /home/username/kde/usr/lib
Not prepending /home/username/kde/usr/bin to PATH as it appears to already be defined in PATH.
Queueing PATH to be set to /home/username/kde/usr/bin:/home/username/kde/src/kdesrc-build:/home/username/.local/bin:/home/username/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Queueing CMAKE_PREFIX_PATH to be set to /home/username/kde/usr
Queueing CMAKE_MODULE_PATH to be set to /home/username/kde/usr/lib64/cmake:/home/username/kde/usr/lib/cmake
Queueing XDG_DATA_DIRS to be set to /home/username/kde/usr/share:/usr/share/plasma:/home/username/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop
Source update complete for kconfig: Skipped
cd /home/username/kde/build


Preparing build system for kconfig.
# dependency of extra-cmake-modules
Removing files in build directory for kconfig
options polkit-qt-1
Old build system cleaned, starting new build system.
    branch qt5
cd /home/username/kde/build/kconfig
end options


Running cmake targeting Unix Makefiles...
# dependency of kcoreaddons
run_logged_p(): Module kconfig, Command: {'cmake', '-B', '.', '-S', '/home/username/kde/src/kconfig', '-G', 'Unix Makefiles', '-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON', '-DCMAKE_BUILD_TYPE=Debug', '-DQT_MAJOR_VERSION=6', '-DBUILD_WITH_QT6=ON', '-DBUILD_TESTING=TRUE', '-DBUILD_WITH_QT6=ON', '-DEXCLUDE_DEPRECATED_BEFORE_AND_AT=5.99.0', '-DCMAKE_CXX_FLAGS:STRING=-pipe', '-DCMAKE_INSTALL_PREFIX=/home/username/kde/usr'} from /home/username/kde/build/kconfig
options plasma-wayland-protocols
cd /home/username/kde/build/kconfig
    branch master
end options


log_command(): Module kconfig, Command: cmake -B . -S /home/username/kde/src/kconfig -G Unix Makefiles -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON -DCMAKE_BUILD_TYPE=Debug -DQT_MAJOR_VERSION=6 -DBUILD_WITH_QT6=ON -DBUILD_TESTING=TRUE -DBUILD_WITH_QT6=ON -DEXCLUDE_DEPRECATED_BEFORE_AND_AT=5.99.0 -DCMAKE_CXX_FLAGS:STRING=-pipe -DCMAKE_INSTALL_PREFIX=/home/username/kde/usr
# dependency of karchive
run_logged_p(): kconfig cmake complete: 0
options qca
</nowiki>}}
    branch qt5
end options
}}


Therefore, kdesrc-build has run the following commands:
After that, include it in your main config:


{{Input|1=<nowiki>
{{bc|1=
# Preparing build system for kconfig. Removing files in build directory for kconfig. Old build system cleaned, starting new build system.
global
rm -rf /home/username/kde/build/kconfig
    _ver 5
mkdir -p /home/username/kde/build/kconfig
    _build_with_qt6 OFF
    branch-group kf${_ver}-qt${_ver}
    cmake-options -DCMAKE_BUILD_TYPE=Debug -DQT_MAJOR_VERSION=${_ver} -DBUILD_WITH_QT6=${_build_with_qt6}
end global


# Queueing X to be set to ...
include ~/Development/kdesrc-build/data/build-include/kf${_ver}-qt${_ver}.ksb
PKG_CONFIG_PATH=/home/username/kde/usr/lib/pkgconfig
include ~/ark-qt5.ksb
LD_LIBRARY_PATH=/home/username/kde/usr/lib
}}
PATH=/home/username/kde/usr/bin:/home/username/kde/src/kdesrc-build:/home/username/.local/bin:/home/username/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
CMAKE_PREFIX_PATH=/home/username/kde/usr
CMAKE_MODULE_PATH=/home/username/kde/usr/lib64/cmake:/home/username/kde/usr/lib/cmake
XDG_DATA_DIRS=/home/username/kde/usr/share:/usr/share/plasma:/home/username/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop


cd /home/username/kde/build/kconfig
Then edit the metadata file:


cmake -B . -S /home/username/kde/src/kconfig -G Unix\ Makefiles -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON -DCMAKE_BUILD_TYPE=Debug -DQT_MAJOR_VERSION=6 -DBUILD_WITH_QT6=ON -DBUILD_TESTING=TRUE -DBUILD_WITH_QT6=ON -DEXCLUDE_DEPRECATED_BEFORE_AND_AT=5.99.0 -DCMAKE_CXX_FLAGS:STRING=-pipe -DCMAKE_INSTALL_PREFIX=/home/username/kde/usr
{{hbc-hl|json|~/.local/state/sysadmin-repo-metadata/dependencies/logical-module-structure.json|
</nowiki>}}
...
        "kde/*" : {
            "kf6-qt6": "master",
            "kf5-qt5": "master",  // <-- it was empty string, place "master" here
            "stable-kf6-qt6": "release/24.02",
            "stable-kf5-qt5": ""
        },
...
}}


== Other CPU architectures than x86_64/amd64 and x86 ==
Now you are able to build Ark with qt5:


You can build and develop KDE projects using a Linux OS installed on an [[Get_Involved/development/ARM|ARM]] architecture CPU.
{{hbc|$ kdesrc-build ark-qt5 --list-build|
Fetching remote changes to sysadmin-repo-metadata
Merging sysadmin-repo-metadata changes from branch master
        * You had local changes to sysadmin-repo-metadata, which have been re-applied.
...
  ── ark : release/23.08
}}

Revision as of 12:32, 14 April 2024

This page is the continuation with more advanced topics of the page Get_Involved/development.

kde-builder is an alternative to kdesrc-build

kdesrc-build and kde-builder are two KDE build frameworks. They are used at the command line and have identical command line syntax, just replace the string "kdesrc-build" with "kde-builder". They use the same configuration file, named kdesrc-buildrc.

kde-builder is newer and regularly gets new features and is written in Python.

kdesrc-build is in maintenance mode and feature frozen and written in Perl.

The "how to install kde-builder" procedure is here https://invent.kde.org/sdk/kde-builder/-/blob/master/README.md .

Develop in a Linux container

When you start programming for KDE, it is recommended that you use kdesrc-build in your main operating system or in a virtual machine running on a Linux operating system that is better supported by kdesrc-build.

As an alternative, you can run kdesrc-build in a Linux container (docker, podman, toolbx, distrobox).

Option 1. The KDE PIM Docker image

You can install Docker and the KDE PIM Docker image. It provides a development environment that is isolated from your day-to-day system. It is based on KDE Neon Unstable.

Option 2. distrobox

It is possible to start developing KDE software using container images that are able to see inside your home folder. This can be done using distrobox and podman.

First, install distrobox and podman from your distribution repositories:

  • Debian/Ubuntu: sudo apt install distrobox podman
  • openSUSE: sudo zypper install distrobox podman
  • Fedora: sudo dnf install distrobox podman
  • Arch: sudo pacman --sync distrobox podman

On systems which are designed for you to not tamper with their root files (immutable distributions like openSUSE Kalpa, Fedora Kinoite, and SteamOS on the Steam Deck) you can use an official alternative method to install distrobox:

curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sh -s -- --prefix ~/.local

On the Steam Deck, you will additionally need to add ~/.local/bin to the $PATH.

Building without kdesrc-build

You can build a single repository using the KDE Neon Unstable docker image. We will be using the plasma:unstable image, which comes with the latest KDE software and libraries, and we will be using the minimal version, which requires you to install development libraries before compiling your projects.

After installing distrobox and podman, run the following to create a new distrobox container:

podman pull invent-registry.kde.org/neon/docker-images/plasma:unstable
distrobox create --image invent-registry.kde.org/neon/docker-images/plasma:unstable

This will create a distrobox container named plasma-unstable.

Note

The plasma:unstable image size is 5.6 GB.


Lastly, enter the generated container:

distrobox enter plasma-unstable

You can then just clone the desired repository in your home folder and build it while being inside the container. If any development libraries are missing, you can just install them the same way you would install on Debian/Ubuntu/KDE Neon:

sudo apt install packagename-dev

You can also use build-dep to let apt install the required libraries for the program you will be compiling. For example, to install the development libraries for Kate, you can run:

sudo apt-get build-dep kate

Building with kdesrc-build

First, install distrobox and podman from your distribution repositories. Then run:

distrobox enter

This should create a container based on your current Linux OS and enter it. It is preferable to use one of the Linux distributions that is better suited for kdesrc-build, as mentioned in this wiki page, so if your distribution does not provide very up-to-date packages, you can download and use a different container image for your distrobox from Dockerhub. For example, with openSUSE Tumbleweed:

podman pull opensuse/tumbleweed
distrobox create --image opensuse/tumbleweed --name tumbleweed
distrobox enter tumbleweed

Then it's a matter of downloading and running kdesrc-build as detailed in Get_Involved/development/Set_up_a_development_environment:

mkdir -p ~/.local/share/
cd ~/.local/share
git clone https://invent.kde.org/sdk/kdesrc-build.git
cd kdesrc-build
./kdesrc-build --initial-setup
mkdir -p ~/.local/bin
ln -sf ~/.local/share/kdesrc-build/kdesrc-build ~/.local/bin

From this point on, one important thing to bear in mind is that a distrobox container is transparent in its user space and containerized in its root space: when you are inside a distrobox container, you can see the content of system's home folder, but not your system's root folders, only the container's root folders. This means that you can install packages inside the container using root privileges and access those packages to compile your programs stored in your home, without ever installing those packages in your actual system!

You can take advantage of this by installing, for instance, Qt development packages used for kdesrc-build from inside the container. This way, it is not necessary to compile Qt with kdesrc-build. This is particularly convenient if you want to compile KDE software with Qt6 quickly.

Likewise, you should install the required dependencies from inside the distrobox rather than from your system's repositories. Then you can start compiling as usual.

After compiling your program with kdesrc-build from inside the distrobox, you can run it with kdesrc-build run, and despite it originating from inside a container and using the libraries from the container, it will run just fine as a GUI application on your system!

Note

If you are on an X11 session, you will need to create the file ~/.config/distrobox/distrobox.conf and add xhost +si:localuser:$USER to it in order for distrobox to be able to run graphical applications.


The only few gotchas to using this method are:

  • You cannot use a full Plasma Desktop session made from git.
  • You will need qqc2-desktop-style and Breeze to show the correct theme for your applications.
  • You will need the QtWayland library and its respective development package to run your applications natively on a Wayland session.

Other operating systems

Kubuntu >= 23.10

The default configuration of kdesrc-build requires Qt version 6.6. Kubuntu 23.10 has Qt version 6.4.2. It is recommended that you use a Linux OS that is better supported by kdesrc-build.

If you are a more seasoned developer you might be able to use Kubuntu for kdesrc-build by installing Qt6 using the Qt online installer or by building Qt6 using kdesrc-build.

FreeBSD

Install the latest release of FreeBSD with KDE Plasma Desktop on your hardware computer or in a virtual machine.

Your user should be member of the "wheel" user group (e.g. this can be configured in the FreeBSD installer, when creating your user you can select additional user groups for your user). Your user should be able to use sudo:

pkg install sudo
visudo
# Uncomment the line: %wheel ALL=(ALL:ALL) ALL

Then set up kdesrc-build using the same procedure as when installing kdesrc-build on a Linux operating system. FreeBSD is currently supported by kdesrc-build. See https://www.youtube.com/watch?v=8MqBnb3Y9JU

OpenBSD >= 7.5

Install OpenBSD version greater than or equal to 7.5. In the installer keep the defaults, the user created by the installer is named "administrator" in this example.

# Enable doas
su -
cp /etc/examples/doas.conf /etc/doas.conf
exit
# kdesrc-build needs sudo.
mkdir -p ~/.local/bin ; ln -s /usr/bin/doas ~/.local/bin/sudo
echo "export PATH=~/.local/bin:\$PATH" >> ~/.bashrc

# Test doas.
doas su
# kde-builder needs bash.
pkg_add bash
chsh -s /usr/local/bin/bash
exit

# As user administrator
chsh -s /usr/local/bin/bash

# As per https://rsadowski.de/posts/2024-01-09-openbsd-kde/ , https://openports.pl/path/meta/kde,-plasma
doas su
pkg_add kde-plasma kate

# I recommend that you use tigervnc. https://nmariusp.github.io/install-os.html#openbsd--75

After you install kdesrc-build:

# Edit the kdesrc-buildrc file e.g.:
cmake-options -DCMAKE_BUILD_TYPE=RelWithDebInfo -DKF_IGNORE_PLATFORM_CHECK=ON

# Also set environment variable:
export CMAKE_PREFIX_PATH=/usr/local/lib/qt6/cmake
# Or
export CMAKE_PREFIX_PATH=/usr/local/lib/qt5/cmake

Microsoft Windows

You can build and develop KDE projects using the Microsoft Windows operating system.

Apple macOS

You can build and develop KDE projects using the Apple macOS operating system.

What to do if CMake configure fails because a build dependency is missing

See https://community.kde.org/Get_Involved/development/Install_the_dependencies .

Project Documentation

Developer's documentation can be found in the doc/source-reference in the project repo.

kf6-qt6 vs. kf5-qt5

Many KDE git repositories can build correctly and run correctly using "kdesrc-build kf6-qt6".

The KDE git repositories that can build correctly and run correctly using "kdesrc-build kf6-qt6" have two long lived git branches:

  • A long lived git branch that does not contain the deprecated symbols from kf5-qt5, named e.g. "master".
  • And another long lived git branch for qt5-kf5, where the deprecated symbols still exist.

What is "kf6-qt6"? You just set up kdesrc-build following the procedure. The resulting kdesrc-build installation will be of type kf6-qt6. In kdesrc-buildrc in the "global" section you will have "branch-group kf6-qt6". The git repositories that have only one long lived git branch e.g. named "master" will use that. The git repositories that have a second long lived git branch, will use the git branch where the deprecated symbols do not exist e.g. named "master".

What is "kf5-qt5"? Follow the chapter "kdesrc-build Qt5". The resulting kdesrc-build installation will be of type kf5-qt5. In kdesrc-buildrc in the "global" section you will have "branch-group kf5-qt5". The git repositories that have only one long lived git branch e.g. named "master" will use that. The git repositories that have a second long lived git branch where the deprecated symbols still exist e.g. named "kf5" will use that.

Build Qt using kdesrc-build

Qt6

If you cannot build the KDE frameworks using kdesrc-build and the Qt provided by your Linux distribution is outdated, you might want to build the Qt framework using kdesrc-build.

In your configuration file use the qt-install-dir option (in the global section) with non-empty value, for example:

global
  qt-install-dir ~/kde/usr
  branch-group kf6-qt6
end global

It is recommended that if you build Qt6 using kdesrc-build, you also build qtwebengine. Edit the file ~/.local/state/sysadmin-repo-metadata/module-definitions/qt6.ksb. Follow the instructions found in the file: if you want qtwebengine, add it to use-modules after "qtwebchannel" and comment out the line "ignore-modules qtwebengine".

Then build Qt6:

kdesrc-build qt6-set

To compile Qt6 with Qt X11 Extras (which is a necessary library to compile KWindowSystem), you should enable XCB feature during compilation

kdesrc-build qt6-set --cmake-options="-DQT_FEATURE_xcb=ON"

Qt5

If you want the same for Qt5, change branch-group option and use qt5-set instead of qt6-set.

Qt 6 installed using the Qt online installer

A screen recording version is available https://www.youtube.com/watch?v=3BIbYN2vIZw

The homepage of the Qt Framework is https://www.qt.io . Go to this web page, create an online account. https://www.qt.io/download-open-source > "Download the Qt Online Installer" > Linux > "Qt Online Installer for Linux (64-bit)" > download a file named e.g. qt-unified-linux-x64-4.6.1-online.run into the directory e.g. "~/Downloads".

ls -la ~/Downloads # The downloaded file needs to have the "executable" chmod bit set.
chmod u+x ~/Downloads/qt-unified-linux-x64-4.6.1-online.run
~/Downloads/qt-unified-linux-x64-4.6.1-online.run

A graphical user interface (GUI) installer wizard starts. Login using your Qt online account. Next > check the checkbox "I have read and agree to the terms and conditions of using OpenSource Qt", check the checkbox "I'm an individual and do not use Qt for any company" > Next > Next > enable "Help us improve" > Next > Custom installation, notice that the install directory is "~/Qt" > Next. Install the latest version of Qt6 and the latest version of the Qt Creator integrated development environment (IDE). There are some Qt6 components that are not used by KDE and can be left out when installing Qt6 e.g. Qt Design Studio, WebAssembly, Android, Sources, Qt Quick 3D, Qt 3D, Qt Quick 3D Physics, "Qt Debug Information Files". Next > enable "I have read and agree" > Next > Install.

In the KDE Plasma app launcher (start menu) you now have the application "Qt Maintenance Tool".

Set up kdesrc-build from scratch as usual.

Edit the file kdesrc-buildrc to look like:

global
...
    qt-install-dir  ~/Qt/6.7.0/gcc_64 # Where to install Qt6 if kdesrc-build supplies it
    libname lib
...
end global

Two independent kdesrc-build configurations: kf6-qt6 and kf5-qt5

You can switch between configurations with --rc-file command line option. Generate another config, make the changes for the source-dir, build-dir, install-dir, and other changes you want. Make sure you use different value for persistent-data-file option, to not mix things up.

As an alternative, you can utilize custom variable to make switch from a single config:

global
    _ver 5  # <-- Change this to switch
    source-dir ~/kde${_ver}/src
    build-dir ~/kde${_ver}/build
    install-dir ~/kde${_ver}/usr
    persistent-data-file ~/kde${_ver}/persistent-options.json
end global

include ~/.local/share/kdesrc-build/data/build-include/kf${_ver}-qt${_ver}.ksb

Other CPU architectures than x86_64/amd64 and x86

You can build and develop KDE projects using a Linux OS installed on an ARM architecture CPU.

kdesrc-build issues

See https://community.kde.org/Get_Involved/development/Install_the_dependencies

wayland-protocols is too old, e.g. "kdesrc-build kidletime" fails

mkdir -p ~/kde/misc && cd ~/kde/misc
wget https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/1.31/downloads/wayland-protocols-1.31.tar.xz
tar -xJvf wayland-protocols-*.tar.xz && mv wayland-protocols-*/ wayland-protocols
cd wayland-protocols
meson setup builddir --prefix $HOME/kde/usr
meson compile -C builddir
meson install -C builddir

"kdesrc-build kpat" fails because of black-hole-solitaire

This happens on Debian/Ubuntu/Kubuntu. Because there is no Linux distribution binary package for https://github.com/shlomif/black-hole-solitaire.

Solution: append at the end of kdesrc-buildrc file:

options kpat
    cmake-options -DWITH_BH_SOLVER=OFF
end options

libdisplay-info is not available

If your Linux OS does not have a package for libdisplay-info. Append at the end of the file kdesrc-buildrc:

module libdisplay-info
  repository https://gitlab.freedesktop.org/emersion/libdisplay-info.git
end module

Building applications against Qt5 after discontinued support

With this commit, for some applications the support of building against Qt5 was intentionally disabled.

If for some reason you still want to build a Qt5 version of application, you can do it with some hacks. For example, lets say we want Ark. We need to manually see its dependencies listed in metadata:

$ ~/.local/state/sysadmin-repo-metadata/dependencies/dependency-data-kf5-qt5 | grep kde/kdeutils/ark

Then for each dependency, find out the branch that is used for qt5.

Then create a custom ksb file with custom module-set:

~/ark-qt5.ksb
module-set ark-qt5
    repository kde-projects
    use-modules \
        extra-cmake-modules \
        karchive \
        kconfig \
        kcoreaddons \
        kcrash \
        kdbusaddons \
        kdoctools \
        ki18n \
        kiconthemes \
        kio \
        kparts \
        kpty \
        kservice \
        kwidgetsaddons \
        kwindowsystem \
        ark
end module-set


options extra-cmake-modules
    branch kf5
end options

options karchive
    branch kf5
end options

options kconfig
    branch kf5
end options

options kcoreaddons
    branch kf5
end options

options kcrash
    branch kf5
end options

options kdbusaddons
    branch kf5
end options

options kdoctools
    branch kf5
end options

options ki18n
    branch kf5
end options

options kiconthemes
    branch kf5
end options

options kio
    branch kf5
end options

options kparts
    branch kf5
end options

options kpty
    branch kf5
end options

options kservice
    branch kf5
end options

options kwidgetsaddons
    branch kf5
end options

options kwindowsystem
    branch kf5
end options

options ark
    branch release/23.08
end options

# --

# dependency of extra-cmake-modules
options polkit-qt-1
    branch qt5
end options

# dependency of kcoreaddons
options plasma-wayland-protocols
    branch master
end options

# dependency of karchive
options qca
    branch qt5
end options

After that, include it in your main config:

global
    _ver 5
    _build_with_qt6 OFF
    branch-group kf${_ver}-qt${_ver}
    cmake-options -DCMAKE_BUILD_TYPE=Debug -DQT_MAJOR_VERSION=${_ver} -DBUILD_WITH_QT6=${_build_with_qt6}
end global

include ~/Development/kdesrc-build/data/build-include/kf${_ver}-qt${_ver}.ksb
include ~/ark-qt5.ksb

Then edit the metadata file:

~/.local/state/sysadmin-repo-metadata/dependencies/logical-module-structure.json
...
        "kde/*" : {
            "kf6-qt6": "master",
            "kf5-qt5": "master",  // <-- it was empty string, place "master" here
            "stable-kf6-qt6": "release/24.02",
            "stable-kf5-qt5": ""
        },
...

Now you are able to build Ark with qt5:

$ kdesrc-build ark-qt5 --list-build
Fetching remote changes to sysadmin-repo-metadata
Merging sysadmin-repo-metadata changes from branch master
        * You had local changes to sysadmin-repo-metadata, which have been re-applied.
...
 ── ark : release/23.08