Krita/Emergebuild
What is Emerge?
- There are no binary releases of KDE Frameworks libraries for Windows. KDE Frameworks is required for Krita. Therefore the only option is to build these libraries from source.
- KDE Frameworks depend on Qt and the Linux Standard Base, and Krita has other dependencies as well. Like KDE Frameworks, many of these dependencies have to be compiled too, so might as well do the entire set of libraries from source. That is what Emerge does.
- To be flexible enough for this massive build task, Emerge is written in Python. Python is very easy to pick up.
- General instructions for using Emerge can be found on the Techbase Wiki.
- You will need approximately 20GB of free space for the whole thing. Doing a separate debug/release build will require another 15GB, and the entire process must be repeated. Fortunately, hard drives are cheap these days.
- If you do not have qualms with Windows Powershell, I recommend it over cmd.exe, since it has saner interactive features. If you wish, you can get pretty good Bash-like keyboard shortcuts using PSReadline.
Preparing Emerge
- The instructions generally follow https://community.kde.org/Calligra/Building_Calligra_on_Windows
- Install Python 3.4
- Set up your .gitconfig so you can use kde: paths.
- Install Microsoft Visual C++ 2015. You can save some space by installing only the compiler without the IDE. However, it is also possible to use the Visual Studio IDE to work with Krita's source if you wish. You will need to restart your computer after installing MSVC.
- Download Emerge.
cd c:\kderoot git clone kde:emerge
- When configuring kdesettings.ini, choose KDECOMPILER = msvc2015 and Architecture = x64.
- There is an option to use a preinstalled Qt instead of building it from source. I have not tried to do this before, it may be worth investigating. Qt 5 has recently become much better at not breaking MSVC builds, so it's mostly a matter of whether you have an extra hour to kill to compile Qt.
- The instructions for each particular package are contained in the .\emerge\portage subfolder. This is where you should expect to spend time fiddling with things.
- Use emerge -v to give verbose output. This can be helpful for diagnosing problems.
- Choose carefully whether you want to do a debug build or release build. You have to do the whole thing from scratch if you want to have both. Windows does not allow linking debug and release libraries together.
- If you do want to do both a debug and release build, e.g. C:\kde_debug\ and C:\kde_release\, you can use symlinks for the C:\kde_XXX\emerge and C:\kde_XXX\download\ folders. That way, your build tweaks in the emerge folder, and the massive amount of downloaded files and cloned git repositories, can be shared between the debug and release paths.
- A few other settings in kdesettings.ini are not necessary but will make the process nicer. This will build with 12 jobs (you can adjust that number to whatever is appropriate for your system), pop up a notification whenever a build process completes, alias the base directory to r:\, and skip building tests. (You can turn on testing for Krita itself later, but there is no need for you to build e.g. libjpeg tests.)
EMERGE_OPTIONS = make.makeOptions=-j12 EMERGE_USE_NOTIFY = Toaster EMERGE_USE_SHORT_PATH = True EMERGE_BUILDTESTS=False
Building Krita's Dependencies
Preparing for failure
Because we're building linux packages on MSVC and cloning from git master, we're begging for a list of build failures. What fails might change from day to day. Be prepared to make tweaks inside the source folders to get everything compiled. Feel free to stub things out if they seem pointless. Git repos are contained in Q:\, unzipped sources will be placed in r:\build\ working directories. Often, to fix an error, you will want to run
emerge --compile
to try the compile command again without re-extracting the source. See emerge --help for more information.
Qt
- Step 1: emerge qt
- Step 2: go get a cup of a coffee.
Krita dependencies
Many dependencies will be straightforward and unproblematic:
emerge pkg-config emerge coreutils emerge eigen3 emerge lcms2 emerge exiv2 emerge tiff emerge lcms2 emerge exiv2 emerge soprano emerge libcurl emerge libwpd emerge ilmbase
A few were can be difficult, although Emerge contains patches for most of them. You may need to manually disable tests for some libraries.
emerge vc emerge eigen3 emerge ocio emerge breakpad emerge gsl
Boost was rather challenging, and I could not figure out a reasonable upstream patch. Commenting out win32libs/boost-regex and win32libs/boost-iostreams from portage/win32libs/boost/boost.py to turn off those dependencies helped building.
emerge boost
Finally there were some optional dependencies that can be put aside for the time being if they are not cooperating. FFTW is straightforward to install by following the instructions from their website instead of using Emerge.
emerge FFTW emerge openexr emerge png2ico emerge librdf-src emerge shared-mime-info
Frameworks
The goal here is to build as few as possible, because they can be rickety. The necessary frameworks are listed in CMakeLists.txt in the Krita repo.
emerge kdewin-lib emerge karchive emerge kconfig emerge kcoreaddons emerge kguiaddons emerge ki18n emerge kitemmodels emerge kitemviews emerge kwidgetsaddons emerge kcompletion
Build Krita
To configure Git and clone, follow these instructions, replacing "calligra" with "krita" in the name of the repo. https://community.kde.org/Calligra/Building_Calligra_on_Windows#Getting_the_source_code
Here is a cmake configure command which worked for me. I was very finicky here and not all the flags may be necessary. If you can build without them, please note that here. Do not try to build the tests, such an endeavor would be dangerous for your mental health.
cmake ..\src\ -DBUILD_TESTING=OFF -G"NMake Makefiles JOM" -DCMAKE_INSTALL_PREFIX=r:\ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="/Gm /MD /Zi" -DCMAKE_MODULE_LINKER_FLAGS ="/machine:x64" -DCMAKE_EXE_LINKER_FLAGS="/machine:x64 /LTCG" -DCMAKE_SHARED_LINKER_FLAGS="/machine:x64" -DCMAKE_STATIC_LINKER_FLAGS="/machine:x64" -DCMAKE_RC_COMPILER="C:/Program Files (x86)/Windows Kits/8.0/bin/x64/rc.exe"
The command -G"NMake Makefiles JOM" specifies that you will be using the jom command line build tool inside the build directory. Other options are -GNinja, to use the Ninja build tool, and -G"Visual Studio 14 2015" to generate .vcxproj project files, which can be opened in Visual Studio. You can make more than one build directory if you wish.
Boost problems
The CMake find_library call in Krita was also unable to locate Boost automatically. I believe there is a way inside Emerge to do this, but I have not pursued that. Instead the following hack in the base CMakeLists.txt fixed things.
-add_definitions(-DBOOST_ALL_NO_LIB) +set(BOOST_INCLUDEDIR "r:/include") +set(BOOST_LIBRARYDIR "r:/lib") +set(BOOST_ROOT "r:") +set(Boost_DEBUG "ON")
FindBoost.cmake will look for dlls called things like boost_system-vc140-mt-1_55.dll but the boost dll's that I built were called boost_system-vc-mt-1_55, and that makes FindBoost FAIL!!! If an error like that occurs, it can be fixed by renaming the dlls.
gokde.ps1
This was a little wrapper script I called gokde.ps1 to set up a few aliases for a Krita build environment. Feel free to use it as a guide with appropriate configurations. In particular, some of the environment variables may not be necessary on Windows. The cmdlet add-pathvariable is from the PowerShell Community Extensions.
C:\kde\emerge\kdeenv.ps1 cd r: Set-Alias krita r:\bin\krita.exe function global:install-krita { Stop-Process -processname Krita -ErrorAction SilentlyContinue ninja -C r:\build\calligra install } function global:build-krita { Stop-Process -processname Krita -ErrorAction SilentlyContinue ninja -C r:\build\calligra } function global:run-krita { install-krita if ($LASTEXITCODE -eq 0) { krita } } Add-PathVariable r:\bin Add-PathVariable r:\lib\krita $env:XDG_DATA_HOME = "r:\share" $env:XDG_DATA_DIRS = $env:XDG_DATA_HOME $env:XDG_CONFIG_HOME = "r:\config" $env:XDG_CONFIG_DIRS = $env:XDG_CONFIG_HOME $env:KDE_DEBUG_NOAREANAME=1 $env:KDEDIRS = "r:" $env:KDEHOME = "r:\share\.kde" $env:OPENSSL_ROOT_DIR="r:" $env:EDITOR = "notepad"