diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b05bf82..c348d4c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,98 +1,108 @@ stages: - test - build - deploy clazy: stage: test image: kaidan/neon-bionic variables: CMAKE_CXX_COMPILER: clazy script: utils/travis/build.sh qmllint: stage: test image: kaidan/neon-bionic script: qmllint $(find . -name "*.qml") variables: QT_SELECT: 5 ubuntu-trusty: stage: build image: kaidan/ubuntu-trusty script: utils/travis/build.sh neon-bionic: stage: build image: kaidan/neon-bionic script: utils/travis/build.sh debian-sid: stage: build image: kaidan/debian-unstable script: utils/travis/build.sh archlinux: stage: build image: kaidan/archlinux script: utils/travis/build.sh linux-appimage: stage: deploy image: kaidan/ubuntu-trusty script: utils/build-linux-appimage.sh variables: QXMPP_BUILD: /usr allow_failure: true artifacts: paths: - "*.AppImage" - "*.AppImage.zsync" expire_in: 1 week click-xenial: stage: deploy image: kaidan/ubuntu-touch-xenial script: utils/travis/build.sh variables: PLATFORM: ubuntu-touch artifacts: paths: - "*.click" expire_in: 1 week windows-mxe: stage: deploy image: kaidan/windows-mxe script: - utils/build-windows-mxe.sh - mv build/bin/kaidan.exe kaidan.exe artifacts: paths: - "kaidan.exe" expire_in: 1 week android: stage: deploy image: kdeorg/android-sdk script: - sudo apt update - sudo apt -y install inkscape optipng - GIT_EXTRA="--branch ${KF5_VERSION}" /opt/helpers/build-kde-dependencies --withProject kirigami - /opt/helpers/build-cmake qxmpp https://github.com/qxmpp-project/qxmpp.git -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF - GIT_EXTRA="--branch ${CI_COMMIT_REF_NAME} --recursive" /opt/helpers/build-cmake ${CI_PROJECT_NAME} ${CI_REPOSITORY_URL} -DQTANDROID_EXPORTED_TARGET=kaidan -DANDROID_APK_DIR=${CI_PROJECT_DIR}/src/${CI_PROJECT_NAME}/misc/android -DI18N=1 - ${CI_PROJECT_DIR}/src/${CI_PROJECT_NAME}/utils/render-logos.sh - /opt/helpers/create-apk ${CI_PROJECT_NAME} - mv ${CI_PROJECT_DIR}/build/${CI_PROJECT_NAME}/kaidan_build_apk/build/outputs/apk/kaidan_build_apk-debug.apk ${CI_PROJECT_DIR} variables: KF5_VERSION: master artifacts: paths: - "kaidan_build_apk-debug.apk" expire_in: 1 week +mac-osxcross: + stage: deploy + image: kaidan/mac-osxcross + script: + - utils/build-mac-osxcross.sh + - tar -cf kaidan.tar -C build/bin/ kaidan.app + artifacts: + paths: + - "kaidan.tar" + expire_in: 1 week variables: GIT_SUBMODULE_STRATEGY: recursive BUILD_SYSTEM: cmake BUILD_TYPE: Release diff --git a/3rdparty/qxmpp b/3rdparty/qxmpp index 754cc5a..e6eb0b7 160000 --- a/3rdparty/qxmpp +++ b/3rdparty/qxmpp @@ -1 +1 @@ -Subproject commit 754cc5a70479a54659dbc93ccb5bf28e1da77ef4 +Subproject commit e6eb0b78d0cb17fccd5ddb60966ba2a0a2d2b593 diff --git a/CMakeLists.txt b/CMakeLists.txt index 0713227..6e09762 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,400 +1,400 @@ -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.3) find_package(ECM 5.40.0 REQUIRED NO_MODULE) set(CMAKE_CXX_STANDARD 14) set(QT_MIN_VERSION "5.8.0") if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() project(kaidan) set(APPLICATION_ID "im.kaidan.kaidan") set(APPLICATION_NAME "kaidan") set(APPLICATION_DISPLAY_NAME "Kaidan") if(UBUNTU_TOUCH) set(APPLICATION_NAME "${APPLICATION_ID}") endif() set(VERSION_STRING "0.4.0~dev") set(DEVELOPMENT_BUILD TRUE) set(ANDROID_VERSION_CODE 3) # CMake options option(I18N "Enable i18n support" FALSE) option(STATIC_BUILD "Build Kaidan statically") option(UBUNTU_TOUCH "Building a Ubuntu Touch click (internal use only!)" FALSE) option(CLICK_ARCH "Architecture that will be used in the click's manifest") option(CLICK_DATE "Date used in the version number in the click's manifest") option(QUICK_COMPILER "Use QtQuick compiler to improve performance" FALSE) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc, uic and rcc automatically when needed. set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(AUTOMOC_MOC_OPTIONS -Muri=${APPLICATION_ID}) # # Dependecies # # CMake module path set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) # CMake modules include include(KDEInstallDirs) include(KDECompilerSettings NO_POLICY_SCOPE) include(KDECMakeSettings) include(ECMInstallIcons) include(FeatureSummary) kde_enable_exceptions() # Find packages find_package(PkgConfig REQUIRED) find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Core Qml Quick Svg Sql QuickControls2 Xml) find_package(KF5Kirigami2 REQUIRED) pkg_search_module(QXmpp REQUIRED qxmpp>=0.9) # Optional QtQuickCompiler if(QUICK_COMPILER) find_package(Qt5QuickCompiler) set_package_properties(Qt5QuickCompiler PROPERTIES DESCRIPTION "Compile QML at build time" TYPE OPTIONAL ) endif() # Optional QWidget style integration (not on mobile) if(NOT UBUNTU_TOUCH AND NOT ANDROID AND NOT IOS) find_package(Qt5Widgets) set_package_properties(Qt5Widgets PROPERTIES DESCRIPTION "Integration with QWidget based desktop styles" TYPE OPTIONAL ) endif() # Platform-specific if(Qt5Widgets_FOUND) add_definitions(-DHAVE_QWIDGETS -DQAPPLICATION_CLASS=QApplication) set(__Qt5Widgets_LIBRARIES Qt5::Widgets) else() add_definitions(-DQAPPLICATION_CLASS=QGuiApplication) endif() if(ANDROID) find_package(Qt5 REQUIRED COMPONENTS AndroidExtras) endif() if(ANDROID OR WIN32) pkg_search_module(OPENSSL REQUIRED openssl IMPORTED_TARGET) message(STATUS "Using OpenSSL ${OPENSSL_VERSION}") endif() # # Load submodules # # Main kaidan sources include("${CMAKE_SOURCE_DIR}/src/CMakeLists.txt") # I18n support if(I18N) include("${CMAKE_SOURCE_DIR}/i18n/CMakeLists.txt") endif() # # Sources / Resources # # Include bundled icons on Ubuntu Touch, Android, Windows, macOS and iOS if(UBUNTU_TOUCH OR ANDROID OR WIN32 OR APPLE) set(KAIDAN_ICONS_QRC kirigami-icons.qrc) endif() # Bundle images on Android, Windows, macOS and iOS if(ANDROID OR WIN32 OR APPLE) set(KAIDAN_IMAGES_QRC "data/images/images.qrc") endif() # Set app icon if(APPLE) set(KAIDAN_ICNS "${CMAKE_SOURCE_DIR}/misc/macos/kaidan.icns") set_source_files_properties(${KAIDAN_ICNS} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") elseif(WIN32) include(ECMAddAppIcon) file(GLOB WIN_ICONS_SRCS "${CMAKE_SOURCE_DIR}/misc/windows/*kaidan.png") message(STATUS ${WIN_ICONS_SRCS}) ecm_add_app_icon(KAIDAN_ICNS ICONS ${WIN_ICONS_SRCS}) message(STATUS ${KAIDAN_ICNS}) endif() link_directories(${QXmpp_LIBDIR}) if(QUICK_COMPILER) qtquick_compiler_add_resources(KAIDAN_QML_QRC kaidan_qml.qrc) else() qt5_add_resources(KAIDAN_QML_QRC kaidan_qml.qrc) endif() add_executable(${PROJECT_NAME} MACOSX_BUNDLE WIN32 ${KAIDAN_ICNS} ${KAIDAN_SOURCES} ${KAIDAN_QML_QRC} ${KAIDAN_ICONS_QRC} # only set if enabled ${KAIDAN_IMAGES_QRC} # ${I18N_QRC_CPP} # ) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Sql Qt5::Qml Qt5::Quick Qt5::Svg Qt5::Network Qt5::Xml ${__Qt5Widgets_LIBRARIES} # currently needs to be hardcoded for windows builds qxmpp ) target_include_directories(${PROJECT_NAME} PUBLIC ${QXmpp_INCLUDE_DIRS} ) target_compile_options(${PROJECT_NAME} PUBLIC ${QXmpp_CFLAGS_OTHER} ) if(ANDROID OR WIN32 OR IOS) target_link_libraries(${PROJECT_NAME} Qt5::QuickControls2 KF5::Kirigami2) endif() if(ANDROID OR WIN32) target_link_libraries(${PROJECT_NAME} PkgConfig::OPENSSL) endif() if(ANDROID) target_link_libraries(${PROJECT_NAME} Qt5::AndroidExtras) endif() if(STATIC_BUILD) add_definitions(-DQXMPP_BUILD) find_package(Perl REQUIRED) set(STATIC_DEPENDENCIES_CMAKE_FILE "${CMAKE_BINARY_DIR}/QtStaticDependencies.cmake") if(EXISTS ${STATIC_DEPENDENCIES_CMAKE_FILE}) file(REMOVE ${STATIC_DEPENDENCIES_CMAKE_FILE}) endif() get_target_property(QT_LIBDIR Qt5::Core LOCATION) get_filename_component(QT_LIBDIR ${QT_LIBDIR} DIRECTORY) macro(CONVERT_PRL_LIBS_TO_CMAKE _qt_component) if(TARGET Qt5::${_qt_component}) get_target_property(_lib_location Qt5::${_qt_component} LOCATION) execute_process(COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/utils/convert-prl-libs-to-cmake.pl --lib ${_lib_location} --libdir ${QT_LIBDIR} --out ${STATIC_DEPENDENCIES_CMAKE_FILE} --component ${_qt_component} --compiler ${CMAKE_CXX_COMPILER_ID} ) endif() endmacro() link_directories(${_qt5_install_prefix}/../) foreach(qt_module Gui Quick QuickControls2 Network Qml Svg Sql QSQLiteDriverPlugin QJpegPlugin QGifPlugin QSvgPlugin QSvgIconPlugin QICOPlugin QGenericEnginePlugin QLocalClientConnectionFactory QTcpServerConnectionFactory) CONVERT_PRL_LIBS_TO_CMAKE(${qt_module}) endforeach() if(WIN32) CONVERT_PRL_LIBS_TO_CMAKE(QWindowsIntegrationPlugin) elseif(IOS) foreach(qt_module QIOSIntegrationPlugin QMacHeifPlugin QMacJp2Plugin QICNSPlugin QTgaPlugin QTiffPlugin QWbmpPlugin QWebpPlugin) CONVERT_PRL_LIBS_TO_CMAKE(${qt_module}) endforeach() endif() if(NOT EXISTS ${STATIC_DEPENDENCIES_CMAKE_FILE}) message(FATAL_ERROR "Unable to find ${STATIC_DEPENDENCIES_CMAKE_FILE}") endif() include(${STATIC_DEPENDENCIES_CMAKE_FILE}) set(QT_QML_PATH ${_qt5Quick_install_prefix}) find_library(KIRIGAMI_PLUGIN kirigamiplugin PATHS ${Kirigami2_INSTALL_PREFIX}/${KDE_INSTALL_QMLDIR}/org/kde/kirigami.2) find_library(QUICK_PLUGIN qtquick2plugin PATHS ${QT_QML_PATH}/qml/QtQuick.2) find_library(LABS_PLATFORM_PLUGIN qtlabsplatformplugin PATHS ${QT_QML_PATH}/qml/Qt/labs/platform) find_library(GRAPHEFFECTS_PLUGIN qtgraphicaleffectsplugin PATHS ${QT_QML_PATH}/qml/QtGraphicalEffects) find_library(GRAPHEFFECTS_PRIVATE_PLUGIN qtgraphicaleffectsprivate PATHS ${QT_QML_PATH}/qml/QtGraphicalEffects/private) find_library(QQC2_PLUGIN qtquickcontrols2plugin PATHS ${QT_QML_PATH}/qml/QtQuick/Controls.2) find_library(QQC2_MATERIAL_PLUGIN qtquickcontrols2materialstyleplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Controls.2/Material) find_library(QQC2_UNIVERSAL_PLUGIN qtquickcontrols2universalstyleplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Controls.2/Universal) find_library(QLAYOUTS_PLUGIN qquicklayoutsplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Layouts) find_library(QWINDOW_PLUGIN windowplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Window.2) find_library(QSHAPES_PLUGIN qmlshapesplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Shapes) find_library(QUICKSHAPES Qt5QuickShapes PATHS ${QT_LIBDIR}) find_library(QTEMPLATES_PLUGIN qtquicktemplates2plugin PATHS ${QT_QML_PATH}/qml/QtQuick/Templates.2) find_library(QMODELS_PLUGIN modelsplugin PATHS ${QT_QML_PATH}/qml/QtQml/Models.2) target_link_libraries(${PROJECT_NAME} ${plugin_libs} Qt5::QSQLiteDriverPlugin Qt5::QJpegPlugin Qt5::QGifPlugin Qt5::QSvgPlugin Qt5::QSvgIconPlugin Qt5::QICOPlugin Qt5::QGenericEnginePlugin Qt5::QLocalClientConnectionFactory Qt5::QTcpServerConnectionFactory ${KIRIGAMI_PLUGIN} ${QUICK_PLUGIN} ${LABS_PLATFORM_PLUGIN} ${GRAPHEFFECTS_PLUGIN} ${GRAPHEFFECTS_PRIVATE_PLUGIN} ${QQC2_PLUGIN} ${QQC2_MATERIAL_PLUGIN} ${QQC2_UNIVERSAL_PLUGIN} ${QLAYOUTS_PLUGIN} ${QWINDOW_PLUGIN} ${QSHAPES_PLUGIN} ${QUICKSHAPES} ${QTEMPLATES_PLUGIN} ${QMODELS_PLUGIN} ${__Qt5Widgets_LIBRARIES} ) if(WIN32) target_link_libraries(${PROJECT_NAME} Qt5::QWindowsIntegrationPlugin ) elseif(IOS) target_link_libraries(${PROJECT_NAME} Qt5::QIOSIntegrationPlugin Qt5::QMacHeifPlugin Qt5::QMacJp2Plugin Qt5::QICNSPlugin Qt5::QTgaPlugin Qt5::QTiffPlugin Qt5::QWbmpPlugin Qt5::QWebpPlugin ) endif() endif() # Set a custom plist file for the app bundle if(APPLE) if(IOS) set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/misc/ios/Info.plist) else() set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/misc/macos/Info.plist) endif() endif() # # Global C++ variables # # iOS-specific linker flags if(IOS) set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper -u _qt_registerPlatformPlugin") endif() if(UBUNTU_TOUCH) set(KAIDAN_COMPILE_DEFINITIONS UBUNTU_TOUCH=True) -elseif(NOT ANDROID AND NOT IOS AND NOT WIN32) +elseif(NOT ANDROID AND NOT IOS AND NOT WIN32 AND NOT APPLE) set(KAIDAN_COMPILE_DEFINITIONS NOTIFICATIONS_LIBNOTIFY=True) endif() if(STATIC_BUILD) set(KAIDAN_COMPILE_DEFINITIONS STATIC_BUILD=True ${KAIDAN_COMPILE_DEFINITIONS} ) endif() target_compile_definitions(${PROJECT_NAME} PRIVATE DEBUG_SOURCE_PATH="${CMAKE_SOURCE_DIR}" VERSION_STRING="${VERSION_STRING}" APPLICATION_ID="${APPLICATION_ID}" APPLICATION_NAME="${APPLICATION_NAME}" APPLICATION_DISPLAY_NAME="${APPLICATION_DISPLAY_NAME}" ${KAIDAN_COMPILE_DEFINITIONS} ) # # Install Kaidan # if(ANDROID) configure_file(${CMAKE_SOURCE_DIR}/misc/android/AndroidManifest.xml.in ${CMAKE_SOURCE_DIR}/misc/android/AndroidManifest.xml) endif() if(UBUNTU_TOUCH AND CLICK_ARCH) set(CLICK_VERSION ${VERSION_STRING}) if(DEVELOPMENT_BUILD) set(CLICK_VERSION "${CLICK_VERSION}.${CLICK_DATE}") endif() # will replace ${CLICK_ARCH} with its value configure_file(${CMAKE_SOURCE_DIR}/misc/ubuntu-touch/manifest.json.in ${CMAKE_SOURCE_DIR}/misc/ubuntu-touch/manifest.json) # install kaidan binary install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/bin/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX} ) # install kaidan media install(DIRECTORY "data/images" DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/${APPLICATION_ID}" ) # install icon install(FILES "misc/kaidan.svg" "misc/ubuntu-touch/apparmor.json" "misc/ubuntu-touch/kaidan.desktop" "misc/ubuntu-touch/manifest.json" DESTINATION "${CMAKE_INSTALL_PREFIX}" ) elseif(UNIX AND NOT APPLE) # install kaidan binary install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/bin/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} ) # install kaidan media install(DIRECTORY "data/images" DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}" ) # install icon (scalable + 128x) install(FILES "misc/kaidan.svg" DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor/scalable/apps" ) install(FILES "misc/kaidan-128x128.png" DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor/128x128/apps" RENAME "kaidan.png" ) # install desktop file install(FILES "misc/kaidan.desktop" DESTINATION "${KDE_INSTALL_APPDIR}" ) # install metainfo install(FILES "misc/metadata.xml" DESTINATION "${KDE_INSTALL_METAINFODIR}" RENAME "im.kaidan.kaidan.appdata.xml" ) endif() feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/utils/build-mac.sh b/utils/build-mac-osxcross.sh similarity index 78% copy from utils/build-mac.sh copy to utils/build-mac-osxcross.sh index 7a4937b..edf1441 100755 --- a/utils/build-mac.sh +++ b/utils/build-mac-osxcross.sh @@ -1,143 +1,146 @@ #!/bin/bash # NOTE: To use this script, you need to set $QT_MACOS to your Qt for MacOS installation if [ -z "$QT_MACOS" ]; then echo "QT_MACOS has to be set" exit 1 fi -# Build type is one of: +# Build type is one of: # Debug, Release, RelWithDebInfo and MinSizeRel BUILD_TYPE="${BUILD_TYPE:-Debug}" -KAIDAN_SOURCES=$(dirname "$(greadlink -f "${0}")")/.. +KAIDAN_SOURCES=$(dirname "$(readlink -f "${0}")")/.. KIRIGAMI_BUILD=/tmp/kirigami-mac-build QXMPP_BUILD=/tmp/qxmpp-mac-build +OSXCROSS_TARGET="x86_64-apple-darwin15" echo "-- Starting $BUILD_TYPE build of Kaidan --" echo "*****************************************" echo "Fetching dependencies if required" echo "*****************************************" if [ ! -f "$KAIDAN_SOURCES/3rdparty/kirigami/.git" ] || [ ! -f "$KAIDAN_SOURCES/3rdparty/breeze-icons/.git" ]; then echo "Cloning Kirigami and Breeze icons" git submodule update --init fi -if [ ! -d "$KAIDAN_SOURCES/3rdparty/qxmpp/.git" ]; then +if [ ! -e "$KAIDAN_SOURCES/3rdparty/qxmpp/" ]; then echo "Cloning QXmpp" git clone https://github.com/qxmpp-project/qxmpp.git 3rdparty/qxmpp fi cdnew() { if [ -d "$1" ]; then rm -rf "$1" fi mkdir $1 cd $1 } export QT_SELECT=qt5 if [ ! -f "$QXMPP_BUILD/lib/pkgconfig/qxmpp.pc" ]; then echo "*****************************************" echo "Building QXmpp" echo "*****************************************" { cdnew $KAIDAN_SOURCES/3rdparty/qxmpp/build - cmake .. \ + ${OSXCROSS_TARGET}-cmake .. \ -DCMAKE_PREFIX_PATH=$QT_MACOS \ -DBUILD_EXAMPLES=OFF \ - -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$QXMPP_BUILD - make -j$(sysctl -n hw.logicalcpu) + -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$QXMPP_BUILD \ + -DBUILD_TESTS=OFF + make -j$(nproc) make install rm -rf $KAIDAN_SOURCES/3rdparty/qxmpp/build } fi if [ ! -f "$KIRIGAMI_BUILD/lib/libKF5Kirigami2.dylib" ]; then echo "*****************************************" echo "Building Kirigami" echo "*****************************************" { cdnew $KAIDAN_SOURCES/3rdparty/kirigami/build - cmake .. \ + ${OSXCROSS_TARGET}-cmake .. \ -DECM_DIR=/usr/local/share/ECM/cmake \ -DCMAKE_PREFIX_PATH=$QT_MACOS \ -DECM_ADDITIONAL_FIND_ROOT_PATH=$QT_MACOS \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$KIRIGAMI_BUILD - - make -j$(sysctl -n hw.logicalcpu) + + make -j$(nproc) make install rm -rf $KAIDAN_SOURCES/3rdparty/kirigami/build } fi if [ ! -f "$KAIDAN_SOURCES/misc/macos/kaidan.icns" ]; then echo "*****************************************" echo "Rendering logos" echo "*****************************************" if [ ! $(command -v inkscape) ] || [ ! $(command -v optipng) ]; then echo "Icons can'be generated" exit 1 fi rendersvg() { inkscape -z -e $2 -w $3 -h $3 -d $4 $1 optipng -quiet $2 } macoslogo() { rendersvg $KAIDAN_SOURCES/misc/kaidan-small-margin.svg "$KAIDAN_SOURCES/misc/macos/kaidan.iconset/icon_$1x$1.png" $1 72 - rendersvg $KAIDAN_SOURCES/misc/kaidan-small-margin.svg "$KAIDAN_SOURCES/misc/macos/kaidan.iconset/icon_$(( $1 * 2 ))x$(( $1 * 2 ))@2x.png" $(( $1 * 2 )) 144 } mkdir -p $KAIDAN_SOURCES/misc/macos/kaidan.iconset macoslogo 16 macoslogo 32 macoslogo 128 macoslogo 256 macoslogo 512 -iconutil --convert icns "$KAIDAN_SOURCES/misc/macos/kaidan.iconset" +png2icns $KAIDAN_SOURCES/misc/macos/kaidan.icns $KAIDAN_SOURCES/misc/macos/kaidan.iconset/* fi export PKG_CONFIG_PATH=$QXMPP_BUILD/lib/pkgconfig +export CXXFLAGS=-I$QXMPP_BUILD/include/qxmpp/ -if [ ! -f "$KAIDAN_SOURCES/build/bin/kaidan" ]; then +if [ ! -d "$KAIDAN_SOURCES/build/bin/kaidan.app" ]; then echo "*****************************************" echo "Building Kaidan" echo "*****************************************" { cdnew $KAIDAN_SOURCES/build - cmake .. \ + ${OSXCROSS_TARGET}-cmake .. \ -DECM_DIR=/usr/local/share/ECM/cmake \ -DCMAKE_PREFIX_PATH=$QT_MACOS\;$KIRIGAMI_BUILD\;$QXMPP_BUILD \ -DKF5Kirigami2_DIR=$KIRIGAMI_BUILD/lib/cmake/KF5Kirigami2 -DI18N=1 \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ - -DQUICK_COMPILER=1 + -DQUICK_COMPILER=OFF - make -j$(sysctl -n hw.logicalcpu) + make -j$(nproc) } fi echo "*****************************************" echo "Macdeployqt" echo "*****************************************" { cd $KAIDAN_SOURCES/build export LD_LIBRARY_PATH=$QT_MACOS/lib/:$KIRIGAMI_BUILD/lib:$LD_LIBRARY_PATH export PATH=$QT_MACOS/bin/:$PATH - + # FIXME: Use `macdeployqt -qmlimport` when QTBUG-70977 is fixed if [ ! -d "$QT_MACOS/qml/org/kde/kirigami.2" ]; then mkdir -p $QT_MACOS/qml/org/kde ln -s $KIRIGAMI_BUILD/lib/qml/org/kde/kirigami.2 $QT_MACOS/qml/org/kde/kirigami.2 fi - macdeployqt bin/kaidan.app -qmldir=../src/qml/ -libpath=$KIRIGAMI_BUILD/lib/ -dmg + macdeployqt bin/kaidan.app -qmlimport=$QT_MACOS/qml -qmlimport=$KIRIGAMI_BUILD/lib/qml/ -qmldir=$KAIDAN_SOURCES/src/qml/ -libpath=$KIRIGAMI_BUILD/lib/ -libpath=$QXMPP_BUILD/lib -libpath=$QT_MACOS/lib/ -appstore-compliant -verbose=3 + ${OSXCROSS_TARGET}-install_name_tool -add_rpath @executable_path/../Frameworks bin/kaidan.app/Contents/MacOS/kaidan } diff --git a/utils/build-mac.sh b/utils/build-mac.sh index 7a4937b..c943afb 100755 --- a/utils/build-mac.sh +++ b/utils/build-mac.sh @@ -1,143 +1,143 @@ #!/bin/bash # NOTE: To use this script, you need to set $QT_MACOS to your Qt for MacOS installation if [ -z "$QT_MACOS" ]; then echo "QT_MACOS has to be set" exit 1 fi # Build type is one of: # Debug, Release, RelWithDebInfo and MinSizeRel BUILD_TYPE="${BUILD_TYPE:-Debug}" KAIDAN_SOURCES=$(dirname "$(greadlink -f "${0}")")/.. KIRIGAMI_BUILD=/tmp/kirigami-mac-build QXMPP_BUILD=/tmp/qxmpp-mac-build echo "-- Starting $BUILD_TYPE build of Kaidan --" echo "*****************************************" echo "Fetching dependencies if required" echo "*****************************************" if [ ! -f "$KAIDAN_SOURCES/3rdparty/kirigami/.git" ] || [ ! -f "$KAIDAN_SOURCES/3rdparty/breeze-icons/.git" ]; then echo "Cloning Kirigami and Breeze icons" git submodule update --init fi -if [ ! -d "$KAIDAN_SOURCES/3rdparty/qxmpp/.git" ]; then +if [ ! -e "$KAIDAN_SOURCES/3rdparty/qxmpp/.git" ]; then echo "Cloning QXmpp" git clone https://github.com/qxmpp-project/qxmpp.git 3rdparty/qxmpp fi cdnew() { if [ -d "$1" ]; then rm -rf "$1" fi mkdir $1 cd $1 } export QT_SELECT=qt5 if [ ! -f "$QXMPP_BUILD/lib/pkgconfig/qxmpp.pc" ]; then echo "*****************************************" echo "Building QXmpp" echo "*****************************************" { cdnew $KAIDAN_SOURCES/3rdparty/qxmpp/build cmake .. \ -DCMAKE_PREFIX_PATH=$QT_MACOS \ -DBUILD_EXAMPLES=OFF \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$QXMPP_BUILD make -j$(sysctl -n hw.logicalcpu) make install rm -rf $KAIDAN_SOURCES/3rdparty/qxmpp/build } fi if [ ! -f "$KIRIGAMI_BUILD/lib/libKF5Kirigami2.dylib" ]; then echo "*****************************************" echo "Building Kirigami" echo "*****************************************" { cdnew $KAIDAN_SOURCES/3rdparty/kirigami/build cmake .. \ -DECM_DIR=/usr/local/share/ECM/cmake \ -DCMAKE_PREFIX_PATH=$QT_MACOS \ -DECM_ADDITIONAL_FIND_ROOT_PATH=$QT_MACOS \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$KIRIGAMI_BUILD make -j$(sysctl -n hw.logicalcpu) make install rm -rf $KAIDAN_SOURCES/3rdparty/kirigami/build } fi if [ ! -f "$KAIDAN_SOURCES/misc/macos/kaidan.icns" ]; then echo "*****************************************" echo "Rendering logos" echo "*****************************************" if [ ! $(command -v inkscape) ] || [ ! $(command -v optipng) ]; then echo "Icons can'be generated" exit 1 fi rendersvg() { inkscape -z -e $2 -w $3 -h $3 -d $4 $1 optipng -quiet $2 } macoslogo() { rendersvg $KAIDAN_SOURCES/misc/kaidan-small-margin.svg "$KAIDAN_SOURCES/misc/macos/kaidan.iconset/icon_$1x$1.png" $1 72 rendersvg $KAIDAN_SOURCES/misc/kaidan-small-margin.svg "$KAIDAN_SOURCES/misc/macos/kaidan.iconset/icon_$(( $1 * 2 ))x$(( $1 * 2 ))@2x.png" $(( $1 * 2 )) 144 } mkdir -p $KAIDAN_SOURCES/misc/macos/kaidan.iconset macoslogo 16 macoslogo 32 macoslogo 128 macoslogo 256 macoslogo 512 iconutil --convert icns "$KAIDAN_SOURCES/misc/macos/kaidan.iconset" fi export PKG_CONFIG_PATH=$QXMPP_BUILD/lib/pkgconfig if [ ! -f "$KAIDAN_SOURCES/build/bin/kaidan" ]; then echo "*****************************************" echo "Building Kaidan" echo "*****************************************" { cdnew $KAIDAN_SOURCES/build cmake .. \ -DECM_DIR=/usr/local/share/ECM/cmake \ -DCMAKE_PREFIX_PATH=$QT_MACOS\;$KIRIGAMI_BUILD\;$QXMPP_BUILD \ -DKF5Kirigami2_DIR=$KIRIGAMI_BUILD/lib/cmake/KF5Kirigami2 -DI18N=1 \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ -DQUICK_COMPILER=1 make -j$(sysctl -n hw.logicalcpu) } fi echo "*****************************************" echo "Macdeployqt" echo "*****************************************" { cd $KAIDAN_SOURCES/build export LD_LIBRARY_PATH=$QT_MACOS/lib/:$KIRIGAMI_BUILD/lib:$LD_LIBRARY_PATH export PATH=$QT_MACOS/bin/:$PATH # FIXME: Use `macdeployqt -qmlimport` when QTBUG-70977 is fixed if [ ! -d "$QT_MACOS/qml/org/kde/kirigami.2" ]; then mkdir -p $QT_MACOS/qml/org/kde ln -s $KIRIGAMI_BUILD/lib/qml/org/kde/kirigami.2 $QT_MACOS/qml/org/kde/kirigami.2 fi macdeployqt bin/kaidan.app -qmldir=../src/qml/ -libpath=$KIRIGAMI_BUILD/lib/ -dmg }