Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3483a42db | ||
|
|
d68797cebb | ||
|
|
ef221d4574 | ||
|
|
3fa2e3fa3c | ||
|
|
bda1bc0df6 | ||
|
|
cb0f084d42 | ||
|
|
674ac146f2 | ||
|
|
1ab00ee774 | ||
|
|
38bcc30ed4 | ||
|
|
204439af94 | ||
|
|
8fc529102c | ||
|
|
a7a8346b63 | ||
|
|
88b129f863 | ||
|
|
f4fc2e1f19 | ||
|
|
e1b35e3ca8 | ||
|
|
a773795e38 | ||
|
|
c8695ca5ff | ||
|
|
bc23d3423a | ||
|
|
f5217dfdfa |
@@ -1,11 +1,16 @@
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
project(discord-screenaudio)
|
||||
|
||||
include(version.cmake)
|
||||
determine_version("${CMAKE_CURRENT_SOURCE_DIR}" DISCORD_SCEENAUDIO)
|
||||
add_definitions( -DDISCORD_SCEENAUDIO_VERSION_FULL="${DISCORD_SCEENAUDIO_VERSION_FULL}" )
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
|
||||
string(TIMESTAMP TIMESTAMP %s)
|
||||
# set(CMAKE_AUTOUIC ON)
|
||||
|
||||
find_package(Qt5 CONFIG REQUIRED COMPONENTS
|
||||
@@ -13,6 +18,12 @@ find_package(Qt5 CONFIG REQUIRED COMPONENTS
|
||||
WebEngineWidgets
|
||||
)
|
||||
|
||||
option(KF5NOTIFICATIONS "Use KF5Notifications for enhanced system notifications" ON)
|
||||
if(KF5NOTIFICATIONS)
|
||||
add_definitions( -DKF5NOTIFICATIONS )
|
||||
find_package(KF5Notifications)
|
||||
endif()
|
||||
|
||||
set(discord-screenaudio_SRC
|
||||
src/main.cpp
|
||||
src/mainwindow.cpp
|
||||
@@ -47,5 +58,13 @@ add_executable(discord-screenaudio ${discord-screenaudio_SRC})
|
||||
|
||||
target_link_libraries(discord-screenaudio Qt5::Widgets Qt5::WebEngineWidgets rohrkabel)
|
||||
|
||||
if(KF5NOTIFICATIONS)
|
||||
target_link_libraries(discord-screenaudio KF5::Notifications)
|
||||
install(FILES assets/discord-screenaudio.notifyrc DESTINATION ${CMAKE_INSTALL_PREFIX}/share/knotifications5)
|
||||
endif()
|
||||
|
||||
install(TARGETS discord-screenaudio DESTINATION bin)
|
||||
install(PROGRAMS assets/discord-screenaudio.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
||||
install(FILES assets/de.shorsh.discord-screenaudio.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/apps)
|
||||
install(PROGRAMS assets/de.shorsh.discord-screenaudio.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
||||
configure_file(assets/de.shorsh.discord-screenaudio.metainfo.xml.in de.shorsh.discord-screenaudio.metainfo.xml)
|
||||
install(FILES ${CMAKE_BINARY_DIR}/de.shorsh.discord-screenaudio.metainfo.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
|
||||
|
||||
23
README.md
23
README.md
@@ -15,6 +15,11 @@ case you want to stream something, maybe used with a second account. For
|
||||
anything else, this client has way too many things that work less well than in
|
||||
the original client.
|
||||
|
||||
Technically this could be against
|
||||
[Discord's TOS](https://discord.com/terms#software-in-discord%E2%80%99s-services),
|
||||
so be warned. Discord probably won't ban you for using this, but if they do I
|
||||
told you and it's not my fault.
|
||||
|
||||
## Known Issues
|
||||
|
||||
- Only works with **PipeWire**
|
||||
@@ -24,9 +29,17 @@ the original client.
|
||||
|
||||
## Installation
|
||||
|
||||
If you are using Arch, you can build and install
|
||||
[from the AUR](https://aur.archlinux.org/packages/discord-screenaudio). If you
|
||||
aren't, you will have to [build it yourself](#building-from-source).
|
||||
You have multiple options:
|
||||
|
||||
- Install the Flatpak (recommended):
|
||||
`flatpak install de.shorsh.discord-screenaudio`
|
||||
- If you are on Arch, you can build and install
|
||||
[`discord-screenaudio`](https://aur.archlinux.org/packages/discord-screenaudio)
|
||||
from the AUR
|
||||
- If you are on openSUSE, you can use the
|
||||
[Open Build Service package](https://software.opensuse.org/download.html?project=home%3AVortexAcherontic&package=discord-screenaudio)
|
||||
by [@VortexAcherontic](https://github.com/VortexAcherontic)
|
||||
- You can [build it yourself](#building-from-source)
|
||||
|
||||
## Building from Source
|
||||
|
||||
@@ -34,12 +47,12 @@ aren't, you will have to [build it yourself](#building-from-source).
|
||||
|
||||
- Basic building tools
|
||||
- CMake
|
||||
- Qt5 and QtWebEngine
|
||||
- Qt5, QtWebEngine and Kf5Notifications
|
||||
- **PipeWire** (it currently doesn't work with PulseAudio)
|
||||
- Git
|
||||
|
||||
On Debian:
|
||||
`apt install -y build-essential cmake qtbase5-dev qtwebengine5-dev pkg-config libpipewire-0.3-dev git`
|
||||
`apt install -y build-essential cmake qtbase5-dev qtwebengine5-dev libkf5notifications-dev pkg-config libpipewire-0.3-dev git`
|
||||
|
||||
### Building
|
||||
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
Type=Application
|
||||
Name=discord-screenaudio
|
||||
Exec=discord-screenaudio
|
||||
Icon=discord
|
||||
Icon=de.shorsh.discord-screenaudio
|
||||
Terminal=false
|
||||
43
assets/de.shorsh.discord-screenaudio.metainfo.xml.in
Normal file
43
assets/de.shorsh.discord-screenaudio.metainfo.xml.in
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop-application">
|
||||
<id>de.shorsh.discord-screenaudio</id>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-3.0+</project_license>
|
||||
<name>discord-screenaudio</name>
|
||||
<releases>
|
||||
<release version="${DISCORD_SCEENAUDIO_VERSION_FULL}" timestamp="${TIMESTAMP}" />
|
||||
</releases>
|
||||
|
||||
<summary>A very WIP custom discord client that supports streaming with audio on Linux</summary>
|
||||
|
||||
<description>
|
||||
<p>A very WIP custom discord client that supports streaming with audio on Linux, made possible by the great work of @edisionnano and the Rohrkabel library by @Curve.</p>
|
||||
<p>The purpose of this project is not to provide an alternative to the original Discord client. Rather, it should be used in addition to the original client in case you want to stream something, maybe used with a second account. For anything else, this client has way too many things that work less well than in the original client.</p>
|
||||
</description>
|
||||
|
||||
<launchable type="desktop-id">
|
||||
de.shorsh.discord-screenaudio.desktop
|
||||
</launchable>
|
||||
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image>
|
||||
https://user-images.githubusercontent.com/48161361/179571245-11ea05f3-fb5e-4aef-9132-2736e122ef04.png
|
||||
</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<url type="homepage">https://github.com/maltejur/discord-screenaudio</url>
|
||||
|
||||
<provides>
|
||||
<binary>discord-screenaudio</binary>
|
||||
</provides>
|
||||
|
||||
<content_rating type="oars-1.0">
|
||||
<content_attribute id="social-chat">intense</content_attribute>
|
||||
<content_attribute id="social-info">intense</content_attribute>
|
||||
<content_attribute id="social-audio">intense</content_attribute>
|
||||
<content_attribute id="social-contacts">intense</content_attribute>
|
||||
<content_attribute id="money-purchasing">mild</content_attribute>
|
||||
</content_rating>
|
||||
</component>
|
||||
BIN
assets/de.shorsh.discord-screenaudio.png
Normal file
BIN
assets/de.shorsh.discord-screenaudio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
8
assets/discord-screenaudio.notifyrc
Normal file
8
assets/discord-screenaudio.notifyrc
Normal file
@@ -0,0 +1,8 @@
|
||||
[Global]
|
||||
IconName=de.shorsh.discord-screenaudio
|
||||
Name=discord-screenaudio
|
||||
DesktopEntry=de.shorsh.discord-screenaudio.desktop
|
||||
|
||||
[Event/discordNotification]
|
||||
Name=Discord Notification
|
||||
Action=Popup
|
||||
@@ -81,11 +81,16 @@ setInterval(() => {
|
||||
});
|
||||
hiddenElements.length = 0;
|
||||
} else {
|
||||
for (const el of document.querySelectorAll(
|
||||
'[aria-label="Share Your Screen"]'
|
||||
)) {
|
||||
for (const el of [
|
||||
document.getElementsByClassName("actionButtons-2vEOUh")?.[0]?.children[1],
|
||||
document.querySelector(
|
||||
".wrapper-3t3Yqv > div > div > div > div > .controlButton-2PMNom"
|
||||
),
|
||||
]) {
|
||||
if (!el) continue;
|
||||
if (el.classList.contains("discord-screenaudio-cloned")) continue;
|
||||
el.classList.add("discord-screenaudio-cloned");
|
||||
elClone = el.cloneNode(true);
|
||||
elClone.ariaLabel = "Share Your Screen with Audio";
|
||||
elClone.title = "Share Your Screen with Audio";
|
||||
elClone.addEventListener("click", () => {
|
||||
console.log("!discord-screenaudio-start-stream");
|
||||
@@ -117,9 +122,10 @@ setInterval(() => {
|
||||
) {
|
||||
for (const el of document.getElementsByClassName("info-3pQQBb")) {
|
||||
const aboutEl = document.createElement("div");
|
||||
aboutEl.innerText = "discord-screenaudio v1.0.0-rc.7";
|
||||
aboutEl.innerText = `discord-screenaudio ${window.discordScreenaudioVersion}`;
|
||||
aboutEl.style.fontSize = "12px";
|
||||
aboutEl.style.color = "var(--text-muted)";
|
||||
aboutEl.style.textTransform = "none";
|
||||
aboutEl.classList.add("dirscordScreenaudioAboutText");
|
||||
el.appendChild(aboutEl);
|
||||
}
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>assets/userscript.js</file>
|
||||
<file>assets/de.shorsh.discord-screenaudio.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -17,6 +17,11 @@ DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) {
|
||||
connect(this, &QWebEnginePage::featurePermissionRequested, this,
|
||||
&DiscordPage::featurePermissionRequested);
|
||||
|
||||
connect(this, &QWebEnginePage::loadStarted, [=]() {
|
||||
runJavaScript(QString("window.discordScreenaudioVersion = '%1';")
|
||||
.arg(QApplication::applicationVersion()));
|
||||
});
|
||||
|
||||
settings()->setAttribute(QWebEngineSettings::ScreenCaptureEnabled, true);
|
||||
settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, true);
|
||||
settings()->setAttribute(QWebEngineSettings::AllowRunningInsecureContent,
|
||||
@@ -31,6 +36,7 @@ DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) {
|
||||
setUrl(QUrl("https://discord.com/app"));
|
||||
|
||||
injectScript(":/assets/userscript.js");
|
||||
injectVersion(QApplication::applicationVersion());
|
||||
|
||||
connect(&m_streamDialog, &StreamDialog::requestedStreamStart, this,
|
||||
&DiscordPage::startStream);
|
||||
@@ -59,6 +65,20 @@ void DiscordPage::injectScript(QString source) {
|
||||
}
|
||||
}
|
||||
|
||||
void DiscordPage::injectVersion(QString version) {
|
||||
QWebEngineScript script;
|
||||
|
||||
auto code = QString("window.discordScreenaudioVersion = '%1';").arg(version);
|
||||
|
||||
script.setSourceCode(code);
|
||||
script.setName("version.js");
|
||||
script.setWorldId(QWebEngineScript::MainWorld);
|
||||
script.setInjectionPoint(QWebEngineScript::DocumentCreation);
|
||||
script.setRunsOnSubFrames(false);
|
||||
|
||||
scripts().insert(script);
|
||||
}
|
||||
|
||||
void DiscordPage::featurePermissionRequested(const QUrl &securityOrigin,
|
||||
QWebEnginePage::Feature feature) {
|
||||
// Allow every permission asked
|
||||
@@ -78,7 +98,6 @@ void DiscordPage::featurePermissionRequested(const QUrl &securityOrigin,
|
||||
bool DiscordPage::acceptNavigationRequest(const QUrl &url,
|
||||
QWebEnginePage::NavigationType type,
|
||||
bool isMainFrame) {
|
||||
qDebug() << url;
|
||||
if (type == QWebEnginePage::NavigationTypeLinkClicked) {
|
||||
QDesktopServices::openUrl(url);
|
||||
return false;
|
||||
|
||||
@@ -25,6 +25,7 @@ private:
|
||||
const QString &message, int lineNumber,
|
||||
const QString &sourceID) override;
|
||||
void injectScript(QString source);
|
||||
void injectVersion(QString version);
|
||||
void stopVirtmic();
|
||||
void startVirtmic(QString target);
|
||||
|
||||
|
||||
@@ -7,7 +7,10 @@
|
||||
int main(int argc, char *argv[]) {
|
||||
QApplication app(argc, argv);
|
||||
QApplication::setApplicationName("discord-screenaudio");
|
||||
QApplication::setApplicationVersion("1.0.0-rc.7");
|
||||
QApplication::setWindowIcon(
|
||||
QIcon(":assets/de.shorsh.discord-screenaudio.png"));
|
||||
QApplication::setApplicationVersion(DISCORD_SCEENAUDIO_VERSION_FULL);
|
||||
QApplication::setDesktopFileName("de.shorsh.discord-screenaudio");
|
||||
|
||||
QCommandLineParser parser;
|
||||
parser.setApplicationDescription(
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
#include "mainwindow.h"
|
||||
#include "virtmic.h"
|
||||
|
||||
#ifdef KF5NOTIFICATIONS
|
||||
#include <KNotification>
|
||||
#endif
|
||||
|
||||
#include <QApplication>
|
||||
#include <QColor>
|
||||
#include <QComboBox>
|
||||
@@ -11,6 +15,8 @@
|
||||
#include <QSpacerItem>
|
||||
#include <QThread>
|
||||
#include <QUrl>
|
||||
#include <QWebEngineNotification>
|
||||
#include <QWebEngineProfile>
|
||||
#include <QWebEngineScript>
|
||||
#include <QWebEngineScriptCollection>
|
||||
#include <QWebEngineSettings>
|
||||
@@ -30,6 +36,23 @@ void MainWindow::setupWebView() {
|
||||
m_webView = new QWebEngineView(this);
|
||||
m_webView->setPage(page);
|
||||
|
||||
#ifdef KF5NOTIFICATIONS
|
||||
QWebEngineProfile::defaultProfile()->setNotificationPresenter(
|
||||
[&](std::unique_ptr<QWebEngineNotification> notificationInfo) {
|
||||
KNotification *notification = new KNotification("discordNotification");
|
||||
notification->setTitle(notificationInfo->title());
|
||||
notification->setText(notificationInfo->message());
|
||||
notification->setPixmap(QPixmap::fromImage(notificationInfo->icon()));
|
||||
notification->setDefaultAction("View");
|
||||
connect(notification, &KNotification::defaultActivated,
|
||||
[&, notificationInfo = std::move(notificationInfo)]() {
|
||||
notificationInfo->click();
|
||||
activateWindow();
|
||||
});
|
||||
notification->sendEvent();
|
||||
});
|
||||
#endif
|
||||
|
||||
setCentralWidget(m_webView);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ StreamDialog::StreamDialog() : QWidget() {
|
||||
setAttribute(Qt::WA_QuitOnClose, false);
|
||||
|
||||
auto layout = new QVBoxLayout(this);
|
||||
layout->setSizeConstraint(QLayout::SetFixedSize);
|
||||
|
||||
auto targetLabel = new QLabel(this);
|
||||
targetLabel->setText("Which app do you want to stream sound from?");
|
||||
@@ -57,7 +58,6 @@ StreamDialog::StreamDialog() : QWidget() {
|
||||
setLayout(layout);
|
||||
|
||||
setWindowTitle("discord-screenaudio Stream Dialog");
|
||||
setFixedSize(0, 0);
|
||||
}
|
||||
|
||||
void StreamDialog::startStream() {
|
||||
|
||||
163
version.cmake
Normal file
163
version.cmake
Normal file
@@ -0,0 +1,163 @@
|
||||
# Copyright (c) 2018-2021 Ribose Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
|
||||
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# desired length of commit hash
|
||||
set(GIT_REV_LEN 7)
|
||||
|
||||
# call git, store output in var (can fail)
|
||||
macro(_git var)
|
||||
execute_process(
|
||||
COMMAND "${GIT_EXECUTABLE}" ${ARGN}
|
||||
WORKING_DIRECTORY "${source_dir}"
|
||||
RESULT_VARIABLE _git_ec
|
||||
OUTPUT_VARIABLE ${var}
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
ERROR_QUIET
|
||||
)
|
||||
endmacro()
|
||||
|
||||
function(extract_version_info version var_prefix)
|
||||
# extract the main components
|
||||
# v1.9.0-3-g5b92266+1546836556
|
||||
# v1.9.0-3-g5b92266-dirty+1546836556
|
||||
string(REGEX MATCH "^v?([0-9]+\\.[0-9]+\\.[0-9]+)(-([0-9]+)-g([0-9a-f]+)(-dirty)?)?(\\+([0-9]+))?$" matches "${version}")
|
||||
if (NOT matches)
|
||||
message(FATAL_ERROR "Failed to extract version components from ${version}.")
|
||||
endif()
|
||||
set(${var_prefix}_VERSION "${CMAKE_MATCH_1}" PARENT_SCOPE) # 1.9.0
|
||||
if (NOT CMAKE_MATCH_3)
|
||||
set(CMAKE_MATCH_3 "0")
|
||||
endif()
|
||||
set(${var_prefix}_VERSION_NCOMMITS "${CMAKE_MATCH_3}" PARENT_SCOPE) # 3
|
||||
if (NOT CMAKE_MATCH_4)
|
||||
set(CMAKE_MATCH_4 "0")
|
||||
endif()
|
||||
set(${var_prefix}_VERSION_GIT_REV "${CMAKE_MATCH_4}" PARENT_SCOPE) # 5b92266
|
||||
if (CMAKE_MATCH_5 STREQUAL "-dirty")
|
||||
set(${var_prefix}_VERSION_IS_DIRTY TRUE PARENT_SCOPE)
|
||||
else()
|
||||
set(${var_prefix}_VERSION_IS_DIRTY FALSE PARENT_SCOPE)
|
||||
endif()
|
||||
# timestamp is optional, default to 0
|
||||
if (NOT CMAKE_MATCH_7)
|
||||
set(CMAKE_MATCH_7 "0")
|
||||
endif()
|
||||
set(${var_prefix}_VERSION_COMMIT_TIMESTAMP "${CMAKE_MATCH_7}" PARENT_SCOPE) # 1546836556
|
||||
endfunction()
|
||||
|
||||
function(determine_version source_dir var_prefix)
|
||||
set(has_release_tag NO)
|
||||
set(has_version_txt NO)
|
||||
set(local_prefix "_determine_ver")
|
||||
# find out base version via version.txt
|
||||
set(base_version "0.0.0")
|
||||
if (EXISTS "${source_dir}/version.txt")
|
||||
set(has_version_txt YES)
|
||||
file(STRINGS "${source_dir}/version.txt" version_file)
|
||||
extract_version_info("${version_file}" "${local_prefix}")
|
||||
set(base_version "${${local_prefix}_VERSION}")
|
||||
message(STATUS "Found version.txt with ${version_file}")
|
||||
else()
|
||||
message(STATUS "Found no version.txt.")
|
||||
endif()
|
||||
# for GIT_EXECUTABLE
|
||||
find_package(Git)
|
||||
# get a description of the version, something like:
|
||||
# v1.9.1-0-g38ffe82 (a tagged release)
|
||||
# v1.9.1-0-g38ffe82-dirty (a tagged release with local modifications)
|
||||
# v1.9.0-3-g5b92266 (post-release snapshot)
|
||||
# v1.9.0-3-g5b92266-dirty (post-release snapshot with local modifications)
|
||||
_git(version describe --abbrev=${GIT_REV_LEN} --match "v[0-9]*" --long --dirty)
|
||||
if (NOT _git_ec EQUAL 0)
|
||||
# no annotated tags, fake one
|
||||
message(STATUS "Found no annotated tags.")
|
||||
_git(revision rev-parse --short=${GIT_REV_LEN} --verify HEAD)
|
||||
if (_git_ec EQUAL 0)
|
||||
set(version "v${base_version}-0-g${revision}")
|
||||
# check if dirty (this won't detect untracked files, but should be ok)
|
||||
_git(changes diff-index --quiet HEAD --)
|
||||
if (NOT _git_ec EQUAL 0)
|
||||
string(APPEND version "-dirty")
|
||||
endif()
|
||||
# append the commit timestamp of the most recent commit (only
|
||||
# in non-release branches -- typically master)
|
||||
_git(commit_timestamp show -s --format=%ct)
|
||||
if (_git_ec EQUAL 0)
|
||||
string(APPEND version "+${commit_timestamp}")
|
||||
endif()
|
||||
elseif(has_version_txt)
|
||||
# Nothing to get from git - so use version.txt completely
|
||||
set(version "${version_file}")
|
||||
else()
|
||||
# Sad case - no git, no version.txt
|
||||
set(version "v${base_version}")
|
||||
endif()
|
||||
else()
|
||||
set(has_release_tag YES)
|
||||
message(STATUS "Found annotated tag ${version}")
|
||||
endif()
|
||||
extract_version_info("${version}" "${local_prefix}")
|
||||
if ("${has_version_txt}" AND NOT ${base_version} STREQUAL ${local_prefix}_VERSION)
|
||||
message(WARNING "Tagged version ${${local_prefix}_VERSION} doesn't match one from the version.txt: ${base_version}")
|
||||
if (${base_version} VERSION_GREATER ${local_prefix}_VERSION)
|
||||
set(${local_prefix}_VERSION ${base_version})
|
||||
endif()
|
||||
endif()
|
||||
foreach(suffix VERSION VERSION_NCOMMITS VERSION_GIT_REV VERSION_IS_DIRTY VERSION_COMMIT_TIMESTAMP)
|
||||
if (NOT DEFINED ${local_prefix}_${suffix})
|
||||
message(FATAL_ERROR "Unable to determine version.")
|
||||
endif()
|
||||
set(${var_prefix}_${suffix} "${${local_prefix}_${suffix}}" PARENT_SCOPE)
|
||||
message(STATUS "${var_prefix}_${suffix}: ${${local_prefix}_${suffix}}")
|
||||
endforeach()
|
||||
# Set VERSION_SUFFIX and VERSION_FULL. When making changes, be aware that
|
||||
# this is used in packaging as well and will affect ordering.
|
||||
# | state | version_full |
|
||||
# |-----------------------------------------------------|
|
||||
# | exact tag | 0.9.0 |
|
||||
# | exact tag, dirty | 0.9.0+git20180604 |
|
||||
# | after tag | 0.9.0+git20180604.1.085039f |
|
||||
# | no tag, version.txt | 0.9.0+git20180604.2ee02af |
|
||||
# | no tag, no version.txt| 0.0.0+git20180604.2ee02af |
|
||||
string(TIMESTAMP date "%Y%m%d" UTC)
|
||||
set(version_suffix "")
|
||||
if (NOT ${local_prefix}_VERSION_NCOMMITS EQUAL 0)
|
||||
# 0.9.0+git20150604.4.289818b
|
||||
string(APPEND version_suffix "+git${date}.${${local_prefix}_VERSION_NCOMMITS}.${${local_prefix}_VERSION_GIT_REV}")
|
||||
elseif ((NOT has_release_tag) AND ((NOT has_version_txt) OR ("${base_version}" STREQUAL "0.0.0") OR (NOT "${revision}" STREQUAL "")))
|
||||
# 0.9.0+git20150604.289818b
|
||||
string(APPEND version_suffix "+git${date}.${${local_prefix}_VERSION_GIT_REV}")
|
||||
elseif(${local_prefix}_VERSION_IS_DIRTY)
|
||||
# 0.9.0+git20150604
|
||||
string(APPEND version_suffix "+git${date}")
|
||||
endif()
|
||||
set(version_full "${${local_prefix}_VERSION}${version_suffix}")
|
||||
# set the results
|
||||
set(${var_prefix}_VERSION_SUFFIX "${version_suffix}" PARENT_SCOPE)
|
||||
set(${var_prefix}_VERSION_FULL "${version_full}" PARENT_SCOPE)
|
||||
# for informational purposes
|
||||
message(STATUS "${var_prefix}_VERSION_SUFFIX: ${version_suffix}")
|
||||
message(STATUS "${var_prefix}_VERSION_FULL: ${version_full}")
|
||||
endfunction()
|
||||
|
||||
Reference in New Issue
Block a user