Difference between revisions of "Qt Quick development process"
(→Compiling GCompris for Android) |
(→Compiling GCompris for Android) |
||
Line 196: | Line 196: | ||
Get the source (tested with 5.62 and 5.63): | Get the source (tested with 5.62 and 5.63): | ||
Under your ~/home type | Under your ~/home type | ||
+ | <pre> | ||
git clone https://github.com/KDE/extra-cmake-modules.git | git clone https://github.com/KDE/extra-cmake-modules.git | ||
+ | </pre> | ||
It downloads files contained under directory extra-cmake-modules | It downloads files contained under directory extra-cmake-modules | ||
Install ECM | Install ECM | ||
+ | <pre> | ||
cmake -DCMAKE_INSTALL_PREFIX=install . && make && make install | cmake -DCMAKE_INSTALL_PREFIX=install . && make && make install | ||
+ | </pre> | ||
Step 2: Download and set path environment variable for android NDK | Step 2: Download and set path environment variable for android NDK | ||
Download Android NDK, Revision 18b (January 2019) Linux 64-bit (x86) | Download Android NDK, Revision 18b (January 2019) Linux 64-bit (x86) | ||
Link can be found at the following address: | Link can be found at the following address: | ||
+ | <pre> | ||
https://developer.android.com/ndk/downloads/older_releases.html | https://developer.android.com/ndk/downloads/older_releases.html | ||
+ | </pre> | ||
Create the directory ~/Android | Create the directory ~/Android | ||
+ | <pre> | ||
mkdir ~/Android | mkdir ~/Android | ||
+ | </pre> | ||
Unzip android-ndk-r18b-linux-x86_64.zip in this directory. | Unzip android-ndk-r18b-linux-x86_64.zip in this directory. | ||
Edit your the file ~/.bashrc to add the following lines | Edit your the file ~/.bashrc to add the following lines | ||
+ | <pre> | ||
export ANDROID_NDK=~/Android/android-ndk-r18b | export ANDROID_NDK=~/Android/android-ndk-r18b | ||
export ANDROID_NDK_ROOT=$ANDROID_NDK | export ANDROID_NDK_ROOT=$ANDROID_NDK | ||
+ | </pre> | ||
Then reload it | Then reload it | ||
+ | <pre> | ||
source ~/.bashrc | source ~/.bashrc | ||
+ | </pre> | ||
Step 3: Download and install android sdk | Step 3: Download and install android sdk |
Revision as of 21:48, 25 October 2019
Learning Qt Quick
Some pointers to discover Qt Quick:
A step by step exercise to dig into Qt Quick with the QtCreator development environment:
Coding Style
We follow this coding style.
Source code
Here is the official repository for the source code. Alternatively you can also get the code on GitHub.
Compilation prerequisites
For Debian based systems, in order to compile GCompris you need to install the following packages:
Compilation chain
sudo apt-get install cmake
sudo apt-get install cmake-curses-gui # Optional
sudo apt-get install g++
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libssl-dev
Note that openssl is needed since GCompris 0.96 to be able to download the resource files in https.
Qt5
sudo apt-get install qt5-default qtdeclarative5-dev qtmultimedia5-dev qml-module-qtquick-controls libqt5svg5-dev libqt5xmlpatterns5-dev libqt5sensors5-dev qml-module-qtquick-particles2 qttools5-dev-tools qml-module-qtmultimedia libqt5multimedia5-plugins
Compilation
CMake is a cross-platform free software program for managing the build process of software using a compiler-independent method. The minimum version to compile GCompris is 2.8 (recommended 3.5.1)
- Get the source code:
git clone git://anongit.kde.org/gcompris.git
- Initialize the git submodule(s)
cd GCompris-qt git submodule init && git submodule update
- Download and Install the latest stable version of Qt (This includes QtCreator in the Tools/QtCreator directory. Minimum required version is 5.6, recommended version 5.9). For running on Android, download the Android version.
- Start QtCreator and open the project file CMakeLists.txt at the root of the source code
- Create a build directory and set it in Qt Creator
- Compile and run it. (No need of giving any arguments to CMake, if QtCreator asks for it)
To compile from the command line you need:
- export Qt5_DIR=$HOME/Qt/5.9.3/5.9/lib/cmake/Qt5 (This path varies with your installed version)
- export Qt5Linguist_DIR=$Qt5_DIR/QtLinguist (not sure if needed)
- mkdir build
- cd build
- cmake ..
- make
To make it run on Android you need first to follow these instructions.
Generate core API documentation
KDE uses kapidox, a wrapper around doxygen to generate API documentation. Kapidox uses doxyqml for generating documentation for QML code.
In GCompris we document all classes in the src/core/ directory.
To build this API documentation you need:
- Install doxygen.
- Build kapidox from https://cgit.kde.org/kapidox.git/
- Install doxyqml from https://github.com/agateau/doxyqml. (Note: need at least version 0.2.0 that supports readonly QML properties.)
Then do
kgenapidox ./path/to/gcompris-checkout/
and find your documentation under apidocs/.
Adding a new activity
Automatically
Let's say you want to port the algebra_by activity.
cd src/activities ./createit.sh algebra_by
And you're done, you can run CMake again in QtCreator and your activity should appear on the list.
Manually
You must create a directory for your activity in src/activities. In it, create an ActivityInfo.qml, CMakeLists.txt and your qml entry point AlgebraBy.qml.
- in src/activities/activities.txt add the directory name of your activity (keep the file sorted).
- check algebra_by/ActivityInfo.qml that the name references you Qml activity entry point and that the icon point to your icon name (preferred format is svg).
If your activity is an existing one, you can move its ported ActivityInfo and icon:
git mv tools/menus/algebra_by.qml src/activities/algebra_by/AlgebraBy.qml git mv tools/menus/resource/algebra_by.svg src/activities/algebra_by/algebra_by
Extending another activity
If the activity is just an extension of an existing one you have to create it either manually or automatically and then change you .qml file to extend another one. The 'erase_clic' activity is a good example.
In your .qml file:
- just import the activity you want to extend with for example: import "qrc:/gcompris/src/activities/erase"
- instead of have your root item being an 'ActivityBase' you just create an object of the base type you want to extend like Erase.
- Use a property to pass parameters to your base item and customize it
Coding guidelines
Take a look at this check list to have a high level check list before asking for a review.
Keep only small Javascript in the QML code, all the game logic must be in your Javascript file. This makes it easier to read the activity logic. It is possible to have several Javascript files if needed. The QML files must be seen as the graphical interface description and the Javascript the logic of the game.
Adding a configuration for a specific activity
Each activity can have a specific configuration (for example, changing the locale of the activity, having different modes...). A simple example can be found on Traffic activity where you can change between images and colors to display the cars.
To add configuration, you need to add the "config" value in the Bar. Then you have to add a DialogActivityConfig item where you will define the component item of the dialog. You need to define the following functions:
- setDefaultValues to set the values when displaying the configuration.
- onLoadData which is called to load the existing data from configuration.
- onSaveData which is called to save the configuration in configuration file and where you can also send signals to dynamically change current activity settings.
The data should be set in "dataToSave" attribute which is a map (pairs of key, values) where the keys are strings and values are javascript var (can be strings, lists...).
Accessing the component items can be done using: dialogActivityConfig.configItem.
For the data to be loaded at start of activity, you also need to call "dialogActivityConfig.getInitialConfiguration()" on Component.onCompleted() of your pageComponent item.
Compilation on different platforms
Compiling GCompris for Desktop
You can still use QtCreator to develop. Within it, open the CMakeLists.txt on top-level of GCompris. Select a directory (create a folder at same level as the gcompris folder for example) and then click on "Run CMake" button then finish.
To compile GCompris on command line, you can create a directory GCompris-qt-build at same level as the gcompris folder, go into it and type "cmake ../gcompris && make". You have the possibility to check which activities you want to compile or not.
If you want to create an auto extractible package for linux platforms, you need to launch cmake using: "cmake -DBUILD_STANDALONE=ON ../gcompris && make".
Troubleshooting
- If you get the error: "The imported target "Qt5::Gui" references the file "Qt5Gui_EGL_LIBRARY-NOTFOUND" but this file does not exist."
sudo apt-get install libgl1-mesa-glx
try again If this still shows the same error or tells you - /usr/bin/ld: cannot find -lGL - do :
on a 32 bits system cd /usr/lib/i386-linux-gnu sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 libGL.so on a 64 bits system cd /usr/lib/x86_64-linux-gnu sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 libGL.so
- If you miss the GL/gl.h header, install it with sudo apt-get install mesa-common-dev
Compiling GCompris for Android
Install openjdk (for example it could be openjdk-8-jdk from your favorite package manager).
Build APK files for android, compilation with Qt5.12.4 minimum (tested with 5.12.5, 5.13.0 and 5.13.1) Uses gradle, android ndk r18b (it does not work with r19 or above yet), openssl 1.1.1c and
New versions of NDK android (Android NDK > ?? ) are using CLang instead of GCC and Gradle instead of GCC.
Clang is provided within the NDK android environment. You do not need anymore to install ant and gradle will download itself automatically.
Step 1: Get ECM sources and install them ECM or Extra CMake Modules package reduces duplication in CMake scripts across KDE software. If the ECM version shipped with your distribution is not recent enough, try to get the most recent version from ECM git repository:
Get the source (tested with 5.62 and 5.63): Under your ~/home type
git clone https://github.com/KDE/extra-cmake-modules.git
It downloads files contained under directory extra-cmake-modules Install ECM
cmake -DCMAKE_INSTALL_PREFIX=install . && make && make install
Step 2: Download and set path environment variable for android NDK Download Android NDK, Revision 18b (January 2019) Linux 64-bit (x86) Link can be found at the following address:
https://developer.android.com/ndk/downloads/older_releases.html
Create the directory ~/Android
mkdir ~/Android
Unzip android-ndk-r18b-linux-x86_64.zip in this directory. Edit your the file ~/.bashrc to add the following lines
export ANDROID_NDK=~/Android/android-ndk-r18b export ANDROID_NDK_ROOT=$ANDROID_NDK
Then reload it
source ~/.bashrc
Step 3: Download and install android sdk Create a directory android-sdk in directory ~/Android/ Download android sdk tools_r25.2.5-linux.zip using the following link: https://dl.google.com/android/repository/tools_r25.2.5-linux.zip Place it in directory in directory ~/Android/android-sdk Unzip it. Execute the program android located in ~/Android/android-sdk/tools. It will open a gui application called Android SDK Manager. Select the following tools: - Android SDK Tools 25.2.5 - Android SDK Platform-tools 29.0.4 - Android SDK build-tools 28.0.3 Install them clicking on button "Install packages". Edit the file ~/.bashrc to add the following lines export ANDROID_SDK_ROOT=~/Android/android-sdk export PATH=$PATH:~/Android/android-sdk/platform-tools:$ANDROID_SDK_ROOT/tools/bin Then reload it source ~/.bashrc
Step 4: Add Qt5_android environment variable Edit the file ~/.bashrc to add the following lines export Qt5_android=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake Adapt the path (~/Qt5.13.1/5.13.1/) to your installation. Reload it source ~/.bashrc
Step 5: Compile and produce the apks
Create the directory build_android at the same level than the directory GCompris-qt.
Go in this directory and run the command
cmake -DCMAKE_TOOLCHAIN_FILE=~/extra-cmake-modules/install/share/ECM/toolchain/Android.cmake -DQt5_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5/ -DQt5Qml_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5Qml/ -DQt5Network_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5Network -DQt5Core_DIR=${Qt5_android}/Qt5Core -DQt5Quick_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5Quick -DQt5Gui_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5Gui -DQt5Multimedia_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5Multimedia -DQt5Svg_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5Svg -DQt5Widgets_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5Widgets -DQt5Xml_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5Xml -DQt5XmlPatterns_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5XmlPatterns -DQt5LinguistTools_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5LinguistTools -DQt5Sensors_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5Sensors -DQt5AndroidExtras_DIR=~/Qt5.13.1/5.13.1/android_armv7/lib/cmake/Qt5AndroidExtras ../GCompris-qt
Here again you have to adapt the different Qt path to your installation (~/Qt5.13.1/5.13.1), and the path to Android.cmake from extra-cmake-modules as well (~/extra-cmake-modules/install/share/ECM/toolchain/Android.cmake).
Once cmake has run execute the following command make -j 4 && make apk_debug
You should find the apk file created under build_android/android/
Deploying on android device
To deploy, plug you computer to your tablet. Go into you tablet preferences, switch on the developer mode.
Into the console, type the following command:
adb install -r GCompris-debug.apk
Compiling GCompris for SailfishOS
You need to download and install the sailfishOS SDK (SDK). Once done, you need to start the mersdk virtual machine:
VBoxManage startvm MerSDK
And ssh into it:
ssh -p 2222 -i ~/SailfishOS/vmshare/ssh/private_keys/engine/mersdk mersdk@localhost
In order to build you need to install cmake and git:
sb2 -t SailfishOS-armv7hl -m sdk-install -R zypper install cmake git
Then, you need to log in armv7hl:
sb2 -t SailfishOS-armv7hl
Clone the source code and on a separate folder type:
cmake -DSAILFISHOS=1 -DBUILD_ARCH=armv7hl ../gcompris/ && make package
You will probably have the following error at the end: CPack Error: Problem copying the package: /home/mersdk/build_arm/_CPack_Packages/Linux/RPM/gcompris-0.34-Linux.rpm to /home/mersdk/build_arm/gcompris-0.34-Linux.rpm but it's ok. You can find the generated package at: /home/mersdk/build_ arm/_CPack_Packages/Linux/RPM/harbour-gcompris-qt-0.34-1.armv7hl.rpm.
If you want to build the translations, you need to install gettext (for msgattrib) and follow the chapter Qt_Quick_development_process#Getting_and_compiling_translations. /!\ Does a Subversion package exist? Maybe https://openrepos.net/content/nieldk/subversion-0?
You can also build for emulator (replace all armv7hl above with i486). To install on emulator, run the SailfishOS emulator and copy the rpm into it. You can copy it from the mersdk vm using the shared folders to get it from the mersdk and on your host:
scp -P 2223 -i ~/SailfishOS/vmshare/ssh/private_keys/SailfishOS_Emulator/nemo harbour-gcompris-qt-0.34_1-1.i486.rpm nemo@localhost:RPMS ssh -p 2223 -i ~/SailfishOS/vmshare/ssh/private_keys/SailfishOS_Emulator/nemo nemo@localhost pkcon install-local harbour-gcompris-qt-0.34-1_1.i486.rpm
It should now appear on the emulator.
Compiling GCompris for Ubuntu click
You need to have a ubuntu OS installed and the ubuntu sdk (sudo apt-get install ubuntu-sdk).
Clone the source code in a GCompris-qt folder.
Then, you need to create the chroot environment (it can take some time) and log into it:
sudo click chroot -a armhf -f ubuntu-sdk-14.10 create sudo click chroot -a armhf -f ubuntu-sdk-14.10 run
You can use a newer one instead of 14.10.
Inside the chroot, you need to manually install the QtQuickControls module and run the compilation command:
apt-get install qml-module-qtquick-controls:armhf cmake -DWITH_UBUNTU=on -DUBUNTU_CLICK=1 -DQt5_DIR=/usr/lib/arm-linux-gnueabihf/cmake/Qt5/ ../GCompris-qt/ && export QT_SELECT=qt5-arm-linux-gnueabihf && make && make DESTDIR=/tmp/click/ install
To compile and embed translations, you need to follow the chapter Qt_Quick_development_process#Getting_and_compiling_translations.
Then outside the chroot, you need to run the click command to create the package:
click build /tmp/click/
This will create the click package.
Compiling GCompris for Windows
Compilation on Windows has been tested with mingw only. Download and install Qt for Windows with mingw (http://www.qt.io/). You also need to install NSIS (NSIS homepage).
Then, in a in Qt/mingw console:
cmake -G"MinGW Makefiles" ..\gcompris && mingw32-make && mingw32-make package.
The package creation can take some time because of the dependencies retrieval.
Compiling GCompris for Mac OS X
Compilation on OSX is quite similar to Linux.
Install CMake. The minimum version to compile GCompris is 2.8.
Download and install Qt for OSX.
Box2D compilation is not yet supported in macOSX, you have to disable it during compilation.
Then in console:
$ git clone https://github.com/gcompris/GCompris-qt.git $ cd GCompris-qt $ git submodule init && git submodule update $ export Qt5_DIR=$HOME/Qt5.7.0/5.7/clang_64/lib/cmake/Qt5/ (This path would vary with your Qt5 folder location) $ mkdir build $ cd build $ cmake -DQML_BOX2D_MODULE=disabled .. $ make
This should successfully build GCompris on your Mac. To run, start the GCompris-qt.app file in build/bin/ folder.
Issues: If you face issues regarding no 'svg/image load'.
-Copy the plugins from
~/Qt5.7.0/5.7/clang_64/plugins/
to
build/bin/GCompris-qt.app/Contents/Plugins/
Getting and compiling translations
By default, no translation are present in the git repository. We need to get them from the KDE svn KDE i10n svn. You can see the translation status at GCompris translation status.
You need to have subversion and msgattrib installed.
To get all the translation files, you need to create the Makefile using cmake (see above) and type:
make getSvnTranslations
This will copy all the po files to a po/ folder in the source directory.
Once you have done this, you need to run again cmake in order to have all the translations handled. Then, to build the translations used by GCompris, type:
make BuildTranslations
Then go into the bin directory and type ./gcompris-qt to launch the software (or running from QtCreator). In the configuration dialog box, you can choose your language. Restart the application to see the language change.
If you're compiling using Qt Creator, you can go to the Projects tab and in Build Steps, add a build step and check BuildTranslations.
Getting translations from the Gtk version
When adding a Gtk ported activity in the QtQuick version, if you used the strings for texts of the Gtk version, you can update all existing translation files. For this, first you need to update existing translation files using (this will add the new strings which will be untranslated for now):
make UpdateTranslations
Then, using the convertPo.py tool (and the updateAll.sh which applies it to all translations), you can update the files to get the translations from the Gtk version (if they existed).
Adding resources
- For resources, you have to put them in the resource directory of your activity
- A compiled qrc file named youractivity.rcc is auto generated by the compilation chain
- You must run cmake again to have new resources included in the qrc
- If you change a resource, a simple make will update the rcc file
- To reference your resource, use a qrc:/ url in the source. The path is:
qrc:/gcompris/src/activities/*youractivity*/resource/*myfile.svg*
Reviewing an activity
The Reviewing an activity page contains info to help reviewing an activity.