diff --git a/CMakeLists.txt b/CMakeLists.txt index 76047891645..25d88ed5d0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,1218 +1,1221 @@ cmake_minimum_required(VERSION 2.8.12) project(calligra) message(STATUS "Using CMake version: ${CMAKE_VERSION}") if (POLICY CMP0002) cmake_policy(SET CMP0002 OLD) endif() if (POLICY CMP0017) cmake_policy(SET CMP0017 NEW) endif () if (POLICY CMP0022) cmake_policy(SET CMP0022 OLD) endif () if (POLICY CMP0026) cmake_policy(SET CMP0026 OLD) endif() if (POLICY CMP0046) cmake_policy(SET CMP0046 OLD) endif () if (POLICY CMP0059) cmake_policy(SET CMP0059 OLD) endif() if (POLICY CMP0063) cmake_policy(SET CMP0063 NEW) endif() # ensure out-of-source build string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" isBuildInSource) if(isBuildInSource) message(FATAL_ERROR "Compiling Calligra inside the source folder is not possible.\nPlease refer to the build instruction: https://community.kde.org/Calligra/Building/3\nYou need to clean up the source folder from all build artifacts just created, otherwise further building attempts will fail again: With a git repo, you can use \"git clean -df\" in the toplevel source folder (attention! will remove also uncommited changes to the source code). With sources from a file bundle (like a zip file), delete the source folder and unbundle the sources again.") endif() ###################### ####################### ## Constants defines ## ####################### ###################### # define common versions of Calligra applications, used to generate calligraversion.h # update these version for every release: set(CALLIGRA_VERSION_STRING "3.0.89") set(CALLIGRA_STABLE_VERSION_MAJOR 3) # 3 for 3.x, 4 for 4.x, etc. set(CALLIGRA_STABLE_VERSION_MINOR 0) # 0 for 3.0, 1 for 3.1, etc. set(CALLIGRA_VERSION_RELEASE 89) # 89 for Alpha, increase for next test releases, set 0 for first Stable, etc. set(CALLIGRA_ALPHA 1) # uncomment only for Alpha #set(CALLIGRA_BETA 1) # uncomment only for Beta #set(CALLIGRA_RC 1) # uncomment only for RC set(CALLIGRA_YEAR 2017) # update every year if(NOT DEFINED CALLIGRA_ALPHA AND NOT DEFINED CALLIGRA_BETA AND NOT DEFINED CALLIGRA_RC) set(CALLIGRA_STABLE 1) # do not edit endif() message(STATUS "Calligra version: ${CALLIGRA_VERSION_STRING}") # Define the generic version of the Calligra libraries here # This makes it easy to advance it when the next Calligra release comes. # 14 was the last GENERIC_CALLIGRA_LIB_VERSION_MAJOR of the previous Calligra series # (2.x) so we're starting with 15 in 3.x series. if(CALLIGRA_STABLE_VERSION_MAJOR EQUAL 3) math(EXPR GENERIC_CALLIGRA_LIB_VERSION_MAJOR "${CALLIGRA_STABLE_VERSION_MINOR} + 15") else() # let's make sure we won't forget to update the "15" message(FATAL_ERROR "Reminder: please update offset == 15 used to compute GENERIC_CALLIGRA_LIB_VERSION_MAJOR to something bigger") endif() set(GENERIC_CALLIGRA_LIB_VERSION "${GENERIC_CALLIGRA_LIB_VERSION_MAJOR}.0.0") set(GENERIC_CALLIGRA_LIB_SOVERSION "${GENERIC_CALLIGRA_LIB_VERSION_MAJOR}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules") message("Module path:" ${CMAKE_MODULE_PATH}) # fetch git revision for the current build set(CALLIGRA_GIT_SHA1_STRING "") set(CALLIGRA_GIT_BRANCH_STRING "") include(GetGitRevisionDescription) get_git_head_revision(GIT_REFSPEC GIT_SHA1) get_git_branch(GIT_BRANCH) if(GIT_SHA1 AND GIT_BRANCH) string(SUBSTRING ${GIT_SHA1} 0 7 GIT_SHA1) set(CALLIGRA_GIT_SHA1_STRING ${GIT_SHA1}) set(CALLIGRA_GIT_BRANCH_STRING ${GIT_BRANCH}) endif() if(NOT DEFINED RELEASE_BUILD) # estimate mode by CMAKE_BUILD_TYPE content if not set on cmdline string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_TOLOWER) set(RELEASE_BUILD_TYPES "release" "relwithdebinfo" "minsizerel") list(FIND RELEASE_BUILD_TYPES "${CMAKE_BUILD_TYPE_TOLOWER}" INDEX) if (INDEX EQUAL -1) set(RELEASE_BUILD FALSE) else() set(RELEASE_BUILD TRUE) endif() endif() message(STATUS "Release build: ${RELEASE_BUILD}") ############ ############# ## Options ## ############# ############ option(GHNS "support Get Hot New Stuff" OFF) option(PACKAGERS_BUILD "Build support of multiple CPU architectures in one binary. Should be used by packagers only." ON) ####################### ######################## ## Productset setting ## ######################## ####################### # For predefined productsets see the definitions in CalligraProducts.cmake and # in the files in the folder cmake/productsets. # Finding out the products & features to build is done in 5 steps: # 1. have the user define the products/features wanted, by giving a productset # 2. estimate all additional required products/features # 3. estimate which of the products/features can be build by external deps # 4. find which products/features have been temporarily disabled due to problems # 5. estimate which of the products/features can be build by internal deps # get the special macros include(CalligraProductSetMacros) # get the definitions of products, features and product sets include(CalligraProducts.cmake) set(PRODUCTSET_DEFAULT "ALL") if(NOT PRODUCTSET) set(PRODUCTSET ${PRODUCTSET_DEFAULT} CACHE STRING "Set of products/features to build" FORCE) endif() if (RELEASE_BUILD) set(CALLIGRA_SHOULD_BUILD_STAGING FALSE) if(BUILD_UNMAINTAINED) set(CALLIGRA_SHOULD_BUILD_UNMAINTAINED TRUE) else() set(CALLIGRA_SHOULD_BUILD_UNMAINTAINED FALSE) endif() else () set(CALLIGRA_SHOULD_BUILD_STAGING TRUE) set(CALLIGRA_SHOULD_BUILD_UNMAINTAINED TRUE) endif () # finally choose products/features to build calligra_set_productset(${PRODUCTSET}) +# Leave this line as is, it is used to enable removal of Plan when releasing Calligra +#calligra_disable_product(APP_PLAN "Plan is released separatly") + ########################## ########################### ## Look for ECM, Qt, KF5 ## ########################### ########################## find_package(ECM 5.19 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) # ECM KDE macros (include first, to have their policies and settings effect all other macros) include(KDEInstallDirs) include(KDECMakeSettings NO_POLICY_SCOPE) include(KDECompilerSettings NO_POLICY_SCOPE) # CMake macros include(CMakePackageConfigHelpers) include(WriteBasicConfigVersionFile) include(CheckFunctionExists) include(CheckTypeSize) include(CheckIncludeFile) include(GenerateExportHeader) include(FeatureSummary) # ECM macros include(ECMOptionalAddSubdirectory) include(ECMInstallIcons) include(ECMAddAppIcon) include(ECMSetupVersion) include(ECMAddTests) include(ECMMarkAsTest) include(ECMMarkNonGuiExecutable) include(ECMGenerateHeaders) # own macros include(MacroBoolTo01) include(MacroOptionalFindPackage) include(MacroEnsureVersion) include(MacroDesktopToJson) set(REQUIRED_KF5_VERSION "5.7.0") find_package(KF5 ${REQUIRED_KF5_VERSION} REQUIRED COMPONENTS Archive Codecs Completion Config ConfigWidgets CoreAddons DBusAddons DocTools GuiAddons I18n IconThemes ItemViews JobWidgets KCMUtils KDELibs4Support KIO Kross Notifications NotifyConfig Parts Sonnet TextWidgets Wallet WidgetsAddons WindowSystem XmlGui ) find_package(KF5Activities) find_package(KF5KHtml) set_package_properties(KF5Activities PROPERTIES TYPE OPTIONAL ) set_package_properties(KF5KHtml PROPERTIES PURPOSE "Required for HTML2ODS import filter" TYPE OPTIONAL ) if(KF5Activities_FOUND) set(HAVE_KACTIVITIES TRUE) endif() find_package(KF5Holidays 5.3.3) set_package_properties(KF5Holidays PROPERTIES DESCRIPTION "Library for generation of public holidays" PURPOSE "Required by Plan" TYPE RECOMMENDED ) if(${KF5_VERSION} VERSION_LESS "5.16.0") set(CALLIGRA_OLD_PLUGIN_METADATA TRUE) endif() set(REQUIRED_QT_VERSION "5.3.0") find_package(Qt5 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS Core Gui Network PrintSupport Svg Test Widgets Xml ) find_package(Qt5 ${REQUIRED_QT_VERSION} QUIET COMPONENTS DBus OpenGL Quick QuickWidgets Sql WebKit # WebKitWidgets ) message("**********************************************************************************************************************") message("**********************************************************************************************************************") message("Qt WebKitWidgets is required for Stage's html export preview. This will need porting, as that module no longer exists.") message("**********************************************************************************************************************") message("**********************************************************************************************************************") # Qt5Declarative was removed in Qt 5.6.0 so search for it in a separate call # Including it in a collected find_package(Qt5 ...) call can lead to a fatal not-found error: # * Qt5 (required version >= 5.3.0) find_package(Qt5Declarative ${REQUIRED_QT_VERSION} QUIET) set_package_properties(Qt5DBus PROPERTIES TYPE RECOMMENDED ) set_package_properties(Qt5Declarative PROPERTIES PURPOSE "Required for QtQuick1 components" TYPE RECOMMENDED ) set_package_properties(Qt5OpenGL PROPERTIES PURPOSE "Required for QtQuick1 components" TYPE RECOMMENDED ) set_package_properties(Qt5Quick PROPERTIES PURPOSE "Required for QtQuick2 components" TYPE RECOMMENDED ) set_package_properties(Qt5QuickWidgets PROPERTIES PURPOSE "Required for Calligra Gemini" TYPE RECOMMENDED ) set_package_properties(Qt5Sql PROPERTIES PURPOSE "Optional for Sheets' database connection" TYPE OPTIONAL ) set_package_properties(Qt5WebKit PROPERTIES PURPOSE "Required for Braindump's Web shape" TYPE OPTIONAL ) set_package_properties(Qt5WebKitWidget PROPERTIES PURPOSE "Required for Stage" TYPE RECOMMENDED ) if(Qt5WebKit_FOUND) add_definitions( -DCAN_USE_QTWEBKIT ) endif() set(HAVE_OPENGL ${Qt5OpenGL_FOUND}) if (GHNS) find_package(Attica 3.0) find_package(NewStuff) set_package_properties(Attica PROPERTIES DESCRIPTION "Attica is used for Get Hot New Stuff." URL "https://projects.kde.org/projects/kdesupport/attica" TYPE OPTIONAL ) if (NOT LIBATTICA_FOUND) set(GHNS FALSE) else () message(STATUS "WARNING: You are compiling with Get Hot New Stuff enabled. Do not do that when building distribution packages. GHNS is unusable these days until someone starts maintaining it again.") endif () endif () find_package(X11) if(X11_FOUND) find_package(Qt5 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS X11Extras ) set(HAVE_X11 TRUE) add_definitions(-DHAVE_X11) else() set(HAVE_X11 FALSE) endif() # use sane compile flags add_definitions( -DQT_USE_QSTRINGBUILDER -DQT_STRICT_ITERATORS -DQT_NO_SIGNALS_SLOTS_KEYWORDS -DQT_USE_FAST_OPERATOR_PLUS -DQT_USE_FAST_CONCATENATION -DQT_NO_URL_CAST_FROM_STRING -DQT_NO_CAST_TO_ASCII ) # only with this definition will all the FOO_TEST_EXPORT macro do something # TODO: check if this can be moved to only those places which make use of it, # to reduce global compiler definitions that would trigger a recompile of # everything on a change (like adding/removing tests to/from the build) if(BUILD_TESTING) add_definitions(-DCOMPILING_TESTS) endif() # overcome some platform incompatibilities if(WIN32) if(NOT MINGW) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/winquirks) add_definitions(-D_USE_MATH_DEFINES) add_definitions(-DNOMINMAX) endif() set(WIN32_PLATFORM_NET_LIBS ws2_32.lib netapi32.lib) endif() ########################### ############################ ## Required dependencies ## ############################ ########################### find_package(Perl REQUIRED) find_package(ZLIB REQUIRED) add_definitions(-DBOOST_ALL_NO_LIB) find_package(Boost REQUIRED COMPONENTS system) # for pigment and stage if (NOT Boost_FOUND) message(FATAL_ERROR "Did not find Boost. Boost is required for the core libraries, stage, sheets.") endif () ########################### ############################ ## Optional dependencies ## ############################ ########################### ## ## Check for OpenEXR ## macro_optional_find_package(OpenEXR) macro_bool_to_01(OPENEXR_FOUND HAVE_OPENEXR) ## ## Test for GNU Scientific Library ## macro_optional_find_package(GSL 1.7) set_package_properties(GSL_FOUND PROPERTIES DESCRIPTION "GNU Scientific Library" URL "https://www.gnu.org/software/gsl" PURPOSE "Required by Sheets' solver plugin" TYPE OPTIONAL ) macro_bool_to_01(GSL_FOUND HAVE_GSL) configure_file(config-gsl.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-gsl.h ) ## ## Test for Phonon4Qt5 ## find_package(Phonon4Qt5 QUIET) set_package_properties(Phonon4Qt5 PROPERTIES DESCRIPTION "Abstraction lib for multimedia applications" URL "https://www.kde.org/" PURPOSE "Required by Stage event actions and Videoshape plugin" TYPE OPTIONAL ) ## ## Test for KF5CalendarCore ## find_package(KF5CalendarCore CONFIG QUIET) set_package_properties(KF5CalendarCore PROPERTIES DESCRIPTION "KDE Calendar Library" URL "https://www.kde.org/" PURPOSE "Required by Plan Ical export and optionally used by semantic item Event" TYPE OPTIONAL ) if ("${KF5CalendarCore_VERSION}" VERSION_GREATER 5.6.40) set(HAVE_QDATETIME_KCALCORE TRUE) endif() ## ## Test for KF5Contacts ## find_package(KF5Contacts CONFIG QUIET) set_package_properties(KF5Contacts PROPERTIES DESCRIPTION "KDE Address book Library" URL "https://www.kde.org/" PURPOSE "Optionally used by semantic item Contact" TYPE OPTIONAL ) ## ## Test for KF5AkonadiContact ## find_package(KF5AkonadiContact CONFIG QUIET) set_package_properties(KF5AkonadiContact PROPERTIES DESCRIPTION "Library for Accessing Contacts stored in Akonadi" URL "https://www.kde.org/" PURPOSE "Optionally used by Plan" TYPE OPTIONAL ) ## ## Test for KF5AkonadiCore ## find_package(KF5Akonadi CONFIG QUIET) set_package_properties(KF5Akonadi PROPERTIES DESCRIPTION "Library for general Access to Akonadi" URL "https://www.kde.org/" PURPOSE "Optionally used by semantic items Event and Contact" TYPE OPTIONAL ) ## ## Test for KGantt ## macro_optional_find_package(KGantt 2.6.0 QUIET) set_package_properties(KGantt PROPERTIES DESCRIPTION "Library for creating Gantt diagrams (part of KDiagram)" URL "https://www.kde.org/" PURPOSE "Required by Plan" TYPE RECOMMENDED ) ## ## Test for KChart ## macro_optional_find_package(KChart 2.6.0 QUIET) set_package_properties(KChart PROPERTIES DESCRIPTION "Library for creating business charts (part of KDiagram)" URL "https://www.kde.org/" PURPOSE "Required by Chart shape and Plan" TYPE RECOMMENDED ) #### Disable kreport for now, reconsidder when it is stable #### ## ## Test for KReport ## # macro_optional_find_package(KReport 3.0 QUIET) # set_package_properties(KReport PROPERTIES # DESCRIPTION "A framework for the creation and generation of reports in multiple formats" # URL "https://community.kde.org/KReport" # PURPOSE "Required for KReports support in Plan" # TYPE OPTIONAL # ) # # ## # ## Test for KPropertyWidgets # ## # macro_optional_find_package(KPropertyWidgets 3.0 QUIET) # set_package_properties(KPropertyWidgets PROPERTIES # DESCRIPTION "A property editing framework with editor widget" # URL "https://community.kde.org/KProperty" # PURPOSE "Required for KReports support in Plan" # TYPE OPTIONAL # ) ## ## Test for eigen3 ## macro_optional_find_package(Eigen3) set_package_properties(Eigen3 PROPERTIES DESCRIPTION "C++ template library for linear algebra" URL "http://eigen.tuxfamily.org" PURPOSE "Required by Calligra Sheets" TYPE RECOMMENDED ) ## ## Test for QCA2 ## macro_optional_find_package(Qca-qt5 2.1.0 QUIET) set_package_properties(Qca-qt5 PROPERTIES DESCRIPTION "Qt Cryptographic Architecture" URL "http:/download.kde.org/stable/qca-qt5" PURPOSE "Required for encrypted OpenDocument files and encrypted xls files support (available as a module in kdesupport)" TYPE OPTIONAL ) ## ## Test for soprano ## # QT5TODO: push for released (and maintained) Qt5 version of Soprano, T462, T461 # macro_optional_find_package(Soprano) set(Soprano_FOUND FALSE) set_package_properties(Soprano PROPERTIES DESCRIPTION "RDF handling library" URL "http://soprano.sourceforge.net/" PURPOSE "Required to handle RDF metadata in ODF" TYPE OPTIONAL ) if(NOT Soprano_FOUND) set(SOPRANO_INCLUDE_DIR "") endif() ## ## Test for marble ## macro_optional_find_package(Marble CONFIG) set_package_properties(Marble PROPERTIES DESCRIPTION "World Globe Widget library" URL "https://marble.kde.org/" PURPOSE "Required by RDF to show locations on a map" TYPE OPTIONAL ) ## ## Test for lcms ## macro_optional_find_package(LCMS2) set_package_properties(LCMS2 PROPERTIES DESCRIPTION "LittleCMS, a color management engine" URL "http://www.littlecms.com" PURPOSE "Will be used for color management" TYPE OPTIONAL ) if(LCMS2_FOUND) if(NOT ${LCMS2_VERSION} VERSION_LESS 2040 ) set(HAVE_LCMS24 TRUE) endif() set(HAVE_REQUIRED_LCMS_VERSION TRUE) set(HAVE_LCMS2 TRUE) endif() ## ## Test for Vc ## set(OLD_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ) set(HAVE_VC FALSE) if( NOT MSVC) macro_optional_find_package(Vc 1.1.0) set_package_properties(Vc PROPERTIES DESCRIPTION "Portable, zero-overhead SIMD library for C++" URL "https://github.com/VcDevel/Vc" PURPOSE "Required by the pigment for vectorization" TYPE OPTIONAL ) macro_bool_to_01(Vc_FOUND HAVE_VC) macro_bool_to_01(PACKAGERS_BUILD DO_PACKAGERS_BUILD) endif() configure_file(config-vc.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-vc.h ) if(HAVE_VC) message(STATUS "Vc found!") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/vc") include (VcMacros) if(Vc_COMPILER_IS_CLANG) set(ADDITIONAL_VC_FLAGS "-Wabi -ffp-contract=fast -fPIC") elseif (NOT MSVC) set(ADDITIONAL_VC_FLAGS "-Wabi -fabi-version=0 -ffp-contract=fast -fPIC") endif() #Handle Vc master if(Vc_COMPILER_IS_GCC OR Vc_COMPILER_IS_CLANG) AddCompilerFlag("-std=c++11" _ok) if(NOT _ok) AddCompilerFlag("-std=c++0x" _ok) endif() endif() macro(ko_compile_for_all_implementations_no_scalar _objs _src) if(PACKAGERS_BUILD) vc_compile_for_all_implementations(${_objs} ${_src} FLAGS ${ADDITIONAL_VC_FLAGS} ONLY SSE2 SSSE3 SSE4_1 AVX AVX2+FMA+BMI2) else() set(${_objs} ${_src}) endif() endmacro() macro(ko_compile_for_all_implementations _objs _src) if(PACKAGERS_BUILD) vc_compile_for_all_implementations(${_objs} ${_src} FLAGS ${ADDITIONAL_VC_FLAGS} ONLY Scalar SSE2 SSSE3 SSE4_1 AVX AVX2+FMA+BMI2) else() set(${_objs} ${_src}) endif() endmacro() if (NOT PACKAGERS_BUILD) # Optimize the whole Calligra for current architecture set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Vc_DEFINITIONS}") endif () endif() set(CMAKE_MODULE_PATH ${OLD_CMAKE_MODULE_PATH} ) if(WIN32) set(LIB_INSTALL_DIR ${LIB_INSTALL_DIR} RUNTIME DESTINATION ${BIN_INSTALL_DIR} LIBRARY ${INSTALL_TARGETS_DEFAULT_ARGS} ARCHIVE ${INSTALL_TARGETS_DEFAULT_ARGS} ) endif() ## ## Test for Fontconfig ## ## Only test if on non-Windows system if(NOT WIN32 AND NOT APPLE) macro_optional_find_package(Fontconfig) set_package_properties(Fontconfig PROPERTIES DESCRIPTION "Library for configuring and customizing font access" URL "http://fontconfig.org" PURPOSE "Required to handle exact font size" TYPE RECOMMENDED ) endif() ## ## Test for Freetype ## ## Only test if on non-Windows system if(NOT WIN32 AND NOT APPLE) macro_optional_find_package(Freetype) set_package_properties(Freetype PROPERTIES DESCRIPTION "A Free, High-Quality, and Portable Font Engine" URL "http://www.freetype.org/" PURPOSE "Required to handle exact font size" TYPE RECOMMENDED ) endif() if(NOT FONTCONFIG_FOUND OR NOT FREETYPE_FOUND) set(FONTCONFIG_INCLUDE_DIR "") set(FREETYPE_INCLUDE_DIRS "") else() add_definitions( -DSHOULD_BUILD_FONT_CONVERSION ) endif() ## ## Test endianess ## include (TestBigEndian) test_big_endian(CMAKE_WORDS_BIGENDIAN) ## ## Test SharedMimeInfo ## macro_optional_find_package(SharedMimeInfo) set_package_properties(SharedMimeInfo PROPERTIES PURPOSE "Required to determine file types SVM or all of MSOOXML." TYPE RECOMMENDED ) ## ## Test for Okular ## macro_optional_find_package(Okular5 0.99.60 QUIET) set_package_properties(Okular5 PROPERTIES DESCRIPTION "A unified document viewer" URL "https://okular.kde.org/" PURPOSE "Required to build the plugins for Okular" TYPE OPTIONAL ) ## ## Test for librevenge ## macro_optional_find_package(LibRevenge) set_package_properties(LibRevenge PROPERTIES DESCRIPTION "A base library for writing document import filters" URL "http://sf.net/p/libwpd/librevenge/" PURPOSE "Required by various import filters" TYPE OPTIONAL ) ## ## Test for libodfgen ## macro_optional_find_package(LibOdfGen) set_package_properties(LibOdfGen PROPERTIES DESCRIPTION "Open Document Format Generation Library" URL "http://sf.net/p/libwpd/libodfgen/" PURPOSE "Required by various import filters" TYPE OPTIONAL ) ## ## Test for WordPerfect Document Library ## macro_optional_find_package(LibWpd) set_package_properties(LibWpd PROPERTIES DESCRIPTION "WordPerfect Document Library" URL "http://libwpd.sourceforge.net/" PURPOSE "Required by the Words WPD import filter" TYPE OPTIONAL ) ## ## Test for WordPerfect Graphics Library ## macro_optional_find_package(LibWpg) set_package_properties(LibWpg PROPERTIES DESCRIPTION "WordPerfect Graphics Library" URL "http://libwpg.sourceforge.net/" PURPOSE "Required by the Karbon WPG import filter" TYPE OPTIONAL ) ## ## Test for Microsoft Works Document Library ## macro_optional_find_package(LibWps) set_package_properties(LibWps PROPERTIES DESCRIPTION "Microsoft Works Document Library" URL "http://libwps.sourceforge.net/" PURPOSE "Required by the Words WPS import filter" TYPE OPTIONAL ) ## ## Test for Microsoft Visio Document Library ## macro_optional_find_package(LibVisio) set_package_properties(LibVisio PROPERTIES DESCRIPTION "Visio Import Filter Library" URL "https://wiki.documentfoundation.org/DLP/Libraries/libvisio" PURPOSE "Required by the Flow visio import filter" TYPE OPTIONAL ) ## ## Test for Apple Keynote Document Library ## macro_optional_find_package(LibEtonyek) set_package_properties(LibEtonyek PROPERTIES DESCRIPTION "Apple Keynote Document Library" URL "https://wiki.documentfoundation.org/DLP/Libraries/libetonyek" PURPOSE "Required by the Stage keynote import filter" TYPE OPTIONAL ) ## ## Test for qt-poppler ## macro_optional_find_package(Poppler COMPONENTS Qt5) set_package_properties(Poppler PROPERTIES DESCRIPTION "A PDF rendering library" URL "http://poppler.freedesktop.org" PURPOSE "Required by the Karbon PDF import filter and CSTester PDF feature" TYPE OPTIONAL ) ## ## Test for qt-poppler not-officially-supported XPDF Headers ## Installing these is off by default in poppler sources, so lets make ## sure they're really there before trying to build the pdf import ## macro_optional_find_package(PopplerXPDFHeaders) set_package_properties(PopplerXPDFHeaders PROPERTIES DESCRIPTION "XPDF headers in the Poppler Qt5 interface library" URL "http://poppler.freedesktop.org" PURPOSE "Required by the Karbon PDF import filter" TYPE OPTIONAL ) ## ## Test for libgit2 ## macro_optional_find_package(Libgit2) ## ## Generate a file for prefix information ## ############################### ################################ ## Add Calligra helper macros ## ################################ ############################### include(MacroCalligraAddBenchmark) #################### ##################### ## Define includes ## ##################### #################### # WARNING: make sure that QT_INCLUDES is the first directory to be added to include_directory before # any other include directory # for config.h and includes (if any?) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/interfaces ) set(KOVERSION_INCLUDES ${CMAKE_SOURCE_DIR}/libs/version ${CMAKE_BINARY_DIR}/libs/version ) include_directories(${KOVERSION_INCLUDES}) # koplugin is at the bottom of the stack set(KOPLUGIN_INCLUDES ${CMAKE_SOURCE_DIR}/libs/plugin) set(KUNDO2_INCLUDES ${CMAKE_SOURCE_DIR}/libs/kundo2 ${CMAKE_BINARY_DIR}/libs/kundo2) # koodf is at the bottom of the stack set(KOODF_INCLUDES ${CMAKE_SOURCE_DIR}/libs/odf ${CMAKE_SOURCE_DIR}/libs/store ${CMAKE_BINARY_DIR}/libs/odf ${CMAKE_BINARY_DIR}/libs/store ${KOVERSION_INCLUDES} ) # pigment depends on koplugin and lcms set(PIGMENT_INCLUDES ${KOPLUGIN_INCLUDES} ${KOVERSION_INCLUDES} ${CMAKE_SOURCE_DIR}/libs/pigment ${CMAKE_BINARY_DIR}/libs/pigment ${CMAKE_SOURCE_DIR}/libs/pigment/compositeops ${CMAKE_SOURCE_DIR}/libs/pigment/resources ${Boost_INCLUDE_DIRS} ) # flake depends on koodf and pigment set(FLAKE_INCLUDES ${CMAKE_SOURCE_DIR}/libs/flake ${KOODF_INCLUDES} ${PIGMENT_INCLUDES} ${KUNDO2_INCLUDES} ${CMAKE_SOURCE_DIR}/libs/widgetutils ${CMAKE_SOURCE_DIR}/libs/flake/commands ${CMAKE_SOURCE_DIR}/libs/flake/tools ${CMAKE_SOURCE_DIR}/libs/flake/svg ${CMAKE_BINARY_DIR}/libs/flake) # vectorimage set(VECTORIMAGE_INCLUDES ${CMAKE_SOURCE_DIR}/libs/vectorimage ${CMAKE_SOURCE_DIR}/libs/vectorimage/libemf ${CMAKE_SOURCE_DIR}/libs/vectorimage/libsvm ${CMAKE_SOURCE_DIR}/libs/vectorimage/libwmf) # KoText depends on koplugin, odf set(KOTEXT_INCLUDES ${CMAKE_SOURCE_DIR}/libs/text ${CMAKE_BINARY_DIR}/libs/text ${CMAKE_SOURCE_DIR}/libs/text/changetracker ${CMAKE_SOURCE_DIR}/libs/text/styles ${CMAKE_SOURCE_DIR}/libs/text/opendocument ${SOPRANO_INCLUDE_DIR} ${FLAKE_INCLUDES} ${KOODF_INCLUDES}) # TextLayout depends on kotext set(TEXTLAYOUT_INCLUDES ${KOTEXT_INCLUDES} ${CMAKE_SOURCE_DIR}/libs/textlayout ${CMAKE_BINARY_DIR}/libs/textlayout) # Widgets depends on kotext and flake set(KOWIDGETS_INCLUDES ${KOTEXT_INCLUDES} ${CMAKE_SOURCE_DIR}/libs/widgetutils ${CMAKE_BINARY_DIR}/libs/widgetutils ${CMAKE_SOURCE_DIR}/libs/widgets ${CMAKE_BINARY_DIR}/libs/widgets) # BasicFlakes depends on flake, widgets set(BASICFLAKES_INCLUDES ${KOWIDGETS_INCLUDES} ${CMAKE_SOURCE_DIR}/libs/basicflakes ${CMAKE_SOURCE_DIR}/libs/basicflakes/tools) # komain depends on kotext & flake set(KOMAIN_INCLUDES ${KOWIDGETS_INCLUDES} ${TEXTLAYOUT_INCLUDES} ${CMAKE_SOURCE_DIR}/libs/main ${CMAKE_BINARY_DIR}/libs/main ${CMAKE_SOURCE_DIR}/libs/main/config) set(KORDF_INCLUDES ${KOMAIN_INCLUDES} ${CMAKE_SOURCE_DIR}/libs/rdf ) set(KORDF_LIBS kordf) if(SHOULD_BUILD_FEATURE_SCRIPTING) set(KOKROSS_INCLUDES ${CMAKE_SOURCE_DIR}/libs/kross ${CMAKE_BINARY_DIR}/libs/kross) endif() # kopageapp set(KOPAGEAPP_INCLUDES ${TEXTLAYOUT_INCLUDES} ${PIGMENT_INCLUDES} ${KOMAIN_INCLUDES} ${CMAKE_SOURCE_DIR}/libs/widgets ${CMAKE_SOURCE_DIR}/libs/pageapp ${CMAKE_SOURCE_DIR}/libs/pageapp/commands ${CMAKE_BINARY_DIR}/libs/pageapp ) ############################################# #### filter libraries #### ############################################# # libodf2 set(KOODF2_INCLUDES ${CMAKE_SOURCE_DIR}/filters/libodf2 ${CMAKE_SOURCE_DIR}/filters/libodf2/chart ) # libodfreader set(KOODFREADER_INCLUDES ${CMAKE_SOURCE_DIR}/filters/libodfreader ) ################################################### #################################################### ## Detect which products/features can be compiled ## #################################################### ################################################### if (NOT WIN32) set(NOT_WIN TRUE) endif() if (NOT QT_MAC_USE_COCOA) set(NOT_COCOA TRUE) endif() if (KReport_FOUND AND KREPORT_SCRIPTING) set(KReport_WithScripting_FOUND TRUE) endif() calligra_drop_product_on_bad_condition( FEATURE_RDF Soprano_FOUND "Soprano not found" ) # calligra_drop_product_on_bad_condition( PART_STAGE # Qt5WebKitWidgets_FOUND "Qt5WebKitWidgets devel not found" # ) calligra_drop_product_on_bad_condition( PART_SHEETS EIGEN3_FOUND "Eigen devel not found" ) calligra_drop_product_on_bad_condition( OKULAR_GENERATOR_ODP Okular5_FOUND "Okular devel not found" ) calligra_drop_product_on_bad_condition( OKULAR_GENERATOR_ODT Okular5_FOUND "Okular devel not found" ) calligra_drop_product_on_bad_condition( PLUGIN_CHARTSHAPE KChart_FOUND "KChart devel not found" ) calligra_drop_product_on_bad_condition( PLUGIN_VIDEOSHAPE Phonon4Qt5_FOUND "Phonon4Qt5 devel not found" ) calligra_drop_product_on_bad_condition( FILTER_KEY_TO_ODP LIBODFGEN_FOUND "libodfgen devel not found" LIBETONYEK_FOUND "libetonyek devel not found" LIBREVENGE_FOUND "librevenge devel not found" ) calligra_drop_product_on_bad_condition( FILTER_VISIO_TO_ODG LIBODFGEN_FOUND "libodfgen devel not found" LIBVISIO_FOUND "libvisio devel not found" LIBREVENGE_FOUND "librevenge devel not found" ) calligra_drop_product_on_bad_condition( FILTER_WORDPERFECT_TO_ODT LIBODFGEN_FOUND "libodfgen devel not found" LIBWPD_FOUND "libwpd devel not found" LIBWPG_FOUND "libwpg devel not found" LIBREVENGE_FOUND "librevenge devel not found" ) calligra_drop_product_on_bad_condition( FILTER_WORKS_TO_ODT LIBODFGEN_FOUND "libodfgen devel not found" LIBWPS_FOUND "libwps devel not found" LIBREVENGE_FOUND "librevenge devel not found" ) calligra_drop_product_on_bad_condition( FILTER_WPG_TO_SVG LIBWPG_FOUND "libwpg devel not found" LIBREVENGE_FOUND "librevenge devel not found" ) calligra_drop_product_on_bad_condition( FILTER_WPG_TO_ODG LIBODFGEN_FOUND "libodfgen devel not found" LIBWPG_FOUND "libwpg devel not found" LIBREVENGE_FOUND "librevenge devel not found" ) calligra_drop_product_on_bad_condition( FILTER_PDF_TO_SVG NOT_WIN "not supported on Windows" PopplerXPDFHeaders_FOUND "poppler xpdf headers not found" ) calligra_drop_product_on_bad_condition( FILTER_HTML_TO_ODS NOT_WIN "not supported on Windows" NOT_COCOA "not supported with Qt Cocoa" KF5KHtml_FOUND "KF5KHtml devel not found" ) calligra_drop_product_on_bad_condition( FILTER_SHEETS_TO_HTML NOT_WIN "not supported on Windows" NOT_COCOA "not supported with Qt Cocoa" ) calligra_drop_product_on_bad_condition( FILTER_KSPREAD_TO_LATEX NOT_WIN "not supported on Windows" NOT_COCOA "not supported with Qt Cocoa" ) calligra_drop_product_on_bad_condition( APP_BRAINDUMP NOT_WIN "unmaintained on Windows" ) calligra_drop_product_on_bad_condition( APP_PLAN KGantt_FOUND "KGantt devel not found" KChart_FOUND "KChart devel not found" # KReport_WithScripting_FOUND "KReport with scripting support not found" # KPropertyWidgets_FOUND "KPropertyWidgets not found" ) calligra_drop_product_on_bad_condition( PLUGIN_CALLIGRAGEMINI_GIT LIBGIT2_FOUND "libgit2 devel not found" ) calligra_drop_product_on_bad_condition( PART_QTQUICK Qt5OpenGL_FOUND "Qt OpenGL not found" Qt5Declarative_FOUND "QtDeclarative not found" ) calligra_drop_product_on_bad_condition( PART_COMPONENTS Qt5Quick_FOUND "QtQuick not found" ) calligra_drop_product_on_bad_condition( APP_SLIDECOMPARE Qt5OpenGL_FOUND "Qt OpenGL not found" ) ############################################# #### Backward compatibility BUILD_x=off #### ############################################# # workaround: disable directly all products which might be activated by internal # dependencies, but belong to scope of old flag calligra_drop_products_on_old_flag(braindump APP_BRAINDUMP) calligra_drop_products_on_old_flag(flow APP_FLOW) calligra_drop_products_on_old_flag(karbon APP_KARBON) calligra_drop_products_on_old_flag(plan APP_PLAN) calligra_drop_products_on_old_flag(sheets PART_SHEETS APP_SHEETS) calligra_drop_products_on_old_flag(stage PART_STAGE APP_STAGE) calligra_drop_products_on_old_flag(words PART_WORDS APP_WORDS) ############################################# #### Temporarily broken products #### ############################################# # If a product does not build due to some temporary brokeness disable it here, # by calling calligra_disable_product with the product id and the reason, # e.g.: # calligra_disable_product(APP_FOO "isn't buildable at the moment") ############################################# #### Calculate buildable products #### ############################################# calligra_drop_unbuildable_products() ############################################# #### Setup product-depending vars #### ############################################# if(SHOULD_BUILD_FEATURE_RDF) add_definitions( -DSHOULD_BUILD_RDF ) endif() ################### #################### ## Subdirectories ## #################### ################### add_subdirectory(words) if (SHOULD_BUILD_APP_FLOW) add_subdirectory(flow) endif () add_subdirectory(stage) if(SHOULD_BUILD_APP_PLAN) add_subdirectory(plan) endif() add_subdirectory(sheets) if(SHOULD_BUILD_APP_KARBON) add_subdirectory(karbon) endif() if(SHOULD_BUILD_APP_BRAINDUMP) add_subdirectory(braindump) endif() if(SHOULD_BUILD_DOC) add_subdirectory(doc) endif() if(SHOULD_BUILD_PART_QTQUICK) add_subdirectory(qtquick) endif() if(SHOULD_BUILD_PART_COMPONENTS) add_subdirectory(components) endif() if(SHOULD_BUILD_GEMINI) add_subdirectory(gemini) endif() # non-app directories are moved here because they can depend on SHOULD_BUILD_{appname} variables set above add_subdirectory(libs) add_subdirectory(interfaces) add_subdirectory(pics) add_subdirectory(plugins) add_subdirectory(servicetypes) add_subdirectory(devtools) add_subdirectory(extras) add_subdirectory(filters) add_subdirectory(data) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) calligra_product_deps_report("product_deps") calligra_log_should_build() add_custom_target(apidox doc/api/gendocs.pl WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) configure_file(KoConfig.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/KoConfig.h ) if (SHOULD_BUILD_DEVEL_HEADERS) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/KoConfig.h DESTINATION ${INCLUDE_INSTALL_DIR}/calligra COMPONENT Devel) endif() if (BUILD_TESTING) add_subdirectory(tests) endif(BUILD_TESTING) diff --git a/devtools/release/create_tarball.rb b/devtools/release/create_tarball.rb index 551c368ecc5..309fed0e317 100755 --- a/devtools/release/create_tarball.rb +++ b/devtools/release/create_tarball.rb @@ -1,275 +1,328 @@ #!/usr/bin/ruby # # Ruby script for generating tarball releases of the Calligra repository # This script can create signed tarballs with source code, translations and documentation # +# (c) 2017 Dag Andersen # (c) 2016 Dag Andersen # # Parts of this script is from create_tarball_kf5.rb, copyright by: # (c) 2005 Mark Kretschmann # (c) 2006-2008 Tom Albers # (c) 2007 Angelo Naselli (command line parameters) # Some parts of this code taken from cvs2dist # # License: GNU General Public License V2 require 'optparse' require 'ostruct' require 'find' require 'fileutils' +# Compare two version strings +# The strings must have the format ".." +# e.g "3.0.1" +# Returns: +# 1 v1 > v2 +# 0 v1 == v2 +# -1 v1 < v2 +def compare_versions(v1, v2) + if v1 == "HEAD" + return 1 + end + vA = v1.split('.') + vB = v2.split('.') + if (vA[0] > vB[0]) + return 1 + end + if (vA[0] < vB[0]) + return -1 + end + if (vA[1] > vB[1]) + return 1 + end + if (vA[1] < vB[1]) + return -1 + end + if (vA[2] > vB[2]) + return 1 + end + if (vA[2] < vB[2]) + return -1 + end + return 0 +end + # check command line parameters options = OpenStruct.new options.help = false options.sign = false options.program = "gpg2" +options.branch = "trunk" options.translations = true options.docs = false options.languages = [] options.tag = "HEAD" options.infolevel = 0 options.checkversion = true opts = OptionParser.new do |opts| opts.on_tail("-h", "--help", "Show this usage statement") do |h| options.help = true end opts.on("-v", "--version ", "Package version (Default: no version)") do |v| options.version = v end opts.on("-c", "--cstring ", "Version string to check against version string in CMakeList.txt (Default: use version given in --version option)") do |c| options.cstring = c end opts.on("-n", "--no-check", "Disable version check") do |n| options.checkversion = false; end opts.on("-g", "--gittag ", "Git tag (Default: 'HEAD')") do |g| options.tag = g end + opts.on("-b", "--branch ", "Svn branch for translations [trunk | stable] (Default: 'trunk')") do |g| + options.tag = g + end opts.on("-t", "--no-translations", "Do not include translations (Default: translations included)") do |t| options.translations = false end opts.on("-d", "--docs", "TODO Include documentation (Default: docs not included)") do |d| # TODO #options.translations = true end opts.on("-s", "--sign", "Sign tarball (Default: tarball is not signed)") do |s| options.sign = true end opts.on("-p", "--program ", "Which program to use for signing (Default: gpg2)") do |p| options.program = p end opts.on("-l", "--languages ", "Include comma separated list of languages only (Default: All available languages)") do |l| options.languages = l.split(/\s*,\s*/) end opts.on("-i", "--infolevel ", "Select amount of info to print during processing (0-2) (Default: 0)") do |i| options.infolevel = i.to_i end end begin opts.parse!(ARGV) rescue Exception => e puts e, "", opts puts exit end if (options.help) puts puts opts puts exit end ############# START ############# app = "calligra" puts puts "-> Processing " + app puts " Git tag: #{options.tag}" puts " Version: #{options.version}" puts " Version string: #{options.cstring}" puts " Signed: #{options.sign}" puts " Program: #{options.program}" puts " Translations: #{options.translations}" print " Languages: " if (options.languages.empty?) puts "all" else puts "#{options.languages}" end puts " Documentation: #{options.docs}" puts gitdir = "calligra" if options.version gitdir += "-" + options.version end gittar = "#{gitdir}.tar.xz" gitsig = "#{gittar}.sig" `rm -rf #{gitdir} 2> /dev/null` if File.exist?(gittar) File.delete(gittar) end if File.exist?(gitsig) File.delete(gitsig) end Dir.mkdir(gitdir) Dir.chdir(gitdir) puts "-> Fetching git archive tag=#{options.tag} .." `git archive --remote git://anongit.kde.org/calligra.git #{options.tag} | tar -x` if !File.exist?("CMakeLists.txt") puts puts "Failed: 'git archive' failed to fetch repository" puts exit end +# get the version +cversion=`grep '(CALLIGRA_VERSION_STRING' CMakeLists.txt | cut -d'"' -f2` +cversion = cversion.delete("\n").delete("\r").strip if options.checkversion - cversion=`grep '(CALLIGRA_VERSION_STRING' CMakeLists.txt | cut -d'"' -f2` - cversion = cversion.delete("\n").delete("\r").strip cstring = options.version if options.cstring cstring = options.cstring end if cversion != cstring puts puts "Failed: Specified version is not the same as in CMakeLists.txt" puts " Specified version: '#{cstring}'" puts " CMakeLists.txt : '#{cversion}'" puts puts " Did you forget to update version in CMakeLists.txt?" puts puts " You can disable this test with the option: --no-check" puts exit end end +# From release 3.0.89, Plan is not released as part of calligra +if compare_versions(cversion, "3.0.89") >= 0 + if (options.infolevel > 2) + puts "Removing plan, version is: #{cversion}" + end + `sed -i 's/\#calligra_disable_product(APP_PLAN/calligra_disable_product(APP_PLAN/g' CMakeLists.txt` + `sed -i 's/add_subdirectory(plan)/\#add_subdirectory(plan)/g' CMakeLists.txt` + `rm -rf plan` +end + # translations if options.translations svnbase = "svn+ssh://svn@svn.kde.org/home/kde" - # atm trunk and no revision is assumed - svnroot = "#{svnbase}/trunk" + if options.branch == "trunk" + svnroot = "#{svnbase}/trunk" + else + svnroot = "#{svnbase}/branches/stable" + end rev = "" puts "-> Fetching po file names .." Dir.mkdir("po") if FileTest.exist?("po_tmp") `rm -rf "po_tmp"` end Dir.mkdir("po_tmp") pofilenames = "po_tmp/pofilenames" `x=$(find $gitdir -name 'Messages.sh' | while read messagefile; do \ if grep -q '^potfilename=' $messagefile; then \ cat $messagefile | grep '^potfilename=' | cut -d'=' -f2 | cut -d'.' -f1; \ fi; \ done);\ echo "$x" >#{pofilenames}` if !File.size?(pofilenames) puts "Failed: Could not fetch any po file names" exit end if options.infolevel > 0 c = `wc -l #{pofilenames} | cut -d' ' -f1` puts " Number of po file names found: " + c end puts "-> Fetching translations .." # get languages i18nlangs = `svn cat #{svnroot}/l10n-kf5/subdirs #{rev}`.split i18nlangsCleaned = [] for lang in i18nlangs l = lang.chomp if !options.languages.empty? if options.languages.include?(l) i18nlangsCleaned += [l] end else l != "x-test" && !i18nlangsCleaned.include?(l) i18nlangsCleaned += [l] end end i18nlangs = i18nlangsCleaned if FileTest.exist?("po") `rm -rf "po"` end Dir.mkdir("po") for lang in i18nlangs lang.chomp! tmp = "po_tmp/#{lang}" dest = "po/#{lang}" # always checkout all po-files print " -> Fetching #{lang} from repository ..\n" pofolder = "l10n-kf5/#{lang}/messages/calligra" if options.infolevel > 0 `svn co #{svnroot}/#{pofolder} #{tmp}` else `svn co #{svnroot}/#{pofolder} #{tmp} 2>/dev/null` end # copy over the po-files we actually use in calligra File.foreach(pofilenames) do |pofile| pofile.chomp! pofilepath = "#{tmp}/#{pofile}.po" if !FileTest.exist?(pofilepath) # all files have not always been translated if options.infolevel > 1 puts " Skipping #{pofilepath} .." end next end if !FileTest.exist?(dest) Dir.mkdir(dest) end if FileTest.exist?(pofilepath) if options.infolevel > 0 puts " Copying #{pofile}.po .." end `mv #{pofilepath} #{dest}` end end end # remove temporary po dir `rm -rf "po_tmp"` # add l10n to compilation. `echo "find_package(KF5I18n CONFIG REQUIRED)" >> CMakeLists.txt` `echo "ki18n_install(po)" >> CMakeLists.txt` if options.docs # add docs to compilation. `echo "find_package(KF5DocTools CONFIG REQUIRED)" >> CMakeLists.txt` `echo "kdoctools_install(po)" >> CMakeLists.txt` end end # Remove cruft `find -name ".svn" | xargs rm -rf` Dir.chdir( ".." ) # root folder print "-> Compressing .. " `tar -Jcf #{gittar} --group=root --owner=root #{gitdir}` puts " done." puts "" print "md5sum: ", `md5sum #{gittar}` print "sha256sum: ", `sha256sum #{gittar}` if (options.sign) puts "-> Signing .. " `#{options.program} -a --output #{gitsig} --detach-sign #{gittar}` puts "" print "sha256sum: ", `sha256sum #{gitsig}` end