From e93854e137313ed5a54935a33729bbb1f7305d63 Mon Sep 17 00:00:00 2001 From: Amin Bandali Date: Tue, 9 Feb 2021 20:50:53 +0100 Subject: [PATCH] autostart: revision for snap packaging Adjust JAMI_DATA_PATH (and in turn JAMI_DATA_DIR) for snap after any cmake 'install' command definitions that refer to it, so that the version compiled into the package using target_compile_definitions will have the right value for our snap package. With this particular configuration, we don't have to check for JAMI_DATA_DIR during runtime since it will have the right value set at build time, and the path it points to (/snap/jami/current/...) is actually stable across updates, so we don't have to worry about correcting the autostart desktop file symlink after each upgrade. Note: as the comments in CMakeLists.txt mention, it is crucial that JAMI_DATA_PATH is only adjusted after all 'install' commands that refer to it, because its snap-specific value isn't meant to be used during build time as an install destination. Also, that the call to target_compile_definitions must come after the JAMI_DATA_PATH change described earlier. Co-authored-by: ababi Gitlab: #262 Change-Id: I07896be8195c336833bcd4a84b918276eddbe159 --- CMakeLists.txt | 18 +++++++++++---- src/utils.cpp | 61 +++++++++++++++++++++++++------------------------- 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 619d01ee2..c0efd1b5b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -207,8 +207,7 @@ add_executable(${PROJECT_NAME} ${QML_RESOURCES_QML} ${LRC_SRC_PATH}/webresource.qrc) -target_compile_definitions(jami-qt PRIVATE - JAMI_DATA_DIR="${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}") +set(JAMI_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}") find_library(ringclient ringclient ${LRCLIBDIR} NO_DEFAULT_PATH) find_library(qrencode qrencode) @@ -228,7 +227,7 @@ endif() # Installation rules install(TARGETS jami-qt - RUNTIME DESTINATION bin) + RUNTIME DESTINATION bin) # install .desktop in XDG desktop dir so that it is recognized by the system install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop @@ -238,7 +237,7 @@ install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop # autostart dir by the client install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop DESTINATION - ${CMAKE_INSTALL_PREFIX}/share/jami-qt + ${JAMI_DATA_PATH} PERMISSIONS WORLD_READ OWNER_WRITE @@ -246,6 +245,17 @@ install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop GROUP_READ ) +# adjust JAMI_DATA_PATH for snap package +# (this must come after all 'install' commands that refer to +# JAMI_DATA_PATH; the following value is not meant to be used for +# any install destinations) +if(DEFINED ENV{SNAPCRAFT_PROJECT_NAME}) + set(JAMI_DATA_PATH "/snap/$ENV{SNAPCRAFT_PROJECT_NAME}/current/usr/share/${PROJECT_NAME}") +endif() + +# (this must come after the above adjustment to JAMI_DATA_PATH) +target_compile_definitions(jami-qt PRIVATE JAMI_DATA_DIR="${JAMI_DATA_PATH}") + # logos install(FILES images/jami.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps) diff --git a/src/utils.cpp b/src/utils.cpp index 9305f3706..595eb9b7b 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -69,7 +69,6 @@ Utils::CreateStartupLink(const std::wstring& wstrAppName) return Utils::CreateLink(programPath.c_str(), linkPath.c_str()); #else - QString desktopPath; /* cmake should set JAMI_DATA_DIR, otherwise it checks the following dirs * - /usr/ @@ -79,13 +78,13 @@ Utils::CreateStartupLink(const std::wstring& wstrAppName) #ifdef JAMI_DATA_DIR desktopPath = JAMI_DATA_DIR; - desktopPath = desktopPath + "/jami-qt.desktop"; + desktopPath += "/jami-qt.desktop"; #else - QString dataDir = "share/jami-qt/"; - QStringList paths = { "/usr/" + dataDir + "jami-qt.desktop", - "/usr/local/" + dataDir + "jami-qt.desktop", - QDir::currentPath() + "/../../install/" - + dataDir + "jami-qt/jami-qt.desktop" }; + desktopPath = "share/jami-qt/jami-qt.desktop"; + QStringList paths = { + "/usr/" + desktopPath, + "/usr/local/" + desktopPath, + QDir::currentPath() + "/../../install/client-qt/" + desktopPath }; for (QString filename : paths) { if (QFile::exists(filename)) { desktopPath = filename; @@ -95,23 +94,23 @@ Utils::CreateStartupLink(const std::wstring& wstrAppName) #endif if (desktopPath.isEmpty() || !(QFile::exists(desktopPath))) { - qDebug() << "Cannot locate .desktop file"; + qDebug() << "Could not locate .desktop file at" << desktopPath; return false; } - qDebug() << "Setting autostart link from " << desktopPath; + qDebug() << "Linking autostart file from" << desktopPath; - QString symlink = QStandardPaths::locate(QStandardPaths::ConfigLocation, - "autostart/jami-qt.desktop"); - if (!symlink.isEmpty()) { - QFileInfo symlinkInfo(symlink); + QString desktopFile = QStandardPaths::locate(QStandardPaths::ConfigLocation, + "autostart/jami-qt.desktop"); + if (!desktopFile.isEmpty()) { + QFileInfo symlinkInfo(desktopFile); if (symlinkInfo.isSymLink()) { if (symlinkInfo.symLinkTarget() == desktopPath) { - qDebug() << symlink << "already points to" << desktopPath; + qDebug() << desktopFile << "already points to" << desktopPath; return true; } else { - qDebug() << symlink << "exists but does not point to " << desktopPath; - QFile::remove(symlink); + qDebug() << desktopFile << "exists but does not point to" << desktopPath; + QFile::remove(desktopFile); } } } else { @@ -120,20 +119,20 @@ Utils::CreateStartupLink(const std::wstring& wstrAppName) if (!QDir(autoStartDir).exists()) { if (QDir().mkdir(autoStartDir)) { - qDebug() << "Created autostart directory: " << autoStartDir; + qDebug() << "Created autostart directory:" << autoStartDir; } else { - qWarning() << "Cannot create autostart directory: " << autoStartDir; + qWarning() << "Could not create autostart directory:" << autoStartDir; return false; } } - symlink = autoStartDir + "/jami-qt.desktop"; + desktopFile = autoStartDir + "/jami-qt.desktop"; } - QFile srcFile (desktopPath); - - bool result = srcFile.link(symlink); - qDebug() << symlink << (result ? "->" + desktopPath + " created successfully" - : "cannot be created"); + QFile srcFile(desktopPath); + bool result = srcFile.link(desktopFile); + qDebug() << desktopFile << (result + ? "-> " + desktopPath + " successfully created" + : "could not be created"); return result; #endif } @@ -183,17 +182,17 @@ Utils::DeleteStartupLink(const std::wstring& wstrAppName) DeleteFile(linkPath.c_str()); #else - QString symlink = QStandardPaths::locate(QStandardPaths::ConfigLocation, - "autostart/jami-qt.desktop"); - if (!symlink.isEmpty()) { + QString desktopFile = QStandardPaths::locate(QStandardPaths::ConfigLocation, + "autostart/jami-qt.desktop"); + if (!desktopFile.isEmpty()) { try { - QFile::remove(symlink); - qDebug() << "Autostart disabled," << symlink << "removed"; + QFile::remove(desktopFile); + qDebug() << "Autostart disabled," << desktopFile << "removed"; } catch (...) { - qDebug() << "Could not remove" << symlink; + qDebug() << "Could not remove" << desktopFile; } } else { - qDebug() << "jami-qt.desktop symlink does not exist"; + qDebug() << desktopFile << "does not exist"; } #endif }