summaryrefslogtreecommitdiff
path: root/meshmc/buildconfig
diff options
context:
space:
mode:
Diffstat (limited to 'meshmc/buildconfig')
-rw-r--r--meshmc/buildconfig/BuildConfig.cpp.in126
-rw-r--r--meshmc/buildconfig/BuildConfig.h185
-rw-r--r--meshmc/buildconfig/CMakeLists.txt11
3 files changed, 322 insertions, 0 deletions
diff --git a/meshmc/buildconfig/BuildConfig.cpp.in b/meshmc/buildconfig/BuildConfig.cpp.in
new file mode 100644
index 0000000000..9af27350df
--- /dev/null
+++ b/meshmc/buildconfig/BuildConfig.cpp.in
@@ -0,0 +1,126 @@
+/* SPDX-FileCopyrightText: 2026 Project Tick
+ * SPDX-FileContributor: Project Tick
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * MeshMC - A Custom Launcher for Minecraft
+ * Copyright (C) 2026 Project Tick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "BuildConfig.h"
+#include <QObject>
+
+const Config BuildConfig;
+
+Config::Config()
+{
+ // Name and copyright
+ MESHMC_NAME = "@MeshMC_Name@";
+ MESHMC_DISPLAYNAME = "@MeshMC_DisplayName@";
+ MESHMC_COPYRIGHT = "@MeshMC_Copyright@";
+ MESHMC_DOMAIN = "@MeshMC_Domain@";
+ MESHMC_CONFIGFILE = "@MeshMC_ConfigFile@";
+ MESHMC_GIT = "@MeshMC_Git@";
+
+ USER_AGENT = "@MeshMC_UserAgent@";
+ USER_AGENT_UNCACHED = USER_AGENT + " (Uncached)";
+
+ // Version information
+ VERSION_MAJOR = @MeshMC_VERSION_MAJOR@;
+ VERSION_MINOR = @MeshMC_VERSION_MINOR@;
+ VERSION_HOTFIX = @MeshMC_VERSION_HOTFIX@;
+ VERSION_BUILD = @MeshMC_VERSION_BUILD@;
+
+ BUILD_PLATFORM = "@MeshMC_BUILD_PLATFORM@";
+ BUILD_ARTIFACT = "@MeshMC_BUILD_ARTIFACT@";
+ BUILD_DATE = "@MeshMC_BUILD_TIMESTAMP@";
+ COMPILER_NAME = "@MeshMC_COMPILER_NAME@";
+ COMPILER_VERSION = "@MeshMC_COMPILER_VERSION@";
+ COMPILER_TARGET_SYSTEM = "@MeshMC_COMPILER_TARGET_SYSTEM@";
+ COMPILER_TARGET_SYSTEM_VERSION = "@MeshMC_COMPILER_TARGET_SYSTEM_VERSION@";
+ COMPILER_TARGET_SYSTEM_PROCESSOR = "@MeshMC_COMPILER_TARGET_PROCESSOR@";
+ UPDATER_BASE = "@MeshMC_UPDATER_BASE@";
+ UPDATER_FEED_URL = "@MeshMC_UPDATER_FEED_URL@";
+ UPDATER_GITHUB_API_URL = "@MeshMC_UPDATER_GITHUB_API_URL@";
+ ANALYTICS_ID = "@MeshMC_ANALYTICS_ID@";
+ NOTIFICATION_URL = "@MeshMC_NOTIFICATION_URL@";
+ FULL_VERSION_STR =
+ "@MeshMC_VERSION_MAJOR@.@MeshMC_VERSION_MINOR@.@MeshMC_VERSION_BUILD@";
+
+ GIT_COMMIT = "@MeshMC_GIT_COMMIT@";
+ GIT_REFSPEC = "@MeshMC_GIT_REFSPEC@";
+ GIT_TAG = "@MeshMC_GIT_TAG@";
+
+ // New updater: enabled when both feed and GitHub API URLs are configured
+ // and a build artifact name is provided for platform-specific asset
+ // matching.
+ if (!UPDATER_FEED_URL.isEmpty() && !UPDATER_GITHUB_API_URL.isEmpty() &&
+ !BUILD_ARTIFACT.isEmpty()) {
+ UPDATER_ENABLED = true;
+ }
+
+ // VERSION_CHANNEL is still populated from the git branch for informational
+ // use.
+ if (GIT_REFSPEC.startsWith("refs/heads/")) {
+ VERSION_CHANNEL = GIT_REFSPEC;
+ VERSION_CHANNEL.remove("refs/heads/");
+ } else {
+ VERSION_CHANNEL = QObject::tr("custom");
+ }
+
+ VERSION_STR = "@MeshMC_VERSION_STRING@";
+ MSAClientID = "@MeshMC_MICROSOFT_CLIENT_ID@";
+ NEWS_RSS_URL = "@MeshMC_NEWS_RSS_URL@";
+ PASTE_EE_KEY = "@MeshMC_PASTE_EE_API_KEY@";
+ IMGUR_CLIENT_ID = "@MeshMC_IMGUR_CLIENT_ID@";
+ META_URL = "@MeshMC_META_URL@";
+ CURSEFORGE_API_KEY = "@MeshMC_CURSEFORGE_API_KEY@";
+
+ BUG_TRACKER_URL = "@MeshMC_BUG_TRACKER_URL@";
+ DISCORD_URL = "@MeshMC_DISCORD_URL@";
+ SUBREDDIT_URL = "@MeshMC_SUBREDDIT_URL@";
+}
+
+QString Config::printableVersionString() const
+{
+ QString vstr =
+ QString("%1.%2.%3")
+ .arg(QString::number(VERSION_MAJOR), QString::number(VERSION_MINOR),
+ QString::number(VERSION_HOTFIX));
+
+ if (!GIT_TAG.isEmpty() && !GIT_TAG.endsWith("-NOTFOUND")) {
+ return vstr;
+ }
+
+ if (!GIT_COMMIT.isEmpty() && !GIT_COMMIT.endsWith("-NOTFOUND")) {
+ vstr += "-r" + GIT_COMMIT.left(6);
+ }
+
+ return vstr;
+}
+
+QString Config::compilerID() const
+{
+ if (COMPILER_VERSION.isEmpty())
+ return COMPILER_NAME;
+ return QStringLiteral("%1 - %2").arg(COMPILER_NAME).arg(COMPILER_VERSION);
+}
+
+QString Config::systemID() const
+{
+ return QStringLiteral("%1 %2 %3")
+ .arg(COMPILER_TARGET_SYSTEM, COMPILER_TARGET_SYSTEM_VERSION,
+ COMPILER_TARGET_SYSTEM_PROCESSOR);
+}
diff --git a/meshmc/buildconfig/BuildConfig.h b/meshmc/buildconfig/BuildConfig.h
new file mode 100644
index 0000000000..760da4ade7
--- /dev/null
+++ b/meshmc/buildconfig/BuildConfig.h
@@ -0,0 +1,185 @@
+/* SPDX-FileCopyrightText: 2026 Project Tick
+ * SPDX-FileContributor: Project Tick
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * MeshMC - A Custom Launcher for Minecraft
+ * Copyright (C) 2026 Project Tick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+#include <QString>
+
+/**
+ * \brief The Config class holds all the build-time information passed from the
+ * build system.
+ */
+class Config
+{
+ public:
+ Config();
+ QString MESHMC_NAME;
+ QString MESHMC_DISPLAYNAME;
+ QString MESHMC_COPYRIGHT;
+ QString MESHMC_DOMAIN;
+ QString MESHMC_CONFIGFILE;
+ QString MESHMC_GIT;
+
+ /// The major version number.
+ int VERSION_MAJOR;
+ /// The minor version number.
+ int VERSION_MINOR;
+ /// The hotfix number.
+ int VERSION_HOTFIX;
+ /// The build number.
+ int VERSION_BUILD;
+
+ /**
+ * The version channel
+ * This is used by the updater to determine what channel the current version
+ * came from.
+ */
+ QString VERSION_CHANNEL;
+
+ bool UPDATER_ENABLED = false;
+
+ /// A short string identifying this build's platform. For example, "lin64"
+ /// or "win32".
+ QString BUILD_PLATFORM;
+
+ /// URL for the updater's channel (legacy, unused)
+ QString UPDATER_BASE;
+
+ /// RSS feed URL for the new updater (projt: namespace).
+ QString UPDATER_FEED_URL;
+
+ /// GitHub releases API URL for update verification.
+ QString UPDATER_GITHUB_API_URL;
+
+ /// A string containing the build timestamp
+ QString BUILD_DATE;
+
+ /// User-Agent to use.
+ QString USER_AGENT;
+
+ /// User-Agent to use for uncached requests.
+ QString USER_AGENT_UNCACHED;
+
+ /// A short string identifying this build's valid artifacts int he updater.
+ /// For example, "lin64" or "win32".
+ QString BUILD_ARTIFACT;
+
+ /// Compiler name
+ QString COMPILER_NAME;
+
+ /// Compiler version
+ QString COMPILER_VERSION;
+
+ /// Target system name (e.g. "Linux", "Windows")
+ QString COMPILER_TARGET_SYSTEM;
+
+ /// Target system version
+ QString COMPILER_TARGET_SYSTEM_VERSION;
+
+ /// Target system processor (e.g. "x86_64")
+ QString COMPILER_TARGET_SYSTEM_PROCESSOR;
+
+ /// Google analytics ID
+ QString ANALYTICS_ID;
+
+ /// URL for notifications
+ QString NOTIFICATION_URL;
+
+ /// Used for matching notifications
+ QString FULL_VERSION_STR;
+
+ /// The git commit hash of this build
+ QString GIT_COMMIT;
+
+ /// The git refspec of this build
+ QString GIT_REFSPEC;
+
+ /// The exact git tag of this build, if any
+ QString GIT_TAG;
+
+ /// This is printed on start to standard output
+ QString VERSION_STR;
+
+ /**
+ * This is used to fetch the news RSS feed.
+ * It defaults in CMakeLists.txt to "https://projecttick.org/rss.xml"
+ */
+ QString NEWS_RSS_URL;
+
+ QString MSAClientID;
+
+ /**
+ * API key you can get from paste.ee when you register an account
+ */
+ QString PASTE_EE_KEY;
+
+ /**
+ * Client ID you can get from Imgur when you register an application
+ */
+ QString IMGUR_CLIENT_ID;
+
+ /**
+ * Metadata repository URL prefix
+ */
+ QString META_URL;
+
+ /**
+ * API key for the CurseForge API
+ */
+ QString CURSEFORGE_API_KEY;
+
+ QString BUG_TRACKER_URL;
+ QString DISCORD_URL;
+ QString SUBREDDIT_URL;
+
+ QString RESOURCE_BASE = "https://resources.download.minecraft.net/";
+ QString LIBRARY_BASE = "https://libraries.minecraft.net/";
+ QString IMGUR_BASE_URL = "https://api.imgur.com/3/";
+ QString FMLLIBS_BASE_URL = "https://files.projecttick.org/fmllibs/";
+ QString TRANSLATIONS_BASE_URL = "https://i18n.projecttick.org/";
+
+ QString MODPACKSCH_API_BASE_URL = "https://api.modpacks.ch/";
+
+ QString LEGACY_FTB_CDN_BASE_URL = "https://dist.creeper.host/FTB2/";
+
+ QString ATL_DOWNLOAD_SERVER_URL =
+ "https://download.nodecdn.net/containers/atl/";
+
+ /**
+ * \brief Converts the Version to a string.
+ * \return The version number in string format (major.minor.revision.build).
+ */
+ QString printableVersionString() const;
+
+ /**
+ * \brief Compiler ID String
+ * \return a string of the form "Name - Version" of just "Name" if the
+ * version is empty
+ */
+ QString compilerID() const;
+
+ /**
+ * \brief System ID String
+ * \return a string of the form "OS Verison Processor"
+ */
+ QString systemID() const;
+};
+
+extern const Config BuildConfig;
diff --git a/meshmc/buildconfig/CMakeLists.txt b/meshmc/buildconfig/CMakeLists.txt
new file mode 100644
index 0000000000..ca3328fdc7
--- /dev/null
+++ b/meshmc/buildconfig/CMakeLists.txt
@@ -0,0 +1,11 @@
+######## Configure the file with build properties ########
+
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/BuildConfig.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/BuildConfig.cpp")
+
+add_library(BuildConfig STATIC
+ BuildConfig.h
+ ${CMAKE_CURRENT_BINARY_DIR}/BuildConfig.cpp
+)
+
+target_link_libraries(BuildConfig Qt6::Core)
+target_include_directories(BuildConfig PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")